コード例 #1
0
        private void CalculateTotalPayment()
        {
            FMainDS.AApDocumentPayment.DefaultView.RowFilter = String.Format("{0}={1}",
                                                                             AApDocumentPaymentTable.GetPaymentNumberDBName(), FSelectedPaymentRow.PaymentNumber);

            FSelectedPaymentRow.Amount = 0m;

            foreach (DataRowView rv in FMainDS.AApDocumentPayment.DefaultView)
            {
                AccountsPayableTDSAApDocumentPaymentRow DocPaymentRow = (AccountsPayableTDSAApDocumentPaymentRow)rv.Row;
                FSelectedPaymentRow.Amount += DocPaymentRow.Amount;
            }

            UpdateTotalAmount(null, null);
        }
コード例 #2
0
        public static Decimal GetPartPaidAmount(Int32 ApDocumentId)
        {
            Decimal PaidAmount = 0m;

            TDBTransaction ReadTransaction = null;

            DBAccess.GDBAccessObj.BeginAutoReadTransaction(ref ReadTransaction,
                                                           delegate
            {
                AApDocumentPaymentTable PreviousPayments =
                    AApDocumentPaymentAccess.LoadViaAApDocument(ApDocumentId, ReadTransaction);

                foreach (AApDocumentPaymentRow PrevPaymentRow in PreviousPayments.Rows)
                {
                    PaidAmount += PrevPaymentRow.Amount;
                }
            });     // End of BeginAutoReadTransaction

            return(PaidAmount);
        }
コード例 #3
0
        public static Decimal GetPartPaidAmount(Int32 ApDocumentId)
        {
            Decimal PaidAmount = 0m;

            TDBTransaction ReadTransaction = null;

            DBAccess.GDBAccessObj.GetNewOrExistingAutoReadTransaction(IsolationLevel.ReadCommitted,
                                                                      TEnforceIsolationLevel.eilMinimum,
                                                                      ref ReadTransaction,
                                                                      delegate
            {
                AApDocumentPaymentTable PreviousPayments =
                    AApDocumentPaymentAccess.LoadViaAApDocument(ApDocumentId, ReadTransaction);

                foreach (AApDocumentPaymentRow PrevPaymentRow in PreviousPayments.Rows)
                {
                    PaidAmount += PrevPaymentRow.Amount;
                }
            });     // End of BeginAutoReadTransaction

            return(PaidAmount);
        }
コード例 #4
0
ファイル: AP.Find.cs プロジェクト: weblate/openpetra
        public static Decimal GetPartPaidAmount(Int32 ApDocumentId)
        {
            Decimal PaidAmount = 0m;

            TDBTransaction ReadTransaction = new TDBTransaction();
            TDataBase      db = DBAccess.Connect("GetPartPaidAmount");

            db.ReadTransaction(
                ref ReadTransaction,
                delegate
            {
                AApDocumentPaymentTable PreviousPayments =
                    AApDocumentPaymentAccess.LoadViaAApDocument(ApDocumentId, ReadTransaction);

                foreach (AApDocumentPaymentRow PrevPaymentRow in PreviousPayments.Rows)
                {
                    PaidAmount += PrevPaymentRow.Amount;
                }
            });     // End of ReadTransaction

            return(PaidAmount);
        }
コード例 #5
0
        private static void SetOutstandingAmount(AccountsPayableTDSAApDocumentRow Row, Int32 ALedgerNumber, AApDocumentPaymentTable DocPaymentTbl)
        {
            if (Row.DocumentStatus == MFinanceConstants.AP_DOCUMENT_PAID)
            {
                Row.OutstandingAmount = 0;
            }
            else
            {
                Row.OutstandingAmount = Row.TotalAmount;
            }

            if (Row.DocumentStatus == MFinanceConstants.AP_DOCUMENT_PARTIALLY_PAID)
            {
                // For any invoices that are partly paid, find out how much is outstanding.
                Row.OutstandingAmount -= UIConnectors.TFindUIConnector.GetPartPaidAmount(Row.ApDocumentId);
            }
        }
