public ActionResult MakeRequestToBank(VisaPaymentViewModel model) { if (!ModelState.IsValid) { return(View("Visa", model)); } // throws exception, when doesn't exists GetBasket(); if (!_paymentService.IsUserExists(model.CardNumber, model.CartHoldersName)) { ModelState.AddModelError(string.Empty, Resource.AccountNotFound); return(View("Visa", model)); } const string code = "qazx"; string sendingMessage = $"Code: {code}"; if (model.ConfirmationType == ConfirmationType.UsingPhoneNumber) { _smsService.Send(model.PhoneNumber, sendingMessage); } if (model.ConfirmationType == ConfirmationType.UsingEmail) { _emailService.Send(model.Email, "Code", sendingMessage); } TempData[VisaPaymentViewModelKey] = model; return(View("Confirmation")); }
private PaymentStatus PayOrderUsingPaymentService(VisaPaymentViewModel data, List <Purchase> basket, decimal amountOfPayment) { string[] expirationDateData = data.ExpireDate.Split('/'); List <GameDto> games = _gameService .GetGamesByIds(basket.Select(p => p.GameId).ToList()) .ToList(); var purpose = new StringBuilder(); games.ForEach(g => purpose.Append($"{g.Key}, ")); purpose.Remove(purpose.Length - 2, 2); PaymentStatus result = _paymentService.PayUsingVisa( data.CardNumber, data.CartHoldersName, data.CVV2, int.Parse(expirationDateData[0]), int.Parse(expirationDateData[1]), purpose.ToString(), amountOfPayment, data.Email, data.PhoneNumber); return(result); }
public async Task <ActionResult> VisaPayout(int dealId) { var model = new VisaPaymentViewModel(); await UpdateDataForVisaPayout(model, dealId); return(View("Visa", model)); }
private async Task UpdateDataForVisaPayout(VisaPaymentViewModel viewModel, int dealId) { var deal = await _dealService.GetById(dealId, User.Identity.GetUserId <int>()); var nearByPayment = deal.Payments.FirstOrDefault(x => !x.IsPaid); var paymentCount = nearByPayment.Amount + nearByPayment.Liability - deal.ExtraMoney; viewModel.PaymentCount = paymentCount; viewModel.DealId = dealId; viewModel.CanSetPaymentCount = true; viewModel.FormAction = "VisaPayout"; viewModel.OffererFullName = deal.Offers.First(x => x.IsApproved).OffererFullName; viewModel.CardNumber = deal.DealOwner.CardNumber.Replace(" ", ""); }
public async Task <PaymentResult> LendMoney(VisaPaymentViewModel visaPaymentViewModel, int currentUserId) { var deal = await _context.Deals .FirstAsync(x => x.Id == visaPaymentViewModel.DealId); var recipient = deal.Owner; var sender = await _context.Users.FirstAsync(x => x.Id == currentUserId); if (!sender.Offers.Exists(x => x.IsApproved && x.DealId == deal.Id)) { throw new AccessViolationException(); } if (Math.Abs(deal.Amount - visaPaymentViewModel.PaymentCount) > NumericConstants.Eps) { return(PaymentResult.Error); } var result = _bankApi.DoWithVisa( new BankVisaTransaction { Amount = visaPaymentViewModel.PaymentCount, RecipientAccountNumber = recipient.CardNumber, SenderCardNumber = visaPaymentViewModel.CardNumber, SenderCcvCode = visaPaymentViewModel.CvvCode, SenderName = visaPaymentViewModel.Name, SenderValidBefore = visaPaymentViewModel.ValidBefore }); switch (result) { case BankResponse.Success: deal.DealStatus = DealStatus.InProgress; deal.PaymentPlan = GeneratePlan(deal); deal.CreditTransaction = GenerateCreditTransaction(sender, recipient, visaPaymentViewModel.PaymentCount); await _context.SaveChangesAsync(); return(PaymentResult.Success); case BankResponse.NotEnoughtMoney: return(PaymentResult.NotEnoughtMoney); default: return(PaymentResult.Error); } }
private async Task UpdateDataForVisaLoan(VisaPaymentViewModel viewModel, int dealId) { var deal = await _dealService.GetById(dealId, User.Identity.GetUserId <int>()); var currentUser = await _userServicee.GetById(User.Identity.GetUserId <int>()); if (!deal.IsCurrentUserLender) { throw new AccessViolationException($"User can't loan deal with id = {dealId}."); } viewModel.DealOwnerName = deal.Deal.OwnerFullName; viewModel.PaymentCount = deal.Deal.Amount; viewModel.DealId = dealId; viewModel.FormAction = "VisaLoan"; viewModel.CardNumber = currentUser.CardNumber.Replace(" ", ""); }
public async Task <ActionResult> VisaPayout(VisaPaymentViewModel formModel) { if (ModelState.IsValid) { var payRes = await _paymentService.Payout(formModel); switch (payRes) { case PaymentResult.Success: return(View("Success", formModel)); case PaymentResult.EmptyData: ModelState.AddModelError("", "Заполните форму"); break; case PaymentResult.Error: ModelState.AddModelError("", "Сервис временно недоступен, повторите попытку позже"); break; case PaymentResult.NotEnoughtMoney: ModelState.AddModelError("", "Недостаточно средств на счёте"); break; case PaymentResult.PermissionError: ModelState.AddModelError("", "Ошибка доступа к счёту, проверьте введенные данные"); break; case PaymentResult.LessThenMinAmount: ModelState.AddModelError("", "Сумма платежа меньше минимальной суммы."); break; } } await UpdateDataForVisaPayout(formModel, formModel.DealId); return(View("Visa", formModel)); }
public async Task <ActionResult> VisaLoan(VisaPaymentViewModel formModel) { if (ModelState.IsValid) { var payRes = await _paymentService.LendMoney(formModel, User.Identity.GetUserId <int>()); switch (payRes) { case PaymentResult.Success: var deal = await _dealService.GetById(formModel.DealId, User.Identity.GetUserId <int>()); formModel.DealOwnerName = deal.Deal.OwnerFullName; return(View("Success", formModel)); case PaymentResult.EmptyData: ModelState.AddModelError("", "Заполните форму"); break; case PaymentResult.Error: ModelState.AddModelError("", "Server Error"); break; case PaymentResult.NotEnoughtMoney: ModelState.AddModelError("", "Недостаточно средств на счёте"); break; case PaymentResult.PermissionError: ModelState.AddModelError("", "Ошибка доступа к счёту"); break; } } await UpdateDataForVisaLoan(formModel, formModel.DealId); return(View("Visa", formModel)); }
public async Task <PaymentResult> Payout(VisaPaymentViewModel visaPaymentViewModel) { var deal = await _context.Deals .Include(x => x.Owner) .Include(x => x.Offers) .FirstAsync(x => x.Id == visaPaymentViewModel.DealId); var recipient = deal.Offers.First(x => x.IsApproved).Offerer; var paymentPlan = await _context .PaymentPlans .FirstOrDefaultAsync(x => x.Id == deal.Id); var allPaidBefore = paymentPlan .Payments .Where(x => x.IsPaid) .Select(x => x.Amount + x.Liability) .Sum(); //some extra money before previous payment var extraMoney = paymentPlan.BankTransactions.Select(x => x.Amount).Sum() - allPaidBefore; var nearByPayment = paymentPlan.Payments.Where(x => !x.IsPaid) .CalculateLiability(extraMoney, deal).OrderBy(x => x.DueDate).ToList(); if (nearByPayment[0].Amount + nearByPayment[0].Liability - extraMoney > visaPaymentViewModel.PaymentCount) { return(PaymentResult.LessThenMinAmount); } var result = BankResponse.NotEnoughtMoney; var resultMoneyAmount = visaPaymentViewModel.PaymentCount * (1 + NumericConstants.Tax); var userBalance = _bankApi.GetBalance(deal.Owner.CardNumber); if (!userBalance.HasValue) { return(PaymentResult.Error); } if (userBalance >= resultMoneyAmount) { result = _bankApi.DoWithVisa( new BankVisaTransaction { Amount = visaPaymentViewModel.PaymentCount, RecipientAccountNumber = recipient.CardNumber, SenderCardNumber = visaPaymentViewModel.CardNumber, SenderCcvCode = visaPaymentViewModel.CvvCode, SenderName = visaPaymentViewModel.Name, SenderValidBefore = visaPaymentViewModel.ValidBefore }); _bankApi.DoWithVisa( new BankVisaTransaction { Amount = visaPaymentViewModel.PaymentCount * NumericConstants.Tax, RecipientAccountNumber = BankConstants.TrueMoneyAccountNumber, SenderCardNumber = visaPaymentViewModel.CardNumber, SenderCcvCode = visaPaymentViewModel.CvvCode, SenderName = visaPaymentViewModel.Name, SenderValidBefore = visaPaymentViewModel.ValidBefore }); } switch (result) { case BankResponse.Success: //new money will used to close calculated payments var newMoney = visaPaymentViewModel.PaymentCount + extraMoney; foreach (var payment in nearByPayment) { var currentPaymentMoney = payment.Amount + payment.Liability; if (currentPaymentMoney <= newMoney) { payment.IsPaid = true; payment.PaidDate = DateTime.Now; newMoney -= currentPaymentMoney; } else { break; } } paymentPlan.BankTransactions.Add( new Data.Entities.BankTransaction { Amount = visaPaymentViewModel.PaymentCount, DateOfPayment = DateTime.Now, PaymentPlan = paymentPlan, PaymentPlanId = paymentPlan.Id }); // check if all payments were paid if (paymentPlan.Payments.All(x => x.IsPaid)) { deal.DealStatus = DealStatus.Closed; UpdateRatingAfterFinish(ref deal); } await _context.SaveChangesAsync(); return(PaymentResult.Success); case BankResponse.NotEnoughtMoney: return(PaymentResult.NotEnoughtMoney); case BankResponse.PermissionError: return(PaymentResult.PermissionError); default: return(PaymentResult.Error); } }