public async Task RefundAsync(RefundRequestDto input)
        {
            var productOrder = await Repository.Include(x => x.OrderItems).FirstOrDefaultAsync(x => x.Id == input.OrderId);

            if (productOrder == null)
            {
                throw new UserFriendlyException("NotFind");
            }

            await _mediator.Publish(new ProductOrderRefundEvent(productOrder, input.RefundPrice, input.Reason));
        }
        public ActionResult RefundRequest()
        {
            var StudentId     = WebUserInfo.UserId;
            var courses       = _db.Set <Student>().Include("CoursesJoinStudents.Course.Term").First(s => s.Id == StudentId).CoursesJoinStudents.ToList();
            var refundRequest = new RefundRequestDto
            {
                Courses = courses.Select(c => new SelectListItem
                {
                    Text  = $@"{c.Course.Name} ({c.Course.Term.Name})",
                    Value = c.Course.Id.ToString()
                })
            };

            return(View(refundRequest));
        }
        /// <summary>
        /// Refund an Ogone Payment
        /// </summary>
        /// <param name="orderReference">Order Reference</param>
        /// <param name="sequence">Transaction Sequence</param>
        /// <param name="amount">Amount to refund (if partial refund)</param>
        /// <returns>Success/Failure</returns>
        public bool RefundPayment(string orderReference, int? sequence = null, decimal? amount = null)
        {
            Logger.LogInfo("RefundPayment: Order Reference {0} | Sequence {1} | Amount {2}", null, orderReference, sequence.HasValue ? sequence.Value : -1, amount.HasValue ? amount.Value : -1);
            var request = new RefundRequestDto
                {
                    Amount = amount.HasValue ? (long) (amount*100) : (long?) null,
                    OrderReference = orderReference,
                    Sequence = sequence
                };

            var result = CallPostEndPoint<RefundResponseDto, RefundRequestDto>(RefundPaymentUrl, request);

            return result.IsSuccess;
        }
        public async Task <IActionResult> RefundSend(RefundRequestDto refundRequestDto)
        {
            var model = new GateApiReturn <RefundResponseDto>
            {
                Status = true
            };
            //Error
            var factorFromRepo = await _dbFinancial.FactorRepository.GetByIdAsync(refundRequestDto.Token);

            if (factorFromRepo == null)
            {
                errorModel.Messages.Clear();
                errorModel.Messages = new string[] { "تراکنشی با این مشخصات یافت نشد" };
                return(BadRequest(errorModel));
            }
            if (factorFromRepo.DateModified.AddMinutes(20) < DateTime.Now)
            {
                errorModel.Messages.Clear();
                errorModel.Messages = new string[] { "زمان استرداد تراکنش شما گذشته است" };
                return(BadRequest(errorModel));
            }
            if (factorFromRepo.IsAlreadyVerified)
            {
                errorModel.Messages.Clear();
                errorModel.Messages = new string[] { "این تراکنش قبلا بررسی شده است" };
                return(BadRequest(errorModel));
            }
            var gateFromRepo = (await _db._GateRepository.GetAllAsync(p => p.Id == refundRequestDto.Api, null, "Wallet")).SingleOrDefault();

            if (gateFromRepo == null)
            {
                errorModel.Messages.Clear();
                errorModel.Messages = new string[] { "Api درگاه معتبر نمیباشد" };
                return(BadRequest(errorModel));
            }
            //var userDocuments = await _db.DocumentRepository
            //    .GetManyAsync(p => p.Approve == 1 && p.UserId == gateFromRepo.Wallet.UserId, null, "");
            //if (!userDocuments.Any())
            //{
            //    errorModel.Messages.Clear();
            //    errorModel.Messages = new string[] { "مدارک کاربر صاحب درگاه تکمیل نمیباشد" };
            //    return BadRequest(errorModel);
            //}
            if (!gateFromRepo.IsActive)
            {
                errorModel.Messages.Clear();
                errorModel.Messages = new string[] { "این درگاه غیر فعال میباشد . درصورت نیاز با پشتیبانی در تماس باید" };
                return(BadRequest(errorModel));
            }
            if (gateFromRepo.IsIp)
            {
                var currentIp     = HttpContext.Connection.RemoteIpAddress.ToString(); //::1
                var gateWebsiteIp = await _utilities.GetDomainIpAsync(gateFromRepo.WebsiteUrl);

                if (currentIp != gateWebsiteIp)
                {
                    errorModel.Messages.Clear();
                    errorModel.Messages = new string[] { "آی پی وبسایت درخواست دهنده پرداخت معبتر نمیباشد" };
                    return(BadRequest(errorModel));
                }
            }


            //Refund
            var trackingNumber = Convert.ToInt64(factorFromRepo.RefBank);
            var refundResult   = await _onlinePayment.RefundCompletelyAsync(trackingNumber);

            if (refundResult.IsSucceed)
            {
                factorFromRepo.Status            = false;
                factorFromRepo.IsAlreadyVerified = true;
                factorFromRepo.DateModified      = DateTime.Now;
                factorFromRepo.Message           = "تراکنش انجام شده و مبلغ استرداد شده است";
                _dbFinancial.FactorRepository.Update(factorFromRepo);
                await _dbFinancial.SaveAcync();

                model.Messages.Clear();
                model.Messages = new string[] { "مبلغ تراکنش استرداد شد" };
                model.Result   = new RefundResponseDto
                {
                    Amount       = factorFromRepo.EndPrice,
                    FactorNumber = factorFromRepo.FactorNumber,
                    RefBank      = "MPC-" + factorFromRepo.RefBank,
                    Mobile       = factorFromRepo.Mobile,
                    Email        = factorFromRepo.Email,
                    Description  = factorFromRepo.Description,
                    CardNumber   = factorFromRepo.ValidCardNumber
                };
                return(Ok(model));
            }
            else
            {
                factorFromRepo.IsAlreadyVerified = true;
                factorFromRepo.DateModified      = DateTime.Now;
                factorFromRepo.Message           = refundResult.Message;
                _dbFinancial.FactorRepository.Update(factorFromRepo);
                await _dbFinancial.SaveAcync();


                errorModel.Messages.Clear();
                errorModel.Messages = new string[] { refundResult.Message };
                return(BadRequest(errorModel));
            }
        }