예제 #1
0
        private bool IsModelValid(ShowTicketCategoriesViewModel submitedModel)
        {
            if (submitedModel.TicketCategories.Any(tc => tc.AvailableCapacity - tc.Ordered < 0))
            {
                ModelState.AddModelError("ErrorSum", "Dané množství vstupenek není možné objednat");
                return(false);
            }

            if (!submitedModel.TicketCategories.Any(tc => tc.Ordered > 0))
            {
                ModelState.AddModelError("ErrorSum", "Není vybrána žádná vstupenka");
                return(false);
            }

            if (submitedModel is ShowTicketCategoriesCodeViewModel)
            {
                if (submitedModel.TicketCategories.Count(tc => tc.Ordered > 0) > 1)
                {
                    ModelState.AddModelError("ErrorSum", "Je možné objednat vstupenky pouze z jedné kategorie");
                    return(false);
                }
            }

            return(true);
        }
예제 #2
0
        public ActionResult CreateReservation(ShowTicketCategoriesViewModel submitedModel)
        {
            string viewName = "~/Views/Tickets/CreateReservationLocalized.cshtml";

            SetLocalization(submitedModel, submitedModel.ProjectID, false);

            if (!IsModelValid(submitedModel))
            {
                return(View(viewName, submitedModel));
            }

            using (ApplicationDbContext context = new ApplicationDbContext())
            {
                var result = CreateReservationFromAction(submitedModel, context, viewName);
                return(result);
            }
        }
예제 #3
0
        private bool ExceededMaxTickets(Project project, ShowTicketCategoriesViewModel submitedModel, ApplicationDbContext context)
        {
            var orders = context.TicketOrders.Where(to => to.Email == submitedModel.Email);

            var ticketOrders = orders.Where(to => to.TicketCategoryOrders.Any(tco => tco.TicketCategory.ProjectID == project.ProjectID)).Select(to => to.TicketOrderID);

            int count = 0;

            foreach (int ticketOrderId in ticketOrders)
            {
                TicketOrder ticketOrder1 = context.TicketOrders.SingleOrDefault(to => to.TicketOrderID == ticketOrderId);
                count += ticketOrder1.TicketCategoryOrders.Sum(tco => tco.Count);
            }

            count += submitedModel.TicketCategories.Sum(tc => tc.Ordered);

            return(count > project.TicketSetting.MaxTicketsPerEmail);
        }
예제 #4
0
        private ShowTicketCategoriesViewModel CreateReservationInit(int projectId, bool isCode)
        {
            using (ApplicationDbContext context = new ApplicationDbContext())
            {
                Project project = context.Projects.SingleOrDefault(p => p.ProjectID == projectId);

                if (project == null)
                {
                    throw new Exception("Project not found.");
                }

                ViewBag.Title = project.Name + " | Vstupenky";
                ShowTicketCategoriesViewModel viewModel;

                if (isCode)
                {
                    viewModel = new ShowTicketCategoriesCodeViewModel();
                }
                else
                {
                    viewModel = new ShowTicketCategoriesViewModel();
                }

                viewModel.ProjectID         = project.ProjectID;
                viewModel.ProjectName       = project.Name;
                viewModel.MaxTicketsPerMail = project.TicketSetting.MaxTicketsPerEmail;

                viewModel.TicketCategories = new List <TicketCategoryViewModel>();

                if (project.TicketsURL != null && project.TicketsURL != "")
                {
                    viewModel.TicketsAvailable = true;
                }
                else
                {
                    viewModel.TicketsAvailable = false;
                    return(viewModel);
                }

                foreach (TicketCategory ticketCategory in project.TicketCategories.Where(tc => !tc.Deleted && tc.CodeRequired == isCode))
                {
                    if (ticketCategory.SoldFrom.Value.ToLocalTime() <= DateTime.Now && ticketCategory.SoldTo.Value.ToLocalTime() >= DateTime.Now)
                    {
                        TicketCategoryViewModel ticketCategoryViewModel = new TicketCategoryViewModel()
                        {
                            AvailableCapacity = ticketCategory.Capacity - ticketCategory.Ordered,
                            Capacity          = ticketCategory.Capacity,
                            Header            = ticketCategory.HeaderCZ,
                            Price             = ticketCategory.Price + "Kč",
                            TicketCategoryID  = ticketCategory.TicketCategoryID,
                            SoldFrom          = String.Format("{0:d.M.yyyy HH:mm:ss}", ticketCategory.SoldFrom.Value.ToLocalTime()),
                            SoldTo            = String.Format("{0:d.M.yyyy HH:mm:ss}", ticketCategory.SoldTo.Value.ToLocalTime()),
                            RowVersion        = ticketCategory.RowVersion
                        };

                        viewModel.TicketCategories.Add(ticketCategoryViewModel);
                    }
                }

                viewModel.TicketsAvailable = viewModel.TicketCategories.Any();

                SetLocalization(viewModel, projectId, isCode);

                return(viewModel);
            }
        }
