public CardPaymentResponse DoPayment(CardPaymentRequest request) { var paymentStatus = _paymentRepository.GetPaymentStatus(request.RequestId); if (paymentStatus != null) { throw new RequestAlreadyProcessedException(paymentStatus.Status, paymentStatus.RequestId); } var currentPaymentStatus = new PaymentStatus() { RequestId = request.RequestId, Status = PaymentStatusEnum.Scheduled }; _paymentRepository.AddPaymentStatus(currentPaymentStatus); var cards = _cardRepository.GetAllCards(); if (!cards.Contains(request.GetCard())) { return new CardPaymentResponse { TransactionStatus = TransactionStatus.Declined, Message = "Wrong card details", RequestId = request.RequestId } } ; var bankAccounts = _bankAccountRepository.GetAllBankAccounts(); if (!bankAccounts.Contains(request.GetBankAccount())) { return new CardPaymentResponse { TransactionStatus = TransactionStatus.Declined, Message = "Wrong bank account details", RequestId = request.RequestId } } ; try { // here the bank performs the transaction currentPaymentStatus.TransactionId = Guid.NewGuid().ToString(); // transaction ok currentPaymentStatus.Status = PaymentStatusEnum.Completed; _paymentRepository.UpdatePaymentStatus(currentPaymentStatus); } catch (Exception e) { currentPaymentStatus.Status = PaymentStatusEnum.Error; _paymentRepository.UpdatePaymentStatus(currentPaymentStatus); throw; } // return the status return(new CardPaymentResponse { TransactionStatus = TransactionStatus.Succeeded, RequestId = request.RequestId, TransactionId = currentPaymentStatus.TransactionId }); } } }