public async Task <Unit> Handle(CreatePaymentCommand request, CancellationToken cancellationToken)
        {
            var paymentId = await _paymentService.MakePayment(new PaymentDto
            {
                Description = request.Description,
                Currency    = request.Currency,
                Email       = request.Email,
                Amount      = request.Amount,
                Token       = request.Token
            }, _paymentService.SecretKey);


            var entity = new Domain.Entities.Payment
            {
                Description       = request.Description,
                Amount            = request.Amount,
                Currency          = request.Currency,
                ExternalPaymentId = paymentId
            };

            await _context.Payment.AddAsync(entity, cancellationToken);

            await _context.SaveChangesAsync(cancellationToken);

            return(Unit.Value);
        }
Пример #2
0
        private ActionResult SavePayment(PaymentViewModel paymentViewModel)
        {
            var ct = new Domain.Entities.Payment();

            ct.Value         = Convert.ToDecimal(paymentViewModel.total);
            ct.Type          = paymentViewModel.paymentType;
            ct.Date          = DateTime.Now;
            ct.Discipline_Id = paymentViewModel.subjectId;
            ct.Student_PIN   = paymentViewModel.studentPin;
            ct.StudentID     = repository.Students.FirstOrDefault(x => x.PIN == paymentViewModel.studentPin).StudentID;
            db.Payments.Add(ct);
            db.SaveChanges();

            return(null);
        }
Пример #3
0
        public async Task <Entities.Payment> CreateAsync(decimal value, int installments, int debitAccountNumber, int creditAccountNumber)
        {
            #region Verifica se as contas existem
            var debitAccount = (await _unitOfWork
                                .CheckingAccountRepository
                                .ListAsync(new CheckingAccountFilterSpecification(debitAccountNumber)))
                               .FirstOrDefault();

            if (debitAccount == null)
            {
                _notifications.Handle(new DomainNotification(string.Empty, "Debit Account not found"));
            }

            var creditAccount = (await _unitOfWork
                                 .CheckingAccountRepository
                                 .ListAsync(new CheckingAccountFilterSpecification(creditAccountNumber)))
                                .FirstOrDefault();

            if (debitAccount == null)
            {
                _notifications.Handle(new DomainNotification(string.Empty, "Credit Account not found"));
            }

            if (_notifications.HasNotifications())
            {
                return(await Task.FromResult <Entities.Payment>(null));
            }
            #endregion

            #region Calculas as taxas
            var netValue = CalculateTax(value, installments);
            #endregion

            #region Verifica o saldo da conta de débito
            if (debitAccount.Balance < netValue)
            {
                _notifications.Handle(new DomainNotification(string.Empty, "The debit account is not enough"));
            }
            #endregion

            #region Insere os lançamentos
            var debitEntry = new Entry
            {
                CheckingAccountNumber = debitAccount.Number,
                Type  = "D",
                Value = netValue
            };

            var creditEntry = new Entry
            {
                CheckingAccountNumber = creditAccount.Number,
                Type  = "C",
                Value = netValue
            };
            #endregion

            #region Criação do pagamento
            var payment = new Domain.Entities.Payment
            {
                GrossValue          = value,
                NetValue            = netValue,
                Installments        = installments,
                CreditAccountNumber = creditAccount.Number,
                DebitAccountNumber  = debitAccount.Number
            };
            #endregion

            #region Atualiza o saldo das contas
            debitAccount.Balance  -= netValue;
            creditAccount.Balance += netValue;
            #endregion

            #region Commit
            _unitOfWork.EntryRepository.Add(debitEntry);
            _unitOfWork.EntryRepository.Add(creditEntry);
            _unitOfWork.PaymentRepository.Add(payment);
            _unitOfWork.CheckingAccountRepository.Update(debitAccount);
            _unitOfWork.CheckingAccountRepository.Update(creditAccount);

            if (!(await _unitOfWork.CommitAsync()))
            {
                return(await Task.FromResult <Entities.Payment>(null));
            }
            #endregion

            return(payment);
        }