private static Int64 GetDonorByBankAccountNumber(BankImportTDS AMainDS, string ABankSortCode, string ABankAccountNumber) { if (Regex.IsMatch(ABankAccountNumber, "^[A-Z]") && (ABankAccountNumber.Length > 2) && (ABankAccountNumber.Substring(0, 2) == "DE")) { // TODO search for IBAN / BIC instead of bank sort code and account number // For the moment, we try to assume sort code and account number // it might be wrong, but then we would not find a donor anyway. // we should definitely not store these calculated numbers // perhaps do validation against https://kontocheck.solidcharity.com string IBAN = ABankAccountNumber; ABankSortCode = IBAN.Substring(4, 8); ABankAccountNumber = IBAN.Substring(12).TrimStart(new char[] { '0' }); // TLogging.Log("IBAN " + IBAN + " converted to sort code " + ABankSortCode + " and account number + " + ABankAccountNumber); } DataRowView[] bankingDetails = AMainDS.PBankingDetails.DefaultView.FindRows(new object[] { ABankSortCode, ABankAccountNumber }); if (bankingDetails.Length > 0) { if (bankingDetails.Length > 1) { TLogging.Log("Warning: 2 people own the same bank account " + ABankSortCode + " " + ABankAccountNumber); } // TODO: just return the first partner key; usually not 2 people owning the same bank account donate at the same time??? BankImportTDSPBankingDetailsRow row = (BankImportTDSPBankingDetailsRow)bankingDetails[0].Row; return(row.PartnerKey); } return(-1); }
private static Int64 GetDonorByIBAN(BankImportTDS AMainDS, string AIBAN) { DataRowView[] bankingDetails = AMainDS.PBankingDetails.DefaultView.FindRows(new object[] { AIBAN }); if (bankingDetails.Length > 0) { if (bankingDetails.Length > 1) { TLogging.Log("Warning: 2 people own the same bank account " + AIBAN); } // TODO: just return the first partner key; usually not 2 people owning the same bank account donate at the same time??? BankImportTDSPBankingDetailsRow row = (BankImportTDSPBankingDetailsRow)bankingDetails[0].Row; return(row.PartnerKey); } return(-1); }
private static void CreateMatches(BankImportTDS AMainDS, AEpStatementRow ACurrentStatement, Int32 ASelectedGiftBatch, bool APostedBatch) { // remove all gifts and giftdetails that don't belong to the selected batch List <DataRow> ToDelete = new List <DataRow>(); foreach (AGiftDetailRow giftdetail in AMainDS.AGiftDetail.Rows) { if (giftdetail.BatchNumber != ASelectedGiftBatch) { ToDelete.Add(giftdetail); } } foreach (DataRow del in ToDelete) { AMainDS.AGiftDetail.Rows.Remove(del); } ToDelete = new List <DataRow>(); foreach (AGiftRow gift in AMainDS.AGift.Rows) { if (gift.BatchNumber != ASelectedGiftBatch) { ToDelete.Add(gift); } } foreach (DataRow del in ToDelete) { AMainDS.AGift.Rows.Remove(del); } ToDelete = new List <DataRow>(); foreach (BankImportTDSAEpTransactionRow transaction in AMainDS.AEpTransaction.Rows) { // delete transactions with negative amount if (transaction.TransactionAmount < 0) { ToDelete.Add(transaction); } else { transaction.MatchAction = MFinanceConstants.BANK_STMT_STATUS_UNMATCHED; } } foreach (DataRow del in ToDelete) { AMainDS.AEpTransaction.Rows.Remove(del); } FindDonorKeysByBankAccount(AMainDS); AMainDS.PBankingDetails.DefaultView.Sort = BankImportTDSPBankingDetailsTable.GetPartnerKeyDBName(); MatchDonorsWithKnownBankaccount(AMainDS); while (MatchTransactionsToGiftBatch(AMainDS)) { ; } if (TLogging.DebugLevel > 0) { TLogging.Log("transactions not matched yet:"); foreach (BankImportTDSAEpTransactionRow transaction in AMainDS.AEpTransaction.Rows) { if (transaction.MatchAction != Ict.Petra.Shared.MFinance.MFinanceConstants.BANK_STMT_STATUS_MATCHED) { TLogging.Log( " " + transaction.DonorKey.ToString() + " " + transaction.AccountName + " --- " + transaction.Description + " " + transaction.TransactionAmount.ToString()); if (transaction.DonorKey == -1) { TLogging.Log(" " + transaction.BankAccountNumber + " " + transaction.BranchCode); } } } TLogging.Log("gifts not matched yet:"); foreach (BankImportTDSAGiftDetailRow giftdetail in AMainDS.AGiftDetail.Rows) { if (!giftdetail.AlreadyMatched) { string HasBankDetails = "-"; int BankDetailsIndex = AMainDS.PBankingDetails.DefaultView.Find(giftdetail.DonorKey); if (BankDetailsIndex != -1) { HasBankDetails = "*"; } TLogging.Log( " " + HasBankDetails + " " + giftdetail.DonorKey.ToString() + " " + giftdetail.DonorShortName + " --- " + giftdetail.RecipientDescription + " " + giftdetail.GiftAmount.ToString()); if (BankDetailsIndex != -1) { BankImportTDSPBankingDetailsRow bankdetail = (BankImportTDSPBankingDetailsRow)AMainDS.PBankingDetails.DefaultView[BankDetailsIndex].Row; TLogging.Log(" " + bankdetail.BankAccountNumber + " " + bankdetail.BankSortCode); } } } int CountMatched = 0; foreach (BankImportTDSAEpTransactionRow transaction in AMainDS.AEpTransaction.Rows) { if (transaction.MatchAction == Ict.Petra.Shared.MFinance.MFinanceConstants.BANK_STMT_STATUS_MATCHED) { CountMatched++; } } TLogging.Log("matched: " + CountMatched.ToString() + " of " + AMainDS.AEpTransaction.Rows.Count.ToString()); } StoreCurrentMatches(AMainDS, ACurrentStatement.BankAccountCode); }