project QadFinancials > class BDebtorReport > method DebtorAgeingAnalysisCurrent

report procedure

Description

DebtorAgeingAnalysisCurrent


Parameters


icLanguageCodeinputcharacter
tFilterinputtemp-table
dcrDebtorAgeingAnalysisCurrentoutputdataset
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BDebtorReport.ApiDebtorAgeingAnalysisCurrent
method BDebtorReport.DebtorAACGroup


program code (program7/bdebtorreport.p)

empty temp-table tqDebtorAgeingAnalysisCurrent.
empty temp-table tCreditLimits.

<M-17 run GetReportLabels
   (input  'DebtorAgeingAnalysisCurrent':U (icReportName), 
    input  icLanguageCode (icLanguageCode), 
    input  tFilter (tFilter), 
    output tqHeader (tqHeader), 
    output tqFilter (tqFilter), 
    output tqText (tqText), 
    output viFcReturnSuper (oiReturnStatus)) in BDebtorReport>

if viFcReturnSuper < 0 or oiReturnStatus  = 0
then assign oiReturnStatus = viFcReturnSuper.
if oiReturnStatus < 0 then return.

<M-1 run SetDataItemsBasedOnFilterTT  (output  viFcReturnSuper (oiReturnStatus)) in BDebtorReport>

if viFcReturnSuper < 0 or oiReturnStatus  = 0
then assign oiReturnStatus = viFcReturnSuper.
if oiReturnStatus < 0 then return.

create tqFilter.
assign 
    tqFilter.ti_Sequence = 0
    tqFilter.tcBusinessFieldLabel = "icActivityCode":U
    tqFilter.tcBusinessFieldName = "SummaryByInfo":U
    tqFilter.tcParameterValue = vcSummaryByFilter.

<M-21 run ValidateAgeingFilters  (output viFcReturnSuper (oiReturnStatus)) in BDebtorReport>

if viFcReturnSuper < 0 or oiReturnStatus  = 0
then assign oiReturnStatus = viFcReturnSuper.
if oiReturnStatus < 0 then return.

<M-12 run SetAgeingPeriod  (output viFcReturnSuper (oiReturnStatus)) in BDebtorReport>

if viFcReturnSuper < 0 or oiReturnStatus  = 0
then assign oiReturnStatus = viFcReturnSuper.
if oiReturnStatus < 0 then return.

/* There cannot be year 0, this is converted to -999 so it won't be translated in query as 0 -> true !!! */
if viToAccYearFilter = 0
then viToAccYearFilter = -999.

assign viToAccPeriodFilter = viToAccYearFilter * 100 + viToAccPeriodFilter.

if vcReportingCurrencyFilter = ?
then assign vcReportingCurrencyFilter = {&CURRENCYTYPE-LC}.



