Beispiel #1
0
        public void TestDataGatheringMethods()
        {
            var theBookingsInSession = (List <Booking>)Session["Cart_PropertyBookings"];

            //  var testSession = new PropertyViewController().AreThereAnyBookingsInTheSession();
            //   var testSEssionExtraBooking = new PropertyViewController().AreThereAnyExtraBookingsInTheSession();
            //instance method execute on propertyview controller
            var result = new FinalBookingDetailGatheringController().CreateListOfFieldsToGatherBasedOnSessionData();
        }
        public ActionResult SignUpRegistration(CustomerRegistration registration)
        {
            bool customerAlreadyExists      = CheckIfCustomerEmailAlreadyExists(registration.EmailAddress);
            bool customerLogonAlreadyExists = CheckIfUserExistsInSimpleMemberProvider(registration.EmailAddress);

            try
            {
                //customerLogonAlreadyExists =


                //create customer if that email's not in use:
                if (!customerAlreadyExists && !customerLogonAlreadyExists)
                {
                    Customer theCustomer = Customer.MapCustomerRegistrationToNewCustomer(registration);

                    FinalBookingDetailGatheringController customerController =
                        new FinalBookingDetailGatheringController();

                    var CustomerAdded = customerController.CreateCustomerAsPartOfSignUp(theCustomer);


                    string UserName = theCustomer.EmailAddress;
                    string Password = registration.Password;

                    //create the ASP.NET account
                    WebSecurity.CreateUserAndAccount(UserName, Password);

                    //make user a 'normal user'
                    if (!Roles.GetRolesForUser(UserName).Contains("User"))
                    {
                        Roles.AddUsersToRole(new[] { UserName }, "User");
                    }

                    //login and get newly created user
                    WebSecurity.Login(UserName, Password);

                    Session["prc_customer"] = theCustomer;

                    return(View("SignUpSuccessful"));
                    //log in with the new details
                }
                else
                {
                    return(View("AlreadyExists"));
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Something went wrong when trying to create a new user");
            }
        }
Beispiel #3
0
        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 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 void TestDataGatheringMethods()
        {

            var theBookingsInSession = (List<Booking>)Session["Cart_PropertyBookings"];

            //  var testSession = new PropertyViewController().AreThereAnyBookingsInTheSession();
            //   var testSEssionExtraBooking = new PropertyViewController().AreThereAnyExtraBookingsInTheSession();
            //instance method execute on propertyview controller
            var result = new FinalBookingDetailGatheringController().CreateListOfFieldsToGatherBasedOnSessionData();


        }
        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"));
            }
        }
        public ActionResult SignUpRegistration(CustomerRegistration registration)
        {

            bool customerAlreadyExists = CheckIfCustomerEmailAlreadyExists(registration.EmailAddress);
            bool customerLogonAlreadyExists = CheckIfUserExistsInSimpleMemberProvider(registration.EmailAddress);

            try
            {


                //customerLogonAlreadyExists = 


                //create customer if that email's not in use:               
                if (!customerAlreadyExists && !customerLogonAlreadyExists)
                {
                    Customer theCustomer = Customer.MapCustomerRegistrationToNewCustomer(registration);

                    FinalBookingDetailGatheringController customerController =
                        new FinalBookingDetailGatheringController();

                    var CustomerAdded = customerController.CreateCustomerAsPartOfSignUp(theCustomer);


                    string UserName = theCustomer.EmailAddress;
                    string Password = registration.Password;

                    //create the ASP.NET account
                    WebSecurity.CreateUserAndAccount(UserName, Password);

                    //make user a 'normal user'
                    if (!Roles.GetRolesForUser(UserName).Contains("User"))
                        Roles.AddUsersToRole(new[] { UserName }, "User");

                    //login and get newly created user
                    WebSecurity.Login(UserName, Password);

                    Session["prc_customer"] = theCustomer;

                    return View("SignUpSuccessful");
                    //log in with the new details


                }
                else
                {
                    return View("AlreadyExists");
                }

            }
            catch (Exception ex)
            {
                throw new Exception("Something went wrong when trying to create a new user");
            }

        }
        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 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 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");
            }

        }
        public ActionResult QuickCreate(BookingExtraSelection bes)
        {
            using (var db = new PortugalVillasContext())
            {
                var cus = db.Customers.Find(bes.CustomerID);


                var account      = new AccountController();
                var eventService = new EventController();
                var bookingRepo  = new FinalBookingDetailGatheringController();

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


                parentContainer = bookingRepo.CreateBookingParentContainer(parentContainer, db);


                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);
            }


            return(View());
        }