/// <summary>
        /// Gets 
        /// </summary>
        public static CustomerBankDetail GetCustomerBankDetailFromCustomer(Customer aCustomer)
        {
            PortugalVillasContext db = new PortugalVillasContext();
            CustomerBankDetail theBankDetailsToReturn = db.CustomerBankDetails.Where(x => x.CustomerID == aCustomer.CustomerID).FirstOrDefault();
            return theBankDetailsToReturn;

        }
 public bool SetCustomer(Customer aCustomer)
 {
  
         this.Id = aCustomer.CustomerID;
         this.aCustomer = aCustomer;
         return true;                                 
 }
        public CustomerSet(Customer aCustomer)
        {
            this.Id = aCustomer.CustomerID;
            this.aCustomer = aCustomer;
            this.aCustomersBankDetails = CustomerBankDetail.GetCustomerBankDetailFromCustomer(aCustomer);
            this.theEventsChainToComplete = new EventProvider(this);

        }
        /// <summary>
        /// There is only one template pattern at the moment - Standard template
        /// </summary>
        /// <param name="anEvent"></param>
        /// <param name="customer"></param>
        /// <param name="documentType"></param>
        /// <param name="booking"></param>
        /// <param name="bes"></param>
        public EventCommandSendEmail(Event anEvent, int EmailTemplateId, Customer customer, Booking booking = null, BookingExtraSelection bes = null)
        {
            this.Event = anEvent;
            this.customer = customer;           
            this.booking = booking;
            this.bes = bes;
            this.EmailTemplateId = EmailTemplateId;

        }
 public EventCommandCreateDocument(Event anEvent, Customer customer, PRCDocument.PRCDocumentType documentType, Booking booking = null, BookingExtraSelection bes = null)
 {
     //inject properties
     this.Event = anEvent;
     this.customer = customer;
     this.documentType = documentType;
     this.booking = booking;
     this.bes = bes;
 }
        public ActionResult QuickCreateCustomer(Customer customer)
        {

          
            var redirect = Create(customer);

            return this.RedirectToAction("Edit", customer);

        }
        public ActionResult Create(Customer customer)
        {
            if (ModelState.IsValid)
            {
                db.Customers.Add(customer);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(customer);
        }
        public ActionResult Edit(Customer customer)
        {

            if (ModelState.IsValid)
            {
                using (var db = new PortVillasContext())
                {
                    db.Entry(customer).State = EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            return RedirectToAction("Index");
        }
        public ActionResult TestAjaxView()
        {

            var cus = new Customer
            {
                FirstName = "Test",
                LastName = "test"

            };
            ViewBag.Message = "This is a AJAX form";

             
            return View();
        }
        public int SendEmailToCustomer(Customer customer, int EmailTemplateID, Booking booking = null, BookingExtraSelection bes = null)
        {
            try
            {
                StandardEmailTemplate template = new StandardEmailTemplate(customer.EmailAddress, EmailTemplateID, customer, booking, bes);
                template.SendEmail();

                return 0;
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }
        public PRCDocument(Customer customer, PRCDocumentType type, Booking booking = null, BookingExtraSelection  bookingExtraSelection = null)
        {
            this.Type = type;

            this.MainDataTable = new DataTable();
            this.SecondaryDataTable = new DataTable();

            this.CustomerID = customer.CustomerID;
            if(booking != null)
            {
                BookingID = booking.BookingID;
            }
            if(bookingExtraSelection != null)
            {
                this.BookingExtraSelectionID = bookingExtraSelection.BookingExtraSelectionID;
            }

        }
        //IContactable Wrappers
    /*    public string ContactFirstName { get; set; }
        public string ContactLastName { get; set; }
        public string ContactEmailAddress { get; set; }*/


        /////////////////////
        //static methods
        /////////////////////
        /// 

        public static Customer MapCustomerRegistrationToNewCustomer(CustomerRegistration theCustomerRegistration)
        {
            try
            {
                Customer theCustomer = new Customer
                {
                    Title = theCustomerRegistration.Title,
                    Address1 = theCustomerRegistration.Address1,
                    Address2 = theCustomerRegistration.Address2,
                    AltEmailAddress = theCustomerRegistration.AltEmailAddress,
                    AltTelephone = theCustomerRegistration.AltTelephone,
                    CompanyTelephone = theCustomerRegistration.CompanyTelephone,
                    County = theCustomerRegistration.County,
                    Country = theCustomerRegistration.Country,
                    CreationDate = theCustomerRegistration.CreationDate,
                    DOB = theCustomerRegistration.DOB,
                    DayTimeTelephone = theCustomerRegistration.DayTimeTelephone,
                    HomeTelephone = theCustomerRegistration.HomeTelephone,
                    EmailAddress = theCustomerRegistration.EmailAddress,
                    FirstName = theCustomerRegistration.FirstName,
                    LastName = theCustomerRegistration.LastName,
                    MiddleName = theCustomerRegistration.MiddleName,
                    Town = theCustomerRegistration.Town,
                    Postcode = theCustomerRegistration.Postcode,
                    MobileTelephone = theCustomerRegistration.MobileTelephone,
                    PreferredCurrency = theCustomerRegistration.PreferredCurrency,
                    PreferredCurrencySymbol = theCustomerRegistration.PreferredCurrencySymbol,
                    Test = theCustomerRegistration.Test

                };


                return theCustomer;
            }
            catch (Exception ex)
            {
                
                throw ex;
            }
        }
        public ActionResult Edit(Customer customer)
        {


            var oldCust = db.Customers.Where(x => x.CustomerID == customer.CustomerID).First();
            customer.CreationDate = customer.CreationDate;


            if (ModelState.IsValid)
            {
                using (var _db = new PortugalVillasContext())
                {
                    _db.Customers.Attach(customer);
                    _db.Entry(customer).State = EntityState.Modified;
                    _db.SaveChanges();
                    Session["currentCustomer"] = customer;
                    return RedirectToAction("Edit", customer);
                }

            }
            return View(customer);
        }
        /// <summary>
        /// Sends an email for 1*1 bookings or extrabookings
        /// </summary>
        /// <param name="customer"></param>
        /// <param name="booking"></param>
        /// <param name="bookingExtraSelection"></param>
        public StandardEmailTemplate(string toEmailAddress, int EmailTemplateID, Customer customer, Booking booking = null, BookingExtraSelection bookingExtraSelection = null)
        {

            EmailTemplate theTemplate;
            EmailTemplate Header;
            EmailTemplate Footer;

            using (PortugalVillasContext db = new PortugalVillasContext())
            {
                theTemplate = db.EmailTemplates.Find(EmailTemplateID);
                Header = db.EmailTemplates.Find(1);
                Footer = db.EmailTemplates.Find(2);
            }
            theAsposeMessage = new MailMessage();
            Property property = null;
            BookingExtra bookingExtra = null;

            EmailOutType theMainBody = new EmailOutType();

            //map all passed in object fields
            bool bookingToggle = false;
            bool bookingExtraToggle = false;
            bool combinedServicesToggle = false;


            //gets necessary

            //assign body
            if (booking == null)
            {
                bookingExtraToggle = true;
                bookingExtra = BookingExtra.GetBookingExtraByID(bookingExtraSelection.BookingExtraID);
                //theMainBody = new EmailOutType(EmailOutType.EmailOutEmailType.BookingExtraSelectionConfirm);
            }
            else if (booking != null && bookingExtraSelection == null)
            {
                bookingToggle = true;
                long propertyID = (long)booking.PropertyID;
                property = Property.GetPropertyByID(propertyID);
                //theMainBody = new EmailOutType(EmailOutType.EmailOutEmailType.BookingConfirm);//
            }
            else if (booking != null && bookingExtraSelection != null)
            {
                long propertyID = (long)booking.PropertyID;
                property = Property.GetPropertyByID(propertyID);
                bookingExtra = BookingExtra.GetBookingExtraByID(bookingExtraSelection.BookingExtraID);
                combinedServicesToggle = true;
                //theMainBody = new EmailOutType(EmailOutType.EmailOutEmailType.BookingAndBookingExtraSelectionConfirm);
            }







            //customer
            var customerFullName = customer.FirstName + " " + customer.LastName;

            //bookings and extras

            var prcRef = booking != null ? property.LegacyReference : bookingExtra.LegacyReference;

            string bookingPropertyOrSelectionName = booking != null ? property.PropertyName : bookingExtra.BookingExtraName;
            string bookingStartDate = booking != null ? Convert.ToDateTime(booking.StartDate.ToString()).ToString("dd/MM/yyyy") : Convert.ToDateTime(bookingExtraSelection.ExtraRentalDate.ToString()).ToString("dd/MM/yyyy");
            string bookingEndDate = booking != null ? Convert.ToDateTime(booking.EndDate.ToString()).ToString("dd/MM/yyyy") : new DateTime(1901, 01, 01).ToString("dd/MM/yyyy");
            string numberOfNights = booking != null ? booking.NumberOfNights.ToString() : "0";


            theAsposeMessage.To = customer.EmailAddress;
            theAsposeMessage.From = "*****@*****.**";

            theSMTPClient.Host = "smtp.gmail.com";
            theSMTPClient.Username = LoginEmailAddress;
            theSMTPClient.Password = EmailPassword;
            theSMTPClient.Port = 587;
            theSMTPClient.EnableSsl = true;
            theSMTPClient.SecurityMode = SmtpSslSecurityMode.Explicit;


            //set some email body   
            //set the body
            //subject
            //           
            theAsposeMessage.Subject = theTemplate.EmailSubject;
            theAsposeMessage.HtmlBody = "";

            //get correct email according to emailEnumID


            var temp = "";
            //string merges
            var fullName = customer != null ? customerFullName : "";
            var legacyRef = property != null ? property.LegacyReference : bookingExtra.LegacyReference;
            var bookStart = bookingStartDate != null ? bookingStartDate : "";
            var bookEnd = bookingEndDate != null ? bookingEndDate : "";
            var NoNights = numberOfNights != null ? numberOfNights : "";
            var reference = booking != null ? booking.BookingPRCReference : bookingExtraSelection.BookingExtraPRCReference;
            var bID = booking != null ? booking.BookingID.ToString() : "";
            var besID = bookingExtraSelection != null ? bookingExtraSelection.BookingExtraSelectionID.ToString() : "";
            
            var finalRentalPayment = booking != null ? booking.BookingPrice.ToString() : "";
            var finalRentalPaymentDate = "";
                if(booking != null)
                {
                   finalRentalPaymentDate =  booking.FinalRentalPaymentDueDate != null ? ((DateTime)booking.FinalRentalPaymentDueDate).ToString("dd/MM/yyyy") : "";
                }

            var rentalDeposit = booking != null ? booking.BreakageDeposit.ToString() : "";

            temp = String.Format(theTemplate.EmailTemplateBodyHTML, fullName, legacyRef, bookStart, bookEnd, NoNights, reference, finalRentalPaymentDate, bID, besID, finalRentalPayment, rentalDeposit);

            //booking request optional
            //if (bookingToggle == true && EmailTemplateID == 17)
            //{
            //    temp = String.Format(theTemplate.EmailTemplateBodyHTML, customerFullName, property.LegacyReference, bookingStartDate, bookingEndDate, numberOfNights, bookingExtraSelection.BookingExtraSelectionID);
            //}

            ////booking request forms standard
            //else if (bookingToggle == true // && EmailTemplateID == 3 || EmailTemplateID == 4 || EmailTemplateID == 5 || EmailTemplateID == 6
            //    )
            //{


            //    temp = String.Format(theTemplate.EmailTemplateBodyHTML, customerFullName, property.LegacyReference, booking.BookingPRCReference, ((DateTime)booking.FinalRentalPaymentDueDate).ToString("dd/MM/yyyy"));


            //}


            //else if (bookingExtraToggle == true)
            //{
            //    temp = String.Format(theTemplate.EmailTemplateBodyHTML, customerFullName, prcRef, bookingExtraSelection.BookingExtraSelectionID);

            //}
            //else if (combinedServicesToggle == true)
            //{
            //    temp = String.Format(theTemplate.EmailTemplateBodyHTML, customerFullName, booking.BookingID);

            //}






            //set the body
            var completeEmail = Header.EmailTemplateBodyHTML + temp + Footer.EmailTemplateBodyHTML;

            theAsposeMessage.HtmlBody = completeEmail;


        }
        public ActionResult ProcessLink()
        {
            var cus = new Customer
            {
                CustomerID = 10000,
                FirstName = "Zog"
            };

            return View("Index", cus);
        }
        public ActionResult GetBookingDetails()
        {
            Customer customer = new Customer();

            var testCus = Session["prc_customer"];

            if (testCus != null)
            {
                customer = (Customer)Session["prc_customer"];
            }

            CustomerBankDetail customerBankDetail = new CustomerBankDetail();
            var testBank = Session["prc_customerBankingDetail"];
            if (testBank != null)
            {
                customerBankDetail = (CustomerBankDetail)Session["prc_customerBankingDetail"];
            }


            var model = new FinalBookingDetailViewModel();
            model.Customer = customer;
            model.CustomerBankDetail = customerBankDetail;


            //test if any booking in the cart, if so pass them into the model
            List<Booking> bookings = new List<Booking>();


            if (Session["Cart_PropertyBookings"] != null)
            {
                bookings = (List<Booking>)Session["Cart_PropertyBookings"];
                model.Bookings = bookings;
                foreach (var booking in bookings)
                {
                    booking.Property = db.Properties.Find(booking.PropertyID);
                }
            }


            List<BookingExtraSelection> bes = new List<BookingExtraSelection>();

            if (Session["Cart_ExtraBookings"] != null)
            {
                bes = (List<BookingExtraSelection>)Session["Cart_ExtraBookings"];
                model.BookingExtraSelections = bes;
                foreach (var b in bes)
                {
                    b.BookingExtra = db.BookingExtras.Find(b.BookingExtraID);
                }
            }




            //test if any bes in the cart, if so pass them into the model

            List<AirportDestination>
                apd = AirportDestination.GetAllAirportDestinations().ToList();
            List<SelectListItem>
                airportDestinations = new List<SelectListItem>
                    ();

            /*   
               foreach (var airportDestination in apd)
               {
                   airportDestinations.Add(new SelectListItem { Text = @airportDestination.AirportPickupLocationName, Value = @airportDestination.AirportPickupLocationID.ToString() })
                       ;
               }*/


            airportDestinations.Add(new SelectListItem { Selected = true, Value = "1", Text="BoggleWoggle"});

            ViewBag.AirportDest = airportDestinations;
            ViewBag.Keywords = "cheap all inclusive holidays to portugal,holiday villa portugal,holiday apartments in portugal,portugal rental cottages,cheap package holidays to portugal, cheap holidays to portugal all inclusive";
            ViewBag.Title = "Search for villas townhouses, apartments in rural, seaside or city break settings. Book holidays in portugal's silver coast, in Foz do Arelho, Salir do Porto, Olho Marinho or Formigal. Book car rental, wine tours, site seeing tours with Portugal Rental Cottages. Rent Hyundai I20, Mitsubishi Lancer, Mitsubishi Grandis, go siteseeing with Lisbon City Tours or Sintra Palace Tours, get 9 Seater Van transport from the airport and have full Cleaning Service, Breakfast and Swimming Towels provided! Visit EXPO 98 & Ocenarium on your Portugal Holiday Rental!";
            return View(model);
        }
        public ActionResult ProcessForm(Customer obj)
        {


            using (var _db = new PortVillasContext())
            {
                var data = _db.Customers.Where(x => x.CustomerID == obj.CustomerID).SingleOrDefault();

                ViewData["currentCustomer"] = data;

                return PartialView("CustomerEdit", data);
            }



        }
        public ActionResult Create(Customer customer)
        {
            customer.CreationDate = DateTime.Now;
            if (customer.Country.ToLower() == "united kingdom")
            {
                customer.PreferredCurrency = "GBP";
                customer.PreferredCurrencySymbol = "£";
            }
            else
            {
                customer.PreferredCurrency = "EUR";
                customer.PreferredCurrencySymbol = "€";
            }

            db.Customers.Add(customer);
            db.SaveChanges();

            return this.RedirectToAction("Edit", customer);
            
        }
        public Customer CreateCustomer(Customer customer, PortugalVillasContext db)
        {




            //CHECK IF THERE'S ALREADY A CUSTOMER WITH THIS EMAIL ADDRESS FIRST!!!

            //end check

            //CHECK we ain't got anything for this customer in the Sessions already

            //end check


            //if not, add customer            

            //set up fields
            customer.CreationDate = DateTime.Now;
            customer.Test = false;



            //end

            db.Customers.Add(customer);

            if (db.SaveChanges() > 0)
            {
                //customer now has an ID if the save has worked
                return customer;

            }

            throw new Exception("Cannot create customer");

        }
        //
        // POST: /FinalBookingDetailGathering/Create


        public bool CreateCustomerAsPartOfSignUp(Customer customer)
        {

            PortugalVillasContext db = new PortugalVillasContext();

            if (ModelState.IsValid)
            {

                //CHECK IF THERE'S ALREADY A CUSTOMER WITH THIS EMAIL ADDRESS FIRST!!!

                //end check

                //CHECK we ain't got anything for this customer in the Sessions already

                //end check


                //if not, add customer            

                //set up fields

                customer.CreationDate = DateTime.Now;
                if (customer.Country.ToLower() == "united kingdom")
                {
                    customer.PreferredCurrency = "GBP";
                    customer.PreferredCurrencySymbol = "£";
                }
                else
                {
                    customer.PreferredCurrency = "EUR";
                    customer.PreferredCurrencySymbol = "€";
                }
                //end

                db.Customers.Add(customer);

                if (db.SaveChanges() > 0)
                {
                    //customer now has an ID if the save has worked
                    System.Web.HttpContext.Current.Session["prc_customer"] = customer;

                    return true;

                }



            }
            return false;
        }
        //  [Authorize(Roles = "Administrator, User")]
        public ActionResult ManageCustomer(Customer customer)
        {


            Customer previousCustomer = (Customer)Session["prc_previouscustomer"];
            customer.CustomerID = previousCustomer.CustomerID;


            if ((!CheckIfCustomerEmailAlreadyExists(customer.EmailAddress) &&
                !CheckIfUserExistsInSimpleMemberProvider(customer.EmailAddress)) || (previousCustomer.EmailAddress.ToLower().Trim() == customer.EmailAddress.ToLower().Trim()))
            {

                PortugalVillasContext _dbContext = new PortugalVillasContext();
                UsersContext _usersContext = new UsersContext();

                //get the old customer detailf from the session



                //update simplemembership provider too
                var user =
                    _usersContext.UserProfiles.Where(
                        x => x.UserName.ToLower().Trim() == previousCustomer.EmailAddress.ToLower().Trim())
                        .FirstOrDefault();

                user.UserName = customer.EmailAddress;

                //update customer and user
                try
                {
                    if (ModelState.IsValid)
                    {
                        _dbContext.Entry(customer).State = EntityState.Modified;
                        var objContext = ((IObjectContextAdapter)_dbContext).ObjectContext;

                        var refreshableObjects = (from entry in objContext.ObjectStateManager.GetObjectStateEntries(
                            EntityState.Added
                            | EntityState.Deleted
                            | EntityState.Modified
                            | EntityState.Unchanged)
                                                  where entry.EntityKey != null
                                                  select entry.Entity);

                        objContext.Refresh(RefreshMode.ClientWins, refreshableObjects);

                        //if it works, do the update for the userContext, else, don't as it failed
                        if (objContext.SaveChanges() > 0)
                        {
                            _usersContext.Entry(user).State = EntityState.Modified;
                            _usersContext.SaveChanges();

                            WebSecurity.Logout();

                            Session["prc_customer"] = customer;
                            //update the customer
                            return View("CustomerUpdateSuccess");
                        }

                    }
                }

                catch
            (DbUpdateConcurrencyException ex)
                {
                    var objContext = ((IObjectContextAdapter)_dbContext).ObjectContext;
                    var entry = ex.Entries.Single();

                    objContext.Refresh(RefreshMode.ClientWins, entry.Entity);
                    _dbContext.SaveChanges();


                }

            }


            //update the customer on result
            ViewBag.Title = "Manage Portugal Holiday Rentals Customer";
            return View("CustomerUpdateFailed");


        }
 public ActionResult Edit(Customer customer)
 {
     if (ModelState.IsValid)
     {
         db.Entry(customer).State = EntityState.Modified;
         db.SaveChanges();
         return RedirectToAction("Index");
     }
     return View(customer);
 }
 public ActionResult EditCustomer(Customer customer)
 {
     PortugalVillasContext db = new PortugalVillasContext();
     if (ModelState.IsValid)
     {
         db.Entry(customer).State = EntityState.Modified;
         db.SaveChanges();
         return RedirectToAction("Index");
     }
     return View(customer);
 }
        public void TestNewClassesAndInterfaces()
        {
            ///create a new concrete implementation of the 
            ///
            Customer testCusti = Customer.GetSingleCustomer(1);

            Customer blankCust = new Customer();
            CustomerBankDetail aBankDetail = CustomerBankDetail.GetCustomerBankDetailFromCustomer(testCusti);

            testCusti.EmailAddress = "*****@*****.**";
            testCusti.Town = "london";


            ICustomerSet testMeCustomer = new CustomerSet(testCusti);

            //right, so do we have the right events dere eh?

            var theEvents = testMeCustomer.theEventsChainToComplete.CheckRemainingEvents();
            var isItFalse = testMeCustomer.theEventsChainToComplete.CheckIfBookingComplete();
            var nextEvent = testMeCustomer.theEventsChainToComplete.CheckNextEvent();

            testMeCustomer.theEventsChainToComplete.EventComplete_RemoveFromRemainingEvents(nextEvent);


            var howManyEventsWeGot = testMeCustomer.theEventsChainToComplete.CheckRemainingEvents().Count();


        }
        public Booking CreateBooking(Booking booking, Property property, Customer theCustomer, PortugalVillasContext db)
        {

            //set default currency

            booking.BookingCurrencyConversionSymbol = theCustomer.PreferredCurrencySymbol;
            booking.BookingPreferredCurrency = theCustomer.PreferredCurrency;

            var cc = new CurrencyConverterController();



            //if the booking is not in GBP convert to EUROS



            //NEED TO CONVERT THE CURRENCY BASED ON WHETHER IT NEEDS TO BE EU OR UK





            int adults, kids, infants;

            adults = booking.NumberOfAdults ?? 0;
            kids = booking.NumberOfChildren ?? 0;
            infants = booking.NumberOfInfants ?? 0;


            booking.NumberOfAdults = adults;
            booking.NumberOfChildren = kids;
            booking.NumberOfInfants = infants;



            booking.CustomerID = theCustomer.CustomerID;
            booking.BookingTypeID = 1; //always a property booking

            booking.NumberOfGuests = adults + kids + infants;
            booking.TotalNumberOfMinors = kids + infants;
            booking.NumberOfNights = GeneralStaticHelperMethods.CalculateNoofNights(booking.StartDate, booking.EndDate);


            try
            {
                var exchangeRateFromDB = new CurrencyExchange();
                var baseCurrency = "";
                var newCurrency = "";

                booking.NumberOfNights = GeneralStaticHelperMethods.CalculateNoofNights(booking.StartDate,
                    booking.EndDate);
                booking.CalculateBookingPricingForAPropertyBooking(db);
                booking.CalculateExtrasPriceForAPropertyBooking(property, booking, db);
                //set this now because need to convert it
                booking.SetBreakageDepositDueDate(); //1 month before
                booking.SetBreakageDepositAmount(); //depends on property

                booking.BookingCurrencyLongName = "G.B. Pounds Sterling";
                //NOW CONVERT CURRENCY IF NECESSARY SO OTHER CALCS ARE CORRECT
                //CHANGE THIS!!! IT'S USING HIDDEN EXTERNAL DEPENDENY
                booking.BookingCurrencyConversionSymbol = "£";
                booking.BookingCurrencyExchangeRate = 1.00M;
                booking.BookingPreferredCurrency = "GBP";


                if (theCustomer.Country.ToLower() != "united kingdom" && ConfigurationManager.AppSettings["defaultCurrency"] == "GBP")
                {

                    //euro strategy
                    baseCurrency = "GBP";
                    newCurrency = "EUR";


                    //set exchange rate
                    booking.BookingCurrencyExchangeRate = exchangeRateFromDB.CurrencyExchangeRate;
                    booking.BookingCurrencyLongName = "Euros";
                    booking.BookingCurrencyConversionSymbol = exchangeRateFromDB.CurrencyExchangeSymbol;
                    booking.BookingCurrencyExchangeRate = exchangeRateFromDB.CurrencyExchangeRate;
                    booking.BookingPreferredCurrency = "EUR";

                    try
                    {
                        booking.BookingPrice = cc.ConvertCurrency(baseCurrency, newCurrency, (decimal)booking.BookingPrice);
                        booking.BookingCurrencyConversionPrice = booking.BookingPrice;

                        booking.TowelsPrice = cc.ConvertCurrency(baseCurrency, newCurrency, (decimal)booking.TowelsPrice);
                        booking.MidVactionCleaningPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.MidVactionCleaningPrice);
                        booking.SwimmingPoolHeatingPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.SwimmingPoolHeatingPrice);
                        booking.ExtraLininSetPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.ExtraLininSetPrice);
                        booking.BreakageDeposit = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.BreakageDeposit);
                        booking.CleaningPostVisitPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.CleaningPostVisitPrice);
                        booking.HeatingPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.HeatingPrice);





                    }
                    catch (Exception)
                    {

                        throw;
                    }

                }

                //ALL BOOKINGS FOR US SYSTEM IN USD
                else if (ConfigurationManager.AppSettings["defaultCurrency"] == "USD")
                {
                    baseCurrency = "GBP";
                    newCurrency = "USD";

                    exchangeRateFromDB =
                        db.CurrencyExchanges.First(x => x.CurrencyExchangeName == "GBP-USD");

                    //set exchange rate and currencies
                    booking.BookingCurrencyExchangeRate = exchangeRateFromDB.CurrencyExchangeRate;
                    booking.BookingCurrencyLongName = "U.S. Dollars";
                    booking.BookingCurrencyConversionSymbol = exchangeRateFromDB.CurrencyExchangeSymbol;
                    booking.BookingCurrencyExchangeRate = exchangeRateFromDB.CurrencyExchangeRate;
                    booking.BookingPreferredCurrency = "USD";




                }

                //do all cuurency conversions if not a UK booking
                if (theCustomer.Country.ToLower() != "united kingdom" || !ConfigurationManager.AppSettings["defaultCurrency"].Equals("GBP"))
                {
                    try
                    {
                        booking.BookingPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.BookingPrice);
                        booking.BookingCurrencyConversionPrice = booking.BookingPrice;

                        booking.TowelsPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.TowelsPrice);
                        booking.MidVactionCleaningPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.MidVactionCleaningPrice);
                        booking.SwimmingPoolHeatingPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.SwimmingPoolHeatingPrice);
                        booking.ExtraLininSetPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.ExtraLininSetPrice);
                        booking.BreakageDeposit = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.BreakageDeposit);
                        booking.CleaningPostVisitPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.CleaningPostVisitPrice);
                        booking.HeatingPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.HeatingPrice);


                        booking.HeatingUnitPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.HeatingUnitPrice);
                        booking.CleaningPostVisitUnitPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.CleaningPostVisitUnitPrice);
                        booking.ExtraLininSetUnitPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.ExtraLininSetUnitPrice);
                        booking.MidVactionCleaningUnitPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.MidVactionCleaningUnitPrice);
                        booking.SwimmingPoolHeatingUnitPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.SwimmingPoolHeatingUnitPrice);
                        booking.TowelsUnitPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.TowelsUnitPrice);
                        booking.FirewoodUnitPrice = cc.ConvertCurrency(baseCurrency, newCurrency,
                            (decimal)booking.FirewoodUnitPrice);

                    }
                    catch (Exception)
                    {

                        throw;
                    }
                }

            }
            catch (Exception ex)
            {
                /*Response.Redirect("http://" + Request.Url.Authority + "/Error/PropertyErrorSelection");*/
                //return RedirectToAction("PropertyErrorSelection", "Error", new { propID = CartBooking.PropertyID });                    
            }


            //CURRENCY MUST BE CONVERTED BEFORE THESE METHODS ARE CALLED

            //call meths to set dates
            booking.SetInitalDepositDate();
            booking.SetInitialDepositAmount();

            booking.SetRentalBalanceDueDate(); //1 month before
            booking.CalculateFinalRentalPaymentAmount(); //extrasSummedPrice + price - deposit


            booking.SetBreakageDepositRemittanceDate();
            booking.SetBreakageDepositRemittanceAmount();//1 month after trip end?
            //booking.SetFinalRentalPayment(); //price - deposit

            booking.SetHomeownerAndPRCComissionAmount(db);

            booking.CreationDate = DateTime.Now;


            booking.Cancelled = false;
            booking.Confirmed = false; //if they pay by paypal later, we can update;




            var refGenService = new ReferenceGenerationService();
            booking.BookingPRCReference = refGenService.GenerateBookingReference(booking, property);


            //if (ModelState.IsValid)
            //{

            db.Bookings.Add(booking);

            if (db.SaveChanges() > 0)
            {

                if (booking.BookingID > 0)
                {
                    booking.BookingPRCReference = refGenService.GenerateBookingReference(booking, property);

                    db.Entry(booking).State = EntityState.Modified;
                    db.SaveChanges();

                }





            }
            return booking;
        }
        public BookingExtraSelection CreateBookingExtraSelection(BookingExtraSelection bookingExtraSelection, BookingExtra extra, Customer theCustomer, PortugalVillasContext db)
        {
            bookingExtraSelection.BESCurrencyConversionSymbol = theCustomer.PreferredCurrencySymbol;
            bookingExtraSelection.BESPreferredCurrency = theCustomer.PreferredCurrency;

            var cc = new CurrencyConverterController();


            long? currentBookingTypeID = bookingExtraSelection.GetBookingExtraTypeIDFromBookingExtraSelection();
            bookingExtraSelection.CustomerID = theCustomer.CustomerID;

            //the price already needs to be assigned
            bookingExtraSelection.BESPrice = BookingExtraSelection.GetBookingExtraPrice(bookingExtraSelection, db);
            bookingExtraSelection.BESExtraServicesPrice = BookingExtraSelection.CalculateBookingExtraAdditionalCostsAndAssignToThisBooking(bookingExtraSelection, db);

            bookingExtraSelection.BESTotalServicesPrice = BookingExtraSelection.GetBookingExtraTotalServicesPrice(bookingExtraSelection, db);


            bookingExtraSelection.WhenCreated = DateTime.Now;

            //calc number of guests
            if (bookingExtraSelection.NumberOfGuests == null || bookingExtraSelection.NumberOfGuests == 0)
            {
                bookingExtraSelection.CalculateNoOfGuests();
            }

            //if not UK need to do currency conversion
            if (theCustomer.Country.ToLower() != "united kingdom" && ConfigurationManager.AppSettings["defaultCurrency"] == "GBP")
            {
                var baseCurrency = "GBP";
                var newCurrency = "EUR";

                var exchangeRateFromDB =
                    db.CurrencyExchanges.First(x => x.CurrencyExchangeName == "GBP-EUR");

                try
                {
                    bookingExtraSelection.BESPrice = cc.ConvertCurrency(baseCurrency, newCurrency, (decimal)bookingExtraSelection.BESPrice);
                    bookingExtraSelection.BESCurrencyConversionPrice = bookingExtraSelection.BESPrice;
                    bookingExtraSelection.BESExtraServicesPrice = cc.ConvertCurrency(baseCurrency, newCurrency, (decimal)bookingExtraSelection.BESExtraServicesPrice);
                    bookingExtraSelection.BESTotalServicesPrice = cc.ConvertCurrency(baseCurrency, newCurrency, (decimal)bookingExtraSelection.BESTotalServicesPrice);

                

                    //set exchange rate
                    bookingExtraSelection.BESCurrencyConversionSymbol = exchangeRateFromDB.CurrencyExchangeSymbol;
                    bookingExtraSelection.BESCurrencyExchangeRate = exchangeRateFromDB.CurrencyExchangeRate;
                    bookingExtraSelection.BESPreferredCurrency = "EUR";
                }
                catch (Exception)
                {

                    throw;
                }

            }

            else if (ConfigurationManager.AppSettings["defaultCurrency"] == "USD")
            {
                var baseCurrency = "GBP";
                var newCurrency = "USD";

                var exchangeRateFromDB =
                    db.CurrencyExchanges.First(x => x.CurrencyExchangeName == "GBP-USD");

                try
                {
                    bookingExtraSelection.BESPrice = cc.ConvertCurrency(baseCurrency, newCurrency, (decimal)bookingExtraSelection.BESPrice);
                    bookingExtraSelection.BESCurrencyConversionPrice = bookingExtraSelection.BESPrice;
                    bookingExtraSelection.BESExtraServicesPrice = cc.ConvertCurrency(baseCurrency, newCurrency, (decimal)bookingExtraSelection.BESExtraServicesPrice);
                    bookingExtraSelection.BESTotalServicesPrice = cc.ConvertCurrency(baseCurrency, newCurrency, (decimal)bookingExtraSelection.BESTotalServicesPrice);


                    //set exchange rate
                    bookingExtraSelection.BESCurrencyConversionSymbol = exchangeRateFromDB.CurrencyExchangeSymbol;
                    bookingExtraSelection.BESCurrencyExchangeRate = exchangeRateFromDB.CurrencyExchangeRate;
                    bookingExtraSelection.BESPreferredCurrency = "USD";
                }
                catch (Exception)
                {

                    throw;
                }
            }

            //generate reference
            var refGenService = new ReferenceGenerationService();
            bookingExtraSelection.BookingExtraPRCReference = refGenService.GenerateBESReference(bookingExtraSelection, extra);


            if (ModelState.IsValid)
            {
                db.BookingExtraSelections.Add(bookingExtraSelection);
                if (db.SaveChanges() > 0)
                {
                    //generate reference with ID
                    bookingExtraSelection.BookingExtraPRCReference = refGenService.GenerateBESReference(bookingExtraSelection, extra);

                    db.Entry(bookingExtraSelection).State = EntityState.Modified;
                    db.SaveChanges();
                    return bookingExtraSelection;

                }


            }
            throw new Exception();

        }
        public void TestNewMailAllTemplates()
        {
            Customer testCust = new Customer();
            testCust.FirstName = "Test";
            testCust.LastName = "Customer";
            testCust.EmailAddress = "*****@*****.**";

            Booking booking = new Booking();
            booking.StartDate = new DateTime(2014, 01, 04);
            booking.EndDate = new DateTime(2014, 01, 10);
            booking.NumberOfNights = 5;
            booking.PropertyID = 220;
            booking.BookingID = 513;


            BookingExtraSelection bes = new BookingExtraSelection();
            bes.ExtraRentalDate = new DateTime(2014, 01, 04);
            bes.ExtraReturnDate = new DateTime(2014, 01, 09);
            bes.BookingExtraID = 1;
            bes.BookingExtraSelectionID = 1; //primary key





            EmailController ec = new EmailController();
            /*var ok = ec.SendEmailToCustomer(testCust, , booking, bes);
            ok = ec.SendEmailToCustomer(testCust, EmailOutType.EmailOutEmailType.BookingConfirm, booking);
            ok = ec.SendEmailToCustomer(testCust, EmailOutType.EmailOutEmailType.BookingExtraSelectionConfirm, null, bes);*/




        }
        public CustomerBankDetail CreateCustomerBankDetail(CustomerBankDetail customerBankDetail, Customer customer, PortugalVillasContext db)
        {
            customer.CustomerID = customer.CustomerID;

            db.CustomerBankDetails.Add(customerBankDetail);
            //whack it in the session
            if (db.SaveChanges() > 0)
            {
                //customer now has an ID if the save has worked

            }



            return customerBankDetail;
        }
        public ActionResult TestBookingSteps(Customer cus, CustomerBankDetail bank, List<Booking> bookings = null, List<BookingExtraSelection> bookingExtraSelections = null, List<BookingParticipant> bookingParticipants = null)
        {
            Session["prc_customer"] = new Customer();


            using (var db = new PortugalVillasContext())
            {
                var eventService = new EventController();
                var bookingRepo = new FinalBookingDetailGatheringController();
                //CUSTOMER
                //does customer have ID? if not create new Customer
                if (cus.CustomerID.Equals(0))
                {
                    bookingRepo.CreateCustomer(cus, db);
                }
                else
                {
                    //update customer with new details
                    /*cus.BookingExtraSelections = null;
                    cus.Bookings = null;
                    cus.CreationDate = cus.CreationDate;

                    db.Customers.Attach(cus);
                    db.Entry(cus).State = EntityState.Modified;

                    try
                    {
                        db.SaveChanges();
                    }
                    catch (OptimisticConcurrencyException)
                    {
                       
                    }
                    */
                }

                //BANK DETAIL
                if (bank.CustomerBankDetailID.Equals(0))
                {
                    bookingRepo.CreateCustomerBankDetail(bank, cus, db);
                }
                else
                {
                    //update customer with new details
                    db.CustomerBankDetails.Attach(bank);
                    db.Entry(bank).State = EntityState.Modified;
                    db.SaveChanges();
                }




                //////////////////
                //BOOKING
                //create a parent booking thingy and link it
                BookingParentContainer parentContainer = new BookingParentContainer();
                parentContainer.CustomerID = cus.CustomerID;

                parentContainer = bookingRepo.CreateBookingParentContainer(parentContainer, db);


                foreach (var booking in bookings)
                {   //link to parent booking
                    booking.BookingParentContainerID = parentContainer.BookingParentContainerID;
                    //fill em out and push them to the DB


                  /*  bookingRepo.CreateBooking(booking, cus, db);*/

                    
                    var participantsThisRound =
                        bookingParticipants.Where(x => x.StepNo.Equals(bookingParticipants.Min(y => y.StepNo))).ToList();
                    //create the participants

                    foreach (var bookingParticipant in participantsThisRound)
                    {
                        if (bookingParticipant.BookingParticipantFirstName != "" && bookingParticipant.BookingParticipantFirstName != null 
                            && bookingParticipant.BookingParticipantLastName != "" &&
                             bookingParticipant.BookingParticipantLastName != null)
                        {
                            bookingRepo.CreateBookingParticipant(participantsThisRound, booking, db);
                        }        
                    }
                    


                    foreach (var bookingParticipant in participantsThisRound)
                    {
                        bookingParticipants.Remove(bookingParticipant);               
                    }
         

                    


                    //now check which booking form to send depending on location
                    string EventTypeID;
                    if (cus.Country.ToUpper() == "GB")
                    {
                        EventTypeID = "17";
                    }
                    else
                    {
                        EventTypeID = "20";
                    }

                    //email all docs
                    var form = new FormCollection();
                    form.Add("BookingID", booking.BookingID.ToString());
                    form.Add("EventTypeID", EventTypeID);

                    eventService.AddBookingEvent(form);

                    //email the user of the system 

                }


                foreach (var bes in bookingExtraSelections)
                {
                    //link to parent booking

                }
             

                //wipe cars = booking and bes
                Session["Cart_PropertyBookings"] = null;
                Session["Cart_ExtraBookings"] = null;


                return RedirectToAction("EndOfBookingProcess", "EndOfProcess");
            }

        }
        public ActionResult GetBookingDetails(Customer cus, CustomerBankDetail bank, List<Booking> bookings = null, List<BookingExtraSelection> bookingExtraSelections = null, List<BookingParticipant> bookingParticipants = null)
        {
            //set customer preferred currency symbol and currency

            using (var db = new PortugalVillasContext())
            {

                var account = new AccountController();
                var eventService = new EventController();
                var bookingRepo = new FinalBookingDetailGatheringController();
                //CUSTOMER
                //does customer have ID? if not create new Customer
                if (cus.CustomerID.Equals(0))
                {
                    var returnedCus = bookingRepo.CreateCustomer(cus, db);
                    cus = returnedCus;
                    Session["prc_customer"] = returnedCus;
                }
                else
                {
                    //update customer with new details
                    cus.BookingExtraSelections = null;
                    cus.Bookings = null;

                    //Do the UPDATE
                    if (ModelState.IsValid)
                    {
                        db.Entry(cus).State = EntityState.Modified;
                        var objContextCus = ((IObjectContextAdapter)db).ObjectContext;

                        var refreshableObjectsCus =
                            (from entry in objContextCus.ObjectStateManager.GetObjectStateEntries(
                                EntityState.Added
                                | EntityState.Deleted
                                | EntityState.Modified
                                | EntityState.Unchanged)
                             where entry.EntityKey != null
                             select entry.Entity);

                        objContextCus.Refresh(RefreshMode.ClientWins, refreshableObjectsCus);

                        //if it works, do the update for the userContext, else, don't as it failed
                        if (objContextCus.SaveChanges() > 0)
                        {
                            /*_usersContext.Entry(user).State = EntityState.Modified;
                            _usersContext.SaveChanges();*/
                        }



                    }
                }

                //BANK DETAIL
                if (bank.CustomerBankDetailID.Equals(0))
                {
                    var returnedBank = bookingRepo.CreateCustomerBankDetail(bank, cus, db);
                    Session["prc_customerBankingDetail"] = returnedBank;
                }
                else
                {
                    bank.CustomerID = cus.CustomerID;
                    db.Entry(bank).State = EntityState.Modified;

                    var objContext = ((IObjectContextAdapter)db).ObjectContext;

                    var refreshableObjects = (from entry in objContext.ObjectStateManager.GetObjectStateEntries(
                        EntityState.Added
                        | EntityState.Deleted
                        | EntityState.Modified
                        | EntityState.Unchanged)
                                              where entry.EntityKey != null
                                              select entry.Entity);

                    objContext.Refresh(RefreshMode.ClientWins, refreshableObjects);


                    if (ModelState.IsValid)
                    {

                        if (objContext.SaveChanges() > 0) ;
                        {
                            //great it worked
                        }
                    }

                }


                //parent
                BookingParentContainer parentContainer = new BookingParentContainer();
                parentContainer.CustomerID = cus.CustomerID;


                parentContainer = bookingRepo.CreateBookingParentContainer(parentContainer, db);
                //need to add booking reference then propagate to all others below


                //////////////////
                //BOOKING
                //create a parent booking thingy and link i
                if (bookings != null)
                {
                    foreach (var booking in bookings)
                    {
                        booking.Test = false; //it's real, from a customer
                        //convert if neededed

                        //link to parent booking
                        booking.BookingParentContainerID = parentContainer.BookingParentContainerID;
                        //fill em out and push them to the DB

                        var property = db.Properties.Find(booking.PropertyID);

                        booking.Property = property;

                        booking.BookingParticipants = null;
                        bookingRepo.CreateBooking(booking, property, cus, db);



                        var participantsThisRound =
                            bookingParticipants.Where(x => x.StepNo.Equals(bookingParticipants.Min(y => y.StepNo)))
                                .ToList();
                        //create the participants

                        var partstoAdd = new List<BookingParticipant>();
                        foreach (var bookingParticipant in participantsThisRound)
                        {
                            if (bookingParticipant.BookingParticipantFirstName != "" &&
                                bookingParticipant.BookingParticipantFirstName != null
                                && bookingParticipant.BookingParticipantLastName != "" &&
                                bookingParticipant.BookingParticipantLastName != null)
                            {
                                partstoAdd.Add(bookingParticipant);


                            }
                        }



                        foreach (var bookingParticipant in participantsThisRound)
                        {
                            bookingParticipants.Remove(bookingParticipant);
                        }

                        if (partstoAdd.Count > 0)
                        {
                            bookingRepo.CreateBookingParticipant(partstoAdd, booking, db); //create all ones we need
                        }


                        //now check which booking form to send depending on location
                        string EventTypeID;

                        TimeSpan dateRemainder = ((DateTime)booking.StartDate).Subtract(DateTime.Now);
                        int dateRemainderDays = dateRemainder.Days;


                        //late booking form

                        if (cus.Country.ToLower() == "united kingdom" && ConfigurationManager.AppSettings["defaultCurrency"] == "GBP")
                        {
                            if (dateRemainderDays <= 30)
                            {
                                //late uk
                                EventTypeID = "51";
                            }
                            else
                            {
                                //standard UK
                                EventTypeID = "37";
                            }

                        }
                        else
                        {

                            //convert all the bookings to euros                         
                            if (dateRemainderDays <= 30)
                            {
                                //late EU
                                EventTypeID = "52";
                            }
                            else
                            {
                                //standard EU
                                EventTypeID = "20";
                            }

                        }

                        //email all docs
                        var form = new FormCollection();
                        form.Add("BookingID", booking.BookingID.ToString());
                        form.Add("EventTypeID", EventTypeID);

                        eventService.AddBookingEvent(form);

                        //email the user of the system 

                    }
                }



                if (bookingExtraSelections != null)
                {
                    foreach (var bes in bookingExtraSelections)
                    {
                        //?????//convert all BES to EUROS 



                        var extraType = db.BookingExtras.Find((long)bes.BookingExtraID);
                        bes.BookingExtraID = extraType.BookingExtraID;
                        //link to parent booking
                        bes.BookingParentContainerID = parentContainer.BookingParentContainerID;


                        //need
                        //reference
                        //price fully done
                        //all extras on form fully taken care of for each one
                        var createdBes = bookingRepo.CreateBookingExtraSelection(bes, extraType, cus, db);

                        string EventTypeID = "";
                        //car 
                        if (extraType.BookingExtraTypeID == 1)
                        {
                            if (cus.Country.ToLower() == "united kingdom")
                            {
                                EventTypeID = "43";
                            }
                            else
                            {
                                EventTypeID = "62";
                            }
                        }
                        //wine
                        else if (extraType.BookingExtraTypeID == 2)
                        {
                            if (cus.Country.ToLower() == "united kingdom")
                            {
                                EventTypeID = "45";
                            }
                            else
                            {
                                EventTypeID = "60";
                            }
                        }
                        //airport
                        else if (extraType.BookingExtraTypeID == 3)
                        {
                            if (cus.Country.ToLower() == "united kingdom")
                            {
                                EventTypeID = "31";
                            }
                            else
                            {
                                EventTypeID = "61";
                            }
                        }
                        //tour
                        else if (extraType.BookingExtraTypeID == 4)
                        {
                            if (cus.Country.ToLower() == "united kingdom")
                            {
                                EventTypeID = "33";
                            }
                            else
                            {
                                EventTypeID = "63";
                            }
                        }

                        var form = new FormCollection();
                        form.Add("BookingExtraSelectionID", bes.BookingExtraSelectionID.ToString());
                        form.Add("EventTypeID", EventTypeID);

                        eventService.AddBookingExtraSelectionEvent(form);



                    }
                }


                //wipe cars = booking and bes
                Session["Cart_PropertyBookings"] = null;
                Session["Cart_ExtraBookings"] = null;


                //email the main user with the new services and bookings
                var prc = db.PRCInformations.First();

                MaintainanceMailer mail = new MaintainanceMailer();
                mail.theAsposeMessage.Subject = "You have new bookings:";
                mail.theAsposeMessage.HtmlBody =
                    "<h1>Automated email: You have a new booking</h1><br><p>Customer: ID - " + cus.CustomerID + "-" + cus.FirstName + " " +
                    cus.LastName
                    + "</p>";


                if (bookings != null)
                {
                    foreach (var booking in bookings)
                    {
                        mail.theAsposeMessage.HtmlBody += "<p>Booking: ID - " + booking.BookingID + "-" +
                                                          booking.Property.LegacyReference + " for " +
                                                          booking.NumberOfNights + " " + "nights starting " +
                                                          booking.StartDate.ToString().Substring(0, 10)
                                                          + "</p>";
                    }
                }


                if (bookingExtraSelections != null)
                {
                    foreach (var bes in bookingExtraSelections)
                    {
                        mail.theAsposeMessage.HtmlBody += "<p>Booking: ID - " + bes.BookingExtraSelectionID + " - " +
                                                          bes.BookingExtra.BookingExtraName + " for " + bes.NumberOfDays +
                                                          " " + "days starting " +
                                                          bes.ExtraRentalDate.ToString().Substring(0, 10) + " for " +
                                                          bes.NumberOfGuests + " people"
                                                          + "</p>";
                    }
                }

                var addressees = new MailAddressCollection();
                    addressees.Add(prc.PRCNotificationEmailAddress);
                    if (prc.PRCNotificationEmailAddress2 != null)
                        if (prc.PRCNotificationEmailAddress2 != "")
                        {
                            addressees.Add(prc.PRCNotificationEmailAddress2);
                        }
                    if (prc.PRCNotificationEmailAddress3 != null)
                        if (prc.PRCNotificationEmailAddress3 != "")
                        {
                            addressees.Add(prc.PRCNotificationEmailAddress3);
                        }

                    mail.SendEmail();
               


                return RedirectToAction("EndOfBookingProcess", "EndOfProcess");
            }

        }