// PUT api/BookingAPI/5
        public HttpResponseMessage PutBooking(long id, Booking booking)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            if (id != booking.BookingID)
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest);
            }

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

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException ex)
            {
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
            }

            return Request.CreateResponse(HttpStatusCode.OK);
        }
        public string GenerateBookingReference(Booking booking, Property prop)
        {
            string reference = "";

            reference += prop.LegacyReference + "/B" + booking.BookingID + "/" + ((DateTime)booking.StartDate).ToString("ddMMyyyy").Replace("/", "").Replace("-", "");
            
            return reference;

        }
 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;
 }
        // GET api/BookingAPI

     


        public Booking SetBookingPrices(Booking booking)
        {
            var prop = db.Properties.Find(booking.PropertyID);             
            booking.Property = prop;

            // new FinalBookingDetailGatheringController().CreateBooking(booking, prop, db);

            return booking;
        }
        /// <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 ActionResult Create(Booking booking)
        {
            if (ModelState.IsValid)
            {
                db.Bookings.Add(booking);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            ViewBag.BookingTypeID = new SelectList(db.BookingTypes, "BookingTypeID", "BookingType1", booking.BookingTypeID);
            ViewBag.CustomerID = new SelectList(db.Customers, "CustomerID", "Title", booking.CustomerID);
            ViewBag.PropertyID = new SelectList(db.Properties, "PropertyID", "LegacyReference", booking.PropertyID);
            return View(booking);
        }
        public int SendEmail(string emailAddress, int emailEnumID, Booking booking = null, BookingExtraSelection bes = null)
        {
            try
            {
                //StandardEmailTemplate template = new StandardEmailTemplate(emailAddress, emailEnumID, customer, booking, bes);
                //template.SendEmail();

                return 0;
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }
        // POST api/BookingAPI
        public HttpResponseMessage PostBooking(Booking booking)
        {
            if (ModelState.IsValid)
            {
                db.Bookings.Add(booking);
                db.SaveChanges();

                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, booking);
                response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = booking.BookingID }));
                return response;
            }
            else
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
        }
        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;
            }

        }
        internal void CalculateExtrasPriceForAPropertyBooking(Property property, Booking booking, PortugalVillasContext db)
        {
            var allTheServices = db.PropertyTypeServicesChargeInstances.Where(x => x.PropertyTypeID == property.PropertyTypeID).ToSafeReadOnlyCollection();

            var weeks = booking.NumberOfNights / 7;
            if (weeks == 0)
            {
                weeks = 1;
            }
            //towels           
            try
            {
                booking.TowelsPrice = (booking.NoOfTowelsRequested * allTheServices.First(x => x.PropertyTypeServicesID.Equals(5)).ServicePriceGBP) * weeks;
            }
            catch (Exception)
            {


            }
            //cleans
            try
            {
                booking.MidVactionCleaningPrice = booking.MidVactionCleaning * allTheServices.First(x => x.PropertyTypeServicesID.Equals(1)).ServicePriceGBP;
            }
            catch (Exception)
            {


            }
            //heating
            try
            {
                booking.HeatingPrice = booking.HeatingNoNights * allTheServices.First(x => x.PropertyTypeServicesID.Equals(3)).ServicePriceGBP;
            }
            catch (Exception)
            {

            }
            //cleaning laundry post visit
            try
            {
                booking.CleaningPostVisitPrice = allTheServices.First(x => x.PropertyTypeServicesID.Equals(4)).ServicePriceGBP;
            }
            catch (Exception)
            {


            }
            try
            {
                //swimming pool heating
                booking.SwimmingPoolHeatingPrice = booking.SwimmingPoolHeating * allTheServices.First(x => x.PropertyTypeServicesID.Equals(6)).ServicePriceGBP;
            }

            catch (Exception)
            {


            }
            try
            {
                //linen set    
                booking.ExtraLininSetPrice = (booking.ExtraLininSet * allTheServices.First(x => x.PropertyTypeServicesID.Equals(7)).ServicePriceGBP);
            }

            catch (Exception)
            {


            }

            //add all unit prices
            try
            {
                booking.CleaningPostVisitUnitPrice = allTheServices.First(x => x.PropertyTypeServicesID.Equals(4)).ServicePriceGBP;
                booking.ExtraLininSetUnitPrice= ( allTheServices.First(x => x.PropertyTypeServicesID.Equals(7)).ServicePriceGBP);
                booking.HeatingUnitPrice = allTheServices.First(x => x.PropertyTypeServicesID.Equals(3)).ServicePriceGBP;
                booking.MidVactionCleaningUnitPrice = allTheServices.First(x => x.PropertyTypeServicesID.Equals(1)).ServicePriceGBP;
                booking.SwimmingPoolHeatingUnitPrice = allTheServices.First(x => x.PropertyTypeServicesID.Equals(6)).ServicePriceGBP;
                booking.TowelsUnitPrice = allTheServices.First(x => x.PropertyTypeServicesID.Equals(5)).ServicePriceGBP;
                booking.FirewoodUnitPrice = allTheServices.First(x => x.PropertyTypeServicesID.Equals(16)).ServicePriceGBP;
            }
            catch (Exception)
            {
                
       
            }

          

        }
        public Booking ConvertCartBookingToPersistenceBooking(Booking theCartBooking)
        {
            Booking thePersistenceBooking = new Booking();

            return thePersistenceBooking;

        }
        public Booking ConvertPropertyFormBookingToCartBooking(FormCollection theBooking)
        {
            try
            {
                Booking theCartBooking = new Booking();

                //change the form into a BookingObject
                if (theBooking["bookingModalStartDatePicker"] != "" && theBooking["bookingModalStartDatePicker"] != null)
                {
                    theCartBooking.StartDate = DateTime.ParseExact(theBooking["bookingModalStartDatePicker"], "dd-MM-yyyy", System.Globalization.CultureInfo.CreateSpecificCulture("en-GB"));
                }
                if (theBooking["bookingModalEndDatePicker"] != "" && theBooking["bookingModalEndDatePicker"] != null)
                {
                    theCartBooking.EndDate = DateTime.ParseExact(theBooking["bookingModalEndDatePicker"], "dd-MM-yyyy", System.Globalization.CultureInfo.CreateSpecificCulture("en-GB"));
                }
                if (Int32.Parse(theBooking["bookingModalPropertyID"]) != 0 && (theBooking["bookingModalPropertyID"] != null))
                {
                    theCartBooking.PropertyID = Int32.Parse(theBooking["bookingModalPropertyID"]);
                }
                if (theBooking["prcReference"] != "" && theBooking["prcReference"] != null)
                {
                    theCartBooking.BookingPRCReference = theBooking["prcReference"].ToString();
                }


                if (theBooking["Booking_Towels"] != "" && theBooking["Booking_Towels"] != null)
                {
                    theCartBooking.NoOfTowelsRequested = Convert.ToInt32(theBooking["Booking_Towels"].ToString());
                }
                if (theBooking["Booking_MidVacationCleaning"] != "" && theBooking["Booking_MidVacationCleaning"] != null)
                {
                    theCartBooking.MidVactionCleaning = Convert.ToInt32(theBooking["Booking_MidVacationCleaning"].ToString());
                }
                if (theBooking["Booking_SwimmingPoolHeating"] != "" && theBooking["Booking_SwimmingPoolHeating"] != null)
                {
                    theCartBooking.SwimmingPoolHeating= Convert.ToInt32(theBooking["Booking_SwimmingPoolHeating"].ToString());
                }
                if (theBooking["Booking_ExtraLinen"] != "" && theBooking["Booking_ExtraLinen"] != null)
                {
                    theCartBooking.ExtraLininSet = Convert.ToInt32(theBooking["Booking_ExtraLinen"].ToString());
                }
                if (theBooking["Booking_Heating"] != "" && theBooking["Booking_Heating"] != null)
                {
                    theCartBooking.HeatingNoNights = Convert.ToInt32(theBooking["Booking_Heating"].ToString());
                }

                theCartBooking.BookingGUID = Guid.NewGuid();
                

                //takes a cart booking object and converts to a 'proper' booking that can be stored in the Db.
                return theCartBooking;
            }
            catch (Exception ex)
            {
                throw ex;

            }

        }
        public Event CreateBookingEventViaFactory(long eventTypeID, Booking booking)
        {

            var returnEvent = CreateEventViaFactory(eventTypeID);
            returnEvent.BookingID = booking.BookingID;



            return returnEvent;
        }
