Esempio n. 1
0
        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));
            }
        }