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