コード例 #6
0
        /// <summary>
        /// export all posted invoices of other suppliers in this year
        /// </summary>
        public static void Export(string AOutputPath,
                                  char ACSVSeparator,
                                  string ANewLine,
                                  Int32 ALedgerNumber,
                                  Int32 AFinancialYear,
                                  string ACostCentres)
        {
            string filename = Path.GetFullPath(Path.Combine(AOutputPath, "accountspayable.csv"));

            Console.WriteLine("Writing file: " + filename);

            StringBuilder sb = new StringBuilder();

            TDBTransaction Transaction = DBAccess.GDBAccessObj.BeginTransaction(IsolationLevel.ReadCommitted);

            // get all posted or paid ap_documents by their date issued
            string sql =
                String.Format(
                    "SELECT * FROM PUB_{0} " +
                    "WHERE {1} = {2} AND " +
                    "({3} = '{4}' OR {3} = '{5}' OR {3} = '{6}') AND " +
                    "{7} >= ? AND {7} <= ?",
                    AApDocumentTable.GetTableDBName(),
                    AApDocumentTable.GetLedgerNumberDBName(),
                    ALedgerNumber,
                    AApDocumentTable.GetDocumentStatusDBName(),
                    MFinanceConstants.AP_DOCUMENT_POSTED,
                    MFinanceConstants.AP_DOCUMENT_PARTIALLY_PAID,
                    MFinanceConstants.AP_DOCUMENT_PAID,
                    AApDocumentTable.GetDateIssuedDBName());

            List <OdbcParameter> Parameters = new List <OdbcParameter>();
            OdbcParameter        param      = new OdbcParameter("startdate", OdbcType.DateTime);

            param.Value = TAccountingPeriodsWebConnector.GetPeriodStartDate(ALedgerNumber, AFinancialYear, 0, 1);
            Parameters.Add(param);
            param       = new OdbcParameter("enddate", OdbcType.DateTime);
            param.Value = TAccountingPeriodsWebConnector.GetPeriodEndDate(ALedgerNumber, AFinancialYear, 0, 12);
            Parameters.Add(param);

            AApDocumentTable apDocuments = new AApDocumentTable();

            DBAccess.GDBAccessObj.SelectDT(apDocuments, sql, Transaction, Parameters.ToArray(), 0, 0);

            // get all ap details
            sql =
                String.Format(
                    "SELECT Detail.* FROM PUB_{0} AS Doc, PUB_{8} AS Detail " +
                    "WHERE Doc.{1} = {2} AND " +
                    "({3} = '{4}' OR {3} = '{5}' OR {3} = '{6}') AND " +
                    "{7} >= ? AND {7} <= ? AND " +
                    "Detail.{1} = Doc.{1} AND Detail.{9} = Doc.{9} AND " +
                    "Detail.{10} IN ({11})",
                    AApDocumentTable.GetTableDBName(),
                    AApDocumentTable.GetLedgerNumberDBName(),
                    ALedgerNumber,
                    AApDocumentTable.GetDocumentStatusDBName(),
                    MFinanceConstants.AP_DOCUMENT_POSTED,
                    MFinanceConstants.AP_DOCUMENT_PARTIALLY_PAID,
                    MFinanceConstants.AP_DOCUMENT_PAID,
                    AApDocumentTable.GetDateIssuedDBName(),
                    AApDocumentDetailTable.GetTableDBName(),
                    AApDocumentTable.GetApDocumentIdDBName(),
                    AApDocumentDetailTable.GetCostCentreCodeDBName(),
                    "'" + ACostCentres.Replace(",", "','") + "'");

            AApDocumentDetailTable apDetails = new AApDocumentDetailTable();

            DBAccess.GDBAccessObj.SelectDT(apDetails, sql, Transaction, Parameters.ToArray(), 0, 0);

            apDetails.DefaultView.Sort = AApDocumentDetailTable.GetApDocumentIdDBName();

            // get all ap payments
            sql =
                String.Format(
                    "SELECT DP.{0}, DP.{1}, P.{2} AS {3}, DP.{7}, DP.{15} FROM PUB_{4} AS Doc, PUB_{5} AS DP, PUB_{6} AS P " +
                    "WHERE Doc.{7} = {8} AND " +
                    "({9} = '{10}' OR {9} = '{11}' OR {9} = '{12}') AND " +
                    "{13} >= ? AND {13} <= ? AND " +
                    "DP.{7} = Doc.{7} AND DP.{14} = Doc.{14} AND " +
                    "P.{7} = Doc.{7} AND P.{15} = DP.{15}",

                    AApDocumentPaymentTable.GetApDocumentIdDBName(),
                    AApDocumentPaymentTable.GetAmountDBName(),
                    AApPaymentTable.GetPaymentDateDBName(),
                    AApDocumentPaymentTable.GetDateCreatedDBName(),
                    AApDocumentTable.GetTableDBName(),
                    AApDocumentPaymentTable.GetTableDBName(),
                    AApPaymentTable.GetTableDBName(),

                    AApDocumentTable.GetLedgerNumberDBName(),
                    ALedgerNumber,
                    AApDocumentTable.GetDocumentStatusDBName(),
                    MFinanceConstants.AP_DOCUMENT_POSTED,
                    MFinanceConstants.AP_DOCUMENT_PARTIALLY_PAID,
                    MFinanceConstants.AP_DOCUMENT_PAID,
                    AApDocumentTable.GetDateIssuedDBName(),

                    AApDocumentTable.GetApDocumentIdDBName(),
                    AApPaymentTable.GetPaymentNumberDBName());

            AApDocumentPaymentTable apPayments = new AApDocumentPaymentTable();

            DBAccess.GDBAccessObj.SelectDT(apPayments, sql, Transaction, Parameters.ToArray(), 0, 0);

            apPayments.DefaultView.Sort = AApDocumentPaymentTable.GetApDocumentIdDBName();

            // get the analysis attributes for the taxes
            sql =
                String.Format(
                    "SELECT Attrib.* FROM PUB_{0} AS Doc, PUB_{8} AS Attrib " +
                    "WHERE Doc.{1} = {2} AND " +
                    "({3} = '{4}' OR {3} = '{5}' OR {3} = '{6}') AND " +
                    "{7} >= ? AND {7} <= ? AND " +
                    "Attrib.{1} = Doc.{1} AND Attrib.{9} = Doc.{9}",
                    AApDocumentTable.GetTableDBName(),
                    AApDocumentTable.GetLedgerNumberDBName(),
                    ALedgerNumber,
                    AApDocumentTable.GetDocumentStatusDBName(),
                    MFinanceConstants.AP_DOCUMENT_POSTED,
                    MFinanceConstants.AP_DOCUMENT_PARTIALLY_PAID,
                    MFinanceConstants.AP_DOCUMENT_PAID,
                    AApDocumentTable.GetDateIssuedDBName(),
                    AApAnalAttribTable.GetTableDBName(),
                    AApDocumentTable.GetApDocumentIdDBName());

            AApAnalAttribTable apAttrib = new AApAnalAttribTable();

            DBAccess.GDBAccessObj.SelectDT(apAttrib, sql, Transaction, Parameters.ToArray(), 0, 0);

            apAttrib.DefaultView.Sort = AApAnalAttribTable.GetApDocumentIdDBName() + "," + AApAnalAttribTable.GetDetailNumberDBName();

            // get the supplier name
            sql =
                String.Format(
                    "SELECT DISTINCT p.* FROM PUB_{0} AS Doc, PUB_{8} AS p " +
                    "WHERE Doc.{1} = {2} AND " +
                    "({3} = '{4}' OR {3} = '{5}' OR {3} = '{6}') AND " +
                    "{7} >= ? AND {7} <= ? AND " +
                    "p.{9} = Doc.{10}",
                    AApDocumentTable.GetTableDBName(),
                    AApDocumentTable.GetLedgerNumberDBName(),
                    ALedgerNumber,
                    AApDocumentTable.GetDocumentStatusDBName(),
                    MFinanceConstants.AP_DOCUMENT_POSTED,
                    MFinanceConstants.AP_DOCUMENT_PARTIALLY_PAID,
                    MFinanceConstants.AP_DOCUMENT_PAID,
                    AApDocumentTable.GetDateIssuedDBName(),
                    PPartnerTable.GetTableDBName(),
                    PPartnerTable.GetPartnerKeyDBName(),
                    AApDocumentTable.GetPartnerKeyDBName());

            PPartnerTable suppliers = new PPartnerTable();

            DBAccess.GDBAccessObj.SelectDT(suppliers, sql, Transaction, Parameters.ToArray(), 0, 0);

            foreach (AApDocumentRow doc in apDocuments.Rows)
            {
                PPartnerRow supplier = (PPartnerRow)suppliers.Rows.Find(doc.PartnerKey);

                DataRowView[] detailsRV = apDetails.DefaultView.FindRows(doc.ApDocumentId);

                foreach (DataRowView rv in detailsRV)
                {
                    AApDocumentDetailRow detail = (AApDocumentDetailRow)rv.Row;

                    if (doc.CreditNoteFlag)
                    {
                        detail.Amount *= -1.0m;
                    }

                    DataRowView[] payments = apPayments.DefaultView.FindRows(doc.ApDocumentId);

                    string DatePaid = string.Empty;

                    if (payments.Length > 1)
                    {
                        DatePaid = "Several Payments: ";

                        foreach (DataRowView rvPayment in payments)
                        {
                            AApDocumentPaymentRow payment = ((AApDocumentPaymentRow)rvPayment.Row);
                            DatePaid += payment.DateCreated.Value.ToString("yyyyMMdd") + " ";
                            DatePaid += payment.PaymentNumber.ToString() + "; ";
                        }

                        // for gdpdu, only write dates to this column
                        DatePaid = string.Empty;
                    }
                    else if (payments.Length == 1)
                    {
                        AApDocumentPaymentRow payment = ((AApDocumentPaymentRow)payments[0].Row);
                        DatePaid = payment.DateCreated.Value.ToString("yyyyMMdd");
                    }

                    sb.Append(StringHelper.StrMerge(
                                  new string[] {
                        doc.ApNumber.ToString(),
                        detail.DetailNumber.ToString(),
                        doc.DateIssued.ToString("yyyyMMdd"),
                        DatePaid,
                        doc.PartnerKey.ToString(),
                        supplier.PartnerShortName,
                        detail.CostCentreCode,
                        detail.AccountCode,
                        String.Format("{0:N}", detail.Amount),
                        detail.Narrative
                    }, ACSVSeparator));
                    sb.Append(ANewLine);
                }
            }

            DBAccess.GDBAccessObj.RollbackTransaction();

            StreamWriter sw = new StreamWriter(filename, false, Encoding.GetEncoding(1252));

            sw.Write(sb.ToString());
            sw.Close();
        }
