public async Task <ResponseMessage> CapturePayment(Guid orderId) { var transactions = await _paymentRepository.GetTransactionByOrderId(orderId); var authorizedTransaction = transactions?.FirstOrDefault(t => t.Status == TransactionStatus.Authorized); var validationResult = new ValidationResult(); if (authorizedTransaction == null) { throw new DomainException($"Transaction not found for the order {orderId}"); } var transaction = await _paymentFacade.CapturePayment(authorizedTransaction); if (transaction.Status != TransactionStatus.Paid) { validationResult.Errors.Add(new ValidationFailure("Payment", $"An error occurred to process the payment for the order {orderId}")); return(new ResponseMessage(validationResult)); } transaction.PaymentId = authorizedTransaction.PaymentId; _paymentRepository.AddTransaction(transaction); if (!await _paymentRepository.UnitOfWork.Commit()) { validationResult.Errors.Add(new ValidationFailure("Payment", $"An error occurred to process the payment for the order {orderId}")); } return(new ResponseMessage(validationResult)); }
public async Task <ResponseMessage> CapturePayment(Guid orderId) { var transactions = await _paymentRepository.GetTransactionsByOrderId(orderId); var transactionAuthorized = transactions?.FirstOrDefault(t => t.Status == StatusTransaction.Authorized); var validationResult = new ValidationResult(); if (transactionAuthorized == null) { throw new DomainException($"transaction not found - order {orderId}"); } var transaction = await _paymentFacade.CapturePayment(transactionAuthorized); if (transaction.Status != StatusTransaction.Paid) { validationResult.Errors.Add(new ValidationFailure("Payment", $"Order payment could not be captured {orderId}")); return(new ResponseMessage(validationResult)); } transaction.PaymentId = transactionAuthorized.PaymentId; _paymentRepository.AddTransaction(transaction); if (!await _paymentRepository.UnitOfWork.Commit()) { validationResult.Errors.Add(new ValidationFailure("Payment", $"Order payment capture could not be persisted {orderId}")); return(new ResponseMessage(validationResult)); } return(new ResponseMessage(validationResult)); }
public async Task <Transaction> MakeOrderPayment(PaymentOrder paymentOrder) { var order = new Order { Id = paymentOrder.OrderId, Value = paymentOrder.Total }; var payment = new Payment { Value = paymentOrder.Total, CardName = paymentOrder.CardName, CardNumber = paymentOrder.CardNumber, ExpirationCard = paymentOrder.ExpirationCard, CvvCard = paymentOrder.CvvCard, OrderId = paymentOrder.OrderId }; var transaction = _paymentCreditCardFacade.MakePayment(order, payment); if (transaction.StatusTransaction == StatusTransaction.Paid) { payment.AddEvent(new PaymentMadeEvent(order.Id, paymentOrder.ClientId, transaction.PaymentId, transaction.Id, order.Value)); _paymentRepository.Add(payment); _paymentRepository.AddTransaction(transaction); await _paymentRepository.UnitOfWork.Commit(); return(transaction); } await _mediatorHandler.PublishNotification(new DomainNotification("payment", "Card operator refused the payment")); await _mediatorHandler.PublishEvent(new PaymentOrderRefusedEvent(order.Id, paymentOrder.ClientId, transaction.PaymentId, transaction.Id, order.Value)); return(transaction); }
public async Task <Transaction> Pay(OrderPayment orderPayment) { var order = new Order { Id = orderPayment.OrderId, Total = orderPayment.Total }; var payment = new Payment { Amount = orderPayment.Total, CardName = orderPayment.CardName, CardNumber = orderPayment.CardNumber, ExpiryDate = orderPayment.ExpiryDate, CvvCode = orderPayment.CvvCode, OrderId = orderPayment.OrderId }; var transaction = _creditCardPaymentFacade.Pay(order, payment); if (transaction.TransactionStatus == TransactionStatus.Paid) { payment.AddEvent(new OrderPaymentConfirmedEvent(order.Id, orderPayment.CustomerId, transaction.PaymentId, transaction.Id, order.Total)); _paymentRepository.Add(payment); _paymentRepository.AddTransaction(transaction); await _paymentRepository.UnitOfWork.Commit(); return(transaction); } await _mediatorHandler.PublishNotification(new DomainNotification("Payment", "The provider has denied payment")); await _mediatorHandler.PublishEvent(new OrderPaymentRejectedEvent(order.Id, orderPayment.CustomerId, transaction.PaymentId, transaction.Id, order.Total)); return(transaction); }