private void EnrichTransactionsByDetails(AmexCardInfo card, CreditCardDebitPeriod debit, List <AmexCardTransaction> transactions) { var tasks = CreateDetailsEnrichmentTasks(card.CardIndex, debit, transactions); foreach (var task in tasks) { task.Start(); } Task.WaitAll(tasks.ToArray()); }
private List <Task> CreateDetailsEnrichmentTasks(int cardIndex, CreditCardDebitPeriod debit, List <AmexCardTransaction> dtoTransactions) { var result = new List <Task>(); var period = $"{debit.Date.Month}{debit.Date.Year}"; foreach (var trs in debit.Transactions) { var trsToEnrich = dtoTransactions.FirstOrDefault(t => trs.Id == t.VoucherNumberRatz || trs.Id == t.VoucherNumberRatzOutbound); if (trsToEnrich == null) { continue; } var task = new Task((p) => { try { TransactionEnrichmentParameters parameters = (TransactionEnrichmentParameters)p; var isInbound = !string.IsNullOrEmpty(trsToEnrich.DealsInbound) && !trsToEnrich.DealsInbound.Equals("no", StringComparison.CurrentCultureIgnoreCase); var details = _api.GetTransactionDetails(cardIndex, period, isInbound, parameters.Transaction.Id); parameters.Transaction.DealSector = (details?.Sector ?? String.Empty).Trim(); parameters.Transaction.SupplierAddress = (details?.Address ?? String.Empty).Trim(); } catch (Exception exp) { } }, new TransactionEnrichmentParameters { RowTransaction = trsToEnrich, Transaction = trs }); result.Add(task); } return(result); }
private static CreditCardDebitPeriod GenerateDebitPeriodForTransaction(AmexCardInfo card, CreditCardDebitPeriod debit, AmexCardTransaction transaction) { return(new CreditCardDebitPeriod { CardId = GenerateCardId(card), CardLastDigits = card.CardNumber, Date = debit.Date, Amount = String.IsNullOrEmpty(transaction.DealSumOutbound) ? Convert.ToDecimal(transaction.PaymentSum) : Convert.ToDecimal(transaction.DealSumOutbound), Transactions = new List <CreditCardTransaction>() }); }
private List <CreditCardDebitPeriod> FetchInternalDebits(AmexCardInfo card, CreditCardDebitPeriod debit, IList <AmexCardTransaction> transactions, bool includeDeatils) { var result = new List <CreditCardDebitPeriod>(); for (int i = 0; i < transactions.Count; i++) { var trs = transactions[i]; if (!String.IsNullOrEmpty(trs.DealsInbound) && trs.VoucherNumber == null) { if (trs.DealSumType == "P" && trs.MoreInfo == "חיוב במועד הבא") { transactions.RemoveAt(i); transactions.RemoveAt(i - 1); i -= 2; } else if (trs.DealSumType == "T" && trs.DealsInbound == "NO") { transactions.RemoveAt(i); i--; } else if (trs.DealSumType == "T" && trs.DealsInbound == "yes") { var newDebit = GenerateDebitPeriodForTransaction(card, debit, transactions[i - 1]); var debitTrs = GenerateCardTransaction(transactions[i - 1], newDebit.Date); newDebit.Transactions.Add(debitTrs); result.Add(newDebit); if (includeDeatils) { EnrichTransactionsByDetails(card, newDebit, transactions.ToList()); } transactions.RemoveAt(i); transactions.RemoveAt(i - 1); i -= 2; } else if (trs.DealSumType == "1") { transactions.RemoveAt(i); i--; } } else if (String.IsNullOrEmpty(trs.DealsInbound)) { if (trs.DealSumOutbound == null && !trs.FullSupplierNameOutbound.Equals("CASH ADVANCE FEE")) { transactions.RemoveAt(i); i--; } else if (Convert.ToDecimal(trs.DealSumOutbound) < 0) { var newDebit = GenerateDebitPeriodForTransaction(card, debit, trs); var debitTrs = GenerateCardTransaction(trs, newDebit.Date); newDebit.Transactions.Add(debitTrs); result.Add(newDebit); if (includeDeatils) { EnrichTransactionsByDetails(card, newDebit, transactions.ToList()); } transactions.RemoveAt(i); i--; } } } return(result); }
private bool SameDebits(CreditCardDebitPeriod debit, CreditCardDebitPeriod debitUpdate) { return(debitUpdate.Transactions.Any(t => !IsExisted(t, debit.Transactions))); }