private static Iso8583Message PerformReversal(Iso8583Message message, ListenerPeer listener) { var STAN = ExtractSTAN(message); message = SetFee(message, 0); var transactionsToReverse = _context.TransactionLogs.Where(c => c.STAN.Equals(STAN) && !c.Narration.Equals("Reversal")).ToList(); try { string responseCode = null; if (transactionsToReverse != null || transactionsToReverse.Count > 0) { foreach (var transaction in transactionsToReverse) { if (!transaction.Narration.Equals("Balance Enquiry")) { if (transaction.TypeOfEntry.Equals("Debit")) { if (transaction.Account2 == null) { bool remote1 = false; if (transaction.RemoteOnUs == true) { remote1 = true; } responseCode = CBA.PerformDoubleEntry("Credit", transaction.Account1, transaction.Amount, remote1); var isoAmt = Convert.ToDouble(FormatTo2Dp(Convert.ToDecimal(transaction.Amount))) * 100; message.Fields.Add(4, isoAmt.ToString().PadLeft(10, '0')); new TransactionLogger().LogTransaction(message, "Credit", "Reversal"); transaction.STAN = transaction.STAN + "R"; continue; } } bool remote = false; if (transaction.RemoteOnUs == true) { remote = true; } responseCode = CBA.PerformDoubleEntry("Debit", transaction.Account1, transaction.Amount, remote); var isoAmount = Convert.ToDouble(FormatTo2Dp(Convert.ToDecimal(transaction.Amount))) * 100; message.Fields.Add(4, isoAmount.ToString().PadLeft(10, '0')); new TransactionLogger().LogTransaction(message, "Debit", "Reversal"); transaction.STAN = transaction.STAN + "R"; } } _context.SaveChanges(); message = SetResponseMessage(message, responseCode); message = SendResponseMessage(listener, message); } } catch (Exception e) { Console.WriteLine(e); throw; } return(message); }
public Iso8583Message ProcessTransaction(Iso8583Message message, ListenerPeer listener) { if (message != null) { if (!message.IsReversalOrChargeBack()) { message = CheckIfFeeApplies(message); var fee = ExtractFee(message); var trxType = ExtractTransactionType(message); var accountNumber = ExtractAccountNumber(message); var amount = ExtractAmount(message); var STAN = ExtractSTAN(message); var RRN = ExtractRRN(message); if (trxType.ToString().Equals(Codes.WITHDRAWAL) || trxType.ToString().Equals(Codes.PAYMENT)) { if (accountNumber != null && amount != null) { if (trxType.ToString().Equals(Codes.PAYMENT)) { } var responseCode = CBA.PerformDoubleEntry("Debit", accountNumber, (amount + fee), CheckIfRemote(message)); message = SetResponseMessage(message, responseCode); message = SendResponseMessage(listener, message); if (!message.Fields[39].Value.ToString().Equals(Codes.APPROVED)) { Debug.WriteLine("Transaction Incomplete ..."); } else { new TransactionLogger().LogTransaction(message, "Debit", "Request"); Debug.WriteLine("Transaction Complete ..."); } } } else if (trxType.ToString().Equals(Codes.BALANCE_ENQUIRY)) { var amountEnquired = CBA.BalanceEnquiry(accountNumber); if (amountEnquired != null) { message.Fields.Add(54, amountEnquired); message.Fields.Add(4, "0000000000"); SetResponseMessage(message, Codes.APPROVED); message = SendResponseMessage(listener, message); new TransactionLogger().LogTransaction(message, null, "Balance Enquiry"); } } return(message); } if (message.IsReversalOrChargeBack()) { message = PerformReversal(message, listener); } } return(message); }