public async Task <PaymentResult> MakePayment(PaymentRequest paymentRequest) { //style -> RETURN errors as part of return value PaymentResult result = new PaymentResult(); Payment payment = null; //validate the accounts first //these calls returning bool on validation bool isValidAccount = await _bankClient.CheckAccount(paymentRequest.payee.accountNumber, paymentRequest.payee.ifscCode); if (!isValidAccount) { result.SetResult(PaymentResult.ResultCodes.InvalidInput, PaymentResult.StatusCodes.InvalidPayeeAccount, null); return(result); } isValidAccount = await _bankClient.CheckAccount(paymentRequest.beneficiary.accountNumber, paymentRequest.beneficiary.ifscCode); if (!isValidAccount) { result.SetResult(PaymentResult.ResultCodes.InvalidInput, PaymentResult.StatusCodes.InvalidBeneficieryAccount, null); return(result); } //a hard coded sample check representing a biz logic if (paymentRequest.amount > 1000000) { result.SetResult(PaymentResult.ResultCodes.TransactionError, PaymentResult.StatusCodes.AmountExceedLimit, null); return(result); } //create payment entry with initial status "InProgress" payment = new Payment(paymentRequest.beneficiary.name, paymentRequest.beneficiary.accountNumber, paymentRequest.beneficiary.ifscCode, paymentRequest.payee.name, paymentRequest.payee.accountNumber, paymentRequest.payee.ifscCode, paymentRequest.amount, PaymentStatus.InProgress); _context.Payments.Add(payment); await _context.SaveChangesAsync(); result.SetResult(PaymentResult.ResultCodes.InProgress, PaymentResult.StatusCodes.TransactionInitiated, payment); //do the transaction //debit payee result.SetResult(PaymentResult.ResultCodes.InProgress, PaymentResult.StatusCodes.PayeeDebited, payment); //credit beneficiary result.SetResult(PaymentResult.ResultCodes.InProgress, PaymentResult.StatusCodes.BeneficiaryCredited, payment); //update status in database payment._status = PaymentStatus.Completed; _context.Payments.Update(payment); await _context.SaveChangesAsync(); result.SetResult(PaymentResult.ResultCodes.Success, PaymentResult.StatusCodes.TransactionInitiated, payment); //return the payment result return(result); }