/* Cross-company iteration */
do viDRCompanyIterator = 1 to viDRCompanyEntries:
    /* Get Info about Company (this method fills viDRCurrentCompany_ID) */
    <M-26 run CrossCompanyValues
       (input  viDRCompanyIterator (iiEntryNumber), 
        output viFcReturnSuper (oiReturnStatus)) in BDebtorReport>

    if viFcReturnSuper < 0 or
       oiReturnStatus  = 0
    then assign oiReturnStatus = viFcReturnSuper.

    if oiReturnStatus < 0
    then return.

    empty temp-table tqBaseDebtorAgeingAnalysisCurr.

    /* start --- Ageing Reports Enhancement (Adding Draft Records Information) zhc */

    <Q-36 run GetDraftInvoicesforDAAC (all) (Read) (NoCache)
       (input viDRCurrentCompany_ID, (CompanyId)
        input vcFromDebtorCodeFilter, (FromDebtorCode)
        input vcToDebtorCodeFilter, (ToDebtorCode)
        input vcCandoDebtorCodeFilter, (CandoDebtorCode)
        input vcFromBRCodeFilter, (FromBRCode)
        input vcToBRCodeFilter, (ToBRCode)
        input vcCandoBRCodeFilter, (CandoBRCode)
        input vcFromDivisionCodeFilter, (FromDivisionCode)
        input vcToDivisionCodeFilter, (ToDivisionCode)
        input vcCandoDivisionCodeFilter, (CandoDivisionCode)
        input vcFromJournalCodeFilter, (FromJournalCode)
        input vcToJournalCodeFilter, (ToJournalCode)
        input vcCandoJournalCodeFilter, (CandoJournalCode)
        input vcCurrencyCodeFilter, (CurrencyCode)
        input viToAccPeriodFilter, (ToAccPeriod)
        input vcFromProjectCodeFilter, (FromProjectCode)
        input vcToProjectCodeFilter, (ToProjectCode)
        input vcCandoProjectCodeFilter, (CandoProjectCode)
        input vcFromCostCentreCodeFilter1, (FromCCCode)
        input vcToCostCentreCodeFilter1, (ToCCCode)
        input vcCanDoCostCentreCodeFilter1, (CanDoCCCode)
        input vcFromDContrGLCodeFilter, (FromGLCode)
        input vcToDContrGLCodeFilter, (ToGLCode)
        input vcCandoDContrGLCodeFilter, (CanDoGLCode)
        input {&DOCUMENTTYPE-DRAFT}, (DDocumentDraftType)
        input vcDebtorTypeFilter, (DebtorTypeCode)
        input vcSalespersonFilter, (Salesperson)
        input vcPaymentGroupFilter, (PaymentGroup)
        output dataset tqGetDraftInvoicesforDAAC) in BDebtorReport> 
        
    assign vcDinvoiceOpInfoList = "".
    for each tqGetDraftInvoicesforDAAC 
        break by tqGetDraftInvoicesforDAAC.tiDDocument_ID:
        if first-of(tqGetDraftInvoicesforDAAC.tiDDocument_ID)
        then do:
            create tqBaseDebtorAgeingAnalysisCurr.
            buffer-copy tqGetDraftInvoicesforDAAC to tqBaseDebtorAgeingAnalysisCurr.
            assign
                tqBaseDebtorAgeingAnalysisCurr.tcDInvoiceType    = {&DOCUMENTTYPE-DRAFT}
                tqBaseDebtorAgeingAnalysisCurr.tcCurrencyCode    = tqGetDraftInvoicesforDAAC.tcCurrencyCode
                tqBaseDebtorAgeingAnalysisCurr.tcJournalCode     = tqGetDraftInvoicesforDAAC.tcPayFormatTypeCode
                tqBaseDebtorAgeingAnalysisCurr.tiDInvoiceVoucher = tqGetDraftInvoicesforDAAC.tiDDocumentNumber
                tqBaseDebtorAgeingAnalysisCurr.ttDInvoiceDate    = tqGetDraftInvoicesforDAAC.ttDDocumentCreationDate
                tqBaseDebtorAgeingAnalysisCurr.ttDInvoiceDueDate = tqGetDraftInvoicesforDAAC.ttDDocumentDueDate
                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceCreditCC  = tqGetDraftInvoicesforDAAC.tdDDocumentOriginalCreditCC
                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceCreditLC  = tqGetDraftInvoicesforDAAC.tdDDocumentOriginalCreditLC
                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceCreditTC  = tqGetDraftInvoicesforDAAC.tdDDocumentOriginalCreditTC
                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceDebitCC   = tqGetDraftInvoicesforDAAC.tdDDocumentOriginalDebitCC
                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceDebitLC   = tqGetDraftInvoicesforDAAC.tdDDocumentOriginalDebitLC
                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceDebitTC   = tqGetDraftInvoicesforDAAC.tdDDocumentOriginalDebitTC
                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalCreditCC = tqGetDraftInvoicesforDAAC.tdDDocumentOriginalCreditCC
                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalCreditLC = tqGetDraftInvoicesforDAAC.tdDDocumentOriginalCreditLC
                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalCreditTC = tqGetDraftInvoicesforDAAC.tdDDocumentOriginalCreditTC
                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalDebitCC  = tqGetDraftInvoicesforDAAC.tdDDocumentOriginalDebitCC
                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalDebitLC  = tqGetDraftInvoicesforDAAC.tdDDocumentOriginalDebitLC
                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalDebitTC  = tqGetDraftInvoicesforDAAC.tdDDocumentOriginalDebitTC
                tqBaseDebtorAgeingAnalysisCurr.tcDebtorCommentNote        = tqGetDraftInvoicesforDAAC.tcDebtorCommentNote
                tqBaseDebtorAgeingAnalysisCurr.tcDInvoiceCommentNote      = tqGetDraftInvoicesforDAAC.tcDInvoiceCommentNote
                tqBaseDebtorAgeingAnalysisCurr.tcDInvoiceShipperList      = tqGetDraftInvoicesforDAAC.tcDInvoiceShipperList.
        end.
        
    end.


    <Q-2 run DebtorAgeingAnalysisCurrMR (all) (Read) (NoCache)
       (input viDRCurrentCompany_ID, (CompanyId)
        input vcFromDebtorCodeFilter, (FromDebtorCode)
        input vcToDebtorCodeFilter, (ToDebtorCode)
        input vcCandoDebtorCodeFilter, (CandoDebtorCode)
        input vcFromBRCodeFilter, (FromBRCode)
        input vcToBRCodeFilter, (ToBRCode)
        input vcCandoBRCodeFilter, (CandoBRCode)
        input vcFromDivisionCodeFilter, (FromDivisionCode)
        input vcToDivisionCodeFilter, (ToDivisionCode)
        input vcCandoDivisionCodeFilter, (CandoDivisionCode)
        input vcFromJournalCodeFilter, (FromJournalCode)
        input vcToJournalCodeFilter, (ToJournalCode)
        input vcCandoJournalCodeFilter, (CandoJournalCode)
        input vcCurrencyCodeFilter, (CurrencyCode)
        input viToAccPeriodFilter, (ToAccPeriod)
        input vcFromProjectCodeFilter, (FromProjectCode)
        input vcToProjectCodeFilter, (ToProjectCode)
        input vcCandoProjectCodeFilter, (CandoProjectCode)
        input vcFromCostCentreCodeFilter1, (FromCCCode)
        input vcToCostCentreCodeFilter1, (ToCCCode)
        input vcCanDoCostCentreCodeFilter1, (CanDoCCCode)
        input vcFromDContrGLCodeFilter, (FromGLCode)
        input vcToDContrGLCodeFilter, (ToGLCode)
        input vcCandoDContrGLCodeFilter, (CanDoGLCode)
        input vcDebtorTypeFilter, (DebtorTypeCode)
        input vcSalespersonFilter, (Salesperson)
        input vcPaymentGroupFilter, (PaymentGroup)
        output dataset tqDebtorAgeingAnalysisCurrMR) in BDebtorReport> 

    for each tqDebtorAgeingAnalysisCurrMR
        break by tqDebtorAgeingAnalysisCurrMR.tiDInvoice_ID
              by tqDebtorAgeingAnalysisCurrMR.tiDInvoiceStage_ID:

        /* in case there are more than one DInvoiceOpInfo records with type SHIPPER per stage, we will only take one record */          
        if last-of(tqDebtorAgeingAnalysisCurrMR.tiDInvoiceStage_ID)
        then do:                      
            if tqDebtorAgeingAnalysisCurrMR.tcPaymentConditionPaymentTyp = {&PAYMENTCONDITIONPAYMENTTYPE-STAGED}
            then do:
                if (tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC >= 0 and
                   tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC > tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmtAppliedTC) or
                   (tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC <= 0 and
                   tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC < tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmtAppliedTC)
                then do:
                    create tqBaseDebtorAgeingAnalysisCurr.
                    buffer-copy tqDebtorAgeingAnalysisCurrMR to tqBaseDebtorAgeingAnalysisCurr.
                    if (tqDebtorAgeingAnalysisCurrMR.tdDInvoiceOriginalDebitTC - tqDebtorAgeingAnalysisCurrMR.tdDInvoiceOriginalCreditTC) * tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC >= 0
                    then assign tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceDebitCC   = tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountCC - tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountCC * tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmtAppliedTC / tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceDebitLC   = tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountLC - tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountLC * tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmtAppliedTC / tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceDebitTC   = tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC - tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmtAppliedTC
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceCreditCC  = 0
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceCreditLC  = 0
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceCreditTC  = 0
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalDebitCC  = tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountCC
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalDebitLC  = tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountLC
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalDebitTC  = tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalCreditCC = 0
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalCreditLC = 0
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalCreditTC = 0.
                    else assign tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceDebitCC   = 0
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceDebitLC   = 0
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceDebitTC   = 0
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceCreditCC  = tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountCC - tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountCC * tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmtAppliedTC / tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceCreditLC  = tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountLC - tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountLC * tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmtAppliedTC / tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceCreditTC  = tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC - tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmtAppliedTC
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalDebitCC  = 0
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalDebitLC  = 0
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalDebitTC  = 0
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalCreditCC = tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountCC
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalCreditLC = tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountLC
                                tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalCreditTC = tqDebtorAgeingAnalysisCurrMR.tdDInvoiceStageAmountTC.                            
                    assign tqBaseDebtorAgeingAnalysisCurr.ttDInvoiceDueDate           = tqDebtorAgeingAnalysisCurrMR.ttDInvoiceStageDueDate
                           tqBaseDebtorAgeingAnalysisCurr.ttDInvoiceDiscountDueDate   = tqDebtorAgeingAnalysisCurrMR.ttDInvoiceStageDiscDate
                           tqBaseDebtorAgeingAnalysisCurr.tcDebtorCommentNote         = tqDebtorAgeingAnalysisCurrMR.tcDebtorCommentNote
                           tqBaseDebtorAgeingAnalysisCurr.tcDInvoiceCommentNote       = tqDebtorAgeingAnalysisCurrMR.tcDInvoiceCommentNote
                           tqBaseDebtorAgeingAnalysisCurr.tcDInvoiceShipperList       = tqDebtorAgeingAnalysisCurrMR.tcDInvoiceShipperList.                           
                end.    
            end.
            else do:
                create tqBaseDebtorAgeingAnalysisCurr.
                buffer-copy tqDebtorAgeingAnalysisCurrMR to tqBaseDebtorAgeingAnalysisCurr.              
            end. /* else do: */
        end. /* if first-of(tqDebtorAgeingAnalysisCurrMR.tiDInvoiceStage_ID) */
    end.

    /* end --- Ageing Reports Enhancement (Adding Draft Records Information) zhc */


    for each tqBaseDebtorAgeingAnalysisCurr:
        /* Prepayments and Adjustments: valid only if "Within terms = yes" */
        /* if vlInvoicesWithinTermsFilter                  <> true                      and
          (tqBaseDebtorAgeingAnalysisCurr.tcdInvoiceType = {&INVOICETYPE-PREPAYMENT} or
           tqBaseDebtorAgeingAnalysisCurr.tcdInvoiceType = {&INVOICETYPE-ADJUSTMENT})
        then next. */

        /* If "Within terms = no", skip all invoices that aren't due yet */
        if vlInvoicesWithinTermsFilter = false and tqBaseDebtorAgeingAnalysisCurr.ttDInvoiceDueDate >= vtDateForAgeingCalcFilter
        then next.
        
        create tqDebtorAgeingAnalysisCurrent. 
        buffer-copy tqBaseDebtorAgeingAnalysisCurr to tqDebtorAgeingAnalysisCurrent.      
                
        assign tqDebtorAgeingAnalysisCurrent.tcControlGLCode          = tqBaseDebtorAgeingAnalysisCurr.tcGLCode
               tqDebtorAgeingAnalysisCurrent.tcControlGLDescription   = tqBaseDebtorAgeingAnalysisCurr.tcGLDescription
               tqDebtorAgeingAnalysisCurrent.tcDInvoiceOpInfoCode     = tqBaseDebtorAgeingAnalysisCurr.tcDInvoiceShipperList 
               tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod1BalanceXC = 0
               tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod2BalanceXC = 0
               tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod3BalanceXC = 0
               tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod4BalanceXC = 0
               tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod5BalanceXC = 0
               vdBalanceCC = tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceDebitCC - tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceCreditCC
               vdBalanceLC = tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceDebitLC - tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceCreditLC
               vdBalanceTC = tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceDebitTC - tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceBalanceCreditTC
               vdOriginal1CC = tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalDebitCC - tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalCreditCC
               vdOriginal1LC = tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalDebitLC - tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalCreditLC
               vdOriginal1TC = tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalDebitTC - tqBaseDebtorAgeingAnalysisCurr.tdDInvoiceOriginalCreditTC.
               
        case vcReportingCurrencyFilter:
            when {&CURRENCYTYPE-CC}
            then assign vdBalanceXC   = vdBalanceCC
                        vdOriginal1XC = vdOriginal1CC.

            when {&CURRENCYTYPE-LC}
            then assign vdBalanceXC   = vdBalanceLC
                        vdOriginal1XC = vdOriginal1LC.

            when {&CURRENCYTYPE-TC}
            then assign vdBalanceXC   = vdBalanceTC
                        vdOriginal1XC = vdOriginal1TC.
        end.

        assign tqDebtorAgeingAnalysisCurrent.tdBalanceXC =
                   if vcReportingCurrencyFilter = {&CURRENCYTYPE-TC}
                   then vdBalanceTC
                   else vdBalanceXC
               tqDebtorAgeingAnalysisCurrent.tdBalanceTC = vdBalanceTC.

        /* if tqBaseDebtorAgeingAnalysisCurr.tcDInvoiceType = {&INVOICETYPE-PREPAYMENT} or
           tqBaseDebtorAgeingAnalysisCurr.tcDInvoiceType = {&INVOICETYPE-ADJUSTMENT}
        then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod1BalanceXC = vdBalanceXC.
        else */
        if tqBaseDebtorAgeingAnalysisCurr.tcDInvoiceType <> {&DOCUMENTTYPE-DRAFT}
        then do:
            /* if can-find(first tqDInvoiceStageByInvoice where
                              tqDInvoiceStageByInvoice.tiDInvoice_ID = tqBaseDebtorAgeingAnalysisCurr.tiDInvoice_ID)
            then do:
                assign vdBalanceXC = vdOriginal1XC - vdBalanceXC.
    
                if vdBalanceXC < 0
                then assign vdBalanceXC = vdBalanceXC * -1.
    
                for each tqDInvoiceStageByInvoice where
                         tqDInvoiceStageByInvoice.tiDInvoice_ID           = tqBaseDebtorAgeingAnalysisCurr.tiDInvoice_ID and
                         tqDInvoiceStageByInvoice.tdDInvoiceStageAmountTC > tqDInvoiceStageByInvoice.tdDInvoiceStageAmtAppliedTC:
                    if vlInvoicesWithinTermsFilter = false and
                       tqDInvoiceStageByInvoice.ttDInvoiceStageDueDate >= vtDateForAgeingCalcFilter
                    then next.
    
                    case vcReportingCurrencyFilter:
                        when {&CURRENCYTYPE-CC}
                        then assign vdStageAmountXC = tqDInvoiceStageByInvoice.tdDInvoiceStageAmountCC.
    
                        when {&CURRENCYTYPE-LC}
                        then assign vdStageAmountXC = tqDInvoiceStageByInvoice.tdDInvoiceStageAmountLC.
    
                        when {&CURRENCYTYPE-TC}
                        then assign vdStageAmountXC = tqDInvoiceStageByInvoice.tdDInvoiceStageAmountTC.
                    end.
    
                    if vdBalanceXC > 0
                    then assign vdBalanceXC = vdBalanceXC - vdStageAmountXC.
                    else assign vdBalanceXC = vdStageAmountXC * -1.
    
                    if vdBalanceXC < 0
                    then vdXCValue = vdBalanceXC * -1.
                    else vdXCValue = vdBalanceXC.
    
                    if tqBaseDebtorAgeingAnalysisCurr.tcDInvoiceType = {&INVOICETYPE-CREDITNOTE} or
                       tqBaseDebtorAgeingAnalysisCurr.tcDInvoiceType = {&INVOICETYPE-CREDITNOTECORRECTION}
                    then assign vdXCValue = vdXCValue * -1.
    
                    find first tAgeingPeriod where
                               tAgeingPeriod.ttAgeingPeriodFromDate <= tqDInvoiceStageByInvoice.ttDInvoiceStageDueDate and
                               tAgeingPeriod.ttAgeingPeriodToDate   >= tqDInvoiceStageByInvoice.ttDInvoiceStageDueDate
                               no-error.
    
                    if available tAgeingPeriod and
                       vdBalanceXC < 0
                    then case tAgeingPeriod.tiAgeingPeriodSeq:
                        when 1
                        then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod1BalanceXC = tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod1BalanceXC + vdXCValue.
                        when 2
                        then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod2BalanceXC = tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod2BalanceXC + vdXCValue.
                        when 3
                        then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod3BalanceXC = tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod3BalanceXC + vdXCValue.
                        when 4
                        then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod4BalanceXC = tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod4BalanceXC + vdXCValue.
                        when 5
                        then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod5BalanceXC = tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod5BalanceXC + vdXCValue.
                    end case.
                end.
            end.
            else do: */
                find first tAgeingPeriod where
                           tAgeingPeriod.ttAgeingPeriodFromDate <= tqDebtorAgeingAnalysisCurrent.ttDInvoiceDueDate and
                           tAgeingPeriod.ttAgeingPeriodToDate   >= tqDebtorAgeingAnalysisCurrent.ttDInvoiceDueDate
                           no-error.
    
            if available tAgeingPeriod
            then case tAgeingPeriod.tiAgeingPeriodSeq:
                when 1
                then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod1BalanceXC = vdBalanceXC.
                when 2
                then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod2BalanceXC = vdBalanceXC.
                when 3
                then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod3BalanceXC = vdBalanceXC.
                when 4
                then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod4BalanceXC = vdBalanceXC.
                when 5
                then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod5BalanceXC = vdBalanceXC.
            end case.
            /* end. */
        end. /* if tqBaseDebtorAgeingAnalysisCurr.tcDInvoiceType <> {&DOCUMENTTYPE-DRAFT} */
        else do:
            find first tAgeingPeriod where
                       tAgeingPeriod.ttAgeingPeriodFromDate <= tqDebtorAgeingAnalysisCurrent.ttDInvoiceDueDate and
                       tAgeingPeriod.ttAgeingPeriodToDate   >= tqDebtorAgeingAnalysisCurrent.ttDInvoiceDueDate
                       no-error.

            if available tAgeingPeriod
            then case tAgeingPeriod.tiAgeingPeriodSeq:
                when 1
                then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod1BalanceXC = vdBalanceXC.
                when 2
                then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod2BalanceXC = vdBalanceXC.
                when 3
                then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod3BalanceXC = vdBalanceXC.
                when 4
                then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod4BalanceXC = vdBalanceXC.
                when 5
                then assign tqDebtorAgeingAnalysisCurrent.tdAgeingPeriod5BalanceXC = vdBalanceXC.
            end case.
        end.
        if tqDebtorAgeingAnalysisCurrent.tcDInvoiceType = {&INVOICETYPE-DEDUCTION} then
        do:
            <M-14 run CalDeductionStatus
               (input  tqDebtorAgeingAnalysisCurrent.tiDInvoice_ID (iiDInvoiceID), 
                output tqDebtorAgeingAnalysisCurrent.tcDInvoiceDeductionStatus (ocDeductionStatus), 
                input-output tqDebtorAgeingAnalysisCurrent.tcDInvoiceType (bcDInvoiceType), 
                output oiReturnStatus (oiReturnStatus)) in BDebtorReport>
        end.
    end.