Beispiel #15
0
        internal void CalculateExtrasPriceForAPropertyBooking(Property property, Booking booking, PortugalVillasContext db)
        {
            var allTheServices = db.PropertyTypeServicesChargeInstances.Where(x => x.PropertyTypeID == property.PropertyTypeID).ToSafeReadOnlyCollection();

            var weeks = booking.NumberOfNights / 7;

            if (weeks == 0)
            {
                weeks = 1;
            }
            //towels
            try
            {
                booking.TowelsPrice = (booking.NoOfTowelsRequested * allTheServices.First(x => x.PropertyTypeServicesID.Equals(5)).ServicePriceGBP) * weeks;
            }
            catch (Exception)
            {
            }
            //cleans
            try
            {
                booking.MidVactionCleaningPrice = booking.MidVactionCleaning * allTheServices.First(x => x.PropertyTypeServicesID.Equals(1)).ServicePriceGBP;
            }
            catch (Exception)
            {
            }
            //heating
            try
            {
                booking.HeatingPrice = booking.HeatingNoNights * allTheServices.First(x => x.PropertyTypeServicesID.Equals(3)).ServicePriceGBP;
            }
            catch (Exception)
            {
            }
            //cleaning laundry post visit
            try
            {
                booking.CleaningPostVisitPrice = allTheServices.First(x => x.PropertyTypeServicesID.Equals(4)).ServicePriceGBP;
            }
            catch (Exception)
            {
            }
            try
            {
                //swimming pool heating
                booking.SwimmingPoolHeatingPrice = booking.SwimmingPoolHeating * allTheServices.First(x => x.PropertyTypeServicesID.Equals(6)).ServicePriceGBP;
            }

            catch (Exception)
            {
            }
            try
            {
                //linen set
                booking.ExtraLininSetPrice = (booking.ExtraLininSet * allTheServices.First(x => x.PropertyTypeServicesID.Equals(7)).ServicePriceGBP);
            }

            catch (Exception)
            {
            }

            //add all unit prices
            try
            {
                booking.CleaningPostVisitUnitPrice   = allTheServices.First(x => x.PropertyTypeServicesID.Equals(4)).ServicePriceGBP;
                booking.ExtraLininSetUnitPrice       = (allTheServices.First(x => x.PropertyTypeServicesID.Equals(7)).ServicePriceGBP);
                booking.HeatingUnitPrice             = allTheServices.First(x => x.PropertyTypeServicesID.Equals(3)).ServicePriceGBP;
                booking.MidVactionCleaningUnitPrice  = allTheServices.First(x => x.PropertyTypeServicesID.Equals(1)).ServicePriceGBP;
                booking.SwimmingPoolHeatingUnitPrice = allTheServices.First(x => x.PropertyTypeServicesID.Equals(6)).ServicePriceGBP;
                booking.TowelsUnitPrice   = allTheServices.First(x => x.PropertyTypeServicesID.Equals(5)).ServicePriceGBP;
                booking.FirewoodUnitPrice = allTheServices.First(x => x.PropertyTypeServicesID.Equals(16)).ServicePriceGBP;
            }
            catch (Exception)
            {
            }
        }
        public void TestPricingMethods()
        {

            var db = new PortugalVillasContext();

            Booking testBooks = new Booking { PropertyID = 220, StartDate = new DateTime(2014, 01, 01), EndDate = new DateTime(2014, 01, 08) };

            var price = testBooks.CalculateBookingPricingForAPropertyBooking(db);

            //test for every day in a booking (e.g. range)
            var test = 0;

        }
        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 byte[] CreateDocument(Customer customer, PRCDocument.PRCDocumentType type, Booking booking = null, BookingExtraSelection bes = null)
        {
            try
            {
                PRCDocument aDocument = new PRCDocument(customer, type, booking, bes);

                var filepathAndName = MergeDocumentWithDatabaseAndReturnFilePath(customer, type, booking, bes);

                var documentBytes = System.IO.File.ReadAllBytes(filepathAndName);

                return documentBytes;
            }
            catch (Exception ex)
            {
                throw;
            }
        }
        public List<BookingParticipant> CreateBookingParticipant(List<BookingParticipant> bookingParticipants, Booking booking, PortugalVillasContext db)
        {
            //assign fields

            foreach (var bookingParticipant in bookingParticipants)
            {

                bookingParticipant.BookingID = booking.BookingID;
                bookingParticipant.BookingParticipantWhenCreated = DateTime.Now;

                //GeneralStaticHelperMethods.IsPersonAdultChildOrInfant(bookingParticipant);

                db.BookingParticipants.Add(bookingParticipant);


            }
            db.SaveChanges();

            return bookingParticipants;

        }
        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 ActionResult DetailGatheringEventChain()
        {
            //create the lists we need 

            Dictionary<BookingDataCollectionEventType.Types, BookingDataCollectionEventType.PRCDataGatheringControllerActionRedirect> DataThatNeedsGetting = CreateListOfFieldsToGatherBasedOnSessionData();

            foreach (var dataRedirect in DataThatNeedsGetting)
            {
                //if it's a booking or an extra, whack it into the session so we know which one we're using and can pull the vars                

                if (dataRedirect.Key == BookingDataCollectionEventType.Types.Booking)
                {

                    Session["CurrentBookingDataGathering"] = new Booking
                    {
                        PropertyID = (long?)dataRedirect.Value.PropertyID,
                        BookingPRCReference = dataRedirect.Value.PRCRef.ToString(),
                        StartDate = dataRedirect.Value.StartDate,
                        EndDate = dataRedirect.Value.EndDate,
                        ExtraLininSet = dataRedirect.Value.NoLinen,
                        SwimmingPoolHeating = dataRedirect.Value.NoSwimmingPool,
                        // SpecialRequests = dataRedirect.Value.SpecialRequests,
                        NoOfTowelsRequested = dataRedirect.Value.NoTowels,
                        BookingPrice = dataRedirect.Value.Price


                    };
                }
                else if (dataRedirect.Key == BookingDataCollectionEventType.Types.BookingExtraSelection)
                {
                    Session["CurrentBookingExtraDataGathering"] = new BookingExtraSelection
                    {
                        BookingExtraPRCReference = dataRedirect.Value.PRCRef.ToString(),
                        ExtraRentalDate = dataRedirect.Value.StartDate,
                        ExtraReturnDate = dataRedirect.Value.EndDate,
                        BookingExtraID = (long)dataRedirect.Value.ExtraTypeID,
                        BESPrice = dataRedirect.Value.Price
                    };

                }

                return RedirectToAction(dataRedirect.Value.Action, dataRedirect.Value.Controller);
            }



            //populate the session items with those lists






            if (DataThatNeedsGetting.Count == 0)
            //we're done
            {
                return View();
            }
            //remove all items from our list that need gathering

            //end


            return RedirectToAction("DetailGatheringEventChain");


        }
        public Booking ConvertPropertyFormBookingToCartBooking(FormCollection theBooking)
        {
            try
            {
                Booking theCartBooking = new Booking();

                //change the form into a BookingObject
                if (theBooking["bookingModalStartDatePicker"] != "" && theBooking["bookingModalStartDatePicker"] != null)
                {
                    theCartBooking.StartDate = DateTime.Parse(theBooking["bookingModalStartDatePicker"]);
                }
                if (theBooking["bookingModalEndDatePicker"] != "" && theBooking["bookingModalEndDatePicker"] != null)
                {
                    theCartBooking.EndDate = DateTime.Parse(theBooking["bookingModalEndDatePicker"]);
                }
                if (Int32.Parse(theBooking["propertyID"]) != 0 && (theBooking["propertyID"] != null))
                {
                    theCartBooking.PropertyID = Int32.Parse(theBooking["propertyID"]);
                }
                if (theBooking["prcReference"] != "" && theBooking["prcReference"] != null)
                {
                    theCartBooking.BookingPRCReference = theBooking["prcReference"].ToString();
                }

                //takes a cart booking object and converts to a 'proper' booking that can be stored in the Db.
                return theCartBooking;
            }
            catch (Exception ex)
            {
                throw ex;

            }
        }
        /// <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 EventManagementServiceBooking(Booking booking)
 {
     booking = booking;
 }
        public ActionResult QuickCreateBooking(Booking booking, List<BookingParticipant> bookingParticipants)
        {
            //setup
            

            booking.Test = false;

            var bookingRepo = new FinalBookingDetailGatheringController();

            BookingParentContainer parentContainer = new BookingParentContainer();
            parentContainer.CustomerID = booking.CustomerID;


            parentContainer = bookingRepo.CreateBookingParentContainer(parentContainer, db);
            db.BookingParentContainers.Add(parentContainer);

            //create booking
            var property = db.Properties.Find(booking.PropertyID);
            var customer = db.Customers.Find(booking.CustomerID);
            booking.Property = property;
            booking.BookingParentContainer = parentContainer;
            booking.BookingCurrencyConversionSymbol = customer.PreferredCurrencySymbol;
            booking.BookingPreferredCurrency = customer.PreferredCurrency;
            
            booking.BookingParticipants = null;
            bookingRepo.CreateBooking(booking, property, customer, db);
            //create parts           
            booking.Cancelled = false;
            booking.Confirmed = true;
            booking.Test = false;

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



            var partstoAdd = new List<BookingParticipant>();
            if (bookingParticipants != null)
            {

                foreach (var bookingParticipant in bookingParticipants)
                {
                    if (bookingParticipant.BookingParticipantFirstName != "" &&
                        bookingParticipant.BookingParticipantFirstName != null
                        && bookingParticipant.BookingParticipantLastName != "" &&
                        bookingParticipant.BookingParticipantLastName != null &&
                        bookingParticipant.BookingParticipantAge != "")
                    {
                        bookingParticipant.BookingID = booking.BookingID;
                        partstoAdd.Add(bookingParticipant);
                    }

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



            return View("QuickCreateBookingWrapper");
        }
        public int CurrencyExchange()
        {
            var cc = new CurrencyConverterController();


            Booking book = new Booking();


            book.BookingPreferredCurrency = "GBP";
            book.BookingCurrencyConversionPrice = 1M;
            book.BookingCurrencyConversionSymbol = "£";
            book.BookingCurrencyExchangeRate = 1M;

            var result = cc.ConvertCurrency("GBP", "EUR", 1.00M);


            return 0;
        }
        //insert a booking
        private static bool CreateBooking(Booking aBooking)
        {
            PortugalVillasContext _db = new PortugalVillasContext();

            _db.Bookings.Add(aBooking);

            if (_db.SaveChanges() > 0)
            {

                return true;
            };
            return false;

        }
        public static IEnumerable<DateTime> GetDateConfirmedRangeForABooking(Booking aBooking)
        {
            //check the booking is confirmed
            if (aBooking.Confirmed == true)
            {
                //use null coalescing operator
                DateTime startingDate = aBooking.StartDate ?? DateTime.Parse("1/1/1901 00:00:00 AM");
                DateTime endingDate = aBooking.EndDate ?? DateTime.Parse("1/1/1901 00:00:00 AM");


                while (startingDate <= endingDate)
                {
                    yield return startingDate;
                    startingDate = startingDate.AddDays(1);
                }

            }


        }
            //takes 
            public Document(Booking aBooking)
            {
                //get the type of document
                //pull all customer details from booking

            }
        private string MergeDocumentWithDatabaseAndReturnFilePath(Customer customer, PRCDocument.PRCDocumentType type, Booking booking = null, BookingExtraSelection bes = null)
        {
            //BOOKING needs to have a propertyID, BES needs to have the ExtraID!!!!


            var db = new PortugalVillasContext();
            var bookPartTable = new DataTable();
            var besPartTable = new DataTable();
            var extraAttributes = new DataTable();

            PRCDocument aDocument = new PRCDocument(type);
            aDocument = InitialSetUpPRCDocument(type);

            //tables for merge

            List<DataTable> tablesForMerge_PreMerge = new List<DataTable>();


            PRCDocumentData theDocumentDataInstance = new PRCDocumentData();

            //PRC
            tablesForMerge_PreMerge.Add(
                theDocumentDataInstance.GetPRCDocumentData(
                    PRCDocumentData.PRCReturnDataTableWrapperTypes.StandardPRCInformation, 1));

            //CUSTOMERS
            tablesForMerge_PreMerge.Add(
                theDocumentDataInstance.GetPRCDocumentData(PRCDocumentData.PRCReturnDataTableWrapperTypes.CustomerByCustomerID,
                    customer.CustomerID)); //works*/
            //CUSTOMER BANK DETAILS
            
            
            
            if (booking != null)
            {
                tablesForMerge_PreMerge.Add(
                theDocumentDataInstance.GetPRCDocumentData(
                    PRCDocumentData.PRCReturnDataTableWrapperTypes.CustomerBankDetailByCustomerID, customer.CustomerID));


                //COMMISSION FOR YEAR            
                var TotalCommisssion = new DataTable();
                TotalCommisssion.Columns.Add("TotalCommissionThisYear");
                TotalCommisssion.Columns.Add("CommissionDateTime");
                DataRow _row = TotalCommisssion.NewRow();
                _row["TotalCommissionThisYear"] = db.Bookings.Where(x => x.PropertyID == booking.PropertyID).Sum(x => x.CommissionAmount);
                _row["CommissionDateTime"] = DateTime.Now.ToShortDateString();
                TotalCommisssion.Rows.Add(_row);

                tablesForMerge_PreMerge.Add(TotalCommisssion);

                //BOOKING
                tablesForMerge_PreMerge.Add(
                    theDocumentDataInstance.GetPRCDocumentData(PRCDocumentData.PRCReturnDataTableWrapperTypes.BookingByBookingID, booking.BookingID));


                //PROPERTY
                tablesForMerge_PreMerge.Add(
                    theDocumentDataInstance.GetPRCDocumentData(PRCDocumentData.PRCReturnDataTableWrapperTypes.PropertyByPropertyID,
                        (long)booking.PropertyID));


                //TOWN
                tablesForMerge_PreMerge.Add(
                    theDocumentDataInstance.GetPRCDocumentData(
                        PRCDocumentData.PRCReturnDataTableWrapperTypes.PropertyTownByPropertyTownID, Convert.ToInt64(db.Properties.Where(x => x.PropertyID == booking.PropertyID).FirstOrDefault().PropertyTownID)));

                //REGION
                tablesForMerge_PreMerge.Add(
                    theDocumentDataInstance.GetPRCDocumentData(
                        PRCDocumentData.PRCReturnDataTableWrapperTypes.PropertyRegionByPropertyRegionID, db.Properties.Where(x => x.PropertyID == booking.PropertyID).FirstOrDefault().PropertyTown.PropertyRegionID));

                //BOOKINGPART
                bookPartTable = theDocumentDataInstance.GetPRCDocumentData(
                    PRCDocumentData.PRCReturnDataTableWrapperTypes.BookingParticipantByBookingID, booking.BookingID);
                bookPartTable.TableName = "BOOKINGPARTTABLE";
                tablesForMerge_PreMerge.Add(bookPartTable);

                if (booking.BookingParentContainerID != null)
                {
                    //PARENT
                    tablesForMerge_PreMerge.Add(
                        theDocumentDataInstance.GetPRCDocumentData(
                            PRCDocumentData.PRCReturnDataTableWrapperTypes.StandardBookingParentContainer,
                            (long)booking.BookingParentContainerID));
                }




                BookingParentContainer bookingParentContainer;

                //PROPERTY OWNER
                tablesForMerge_PreMerge.Add(
              theDocumentDataInstance.GetPRCDocumentData(
                  PRCDocumentData.PRCReturnDataTableWrapperTypes.StandardPropertyOwner, (long)booking.PropertyID));
            }




            if (bes != null)
            {

                //get top level item for same sub type to pull out attributes:
                long? extraIDforAtts = null;

                try
                {
                    extraIDforAtts = db.BookingExtras.Where(x =>
                                    x.TopLevelItem == true)
                                    .Where(y => y.BookingExtraSubTypeID == bes.BookingExtra.BookingExtraSubTypeID)
                                    .FirstOrDefault().BookingExtraID;
                }
                catch (Exception)
                {
                     extraIDforAtts = db.BookingExtras.Where(x =>
                                    x.MaxPersons > 10)
                                    .Where(y => y.BookingExtraSubTypeID == bes.BookingExtra.BookingExtraSubTypeID)
                                    .FirstOrDefault().BookingExtraID;
                    
                }

                //BES
                tablesForMerge_PreMerge.Add(
                    theDocumentDataInstance.GetPRCDocumentData(
                        PRCDocumentData.PRCReturnDataTableWrapperTypes.BookingExtraSelectionByBookingExtraSelectionID, bes.BookingExtraSelectionID));

                //BEST PART (name etc)

                besPartTable = theDocumentDataInstance.GetPRCDocumentData(
                    PRCDocumentData.PRCReturnDataTableWrapperTypes.BookingExtraParticipantByBookingExtraSelectionID,
                    bes.BookingExtraSelectionID);
                besPartTable.TableName = "BESPARTTABLE";

                tablesForMerge_PreMerge.Add(besPartTable);
                //EXTRA
                tablesForMerge_PreMerge.Add(
                    theDocumentDataInstance.GetPRCDocumentData(
                        PRCDocumentData.PRCReturnDataTableWrapperTypes.BookingExtraByBookingExtraID, bes.BookingExtraID));

                //PARENT
                if (bes.BookingParentContainerID != null)
                {
                    tablesForMerge_PreMerge.Add(
                        theDocumentDataInstance.GetPRCDocumentData(
                      PRCDocumentData.PRCReturnDataTableWrapperTypes.StandardBookingParentContainer, (long)bes.BookingParentContainerID));
                }

                //ATTRIBUTES

                if (extraIDforAtts != null)
                {
                    extraAttributes = theDocumentDataInstance.GetPRCDocumentData(
                        PRCDocumentData.PRCReturnDataTableWrapperTypes.BookingExtraAttributesByBookingExtraID,
                        (long)extraIDforAtts);
                    extraAttributes.TableName = "ATTRIBUTETABLE";
                }


                //test if there is a related booking / property IF it's a solo BES event
                if(booking != null)
                {
                    if(bes.BookingParentContainerID != 0)
                    {
                        booking = db.Bookings.Where(x => x.BookingParentContainerID == bes.BookingParentContainerID).FirstOrDefault();

                        //PROPERTY
                        tablesForMerge_PreMerge.Add(
                            theDocumentDataInstance.GetPRCDocumentData(PRCDocumentData.PRCReturnDataTableWrapperTypes.PropertyByPropertyID,
                                (long)booking.PropertyID));


                        //TOWN
                        tablesForMerge_PreMerge.Add(
                            theDocumentDataInstance.GetPRCDocumentData(
                                PRCDocumentData.PRCReturnDataTableWrapperTypes.PropertyTownByPropertyTownID, Convert.ToInt64(db.Properties.Where(x => x.PropertyID == booking.PropertyID).FirstOrDefault().PropertyTownID)));

                        //REGION
                        tablesForMerge_PreMerge.Add(
                            theDocumentDataInstance.GetPRCDocumentData(
                                PRCDocumentData.PRCReturnDataTableWrapperTypes.PropertyRegionByPropertyRegionID, db.Properties.Where(x => x.PropertyID == booking.PropertyID).FirstOrDefault().PropertyTown.PropertyRegionID));

                    }


                }
            }








            List<DataTable> tablesForMerge = new List<DataTable>();

            foreach (var dataTable in tablesForMerge_PreMerge)
            {
                if (dataTable.Rows.Count > 0)
                {

                    DataTable tableToModAndReturn = dataTable.Copy();
                    //clone every table
                    DataTable dtCloned = dataTable.Copy();
                    //change every datetime column to a string

                    //for every dateTime colum, load into new table
                    foreach (DataColumn col in dtCloned.Columns)
                    {
                        var theType = dtCloned.Columns[col.ColumnName].DataType.ToString();

                        if (dtCloned.Columns[col.ColumnName].DataType.ToString() == "DateTime")
                        {
                            //change the type
                            var name = col.ColumnName;
                            var value = "";
                            if (dtCloned.Rows[0][col].ToString().Count() >= 10)
                            {
                                value = /*DateTime.Parse(*/ Convert.ToDateTime(dtCloned.Rows[0][col].ToString()).ToString("dd/MM/yyyy");
                                //).ToString("dd/MM/yyyy");
                            }


                            tableToModAndReturn.Columns.Remove(name);
                            tableToModAndReturn.Columns.Add(new DataColumn
                            {
                                ColumnName = name,
                                DefaultValue = value
                            });
                        }
                    }



                    tablesForMerge.Add(tableToModAndReturn);
                }
            }


            Aspose.Words.Document theDoc = new Aspose.Words.Document(HttpRuntime.AppDomainAppPath + aDocument.ServerDocumentURL);
            //execute the merges            
            foreach (var dataTable in tablesForMerge)
            {
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    theDoc.MailMerge.Execute(dataTable.Rows[i]);
                }
            }

            //N.B The regions in the document need to correspond to the table name for the below merge to work
            theDoc.MailMerge.ExecuteWithRegions(bookPartTable);
            theDoc.MailMerge.ExecuteWithRegions(besPartTable);
            theDoc.MailMerge.ExecuteWithRegions(extraAttributes);

            string filepathAndName = aDocument.SavePath + aDocument.FileName + ".pdf";
            theDoc.Save(aDocument.SavePath + aDocument.FileName + ".pdf");


            db.Dispose();


            return filepathAndName;
        }
        public ActionResult Edit(Booking booking)
        {
            var oldbook = db.Bookings.Where(x => x.BookingID == booking.BookingID).FirstOrDefault();

            booking.CreationDate = oldbook.CreationDate;
            booking.LastUpdated = oldbook.LastUpdated;

            if (ModelState.IsValid)
            {
                using (var _db = new PortugalVillasContext())
                {
                    _db.Bookings.Attach(booking);
                    _db.Entry(booking).State = EntityState.Modified;
                    _db.SaveChanges();
                    ViewBag.BookingParentContainerID = new SelectList(db.BookingParentContainers,
                        "BookingParentContainerID", "OverallBookingReference", booking.BookingParentContainerID);
                    ViewBag.CustomerID = new SelectList(db.Customers, "CustomerID", "Title", booking.CustomerID);
                    ViewBag.PropertyID = new SelectList(db.Properties, "PropertyID", "LegacyReference",
                        booking.PropertyID);

                    return View("SingleBookingIndex", db.Bookings.Include(x => x.Customer).FirstOrDefault(x => x.BookingID == booking.BookingID));
                }
            }

            ViewBag.BookingParentContainerID = new SelectList(db.BookingParentContainers, "BookingParentContainerID", "OverallBookingReference", booking.BookingParentContainerID);
            ViewBag.CustomerID = new SelectList(db.Customers, "CustomerID", "Title", booking.CustomerID);
            ViewBag.PropertyID = new SelectList(db.Properties, "PropertyID", "LegacyReference", booking.PropertyID);
            return View("SingleBookingIndex", db.Bookings.Include(x => x.Customer).FirstOrDefault(x => x.BookingID == booking.BookingID));
        }