/// <summary> /// export all GL Transactions in the given year, towards the specified cost centres /// </summary> public static void ExportGLTransactions(string AOutputPath, char ACSVSeparator, string ANewLine, Int32 ALedgerNumber, Int32 AFinancialYear, string ACostCentres, string AIgnoreAccounts, string AIgnoreReferences, ref List <string> ACostCentresInvolved, ref List <string> AAccountsInvolved) { string filename = Path.GetFullPath(Path.Combine(AOutputPath, "transaction.csv")); Console.WriteLine("Writing file: " + filename); TDBTransaction Transaction = new TDBTransaction(); ATransactionTable transactions = new ATransactionTable(); ATransAnalAttribTable TransAnalAttrib = new ATransAnalAttribTable(); ATransactionTable allTransactionsInJournal = new ATransactionTable(); AGiftBatchTable giftbatches = new AGiftBatchTable(); AAccountTable accounts = new AAccountTable(); DBAccess.ReadTransaction(ref Transaction, delegate { TDataBase db = Transaction.DataBaseObj; string sql = String.Format("SELECT T.*, B.{4} AS a_transaction_date_d " + "FROM PUB_{8} AS B, PUB_{7} AS T " + "WHERE B.{9} = {10} AND B.{15} = {16} AND B.{11}='{12}' " + "AND T.{9} = B.{9} AND T.{0} = B.{0} " + "AND T.{13} IN ({14}) " + "AND NOT T.{17} IN ({19}) " + "AND NOT T.{20} IN ({21}) " + "ORDER BY {0}, {1}, {2}", ATransactionTable.GetBatchNumberDBName(), ATransactionTable.GetJournalNumberDBName(), ATransactionTable.GetTransactionNumberDBName(), ATransactionTable.GetTransactionAmountDBName(), ABatchTable.GetDateEffectiveDBName(), ATransactionTable.GetNarrativeDBName(), ATransactionTable.GetReferenceDBName(), ATransactionTable.GetTableDBName(), ABatchTable.GetTableDBName(), ATransactionTable.GetLedgerNumberDBName(), ALedgerNumber, ABatchTable.GetBatchStatusDBName(), MFinanceConstants.BATCH_POSTED, ATransactionTable.GetCostCentreCodeDBName(), "'" + ACostCentres.Replace(",", "','") + "'", ABatchTable.GetBatchYearDBName(), AFinancialYear, ATransactionTable.GetAccountCodeDBName(), ATransactionTable.GetDebitCreditIndicatorDBName(), "'" + AIgnoreAccounts.Replace(",", "','") + "'", ATransactionTable.GetReferenceDBName(), "'" + AIgnoreReferences.Replace(",", "','") + "'"); transactions = (ATransactionTable)db.SelectDT(transactions, sql, Transaction, null, 0, 0); // get the analysis attributes sql = String.Format("SELECT A.* from PUB_{1} AS B, PUB_{13} AS T, PUB_{0} AS A " + "WHERE B.{2} = {3} AND B.{4} = {5} AND B.{6}='{7}' " + "AND T.{2} = B.{2} AND T.{8} = B.{8} " + "AND T.{9} IN ({10}) " + "AND A.{2} = T.{2} AND A.{8} = T.{8} AND A.{11} = T.{11} AND A.{12} = T.{12}", ATransAnalAttribTable.GetTableDBName(), ABatchTable.GetTableDBName(), ABatchTable.GetLedgerNumberDBName(), ALedgerNumber, ABatchTable.GetBatchYearDBName(), AFinancialYear, ABatchTable.GetBatchStatusDBName(), MFinanceConstants.BATCH_POSTED, ATransactionTable.GetBatchNumberDBName(), ATransactionTable.GetCostCentreCodeDBName(), "'" + ACostCentres.Replace(",", "','") + "'", ATransactionTable.GetJournalNumberDBName(), ATransactionTable.GetTransactionNumberDBName(), ATransactionTable.GetTableDBName(), ABatchTable.GetBatchYearDBName()); db.SelectDT(TransAnalAttrib, sql, Transaction, null, 0, 0); TransAnalAttrib.DefaultView.Sort = ATransAnalAttribTable.GetBatchNumberDBName() + "," + ATransAnalAttribTable.GetJournalNumberDBName() + "," + ATransAnalAttribTable.GetTransactionNumberDBName(); // get a list of all batches involved List <Int64> batches = new List <Int64>(); StringBuilder batchnumbers = new StringBuilder(); foreach (ATransactionRow r in transactions.Rows) { if (!batches.Contains(r.BatchNumber)) { batches.Add(r.BatchNumber); batchnumbers.Append(r.BatchNumber.ToString() + ","); } } // get the other transactions in the same journal for finding the opposite cc/acc involved // for performance reasons, get all transactions of the whole batch sql = String.Format("SELECT DISTINCT TJ.* " + "FROM PUB_{0} AS TJ " + "WHERE TJ.{1} = {2} AND TJ.{3} IN ({4})", ATransactionTable.GetTableDBName(), ATransactionTable.GetLedgerNumberDBName(), ALedgerNumber, ATransactionTable.GetBatchNumberDBName(), batchnumbers.ToString() + "-1"); allTransactionsInJournal = (ATransactionTable)db.SelectDT(allTransactionsInJournal, sql, Transaction, null, 0, 0); allTransactionsInJournal.DefaultView.Sort = ATransactionTable.GetBatchNumberDBName() + "," + ATransactionTable.GetJournalNumberDBName(); // get all names of gift batches sql = String.Format("SELECT * FROM PUB_{0} " + "WHERE {1} = {2} " + "AND {3} = {4}", AGiftBatchTable.GetTableDBName(), AGiftBatchTable.GetLedgerNumberDBName(), ALedgerNumber, AGiftBatchTable.GetBatchYearDBName(), AFinancialYear); db.SelectDT(giftbatches, sql, Transaction, null, 0, 0); giftbatches.DefaultView.Sort = AGiftBatchTable.GetBatchNumberDBName(); sql = String.Format("SELECT * FROM PUB_{0} " + "WHERE {1} = {2}", AAccountTable.GetTableDBName(), AAccountTable.GetLedgerNumberDBName(), ALedgerNumber); db.SelectDT(accounts, sql, Transaction, null, 0, 0); accounts.DefaultView.Sort = AAccountTable.GetAccountCodeDBName(); }); StringBuilder sb = new StringBuilder(); int rowCounter = 0; foreach (ATransactionRow row in transactions.Rows) { if (row.DebitCreditIndicator) { row.TransactionAmount *= -1.0m; } StringBuilder attributes = new StringBuilder(); DataRowView[] RelatedTransactions = allTransactionsInJournal.DefaultView.FindRows(new object[] { row.BatchNumber, row.JournalNumber }); ATransactionRow[] OtherTransactions = GetOtherTransactions(row, RelatedTransactions); string OtherCostCentres = string.Empty; string OtherAccountCodes = string.Empty; if (OtherTransactions.Length < 30) { foreach (ATransactionRow r in OtherTransactions) { OtherCostCentres = StringHelper.AddCSV(OtherCostCentres, r.CostCentreCode); OtherAccountCodes = StringHelper.AddCSV(OtherAccountCodes, r.AccountCode); } } if (!ACostCentresInvolved.Contains(row.CostCentreCode)) { ACostCentresInvolved.Add(row.CostCentreCode); } if (!AAccountsInvolved.Contains(row.AccountCode)) { AAccountsInvolved.Add(row.AccountCode); } // we are using gift batch for receiving payments string Narrative = row.Narrative; if (Narrative.StartsWith("GB - Gift Batch ") && row.Reference.StartsWith("GB")) { // find the account and set the account description into the narrative try { DataRowView[] acc = accounts.DefaultView.FindRows(row.AccountCode); Narrative = ((AAccountRow)acc[0].Row).AccountCodeLongDesc; } catch (Exception) { } try { DataRowView[] gb = giftbatches.DefaultView.FindRows(Convert.ToInt32(row.Reference.Substring(2))); Narrative += " " + ((AGiftBatchRow)gb[0].Row).BatchDescription; } catch (Exception) { } } sb.Append(StringHelper.StrMerge( new string[] { "B" + row.BatchNumber.ToString() + "_J" + row.JournalNumber.ToString() + "_T" + row.TransactionNumber.ToString(), row.CostCentreCode, row.AccountCode, row.TransactionDate.ToString("yyyyMMdd"), OtherCostCentres, OtherAccountCodes, Narrative, row.Reference, String.Format("{0:N}", row.TransactionAmount), attributes.ToString() }, ACSVSeparator)); sb.Append(ANewLine); rowCounter++; if (rowCounter % 500 == 0) { TLogging.Log("Processing transactions " + rowCounter.ToString()); } } TLogging.Log("Processing transactions " + rowCounter.ToString()); StreamWriter sw = new StreamWriter(filename, false, Encoding.GetEncoding(1252)); sw.Write(sb.ToString()); sw.Close(); }
/// <summary> /// Export all the Data of the batches array list to a String /// </summary> /// <param name="Abatches"></param> /// <param name="ArequestParams"></param> /// <param name="AexportString"></param> /// <returns>false if batch does not exist at all</returns> public bool ExportAllGLBatchData(ArrayList Abatches, Hashtable ArequestParams, out String AexportString) { FStringWriter = new StringWriter(); FMainDS = new GLBatchTDS(); FDelimiter = (String)ArequestParams["Delimiter"]; FLedgerNumber = (Int32)ArequestParams["ALedgerNumber"]; FDateFormatString = (String)ArequestParams["DateFormatString"]; FSummary = (bool)ArequestParams["Summary"]; FUseBaseCurrency = (bool)ArequestParams["bUseBaseCurrency"]; FBaseCurrency = (String)ArequestParams["BaseCurrency"]; FDateForSummary = (DateTime)ArequestParams["DateForSummary"]; String NumberFormat = (String)ArequestParams["NumberFormat"]; FCultureInfo = new CultureInfo(NumberFormat.Equals("American") ? "en-US" : "de-DE"); FTransactionsOnly = (bool)ArequestParams["TransactionsOnly"]; FDontSummarize = (bool)ArequestParams["bDontSummarize"]; FDontSummarizeAccount = (String)ArequestParams["DontSummarizeAccount"]; SortedDictionary <String, AJournalSummaryRow> sdSummary = new SortedDictionary <String, AJournalSummaryRow>(); TDBTransaction Transaction = new TDBTransaction(); TDataBase db = DBAccess.Connect("ExportAllGLBatchData"); db.ReadTransaction(ref Transaction, delegate { UInt32 progressCounter = 0; UInt32 progressJournalCounter = 0; TProgressTracker.InitProgressTracker(DomainManager.GClientID.ToString(), Catalog.GetString("Exporting GL Batches"), 100); TProgressTracker.SetCurrentState(DomainManager.GClientID.ToString(), Catalog.GetString("Retrieving records"), 10); while (Abatches.Count > 0) { Int32 ABatchNumber = (Int32)Abatches[0]; ABatchAccess.LoadByPrimaryKey(FMainDS, FLedgerNumber, ABatchNumber, Transaction); AJournalAccess.LoadViaABatch(FMainDS, FLedgerNumber, ABatchNumber, Transaction); foreach (AJournalRow journal in FMainDS.AJournal.Rows) { if (journal.BatchNumber.Equals(ABatchNumber) && journal.LedgerNumber.Equals(FLedgerNumber)) { ATransactionAccess.LoadViaAJournal(FMainDS, journal.LedgerNumber, journal.BatchNumber, journal.JournalNumber, Transaction); } } foreach (ATransactionRow trans in FMainDS.ATransaction.Rows) { if (trans.BatchNumber.Equals(ABatchNumber) && trans.LedgerNumber.Equals(FLedgerNumber)) { ATransAnalAttribAccess.LoadViaATransaction(FMainDS, trans.LedgerNumber, trans.BatchNumber, trans.JournalNumber, trans.TransactionNumber, Transaction); } } Abatches.RemoveAt(0); } UInt32 counter = 0; AJournalSummaryRow journalSummary = null; foreach (ABatchRow batch in FMainDS.ABatch.Rows) { progressCounter = 0; TProgressTracker.SetCurrentState(DomainManager.GClientID.ToString(), String.Format(Catalog.GetString("Batch {0}"), batch.BatchNumber), 20); if (!FTransactionsOnly & !FSummary) { WriteBatchLine(batch); } //foreach (AJournalRow journal in journalDS.AJournal.Rows) foreach (AJournalRow journal in FMainDS.AJournal.Rows) { if (journal.BatchNumber.Equals(batch.BatchNumber) && journal.LedgerNumber.Equals(batch.LedgerNumber)) { progressJournalCounter = 0; TProgressTracker.SetCurrentState(DomainManager.GClientID.ToString(), String.Format(Catalog.GetString("Batch {0}, Journal {1}"), batch.BatchNumber, journal.JournalNumber), (progressCounter / 25 + 4) * 5 > 90 ? 90 : (progressCounter / 25 + 4) * 5); if (FSummary) { String mapCurrency = FUseBaseCurrency ? FBaseCurrency : journal.TransactionCurrency; decimal mapExchangeRateToBase = FUseBaseCurrency ? 1 : journal.ExchangeRateToBase; if (!sdSummary.TryGetValue(mapCurrency, out journalSummary)) { journalSummary = new AJournalSummaryRow(); sdSummary.Add(mapCurrency, journalSummary); } //overwrite always because we want to have the last journalSummary.ExchangeRateToBase = mapExchangeRateToBase; journalSummary.TransactionCurrency = mapCurrency; } else { if (!FTransactionsOnly) { WriteJournalLine(journal); } } FMainDS.ATransaction.DefaultView.Sort = ATransactionTable.GetTransactionNumberDBName(); FMainDS.ATransaction.DefaultView.RowFilter = String.Format("{0}={1} and {2}={3} and {4}={5}", ATransactionTable.GetLedgerNumberDBName(), journal.LedgerNumber, ATransactionTable.GetBatchNumberDBName(), journal.BatchNumber, ATransactionTable.GetJournalNumberDBName(), journal.JournalNumber); foreach (DataRowView dv in FMainDS.ATransaction.DefaultView) { progressJournalCounter++; if (++progressCounter % 25 == 0) { TProgressTracker.SetCurrentState(DomainManager.GClientID.ToString(), String.Format(Catalog.GetString( "Batch {0}, Journal {1} - {2}"), batch.BatchNumber, journal.JournalNumber, progressJournalCounter), (progressCounter / 25 + 4) * 5 > 90 ? 90 : (progressCounter / 25 + 4) * 5); } ATransactionRow transactionRow = (ATransactionRow)dv.Row; if (FSummary) { ATransactionSummaryRow transactionSummary; counter++; String DictionaryKey = transactionRow.CostCentreCode + ";" + transactionRow.AccountCode; int signum = transactionRow.DebitCreditIndicator ? 1 : -1; bool bDontSummarizeAccount = FDontSummarize && FDontSummarizeAccount != null && FDontSummarizeAccount.Length > 0 && transactionRow.AccountCode.Equals(FDontSummarizeAccount); if (bDontSummarizeAccount) { DictionaryKey += ";" + counter.ToString("X"); } if (journalSummary.TransactionSummaries.TryGetValue(DictionaryKey, out transactionSummary)) { transactionSummary.TransactionAmount += signum * transactionRow.TransactionAmount; transactionSummary.AmountInBaseCurrency += signum * transactionRow.AmountInBaseCurrency; } else { transactionSummary = new ATransactionSummaryRow(); transactionSummary.CostCentreCode = transactionRow.CostCentreCode; transactionSummary.AccountCode = transactionRow.AccountCode; transactionSummary.TransactionAmount = signum * transactionRow.TransactionAmount; transactionSummary.AmountInBaseCurrency = signum * transactionRow.AmountInBaseCurrency; if (bDontSummarizeAccount) { transactionSummary.Narrative = transactionRow.Narrative; transactionSummary.Reference = transactionRow.Reference; } else { transactionSummary.Narrative = summarizedData; transactionSummary.Reference = ""; } journalSummary.TransactionSummaries.Add(DictionaryKey, transactionSummary); } } else { WriteTransactionLine(transactionRow); } } } } } if (FSummary) { TProgressTracker.SetCurrentState(DomainManager.GClientID.ToString(), Catalog.GetString("Summarising"), 95); //To simplify matters this is always written even if there are no batches if (!FTransactionsOnly) { // no batch summary line if only transactions are to be exported WriteBatchSummaryLine(); } foreach (KeyValuePair <string, AJournalSummaryRow> kvp in sdSummary) { if (!FTransactionsOnly) { // no journal summary line if only transactions are to be exported WriteJournalSummaryLine(kvp.Value); } foreach (KeyValuePair <string, ATransactionSummaryRow> kvpt in kvp.Value.TransactionSummaries) { WriteTransactionSummaryLine(kvpt.Value); } } } TProgressTracker.SetCurrentState(DomainManager.GClientID.ToString(), Catalog.GetString("GL batch export successful"), 100); TProgressTracker.FinishJob(DomainManager.GClientID.ToString()); }); AexportString = FStringWriter.ToString(); return(true); } // Export All GLBatch Data