end.

<I-64 {bFcStartAndOpenInstance
     &ADD-TO-TRANSACTION   = "false"
     &CLASS                = "BDebtor"}>

for each  tqDebtorAgeingAnalysisCurrent
    where tqDebtorAgeingAnalysisCurrent.tcDInvoiceType <> {&DOCUMENTTYPE-DRAFT}
    break by tqDebtorAgeingAnalysisCurrent.tcDebtorCode:

    if last-of(tqDebtorAgeingAnalysisCurrent.tcDebtorCode)
    then do:
        assign vdCreditOnTurnOver = 0.
        <M-57 run CalculateCreditOnTurnover
           (input  0 (iiDebtorId), 
            input  tqDebtorAgeingAnalysisCurrent.tcDebtorCode (icDebtorCode), 
            input  vcCurrencyCodeFilter (icCurrencyCode), 
            input  tqDebtorAgeingAnalysisCurrent.tdDebtorPercTurnOverCredLim (idPercentageOfTurnover), 
            output vdCreditOnTurnOver (odCreditOnTurnover), 
            output oiReturnStatus (oiReturnStatus)) in BDebtor>
        
        create tCreditLimits.
        buffer-copy tqDebtorAgeingAnalysisCurrent to tCreditLimits.
        assign tCreditLimits.tdDebtorCreditOnTurnOver = vdCreditOnTurnOver.
    end.
