public static decimal ComputeDisCount(DisCount disCount, decimal Amount)
 {
     if (disCount.Count <= 0 || disCount.StartDate != null && disCount.StartDate > DateTime.Now || disCount.MaxDate != null && disCount.MaxDate < DateTime.Now)
     {
         return(Amount);
     }
     return((Amount) - (Amount * disCount.DisCountPercent / 100));
 }
        public async Task OnGetAsync(int Id, CancellationToken CancellationToken)
        {
            DisCount selectedDisCount = await disCountRepository.GetByIdAsync(Id, CancellationToken);

            Model = new DisCountEditVm
            {
                Id              = selectedDisCount.Id,
                Count           = selectedDisCount.Count,
                DisCountPercent = selectedDisCount.DisCountPercent,
                MaxDate         = selectedDisCount.MaxDate.ToShamsi(),
                StartDate       = selectedDisCount.StartDate.ToShamsi(),
                Title           = selectedDisCount.Title
            };
        }
        public async Task <IActionResult> OnPostAsync(CancellationToken CancellationToken)
        {
            DisCount disCount = new DisCount
            {
                Id              = Model.Id,
                Count           = Model.Count,
                DisCountPercent = Model.DisCountPercent,
                MaxDate         = Model.MaxDate.ToGregorian(),
                StartDate       = Model.StartDate.ToGregorian(),
                Title           = Model.Title
            };

            await disCountRepository.UpdateAsync(disCount, CancellationToken);

            return(RedirectToPage("/Admin/DisCountManagement/Index"));
        }
        public async Task <IActionResult> OnPostAsync(CancellationToken cancellationToken)
        {
            if (disCountRepository.CheckExistEntity(Model.Title.Trim()))
            {
                ModelState.AddModelError("", "قبلا با این نام کد تخفیفی را وارد کرده اید");
                return(Page());
            }

            DisCount disCount = new DisCount
            {
                Count           = Model.Count,
                DisCountPercent = Model.DisCountPercent,
                MaxDate         = Model.MaxDate.ToGregorian(),
                StartDate       = Model.StartDate.ToGregorian(),
                Title           = Model.Title
            };

            await disCountRepository.AddAsync(disCount, cancellationToken);

            return(RedirectToPage("/Admin/DisCountManagement/Index"));
        }
        public async Task <JsonResult> Pay(string DisCountTitle, string OrderId, CancellationToken cancellationToken)
        {
            AjaxResult     result   = new AjaxResult("Error");
            PayInput       input    = new PayInput();
            PaymentRequest response = new PaymentRequest();
            CustomUser     user     = new CustomUser();
            DisCount       DisCount = new DisCount();

            if (string.IsNullOrEmpty(OrderId))
            {
                result.Errors.Add("اطلاعات ارسالی صحیح نیس");
                return(new JsonResult(result));
            }

            Order order = await orderRepository.GetByIdAsync(Guid.Parse(OrderId), cancellationToken);

            if (order == null)
            {
                result.Errors.Add("اطلاعات ارسالی صحیح نیس");
                return(new JsonResult(result));
            }

            input.Deposits = order.TotalPrice;

            if (!string.IsNullOrEmpty(DisCountTitle))
            {
                DisCount = await disCountRepository.GetByTitle(DisCountTitle.Trim(), cancellationToken);

                input.Deposits = DisCount != null?DisCountHelper.ComputeDisCount(DisCount, order.TotalPrice) : order.TotalPrice;
            }

            if (User.Identity.IsAuthenticated)
            {
                user = await customUserManager.GetUserAsync(User);
            }
            else
            {
                string anonymousUserId = cookieManager.Get <string>("LocalhostCart");

                user = await orderRepository.GetAnonymousUser(anonymousUserId, cancellationToken);
            }

            input.Deposits = DisCountHelper.WithdrawFromWallet(user, input.Deposits);

            input.PhoneNumber = user?.PhoneNumber;

            if (input.Deposits >= 1000)
            {
                input.Redirect    = siteSetting.BuyCourseCallBackUrl;
                input.Description = "تصویه صورت حساب با احتساب تخفیف و کسر از کیف پولتان";
                response          = await payment.PayAsync(input, cancellationToken);
            }
            else
            {
                result.Status               = "Success";
                result.RedirectUrl          = "";
                result.MessageWhenSuccessed = " مبلغ با محاسبه تخفیف و کسر از کیف پول پرداخت شد";
                DisCount.Count              = DisCount.Count > 0 ? --DisCount.Count : DisCount.Count;
                await customUserManager.UpdateAsync(user);

                order.IsBought = true;
                await disCountRepository.UpdateAsync(DisCount, cancellationToken);

                return(new JsonResult(result));
            }
            if (Assert.NotNull(response) && response.Status == 1 && Assert.NotNull(response.Token))
            {
                result.Status      = "Success";
                result.RedirectUrl = siteSetting.RedirectUrl + response.Token;
                user.PaymentToken  = response.Token;
                DisCount.Count     = DisCount.Count > 0 ? DisCount.Count-- : DisCount.Count;
                await customUserManager.UpdateAsync(user);

                order.IsBought = true;
                await disCountRepository.UpdateAsync(DisCount, cancellationToken);

                return(new JsonResult(result));
            }
            else
            {
                result.Errors.Add("عملیات پرداخت با شکست مواجه شد لطفا بعدا امتحان کنید");
                result.Errors.Add(response.ErrorMessage);
            }

            return(new JsonResult(result));
        }