Example #1
0
        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"));
        }
Example #2
0
        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(" ", "");
        }
Example #5
0
        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));
        }
Example #9
0
        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);
            }
        }