예제 #5
0
        private void SetLocalization(ShowTicketCategoriesViewModel viewModel, int projectId, bool isCode)
        {
            //TODO: Set cookie, create button to set cookie/localization response bla bla
            bool isEnglish  = false;
            bool isJunkTown = projectId == 3;
            var  cookie     = Request.Cookies[LocalizationCookie];

            if (cookie != null)
            {
                if (cookie.Value == "en")
                {
                    isEnglish = true;
                }
            }

            TicketOrderLocalization ticketOrderLocalization = new TicketOrderLocalization();

            if (isEnglish)
            {
                if (isJunkTown)
                {
                    ticketOrderLocalization.FreeTicketsHdr       = "Available capacity";
                    ticketOrderLocalization.RegistrationStartHdr = "Start of registration";
                    ticketOrderLocalization.EdnRegistrationHdr   = "End of registration";
                    ticketOrderLocalization.TicketPriceHdr       = "Registration fee";
                    ticketOrderLocalization.TicketCountHdr       = "Count";
                    ticketOrderLocalization.RegisterBtn          = "Register";
                    ticketOrderLocalization.NoFreeTicketsMsg     = "There is no available capacity at the moment";
                    ticketOrderLocalization.TicketTypeBtn        = isCode ? "Public registration" : "Private registration";
                }
                else
                {
                    ticketOrderLocalization.FreeTicketsHdr       = "Available tickets";
                    ticketOrderLocalization.RegistrationStartHdr = "Start of presale";
                    ticketOrderLocalization.EdnRegistrationHdr   = "End of presale";
                    ticketOrderLocalization.TicketPriceHdr       = "Price";
                    ticketOrderLocalization.TicketCountHdr       = "Count";
                    ticketOrderLocalization.RegisterBtn          = "Order";
                    ticketOrderLocalization.NoFreeTicketsMsg     = "There is no available tickets at the moment";
                    ticketOrderLocalization.TicketTypeBtn        = isCode ? "Public tickets" : "Private tickets";
                }

                ticketOrderLocalization.ParticipantNameHdr     = "Civic name";
                ticketOrderLocalization.ParticipantEmailHdr    = "Email";
                ticketOrderLocalization.CategoryHdr            = "Categories";
                ticketOrderLocalization.LanguageBtn            = "Czech";
                ticketOrderLocalization.NameViewHdr1           = "For the successful completion of the registration organizer demands that you must fill in the civic names and emails of individual visitors.";
                ticketOrderLocalization.NameViewHdr2           = "These civic names will be checked on entry.";
                ticketOrderLocalization.TermsConditionHdr      = "Please read terms and conditions and agree to them.";
                ticketOrderLocalization.TermsConditionAgree    = "I agree with terms, conditions and processing of personal informations.";
                ticketOrderLocalization.ReservationCode        = "Code";
                ticketOrderLocalization.TermsConditionWarning  = "You have to agree with terms and conditions!";
                ticketOrderLocalization.DuplicateEmailsWarning = "Emails has to be unique!";
            }
            else
            {
                if (isJunkTown)
                {
                    ticketOrderLocalization.FreeTicketsHdr       = "Dostupná místa";
                    ticketOrderLocalization.RegistrationStartHdr = "Začátek registrace";
                    ticketOrderLocalization.EdnRegistrationHdr   = "Konec registrace";
                    ticketOrderLocalization.TicketPriceHdr       = "Celková výše stanového členského příspěvku";
                    ticketOrderLocalization.TicketCountHdr       = "Počet";
                    ticketOrderLocalization.RegisterBtn          = "Registrovat";
                    ticketOrderLocalization.TicketTypeBtn        = isCode ? "Veřejná registrace" : "Soukromá registrace";
                }
                else
                {
                    ticketOrderLocalization.FreeTicketsHdr       = "Dostupných vstupenek";
                    ticketOrderLocalization.RegistrationStartHdr = "Začátek prodeje";
                    ticketOrderLocalization.EdnRegistrationHdr   = "Konec prodeje";
                    ticketOrderLocalization.TicketPriceHdr       = "Cena";
                    ticketOrderLocalization.TicketCountHdr       = "Počet vstupenek";
                    ticketOrderLocalization.RegisterBtn          = "Objednat";
                    ticketOrderLocalization.TicketTypeBtn        = isCode ? "Veřejné vstupenky" : "Soukromé vstupenky";
                }

                ticketOrderLocalization.ParticipantNameHdr     = "Občanské jméno";
                ticketOrderLocalization.ParticipantEmailHdr    = "Email";
                ticketOrderLocalization.CategoryHdr            = "Kategorie";
                ticketOrderLocalization.NoFreeTicketsMsg       = "Momentálně nejsou dostupná žádná volná místa.";
                ticketOrderLocalization.LanguageBtn            = "English";
                ticketOrderLocalization.NameViewHdr1           = "Pro úspěšné dokončení registrace vyžaduje pořadatel vyplnění jednotlivých občanských jmen a emailů návštěvníků.";
                ticketOrderLocalization.NameViewHdr2           = "Uvedená občanská jména budou kontrolována na vstupu.";
                ticketOrderLocalization.TermsConditionHdr      = "Seznamte se s obchodními podmínkami a odsouhlaste je.";
                ticketOrderLocalization.TermsConditionAgree    = "Souhlasím s obchodními podmínkami a zpracováním osobních údajů.";
                ticketOrderLocalization.ReservationCode        = "Kód";
                ticketOrderLocalization.TermsConditionWarning  = "Musíte souhlasit s obchodními podmínkami!";
                ticketOrderLocalization.DuplicateEmailsWarning = "Emaily se nesmí shodovat!";
            }

            ticketOrderLocalization.ChangeLangLink = string.Format("http://{0}/tickets/ChangeLanguage/{1}", Request.Url.Authority, projectId);
            viewModel.Localization = ticketOrderLocalization;
        }