end.            
<I-82 {bFcCloseAndStopInstance
     &CLASS           = "BDebtor"}>
     
/* Remove records that don't match the Customer Balance filter */
/* Fill some extra info for the others                         */
for each tqDebtorAgeingAnalysisCurrent
         break by tqDebtorAgeingAnalysisCurrent.tcDebtorCode:
    accumulate tqDebtorAgeingAnalysisCurrent.tdBalanceXC (total by tqDebtorAgeingAnalysisCurrent.tcDebtorCode).
    
    assign tqDebtorAgeingAnalysisCurrent.tcSortByFilter3     = vcSortByNameFilter
           tqDebtorAgeingAnalysisCurrent.tcAgeingTypeCurrent = vcAgeingTypeFilter.
    if last-of(tqDebtorAgeingAnalysisCurrent.tcDebtorCode)
    then do:

        assign vdBalanceXC = accum total by tqDebtorAgeingAnalysisCurrent.tcDebtorCode tqDebtorAgeingAnalysisCurrent.tdBalanceXC.

        if vcDebtorBalanceFilter = {&DEBTORBALANCE-CREDIT} and
           vdBalanceXC           > 0                       or
           vcDebtorBalanceFilter = {&DEBTORBALANCE-DEBIT}  and
           vdBalanceXC           < 0
        then do:
            for each bDebtorAgeingAnalysisCurrent where
                     bDebtorAgeingAnalysisCurrent.tcDebtorCode = tqDebtorAgeingAnalysisCurrent.tcDebtorCode and
                     rowid(bDebtorAgeingAnalysisCurrent)      <> rowid(tqDebtorAgeingAnalysisCurrent):
                delete bDebtorAgeingAnalysisCurrent.
            end.

            delete tqDebtorAgeingAnalysisCurrent.
        end.
        else do:
            assign vhFcComponent = ?.

            <M-34 run GetAddressWithType
               (input  tqDebtorAgeingAnalysisCurrent.tiBusinessRelation_ID (iiBusinessRelationId), 
                input  tqDebtorAgeingAnalysisCurrent.tcBusinessRelationCode (icBusinessRelationCode), 
                input  ? (iiAddressTypeId), 
                input  {&ADDRESSTYPECODESYSTEM-HEADOFFICE} (icAddressTypeCode), 
                output tAddressQueryRef (tAddressQuery), 
                output viFcReturnSuper (oiReturnStatus)) in BBusinessRelation>

            find first tAddressQueryRef
                       no-error.

            if available tAddressQueryRef
            then do:
                <Q-35 run ContactByAddress (all) (Read) (NoCache)
                   (input tAddressQueryRef.tiAddress_ID, (AddressId)
                    output dataset tqContactByAddress) in BBusinessRelation >

                find first tqContactByAddress
                           no-error.

                for each bDebtorAgeingAnalysisCurrent where
                         bDebtorAgeingAnalysisCurrent.tcDebtorCode = tqDebtorAgeingAnalysisCurrent.tcDebtorCode:
                    assign bDebtorAgeingAnalysisCurrent.tcAddressCity      = tAddressQueryRef.tcAddressCity
                           bDebtorAgeingAnalysisCurrent.tcAddressFax       = tAddressQueryRef.tcAddressFax
                           bDebtorAgeingAnalysisCurrent.tcAddressStreet1   = tAddressQueryRef.tcAddressStreet1
                           bDebtorAgeingAnalysisCurrent.tcAddressStreet2   = tAddressQueryRef.tcAddressStreet2
                           bDebtorAgeingAnalysisCurrent.tcAddressStreet3   = tAddressQueryRef.tcAddressStreet3
                           bDebtorAgeingAnalysisCurrent.tcAddressTelephone = tAddressQueryRef.tcAddressTelephone
                           bDebtorAgeingAnalysisCurrent.tcAddressZip       = tAddressQueryRef.tcAddressZip
                           bDebtorAgeingAnalysisCurrent.tcAddressState     = tAddressQueryRef.tcAddressState
                           bDebtorAgeingAnalysisCurrent.tcAddressCounty    = tAddressQueryRef.tcAddressCounty
                           bDebtorAgeingAnalysisCurrent.tiAddressFormat    = tAddressQueryRef.tiAddressFormat
                           bDebtorAgeingAnalysisCurrent.tcCountryDescription = tAddressQueryRef.tcCountryDescription
                           bDebtorAgeingAnalysisCurrent.tcCountyDescription  = tAddressQueryRef.tcCountyDescription
                           bDebtorAgeingAnalysisCurrent.tcStateCode        = tAddressQueryRef.tcStateCode.
                           
                    find first tCreditLimits
                          where tCreditLimits.tcDebtorCode = bDebtorAgeingAnalysisCurrent.tcDebtorCode no-error.
                    if available (tCreditLimits)
                    then assign bDebtorAgeingAnalysisCurrent.tdDebtorFixedCredLimTC = tCreditLimits.tdDebtorFixedCredLimTC
                                bDebtorAgeingAnalysisCurrent.tdDebtorPercTurnOverCredLim = tCreditLimits.tdDebtorPercTurnOverCredLim
                                bDebtorAgeingAnalysisCurrent.tdDebtorCreditOnTurnOver = tCreditLimits.tdDebtorCreditOnTurnOver.

                    if available tqContactByAddress
                    then assign bDebtorAgeingAnalysisCurrent.tcContactEmail  = tqContactByAddress.tcContactEmail
                                bDebtorAgeingAnalysisCurrent.tcContactName   = tqContactByAddress.tcContactName
                                bDebtorAgeingAnalysisCurrent.tcContactMobile = tqContactByAddress.tcContactMobilePhone
                                bDebtorAgeingAnalysisCurrent.tcContactPhone  = tqContactByAddress.tcContactTelephone.
                end.
            end.
        end.
    end.
end.