public async Task <bool> CheckDuplicateCampaign(DiscountCampaignRequestViewModel discountCampaignRequestViewModel)
        {
            switch (discountCampaignRequestViewModel.CodeType)
            {
            case CodeType.BulkCodes:
            {
                var discountCampaign = await _discountCampaignRepository.GetByCodePrefix(discountCampaignRequestViewModel.CodePrefix);

                if (discountCampaign != null)
                {
                    return(true);
                }
            }
            break;

            case CodeType.SingleCode:
            {
                var discountCode =
                    await _discountCodeRepository.GetDiscountCodeByCode(discountCampaignRequestViewModel
                                                                        .SingleCode);

                if (discountCode != null)
                {
                    return(true);
                }
            }
            break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            return(false);
        }
        public async Task <ResultViewModel> Post([FromBody] DiscountCampaignRequestViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(new ResultViewModel
                {
                    Status = Status.Error,
                    Message = "Invalid Data"
                });
            }

            var checkDuplicateCampaign = await _discountCampaignService.CheckDuplicateCampaign(model);

            if (checkDuplicateCampaign)
            {
                return(new ResultViewModel
                {
                    Status = Status.Error,
                    Message = "Error: Can not create duplicate CodePrefix or Single Code"
                });
            }

            var discountCampaign = _discountCampaignService.GenerateDiscountCampaignFromViewModel(model);

            await _discountCampaignRepository.Insert(discountCampaign);

            return(new ResultViewModel
            {
                Status = Status.Success,
                Message = "Success",
                Data = discountCampaign
            });
        }
        public App.Support.Common.Models.PromotionService.DiscountCampaigns.DiscountCampaign GenerateDiscountCampaignFromViewModel(DiscountCampaignRequestViewModel viewModel)
        {
            var discountCampaign =
                new App.Support.Common.Models.PromotionService.DiscountCampaigns.DiscountCampaign
            {
                Id   = Guid.NewGuid(),
                Name = viewModel.Name,
                DiscountCampaignType    = viewModel.DiscountCampaignType,
                DiscountValue           = viewModel.DiscountValue,
                DiscountUnitId          = viewModel.DiscountUnitId,
                StartDate               = viewModel.StartDate,
                ExpirationDate          = viewModel.ExpirationDate,
                DiscountCampaignApplyOn = viewModel.DiscountCampaignApplyOn,
                ApplyOnId               = viewModel.DiscountCampaignApplyOnId,
                CodePrefix              = viewModel.CodePrefix
            };

            discountCampaign.DiscountValidations =
                new List <App.Support.Common.Models.PromotionService.DiscountValidations.DiscountValidation>();
            foreach (var discountValidation in viewModel.DiscountValidations.Select(viewModelDiscountValidation => _discountValidationService.GenerateDiscountValidationFromViewModel(viewModelDiscountValidation)))
            {
                discountCampaign.DiscountValidations.Add(discountValidation);
            }

            var discountCodes = _discountCodeService.GenerateDiscountCodesFromDiscountCampaignViewModel(viewModel);

            discountCampaign.DiscountCodes = discountCodes;

            return(discountCampaign);
        }
        public ICollection <App.Support.Common.Models.PromotionService.DiscountCodes.DiscountCode> GenerateDiscountCodesFromDiscountCampaignViewModel(DiscountCampaignRequestViewModel viewModel)
        {
            ICollection <App.Support.Common.Models.PromotionService.DiscountCodes.DiscountCode> discountCodes =
                new List <App.Support.Common.Models.PromotionService.DiscountCodes.DiscountCode>();

            switch (viewModel.CodeType)
            {
            case CodeType.SingleCode:
            {
                var discountCode = new App.Support.Common.Models.PromotionService.DiscountCodes.DiscountCode
                {
                    Id             = Guid.NewGuid(),
                    Code           = viewModel.SingleCode,
                    NormalizedCode = viewModel.SingleCode.Normalize(),
                    Status         = DiscountCodeStatus.Active,
                    MaxRedeem      = viewModel.MaxRedeem
                };


                discountCodes.Add(discountCode);

                break;
            }

            case CodeType.BulkCodes:
            {
                var count = viewModel.CodesAmount;

                for (var i = 0; i < count; i++)
                {
                    var discountCode = new App.Support.Common.Models.PromotionService.DiscountCodes.DiscountCode
                    {
                        Id        = Guid.NewGuid(),
                        Code      = $"{viewModel.CodePrefix}-{DiscountCodeHelper.RandomString(5)}",
                        Status    = DiscountCodeStatus.Active,
                        MaxRedeem = 1
                    };

                    discountCode.NormalizedCode = DiscountCodeHelper.ReplaceDash(discountCode.Code).Normalize();

                    discountCodes.Add(discountCode);
                }
                break;
            }

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(discountCodes);
        }