private Guid?ValidatePromotion(string companyKey, string promoCode, int?chargeTypeId, Guid accountId, DateTime pickupDate, bool isFutureBooking, string clientLanguageCode, CreateReportOrder createReportOrder) { if (!promoCode.HasValue()) { // No promo code entered return(null); } var usingPaymentInApp = chargeTypeId == ChargeTypes.CardOnFile.Id || chargeTypeId == ChargeTypes.PayPal.Id; if (!usingPaymentInApp) { var payPalIsEnabled = _serverSettings.GetPaymentSettings(companyKey).PayPalClientSettings.IsEnabled; var cardOnFileIsEnabled = _serverSettings.GetPaymentSettings(companyKey).IsPayInTaxiEnabled; var promotionErrorResourceKey = "CannotCreateOrder_PromotionMustUseCardOnFile"; if (payPalIsEnabled && cardOnFileIsEnabled) { promotionErrorResourceKey = "CannotCreateOrder_PromotionMustUseCardOnFileOrPayPal"; } else if (payPalIsEnabled) { promotionErrorResourceKey = "CannotCreateOrder_PromotionMustUsePayPal"; } // Should never happen since we will check client-side if there's a promocode and not paying with CoF/PayPal ThrowAndLogException(createReportOrder, ErrorCode.CreateOrder_RuleDisable, _resources.Get(promotionErrorResourceKey, clientLanguageCode)); } var promo = _promotionDao.FindByPromoCode(promoCode); if (promo == null) { ThrowAndLogException(createReportOrder, ErrorCode.CreateOrder_RuleDisable, _resources.Get("CannotCreateOrder_PromotionDoesNotExist", clientLanguageCode)); } var promoDomainObject = _promoRepository.Get(promo.Id); string errorMessage; if (!promoDomainObject.CanApply(accountId, pickupDate, isFutureBooking, out errorMessage)) { ThrowAndLogException(createReportOrder, ErrorCode.CreateOrder_RuleDisable, _resources.Get(errorMessage, clientLanguageCode)); } return(promo.Id); }
public ActionResult Create(PromoCodeModel promoCode) { try { if (!ModelState.IsValid) { var validationErrors = string.Join(", ", ModelState.Values.Where(x => x.Errors.Count > 0) .SelectMany(x => x.Errors) .Select(x => x.ErrorMessage) .ToArray()); throw new Exception(string.Format("Something's not right.{0}{1}", Environment.NewLine, validationErrors)); } if (_promotionDao.FindByPromoCode(promoCode.Code) != null) { throw new Exception("A promotion with this code already exists"); } var promotionId = Guid.NewGuid(); promoCode.Id = promotionId; var createPromotionCommand = new CreatePromotion { PromoId = promotionId, Name = promoCode.Name, Description = promoCode.Description, StartDate = promoCode.StartDate, EndDate = promoCode.EndDate, DaysOfWeek = promoCode.DaysOfWeek, StartTime = promoCode.StartTime, EndTime = promoCode.EndTime, AppliesToCurrentBooking = promoCode.AppliesToCurrentBooking, AppliesToFutureBooking = promoCode.AppliesToFutureBooking, DiscountValue = promoCode.DiscountValue, DiscountType = promoCode.DiscountType, Code = promoCode.Code, TriggerSettings = promoCode.TriggerSettings }; if (promoCode.TriggerSettings.Type == PromotionTriggerTypes.NoTrigger) { createPromotionCommand.PublishedStartDate = promoCode.PublishedStartDate; createPromotionCommand.PublishedEndDate = promoCode.PublishedEndDate; } else { // Trigger promotions are always published (but user will only see them when whitelisted) createPromotionCommand.PublishedStartDate = SqlDateTime.MinValue.Value; createPromotionCommand.PublishedEndDate = SqlDateTime.MaxValue.Value; } if (promoCode.TriggerSettings.Type != PromotionTriggerTypes.CustomerSupport) { // User and system usage is unlimited for support promotion. The whitelist will determine if a user can use it. createPromotionCommand.MaxUsage = promoCode.MaxUsage; createPromotionCommand.MaxUsagePerUser = promoCode.MaxUsagePerUser; } _commandBus.Send(createPromotionCommand); TempData["Info"] = string.Format("Promotion \"{0}\" created", promoCode.Name); var promotions = _promotionDao.GetAll().Select(x => new PromoCodeModel(x)).ToList(); promotions.Add(promoCode); var orderedPromotions = promotions.OrderBy(p => p.Name); TempData["Model"] = orderedPromotions; return(RedirectToAction("Index", orderedPromotions)); } catch (Exception ex) { ViewBag.Error = ex.Message; return(View(promoCode)); } }