예제 #6
0
        private TicketOrderViewModel CreateReservration(ShowTicketCategoriesViewModel submitedModel, ApplicationDbContext context, DbContextTransaction transaction, Project project, TicketOrder ticketOrder, List <TicketCategoryOrderViewModel> ticketCategoryOrderViewModels)
        {
            Org org = context.Orgs.First(o => o.OrgID == project.OwnerID);

            //Vytvořit VS a uložit objednávku
            for (int i = 0; i < 20; i++)
            {
                ticketOrder.VariableSymbol = org.VariableSymbolCounter++;

                foreach (var ticketCategoryOrder in ticketOrder.TicketCategoryOrders)
                {
                    var ticketCategoryViewModel = submitedModel.TicketCategories.Single(tc => tc.TicketCategoryID == ticketCategoryOrder.TicketCategoryID);

                    for (int j = 0; j < ticketCategoryOrder.Count; j++)
                    {
                        TicketItem ticketItem = new TicketItem()
                        {
                            Code   = ticketOrder.VariableSymbol.ToString() + "-" + (j + 1),
                            QRCode = Guid.NewGuid().ToString(),
                            TicketCategoryOrder = ticketCategoryOrder
                        };

                        if (project.TicketSetting.NamedTickets)
                        {
                            ticketItem.Name  = ticketCategoryViewModel.Names[j].Name;
                            ticketItem.Email = ticketCategoryViewModel.Emails[j].Email;
                        }

                        context.TicketItems.Add(ticketItem);
                    }
                }

                try
                {
                    context.SaveChanges();
                    transaction.Commit();
                    //Úspěšně vytvořen VS pro danou objednávku a navýšeno počítadlo pro danou organizaci
                    break;
                }
                catch (DbUpdateConcurrencyException ex)
                {
                    ex.Entries.Single().Reload();
                    org = (Org)ex.Entries.Single().Entity;
                    continue;
                }
            }

            context.Entry(project.BankProxy).Reference(bp => bp.FioBankProxy).Load();

            string accountNumber = project.BankProxy.FioBankProxy.AccountNumber + "/" + FioBankHelper.BANK_CODE;

            TicketOrderViewModel ticketOrderViewModel = new TicketOrderViewModel()
            {
                ProjectID      = submitedModel.ProjectID,
                ProjectName    = project.Name,
                Note           = project.TicketSetting.NoteOrderCZ,
                AccountNumber  = accountNumber,
                Email          = ticketOrder.Email,
                ReservedUntil  = ticketOrder.ReservedUntil.Value.ToShortDateString(),
                TotalPrice     = ticketOrder.TotalPrice + " Kč",
                VariableSymbol = ticketOrder.VariableSymbol,
                CategoryOrders = ticketCategoryOrderViewModels
            };

            //SendEmail(ticketOrderViewModel);
            return(ticketOrderViewModel);
        }