コード例 #7
0
        private void MakePayment(object sender, EventArgs e)
        {
            //FSelectedDocumentRow.Amount = Decimal.Parse(txtAmountToPay.Text);
            FSelectedDocumentRow.Amount     = txtAmountToPay.NumberValueDecimal.Value;
            FSelectedPaymentRow.BankAccount = cmbBankAccount.GetSelectedString();
            AccountsPayableTDSAApPaymentTable AApPayment = FMainDS.AApPayment;

            //
            // I want to check whether the user is paying more than the due amount on any of these payments...
            //
            foreach (AccountsPayableTDSAApPaymentRow PaymentRow in AApPayment.Rows)
            {
                FMainDS.AApDocumentPayment.DefaultView.RowFilter = String.Format("{0}={1}",
                                                                                 AApDocumentPaymentTable.GetPaymentNumberDBName(), PaymentRow.PaymentNumber);

                foreach (DataRowView rv in FMainDS.AApDocumentPayment.DefaultView)
                {
                    AccountsPayableTDSAApDocumentPaymentRow DocPaymentRow = (AccountsPayableTDSAApDocumentPaymentRow)rv.Row;
                    Boolean overPayment = (DocPaymentRow.DocType == "INVOICE") ?
                                          (DocPaymentRow.Amount > DocPaymentRow.InvoiceTotal) : (DocPaymentRow.Amount < DocPaymentRow.InvoiceTotal);

                    if (overPayment)
                    {
                        String strMessage =
                            String.Format(Catalog.GetString(
                                              "Payment of {0} {1} to {2}: Payment cannot be more than the due amount."),
                                          StringHelper.FormatUsingCurrencyCode(DocPaymentRow.Amount, PaymentRow.CurrencyCode),
                                          PaymentRow.CurrencyCode, PaymentRow.SupplierName);

                        System.Windows.Forms.MessageBox.Show(strMessage, Catalog.GetString("OverPayment"));
                        return;
                    }
                }
            }

            TDlgGLEnterDateEffective dateEffectiveDialog = new TDlgGLEnterDateEffective(
                FMainDS.AApDocument[0].LedgerNumber,
                Catalog.GetString("Select payment date"),
                Catalog.GetString("The date effective for the payment") + ":");

            if (dateEffectiveDialog.ShowDialog() != DialogResult.OK)
            {
                MessageBox.Show(Catalog.GetString("The payment was cancelled."), Catalog.GetString(
                                    "No Success"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            DateTime PaymentDate = dateEffectiveDialog.SelectedDate;
            TVerificationResultCollection Verifications;

            this.Cursor = Cursors.WaitCursor;

            if (!TRemote.MFinance.AP.WebConnectors.PostAPPayments(
                    ref FMainDS,
                    PaymentDate,
                    out Verifications))
            {
                this.Cursor = Cursors.Default;
                string ErrorMessages = String.Empty;

                foreach (TVerificationResult verif in Verifications)
                {
                    ErrorMessages += "[" + verif.ResultContext + "] " +
                                     verif.ResultTextCaption + ": " +
                                     verif.ResultText + Environment.NewLine;
                }

                System.Windows.Forms.MessageBox.Show(ErrorMessages, Catalog.GetString("Payment failed"));
            }
            else
            {
                this.Cursor = Cursors.Default;
                PrintPaymentReport(sender, e);
                PrintRemittanceAdvice();

                // TODO: show posting register of GL Batch?

                // After the payments screen, The status of this document may have changed.
                TFormsMessage broadcastMessage = new TFormsMessage(TFormsMessageClassEnum.mcAPTransactionChanged);
                broadcastMessage.SetMessageDataAPTransaction(String.Empty);
                TFormsList.GFormsList.BroadcastFormMessage(broadcastMessage);

                Close();
            }
        }
コード例 #8
0
        /// <summary>
        /// export all posted invoices of other suppliers in this year
        /// </summary>
        public static void Export(string AOutputPath,
            char ACSVSeparator,
            string ANewLine,
            Int32 ALedgerNumber,
            Int32 AFinancialYear,
            string ACostCentres)
        {
            string filename = Path.GetFullPath(Path.Combine(AOutputPath, "accountspayable.csv"));

            Console.WriteLine("Writing file: " + filename);

            StringBuilder sb = new StringBuilder();

            TDBTransaction Transaction = null;
            DBAccess.GDBAccessObj.BeginAutoReadTransaction(IsolationLevel.ReadCommitted, ref Transaction,
                delegate
                {
                    // get all posted or paid ap_documents by their date issued
                    string sql =
                        String.Format(
                            "SELECT * FROM PUB_{0} " +
                            "WHERE {1} = {2} AND " +
                            "({3} = '{4}' OR {3} = '{5}' OR {3} = '{6}') AND " +
                            "{7} >= ? AND {7} <= ?",
                            AApDocumentTable.GetTableDBName(),
                            AApDocumentTable.GetLedgerNumberDBName(),
                            ALedgerNumber,
                            AApDocumentTable.GetDocumentStatusDBName(),
                            MFinanceConstants.AP_DOCUMENT_POSTED,
                            MFinanceConstants.AP_DOCUMENT_PARTIALLY_PAID,
                            MFinanceConstants.AP_DOCUMENT_PAID,
                            AApDocumentTable.GetDateIssuedDBName());

                    List <OdbcParameter>Parameters = new List <OdbcParameter>();
                    OdbcParameter param = new OdbcParameter("startdate", OdbcType.DateTime);
                    param.Value = TAccountingPeriodsWebConnector.GetPeriodStartDate(ALedgerNumber, AFinancialYear, 0, 1);
                    Parameters.Add(param);
                    param = new OdbcParameter("enddate", OdbcType.DateTime);
                    //TODO: Calendar vs Financial Date Handling - Check if this should use financial year start/end and not assume calendar
                    param.Value = TAccountingPeriodsWebConnector.GetPeriodEndDate(ALedgerNumber, AFinancialYear, 0, 12);
                    Parameters.Add(param);

                    AApDocumentTable apDocuments = new AApDocumentTable();
                    DBAccess.GDBAccessObj.SelectDT(apDocuments, sql, Transaction, Parameters.ToArray(), 0, 0);

                    // get all ap details
                    sql =
                        String.Format(
                            "SELECT Detail.* FROM PUB_{0} AS Doc, PUB_{8} AS Detail " +
                            "WHERE Doc.{1} = {2} AND " +
                            "({3} = '{4}' OR {3} = '{5}' OR {3} = '{6}') AND " +
                            "{7} >= ? AND {7} <= ? AND " +
                            "Detail.{1} = Doc.{1} AND Detail.{9} = Doc.{9} AND " +
                            "Detail.{10} IN ({11})",
                            AApDocumentTable.GetTableDBName(),
                            AApDocumentTable.GetLedgerNumberDBName(),
                            ALedgerNumber,
                            AApDocumentTable.GetDocumentStatusDBName(),
                            MFinanceConstants.AP_DOCUMENT_POSTED,
                            MFinanceConstants.AP_DOCUMENT_PARTIALLY_PAID,
                            MFinanceConstants.AP_DOCUMENT_PAID,
                            AApDocumentTable.GetDateIssuedDBName(),
                            AApDocumentDetailTable.GetTableDBName(),
                            AApDocumentTable.GetApDocumentIdDBName(),
                            AApDocumentDetailTable.GetCostCentreCodeDBName(),
                            "'" + ACostCentres.Replace(",", "','") + "'");

                    AApDocumentDetailTable apDetails = new AApDocumentDetailTable();
                    DBAccess.GDBAccessObj.SelectDT(apDetails, sql, Transaction, Parameters.ToArray(), 0, 0);

                    apDetails.DefaultView.Sort = AApDocumentDetailTable.GetApDocumentIdDBName();

                    // get all ap payments
                    sql =
                        String.Format(
                            "SELECT DP.{0}, DP.{1}, P.{2} AS {3}, DP.{7}, DP.{15} FROM PUB_{4} AS Doc, PUB_{5} AS DP, PUB_{6} AS P " +
                            "WHERE Doc.{7} = {8} AND " +
                            "({9} = '{10}' OR {9} = '{11}' OR {9} = '{12}') AND " +
                            "{13} >= ? AND {13} <= ? AND " +
                            "DP.{7} = Doc.{7} AND DP.{14} = Doc.{14} AND " +
                            "P.{7} = Doc.{7} AND P.{15} = DP.{15}",

                            AApDocumentPaymentTable.GetApDocumentIdDBName(),
                            AApDocumentPaymentTable.GetAmountDBName(),
                            AApPaymentTable.GetPaymentDateDBName(),
                            AApDocumentPaymentTable.GetDateCreatedDBName(),
                            AApDocumentTable.GetTableDBName(),
                            AApDocumentPaymentTable.GetTableDBName(),
                            AApPaymentTable.GetTableDBName(),

                            AApDocumentTable.GetLedgerNumberDBName(),
                            ALedgerNumber,
                            AApDocumentTable.GetDocumentStatusDBName(),
                            MFinanceConstants.AP_DOCUMENT_POSTED,
                            MFinanceConstants.AP_DOCUMENT_PARTIALLY_PAID,
                            MFinanceConstants.AP_DOCUMENT_PAID,
                            AApDocumentTable.GetDateIssuedDBName(),

                            AApDocumentTable.GetApDocumentIdDBName(),
                            AApPaymentTable.GetPaymentNumberDBName());

                    AApDocumentPaymentTable apPayments = new AApDocumentPaymentTable();
                    DBAccess.GDBAccessObj.SelectDT(apPayments, sql, Transaction, Parameters.ToArray(), 0, 0);

                    apPayments.DefaultView.Sort = AApDocumentPaymentTable.GetApDocumentIdDBName();

                    // get the analysis attributes for the taxes
                    sql =
                        String.Format(
                            "SELECT Attrib.* FROM PUB_{0} AS Doc, PUB_{8} AS Attrib " +
                            "WHERE Doc.{1} = {2} AND " +
                            "({3} = '{4}' OR {3} = '{5}' OR {3} = '{6}') AND " +
                            "{7} >= ? AND {7} <= ? AND " +
                            "Attrib.{1} = Doc.{1} AND Attrib.{9} = Doc.{9}",
                            AApDocumentTable.GetTableDBName(),
                            AApDocumentTable.GetLedgerNumberDBName(),
                            ALedgerNumber,
                            AApDocumentTable.GetDocumentStatusDBName(),
                            MFinanceConstants.AP_DOCUMENT_POSTED,
                            MFinanceConstants.AP_DOCUMENT_PARTIALLY_PAID,
                            MFinanceConstants.AP_DOCUMENT_PAID,
                            AApDocumentTable.GetDateIssuedDBName(),
                            AApAnalAttribTable.GetTableDBName(),
                            AApDocumentTable.GetApDocumentIdDBName());

                    AApAnalAttribTable apAttrib = new AApAnalAttribTable();
                    DBAccess.GDBAccessObj.SelectDT(apAttrib, sql, Transaction, Parameters.ToArray(), 0, 0);

                    apAttrib.DefaultView.Sort = AApAnalAttribTable.GetApDocumentIdDBName() + "," + AApAnalAttribTable.GetDetailNumberDBName();

                    // get the supplier name
                    sql =
                        String.Format(
                            "SELECT DISTINCT p.* FROM PUB_{0} AS Doc, PUB_{8} AS p " +
                            "WHERE Doc.{1} = {2} AND " +
                            "({3} = '{4}' OR {3} = '{5}' OR {3} = '{6}') AND " +
                            "{7} >= ? AND {7} <= ? AND " +
                            "p.{9} = Doc.{10}",
                            AApDocumentTable.GetTableDBName(),
                            AApDocumentTable.GetLedgerNumberDBName(),
                            ALedgerNumber,
                            AApDocumentTable.GetDocumentStatusDBName(),
                            MFinanceConstants.AP_DOCUMENT_POSTED,
                            MFinanceConstants.AP_DOCUMENT_PARTIALLY_PAID,
                            MFinanceConstants.AP_DOCUMENT_PAID,
                            AApDocumentTable.GetDateIssuedDBName(),
                            PPartnerTable.GetTableDBName(),
                            PPartnerTable.GetPartnerKeyDBName(),
                            AApDocumentTable.GetPartnerKeyDBName());

                    PPartnerTable suppliers = new PPartnerTable();
                    DBAccess.GDBAccessObj.SelectDT(suppliers, sql, Transaction, Parameters.ToArray(), 0, 0);

                    foreach (AApDocumentRow doc in apDocuments.Rows)
                    {
                        PPartnerRow supplier = (PPartnerRow)suppliers.Rows.Find(doc.PartnerKey);

                        DataRowView[] detailsRV = apDetails.DefaultView.FindRows(doc.ApDocumentId);

                        foreach (DataRowView rv in detailsRV)
                        {
                            AApDocumentDetailRow detail = (AApDocumentDetailRow)rv.Row;

                            if (doc.CreditNoteFlag)
                            {
                                detail.Amount *= -1.0m;
                            }

                            DataRowView[] payments = apPayments.DefaultView.FindRows(doc.ApDocumentId);

                            string DatePaid = string.Empty;

                            if (payments.Length > 1)
                            {
                                DatePaid = "Several Payments: ";

                                foreach (DataRowView rvPayment in payments)
                                {
                                    AApDocumentPaymentRow payment = ((AApDocumentPaymentRow)rvPayment.Row);
                                    DatePaid += payment.DateCreated.Value.ToString("yyyyMMdd") + " ";
                                    DatePaid += payment.PaymentNumber.ToString() + "; ";
                                }

                                // for gdpdu, only write dates to this column
                                DatePaid = string.Empty;
                            }
                            else if (payments.Length == 1)
                            {
                                AApDocumentPaymentRow payment = ((AApDocumentPaymentRow)payments[0].Row);
                                DatePaid = payment.DateCreated.Value.ToString("yyyyMMdd");
                            }

                            sb.Append(StringHelper.StrMerge(
                                    new string[] {
                                        doc.ApNumber.ToString(),
                                        detail.DetailNumber.ToString(),
                                        doc.DateIssued.ToString("yyyyMMdd"),
                                        DatePaid,
                                        doc.PartnerKey.ToString(),
                                        supplier.PartnerShortName,
                                        detail.CostCentreCode,
                                        detail.AccountCode,
                                        String.Format("{0:N}", detail.Amount),
                                        detail.Narrative
                                    }, ACSVSeparator));
                            sb.Append(ANewLine);
                        }
                    }
                });

            StreamWriter sw = new StreamWriter(filename, false, Encoding.GetEncoding(1252));
            sw.Write(sb.ToString());
            sw.Close();
        }