コード例 #1
0
        public async Task <ValidateDiscountCodeDTO> ValidateDiscountCode(App.Support.Common.Models.CartService.Cart cart,
                                                                         string discountCode)
        {
            var promotionGrpcClient = _grpcClientFactory.CreatePromotionGrpcClient();
            var rq = new ValidateDiscountCodeWithCartRequest()
            {
                DiscountCode = discountCode,
                Cart         = await GenerateCartDto(cart)
            };
            var response = await promotionGrpcClient.ValidateDiscountCodeAsync(rq);

            return(response.ValidateDiscountCode);
        }
        public override async Task <ReturnValidateDiscountCode> ValidateDiscountCode(ValidateDiscountCodeWithCartRequest request, ServerCallContext context)
        {
            var returnValidateDiscountCode = new ReturnValidateDiscountCode()
            {
                Status = GrpcStatus.Success
            };

            var validateDiscountCodeDto = new ValidateDiscountCodeDTO()
            {
                IsValid = true,
                Message = "Discount code is valid to use"
            };

            var discountCode    = request.DiscountCode;
            var discountCodeObj = await _discountCodeRepository.GetDiscountCodeByCode(discountCode);

            if (discountCodeObj == null)
            {
                validateDiscountCodeDto = new ValidateDiscountCodeDTO()
                {
                    IsValid = false,
                    Message = "Error: Discount code is invalid to use"
                };

                returnValidateDiscountCode.ValidateDiscountCode = validateDiscountCodeDto;
                return(returnValidateDiscountCode);
            }

            var discountCampaignId  = discountCodeObj.DiscountCampaignId;
            var discountCampaignObj = await _discountCampaignRepository.GetById(discountCampaignId);

            var cartDto = request.Cart;

            // Check redemptionCount
            var redemptionsCount = discountCodeObj.Redemptions?.Count ?? 0;

            if (discountCodeObj.MaxRedeem == redemptionsCount)
            {
                validateDiscountCodeDto = new ValidateDiscountCodeDTO()
                {
                    IsValid = false,
                    Message = "This code already excess max redemption"
                };
            }

            // Check expirationDate
            if (discountCampaignObj.ExpirationDate < DateTime.Now)
            {
                validateDiscountCodeDto = new ValidateDiscountCodeDTO()
                {
                    IsValid = false,
                    Message = "This code already expired"
                };
            }

            // Check startDate
            if (discountCampaignObj.StartDate > DateTime.Now)
            {
                validateDiscountCodeDto = new ValidateDiscountCodeDTO()
                {
                    IsValid = false,
                    Message = "This campaign not yet start"
                };
            }

            // Check discountValidations
            var discountValidations = discountCampaignObj.GetSortedDiscountValidations();

            var productCatId = "";

            foreach (var discountValidation in discountValidations)
            {
                switch (discountValidation.ValueType)
                {
                case DiscountValidationValueType.Bill:
                {
                    var checkBillDiscountValidation = CheckBillDiscountValidation(discountValidation, cartDto);
                    if (checkBillDiscountValidation != null)
                    {
                        validateDiscountCodeDto = checkBillDiscountValidation;
                    }
                    break;
                }

                case DiscountValidationValueType.ProductCat:
                {
                    productCatId = CheckProductCategoryValidation(discountValidation);
                    break;
                }

                case DiscountValidationValueType.Quantity:
                {
                    var checkQuantityValidation = CheckQuantityValidation(discountValidation, cartDto, productCatId);
                    if (checkQuantityValidation != null)
                    {
                        validateDiscountCodeDto = checkQuantityValidation;
                    }
                    break;
                }

                case DiscountValidationValueType.SpendingAmount:
                {
                    var checkSpendingAmountValidation = CheckSpendingAmountValidation(discountValidation, cartDto, productCatId);
                    if (checkSpendingAmountValidation != null)
                    {
                        validateDiscountCodeDto = checkSpendingAmountValidation;
                    }
                    break;
                }

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            // Return
            returnValidateDiscountCode.ValidateDiscountCode = validateDiscountCodeDto;
            return(returnValidateDiscountCode);
        }