예제 #7
0
        private ActionResult CreateReservationFromAction(ShowTicketCategoriesViewModel submitedModel, ApplicationDbContext context, string viewName)
        {
            using (DbContextTransaction transaction = context.Database.BeginTransaction())
            {
                Project project = context.Projects.SingleOrDefault(p => p.ProjectID == submitedModel.ProjectID);

                if (project == null)
                {
                    return(View("~/Views/Shared/Error.cshtml"));
                }

                if (ExceededMaxTickets(project, submitedModel, context))
                {
                    ModelState.AddModelError("ErrorSum", "Překročen maximální počet vstupenek na email: " + project.TicketSetting.MaxTicketsPerEmail);
                    return(View(viewName, submitedModel));
                }

                if (project.TicketSetting.NamedTickets)
                {
                    if (!submitedModel.AfterNameSetting)
                    {
                        foreach (var ticketCategory in submitedModel.TicketCategories)
                        {
                            if (ticketCategory.Ordered > 0)
                            {
                                ticketCategory.Names           = new TicketName[ticketCategory.Ordered];
                                ticketCategory.Emails          = new TicketEmail[ticketCategory.Ordered];
                                ticketCategory.Emails[0]       = new TicketEmail();
                                ticketCategory.Emails[0].Email = submitedModel.Email;
                            }
                        }


                        submitedModel.AfterNameSetting = true;
                        return(View("~/Views/Tickets/NamedTicketsLocalized.cshtml", submitedModel));
                    }
                    else
                    {
                        foreach (var ticketCategory in submitedModel.TicketCategories)
                        {
                            if (ticketCategory.Ordered > 0)
                            {
                                if (ticketCategory.Emails.GroupBy(e => e.Email).Any(c => c.Count() > 1))
                                {
                                    ModelState.AddModelError("ErrorDuplicate", submitedModel.Localization.DuplicateEmailsWarning);
                                    return(View("~/Views/Tickets/NamedTicketsLocalized.cshtml", submitedModel));
                                }
                            }
                        }
                    }
                }

                if (project.TicketSetting.AllowTermsConditions)
                {
                    if (project.TicketSetting.NamedTickets && submitedModel.AfterNameSetting && !submitedModel.AfterTermsConditionsSetting)
                    {
                        submitedModel.AfterTermsConditionsSetting = true;
                        bool isEnglish = false;
                        var  cookie    = Request.Cookies[LocalizationCookie];

                        if (cookie != null)
                        {
                            if (cookie.Value == "en")
                            {
                                isEnglish = true;
                            }
                        }
                        submitedModel.TermsConditions = isEnglish ? project.TicketSetting.TermsConditionsEN : project.TicketSetting.TermsConditionsCZ;

                        return(View("~/Views/Tickets/TermsConditionsLocalized.cshtml", submitedModel));
                    }
                }


                bool overBought = false;

                TicketOrder ticketOrder = new TicketOrder();
                ticketOrder.Created   = DateTime.Now;
                ticketOrder.Email     = submitedModel.Email;
                ticketOrder.OrgID     = project.OwnerID;
                ticketOrder.ProjectID = project.ProjectID;

                ticketOrder.ReservedUntil = DateTime.Today.AddDays(7).Date;

                if (project.TicketSetting.AllowTermsConditions)
                {
                    ticketOrder.TermsConditionsAccepted = submitedModel.TicketCategories[0].TermsConditionsAccepted;
                }
                else
                {
                    ticketOrder.TermsConditionsAccepted = false;
                }

                context.TicketOrders.Add(ticketOrder);
                context.SaveChanges();

                List <TicketCategoryOrderViewModel> ticketCategoryOrderViewModels = new List <TicketCategoryOrderViewModel>();

                foreach (var ticketCategoryViewModel in submitedModel.TicketCategories)
                {
                    TicketCategory ticketCategory = context.TicketCategories.SingleOrDefault(tc => tc.TicketCategoryID == ticketCategoryViewModel.TicketCategoryID);

                    //Objednání dané kapacity, budu při konkurenci zopakováno 10x
                    for (int i = 0; i < 10; i++)
                    {
                        if (ticketCategory == null || !project.TicketCategories.Contains(ticketCategory) || ticketCategory.Deleted)
                        {
                            transaction.Rollback();
                            return(View("~/Views/Shared/Error.cshtml"));
                        }

                        //Capacity changed
                        if (ticketCategoryViewModel.Capacity != ticketCategory.Capacity)
                        {
                            ticketCategoryViewModel.Capacity = ticketCategory.Capacity;
                        }

                        //Available capacity changed
                        if (ticketCategoryViewModel.AvailableCapacity != ticketCategory.Capacity - ticketCategory.Ordered)
                        {
                            ticketCategoryViewModel.AvailableCapacity = ticketCategory.Capacity - ticketCategory.Ordered;
                        }

                        if (ticketCategoryViewModel.Ordered > 0 && !overBought)
                        {
                            if (ticketCategory.Capacity < ticketCategory.Ordered + ticketCategoryViewModel.Ordered)
                            {
                                overBought = true;
                                break;
                            }
                            else
                            {
                                ticketCategory.Ordered += ticketCategoryViewModel.Ordered;

                                TicketCategoryOrder ticketCategoryOrder = new TicketCategoryOrder()
                                {
                                    Count          = ticketCategoryViewModel.Ordered,
                                    TicketCategory = ticketCategory,
                                    TicketOrder    = ticketOrder
                                };

                                context.TicketCategoryOrders.Add(ticketCategoryOrder);

                                try
                                {
                                    context.SaveChanges();

                                    decimal categoryPrice = ticketCategory.Price * ticketCategoryViewModel.Ordered;

                                    TicketCategoryOrderViewModel ticketCategoryOrderViewModel = new TicketCategoryOrderViewModel()
                                    {
                                        Header     = ticketCategory.HeaderCZ,
                                        Ordered    = ticketCategoryViewModel.Ordered,
                                        TotalPrice = categoryPrice
                                    };

                                    ticketCategoryOrderViewModels.Add(ticketCategoryOrderViewModel);
                                    ticketOrder.TotalPrice += categoryPrice;
                                    //Úspěšně byla navíšena nakoupená kapacita na dané kategorii a zároveň vytvořena položka objednávky pro danou kategorii
                                    break;
                                }
                                catch (DbUpdateConcurrencyException ex)
                                {
                                    //Je odstraněna nevalidní objednávka
                                    context.TicketCategoryOrders.Remove(ticketCategoryOrder);
                                    //Je znovu načtena daná kategorie s korektní sumou
                                    ex.Entries.Single().Reload();
                                    ticketCategory = (TicketCategory)ex.Entries.Single().Entity;
                                    continue;
                                }
                            }
                        }
                        else
                        {
                            //Již překoupeno, případně pro danou kategorii nejsou objednány žádné vstupenky
                            break;
                        }
                    }
                }

                if (!overBought)
                {
                    TicketOrderViewModel ticketOrderViewModel = CreateReservration(submitedModel, context, transaction, project, ticketOrder, ticketCategoryOrderViewModels);

                    return(RedirectToActionPermanent("OrderConfirmation", new RouteValueDictionary(ticketOrderViewModel)));
                }
                else
                {
                    transaction.Rollback();
                    ModelState.AddModelError("ErrorSum", "Dané množství vstupenek není možné objednat");
                    return(View(viewName, submitedModel));
                }
            }
        }