project QadFinancials > class BCreditorBalance > method UpdateCBalanceAndCHist

Description

This method will update the Supplier Balance and the Supplier History.


Parameters


tCredBalQCInvoiceMovementinputtemp-tabletemp-table that stores the deleted QCInvoiceMovement records that need to be processed.
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BQCInvoiceMovement.AdditionalUpdates


program code (program6/bcreditorbalance.p)

/* ======================================================================== */
/* This method will update the Creditor Balance and the Creditor History.   */
/* These modifications will be based on the temp-table that will be passed. */
/* This temp-table holds the QCInvoiceMovement records that need to be      */
/* processed. (Status = 'D')                                                */
/* ======================================================================== */

/* ================================== */
/* Exception handling / Start queries */
/* ================================== */
assign oiReturnStatus = -98.
<Q-20 run CBalanceByCyCreditorCurrID  (Start) in BCreditorBalance >

/* ==================== */
/* Start Block and loop */
/* ==================== */
QCINVOICEBLOCK:
for each tCredBalQCInvoiceMovement:
    
    /* Replace any unknown value by 0 - although striclty spoken here might be no ? here */
    if tCredBalQCInvoiceMovement.Company_ID = ?
    then assign tCredBalQCInvoiceMovement.Company_ID = 0.
    if tCredBalQCInvoiceMovement.CostCentre_ID = ?
    then assign tCredBalQCInvoiceMovement.CostCentre_ID = 0.
    if tCredBalQCInvoiceMovement.Currency_ID = ?
    then assign tCredBalQCInvoiceMovement.Currency_ID = 0.
    if tCredBalQCInvoiceMovement.Creditor_ID = ?
    then assign tCredBalQCInvoiceMovement.Creditor_ID = 0.
    if tCredBalQCInvoiceMovement.Division_ID = ?
    then assign tCredBalQCInvoiceMovement.Division_ID = 0.
    if tCredBalQCInvoiceMovement.GL_ID = ?
    then assign tCredBalQCInvoiceMovement.GL_ID = 0.
    if tCredBalQCInvoiceMovement.Journal_ID = ?
    then assign tCredBalQCInvoiceMovement.Journal_ID = 0.
    if tCredBalQCInvoiceMovement.Period_ID = ?
    then assign tCredBalQCInvoiceMovement.Period_ID = 0.
    if tCredBalQCInvoiceMovement.Project_ID = ?
    then assign tCredBalQCInvoiceMovement.Project_ID = 0.    

    /* ==================================================================== */
    /* Check if a CBalance-record exists for this company/creditor/currency */
    /* Load when it exists; if it does not exist, create it.                */
    /* ==================================================================== */
    <Q-1 run CBalanceByCyCreditorCurrID (all) (Read) (Cache)
       (input tCredBalQCInvoiceMovement.Company_ID, (CompanyId)
        input tCredBalQCInvoiceMovement.Creditor_ID, (Creditor_ID)
        input tCredBalQCInvoiceMovement.Currency_ID, (Currency_ID)
        input ?, (CBalance_ID)
        output dataset tqCBalanceByCyCreditorCurrID) in BCreditorBalance >
    find tqCBalanceByCyCreditorCurrID where
         tqCBalanceByCyCreditorCurrID.tiCompany_ID  = tCredBalQCInvoiceMovement.Company_ID  and
         tqCBalanceByCyCreditorCurrID.tiCreditor_ID = tCredBalQCInvoiceMovement.Creditor_ID and
         tqCBalanceByCyCreditorCurrID.tiCurrency_ID = tCredBalQCInvoiceMovement.Currency_ID
         no-lock no-error.
    if not available tqCBalanceByCyCreditorCurrID
    then do:
        <M-2 run AddDetailLine
           (input  'CBalance':U (icTable), 
            input  ? (icParentRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BCreditorBalance>
        if viFcReturnSuper <> 0 
        then assign viLocalReturnStatus = viFcReturnSuper.
        if viFcReturnSuper < 0
        then leave QCINVOICEBLOCK.
        assign tCBalance.Company_ID  = tCredBalQCInvoiceMovement.Company_ID
               tCBalance.Creditor_ID = tCredBalQCInvoiceMovement.Creditor_ID
               tCBalance.Currency_ID = tCredBalQCInvoiceMovement.Currency_ID.
    end. /* CBalance does not exist yet */
    else do:
        <M-3 run DataLoad
           (input  ? (icRowids), 
            input  string(tqCBalanceByCyCreditorCurrID.tiCBalance_ID) (icPkeys), 
            input  ? (icObjectIds), 
            input  '' (icFreeform), 
            input  true (ilKeepPrevious), 
            output viFcReturnSuper (oiReturnStatus)) in BCreditorBalance>
        if viFcReturnSuper <> 0 
        then assign viLocalReturnStatus = viFcReturnSuper.
        if viFcReturnSuper < 0
        then leave QCINVOICEBLOCK.
        find tCBalance where
             tCBalance.CBalance_ID = tqCBalanceByCyCreditorCurrID.tiCBalance_ID
             no-lock no-error.
        if not available tCBalance
        then do:
            assign vcCreditorBalanceMsg = trim(#T-29'The supplier balance could not be loaded.':255(1454)t-29#) + chr(10) +
                                          trim(substitute(#T-30'Supplier Balance ID: &1.':150(1455)T-30#, trim(string(tqCBalanceByCyCreditorCurrID.tiCBalance_ID)) ))
                   viLocalReturnStatus  = -3.
            <M-4 run SetMessage
               (input  vcCreditorBalanceMsg (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  string(tqCBalanceByCyCreditorCurrID.tiCBalance_ID) (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'QADFIN-1253':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCreditorBalance>
            leave QCINVOICEBLOCK.
        end.
        assign tCBalance.tc_Status = 'C':U.
    end. /* CBalance does already exist */

    /* =========================== */
    /* assign the CBalance-amounts */
    /* =========================== */
    assign tCBalance.CBalanceLC = tCBalance.CBalanceLC + tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC - tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC
           tCBalance.CBalanceTC = tCBalance.CBalanceTC + tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC - tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC
           tCBalance.CBalanceCC = tCBalance.CBalanceCC + tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC - tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC.

    /* ================ */
    /* CREDITOR HISTORY */
    /* ================ */
    /* =================== */
    /* Get the Year/Period */
    /* =================== */
    if tCredBalQCInvoiceMovement.MovementYearPeriod = 0 or 
       tCredBalQCInvoiceMovement.MovementYearPeriod = ?
    then do :
        if vlStartedPeriodPrim = false
        then do :
            <Q-33 run PeriodPrim (Start) in BPeriod >
            assign vlStartedPeriodPrim = true.
        end. /* if vlStartedPeriodPrim = false */
        <Q-5 run PeriodPrim (all) (Read) (Cache)
           (input tCredBalQCInvoiceMovement.Company_ID, (CompanyId)
            input tCredBalQCInvoiceMovement.Period_ID, (PeriodId)
            input ?, (PeriodYear)
            input ?, (PeriodPeriod)
            output dataset tqPeriodPrim) in BPeriod >
        find tqPeriodPrim where
             tqPeriodPrim.tiCompany_ID = tCredBalQCInvoiceMovement.Company_ID and
             tqPeriodPrim.tiPeriod_ID  = tCredBalQCInvoiceMovement.Period_ID
             no-lock no-error.
        if not available tqPeriodPrim
        then do:
            assign vcCreditorBalanceMsg = trim(#T-31'The GL period specified is not defined in the system.':255(1456)t-31#) + chr(10) +
                                          trim(substitute(#T-32'GL period ID: &1.':150(1457)T-32#, trim(string(tCredBalQCInvoiceMovement.Period_ID)) ))
                   viLocalReturnStatus  = -25.
            <M-6 run SetMessage
               (input  vcCreditorBalanceMsg (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  string(tCredBalQCInvoiceMovement.Period_ID) (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'QADFIN-1254':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCreditorBalance>
            leave QCINVOICEBLOCK.
        end.
        assign viYearPeriod = tqPeriodPrim.tiPeriodYear * 100 + tqPeriodPrim.tiPeriodPeriod.
    end. /* if tCredBalQCInvoiceMovement.MovementYearPeriod = 0 or */
    else assign viYearPeriod = tCredBalQCInvoiceMovement.MovementYearPeriod.
    
    /* ======================== */
    /* Calculate the VAT amount */
    /* ======================== */
    assign vdVatAmountTC = tCredBalQCInvoiceMovement.CInvoiceMovementVatDebTC - tCredBalQCInvoiceMovement.CInvoiceMovementVatCredTC
           vdVatAmountLC = tCredBalQCInvoiceMovement.CInvoiceMovementVatDebLC - tCredBalQCInvoiceMovement.CInvoiceMovementVatCredLC
           vdVatAmountCC = tCredBalQCInvoiceMovement.CInvoiceMovementVatDebCC - tCredBalQCInvoiceMovement.CInvoiceMovementVatCredCC.
        
    /* ===================================================================== */
    /* Look for the CHist-records for this creditor for this period or later */
    /* ===================================================================== */   
    find tCHist where
         tCHist.Company_ID           = tCredBalQCInvoiceMovement.Company_ID    and
         tCHist.Creditor_ID          = tCredBalQCInvoiceMovement.Creditor_ID   and
         tCHist.Currency_ID          = tCredBalQCInvoiceMovement.Currency_ID   and
         tCHist.GL_ID                = tCredBalQCInvoiceMovement.GL_ID         and
         tCHist.Division_ID          = tCredBalQCInvoiceMovement.Division_ID   and
         tCHist.Project_ID           = tCredBalQCInvoiceMovement.Project_ID    and
         tCHist.Journal_ID           = tCredBalQCInvoiceMovement.Journal_ID    and
         tCHist.CostCentre_ID        = tCredBalQCInvoiceMovement.CostCentre_ID and
         tCHist.CHistYearPeriodFrom <= viYearPeriod                            and
         tCHist.CHistYearPeriodTill >= viYearPeriod                            and
         tCHist.tc_Status           <> 'D':U
         no-error.
    if not available tCHist /* No current history record found */
    then do:
        /* ===================== */
        /* Create History Record */
        /* ===================== */
        <M-8 run AddDetailLine
           (input  'CHist':U (icTable), 
            input  tCBalance.tc_Rowid (icParentRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BCreditorBalance>
        if viFcReturnSuper <> 0 
        then assign viLocalReturnStatus = viFcReturnSuper.
        if viFcReturnSuper < 0
        then leave QCINVOICEBLOCK.
        ASSIGN viPrevYearPeriod = 0.
        FOR EACH bChist where
                 bCHist.Company_ID           = tCredBalQCInvoiceMovement.Company_ID    and
                 bCHist.Creditor_ID          = tCredBalQCInvoiceMovement.Creditor_ID   and
                 bCHist.Currency_ID          = tCredBalQCInvoiceMovement.Currency_ID   and
                 bCHist.GL_ID                = tCredBalQCInvoiceMovement.GL_ID         and
                 bCHist.Division_ID          = tCredBalQCInvoiceMovement.Division_ID   and
                 bCHist.Project_ID           = tCredBalQCInvoiceMovement.Project_ID    and
                 bCHist.Journal_ID           = tCredBalQCInvoiceMovement.Journal_ID    and
                 bCHist.CostCentre_ID        = tCredBalQCInvoiceMovement.CostCentre_ID and
                 bCHist.CHistYearPeriodFrom  > viYearPeriod                            and
                 bCHist.tc_Status           <> 'D':U
                 NO-LOCK 
                 by bCHist.CHistYearPeriodFrom DESCENDING :                    
              ASSIGN viPrevYearPeriod = bCHist.CHistYearPeriodFrom.
        END.
        if viPrevYearPeriod <> 0 /* History record found with later starting period */
        then assign viPrevYearPeriod = viPrevYearPeriod - 1.
        else assign viPrevYearPeriod = 999999.
        ASSIGN tCHist.CBalance_ID           = tCBalance.CBalance_ID
               tCHist.Company_ID            = tCredBalQCInvoiceMovement.Company_ID
               tCHist.Creditor_ID           = tCredBalQCInvoiceMovement.Creditor_ID
               tCHist.Currency_ID           = tCredBalQCInvoiceMovement.Currency_ID
               tCHist.GL_ID                 = tCredBalQCInvoiceMovement.GL_ID
               tCHist.Division_ID           = tCredBalQCInvoiceMovement.Division_ID
               tCHist.Project_ID            = tCredBalQCInvoiceMovement.Project_ID
               tCHist.Journal_ID            = tCredBalQCInvoiceMovement.Journal_ID
               tCHist.CostCentre_ID         = tCredBalQCInvoiceMovement.CostCentre_ID
               tCHist.CHistYearPeriodFrom   = viYearPeriod
               tCHist.CHistYearPeriodTill   = viPrevYearPeriod
               tCHist.CHistBalanceLC        = tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC - tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC
               tCHist.CHistBalanceTC        = tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC - tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC
               tCHist.CHistBalanceCC        = tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC - tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC
               tCHist.CHistMovementCreditLC = tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC
               tCHist.CHistMovementCreditTC = tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC
               tCHist.CHistMovementCreditCC = tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC
               tCHist.CHistMovementDebitLC  = tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC
               tCHist.CHistMovementDebitTC  = tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC
               tCHist.CHistMovementDebitCC  = tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC.             
        /* vdVatAmountTC is a debit amount and therefore > 0 */                                                                                        
        if tCredBalQCInvoiceMovement.CInvoiceMovementType = 'INITIAL':U and tCredBalQCInvoiceMovement.CInvoiceMovementIsInvoice
        then assign tCHist.CHistNettoInvoiceLC  = tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC - vdVatAmountLC
                    tCHist.CHistNettoInvoiceTC  = tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC - vdVatAmountTC
                    tCHist.CHistNettoInvoiceCC  = tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC - vdVatAmountCC
                    tCHist.CHistGrossInvoiceLC  = tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC 
                    tCHist.CHistGrossInvoiceTC  = tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC 
                    tCHist.CHistGrossInvoiceCC  = tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC.
        /* vdVatAmountTC is a credit amount and therefore < 0 */            
        if tCredBalQCInvoiceMovement.CInvoiceMovementType = 'INITIAL':U and tCredBalQCInvoiceMovement.CInvoiceMovementIsCreditN
        then assign tCHist.CHistNettoCredNoteLC = tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC + vdVatAmountLC
                    tCHist.CHistNettoCredNoteTC = tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC + vdVatAmountTC
                    tCHist.CHistNettoCredNoteCC = tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC + vdVatAmountCC
                    tCHist.CHistGrossCredNoteLC = tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC 
                    tCHist.CHistGrossCredNoteTC = tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC 
                    tCHist.CHistGrossCredNoteCC = tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC.
        /* Assign CHist values */
        <M-19 run UpdateCBalanceAndCHistAssignCHist
           (input  viYearPeriod (iiYearPeriod), 
            input  tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC - tcredBalQCInvoiceMovement.CInvoiceMovementCreditLC (idCHistBalanceLC), 
            input  tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC - tcredBalQCInvoiceMovement.CInvoiceMovementCreditTC (idCHistBalanceTC), 
            input  tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC - tcredBalQCInvoiceMovement.CInvoiceMovementCreditCC (idCHistBalanceCC), 
            input  tCHist.Project_ID (iiProject), 
            input  tCHist.CostCentre_ID (iiCostCentre), 
            input  tCHist.Division_ID (iiDivision), 
            input  tCHist.Journal_ID (iiJournal), 
            input  tCHist.GL_ID (iiGL), 
            output viLocalReturnStatus (oiReturnStatus)) in BCreditorBalance>
        if viFcReturnSuper <> 0
        then assign viLocalReturnStatus = viFcReturnSuper.
        if viFcReturnSuper < 0
        then leave QCINVOICEBLOCK.
    end. /* not available tCHist */ 
    else do:
        assign tCHist.tc_Status = 'C':U.
        if tCHist.CHistYearPeriodFrom = viYearPeriod
        then do:
            assign tCHist.CHistBalanceLC        = tCHist.CHistBalanceLC        + tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC - tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC
                   tCHist.CHistBalanceTC        = tCHist.CHistBalanceTC        + tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC - tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC
                   tCHist.CHistBalanceCC        = tCHist.CHistBalanceCC        + tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC - tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC
                   tCHist.CHistMovementCreditLC = tCHist.CHistMovementCreditLC + tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC
                   tCHist.CHistMovementCreditTC = tCHist.CHistMovementCreditTC + tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC
                   tCHist.CHistMovementCreditCC = tCHist.CHistMovementCreditCC + tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC
                   tCHist.CHistMovementDebitLC  = tCHist.CHistMovementDebitLC  + tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC
                   tCHist.CHistMovementDebitTC  = tCHist.CHistMovementDebitTC  + tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC
                   tCHist.CHistMovementDebitCC  = tCHist.CHistMovementDebitCC  + tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC.             
            /* vdVatAmountTC is a debit amount and therefore > 0 */                                                                                        
            if tCredBalQCInvoiceMovement.CInvoiceMovementType = 'INITIAL':U and tCredBalQCInvoiceMovement.CInvoiceMovementIsInvoice
            then assign tCHist.CHistNettoInvoiceLC  = tCHist.CHistNettoInvoiceLC + tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC - vdVatAmountLC
                        tCHist.CHistNettoInvoiceTC  = tCHist.CHistNettoInvoiceTC + tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC - vdVatAmountTC
                        tCHist.CHistNettoInvoiceCC  = tCHist.CHistNettoInvoiceCC + tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC - vdVatAmountCC
                        tCHist.CHistGrossInvoiceLC  = tCHist.CHistGrossInvoiceLC + tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC 
                        tCHist.CHistGrossInvoiceTC  = tCHist.CHistGrossInvoiceTC + tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC 
                        tCHist.CHistGrossInvoiceCC  = tCHist.CHistGrossInvoiceCC + tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC.
            /* vdVatAmountTC is a credit amount and therefore < 0 */            
            if tCredBalQCInvoiceMovement.CInvoiceMovementType = 'INITIAL':U and tCredBalQCInvoiceMovement.CInvoiceMovementIsCreditN
            then assign tCHist.CHistNettoCredNoteLC = tCHist.CHistNettoCredNoteLC + tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC + vdVatAmountLC
                        tCHist.CHistNettoCredNoteTC = tCHist.CHistNettoCredNoteTC + tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC + vdVatAmountTC
                        tCHist.CHistNettoCredNoteCC = tCHist.CHistNettoCredNoteCC + tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC + vdVatAmountCC
                        tCHist.CHistGrossCredNoteLC = tCHist.CHistGrossCredNoteLC + tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC 
                        tCHist.CHistGrossCredNoteTC = tCHist.CHistGrossCredNoteTC + tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC 
                        tCHist.CHistGrossCredNoteCC = tCHist.CHistGrossCredNoteCC + tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC.
            <M-18 run UpdateCBalanceAndCHistAssignCHist
               (input  viYearPeriod (iiYearPeriod), 
                input  tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC - tcredBalQCInvoiceMovement.CInvoiceMovementCreditLC (idCHistBalanceLC), 
                input  tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC - tcredBalQCInvoiceMovement.CInvoiceMovementCreditTC (idCHistBalanceTC), 
                input  tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC - tcredBalQCInvoiceMovement.CInvoiceMovementCreditCC (idCHistBalanceCC), 
                input  tCHist.Project_ID (iiProject), 
                input  tCHist.CostCentre_ID (iiCostCentre), 
                input  tCHist.Division_ID (iiDivision), 
                input  tCHist.Journal_ID (iiJournal), 
                input  tCHist.GL_ID (iiGL), 
                output viFcReturnSuper (oiReturnStatus)) in BCreditorBalance>
            if viFcReturnSuper <> 0 
            then assign viLocalReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then leave QCINVOICEBLOCK.
        end. /* if tCHist.CHistYearPeriodFrom = viYearPeriod */
        else do:
            assign viPrevYearPeriod            = tCHist.CHistYearPeriodTill
                   vdCHistBalanceLC            = tCHist.CHistBalanceLC
                   vdCHistBalanceTC            = tCHist.CHistBalanceTC
                   vdCHistBalanceCC            = tCHist.CHistBalanceCC
                   tCHist.CHistYearPeriodTill  = viYearPeriod - 1.
            <M-16 run AddDetailLine
               (input  'CHist':U (icTable), 
                input  tCBalance.tc_Rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BCreditorBalance>
            if viFcReturnSuper <> 0 
            then assign viLocalReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then leave QCINVOICEBLOCK.
            assign tCHist.CBalance_ID           = tCBalance.CBalance_ID
                   tCHist.Company_ID            = tCredBalQCInvoiceMovement.Company_ID
                   tCHist.Creditor_ID           = tCredBalQCInvoiceMovement.Creditor_ID
                   tCHist.Currency_ID           = tCredBalQCInvoiceMovement.Currency_ID
                   tCHist.GL_ID                 = tCredBalQCInvoiceMovement.GL_ID
                   tCHist.Division_ID           = tCredBalQCInvoiceMovement.Division_ID
                   tCHist.Project_ID            = tCredBalQCInvoiceMovement.Project_ID
                   tCHist.Journal_ID            = tCredBalQCInvoiceMovement.Journal_ID
                   tCHist.CostCentre_ID         = tCredBalQCInvoiceMovement.CostCentre_ID
                   tCHist.CHistYearPeriodFrom   = viYearPeriod
                   tCHist.CHistYearPeriodTill   = viPrevYearPeriod
                   tCHist.CHistBalanceLC        = vdCHistBalanceLC + tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC - tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC
                   tCHist.CHistBalanceTC        = vdCHistBalanceTC + tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC - tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC
                   tCHist.CHistBalanceCC        = vdCHistBalanceCC + tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC - tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC
                   tCHist.CHistMovementCreditLC = tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC
                   tCHist.CHistMovementCreditTC = tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC
                   tCHist.CHistMovementCreditCC = tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC
                   tCHist.CHistMovementDebitLC  = tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC
                   tCHist.CHistMovementDebitTC  = tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC
                   tCHist.CHistMovementDebitCC  = tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC.             
            /* vdVatAmountTC is a debit amount and therefore > 0 */                                                                                        
            if tCredBalQCInvoiceMovement.CInvoiceMovementType = 'INITIAL':U and tCredBalQCInvoiceMovement.CInvoiceMovementIsInvoice
            then assign tCHist.CHistNettoInvoiceLC  = tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC - vdVatAmountLC
                        tCHist.CHistNettoInvoiceTC  = tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC - vdVatAmountTC
                        tCHist.CHistNettoInvoiceCC  = tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC - vdVatAmountCC
                        tCHist.CHistGrossInvoiceLC  = tCredBalQCInvoiceMovement.CInvoiceMovementCreditLC 
                        tCHist.CHistGrossInvoiceTC  = tCredBalQCInvoiceMovement.CInvoiceMovementCreditTC 
                        tCHist.CHistGrossInvoiceCC  = tCredBalQCInvoiceMovement.CInvoiceMovementCreditCC.
            /* vdVatAmountTC is a credit amount and therefore < 0 */            
            if tCredBalQCInvoiceMovement.CInvoiceMovementType = 'INITIAL':U and tCredBalQCInvoiceMovement.CInvoiceMovementIsCreditN
            then assign tCHist.CHistNettoCredNoteLC = tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC + vdVatAmountLC
                        tCHist.CHistNettoCredNoteTC = tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC + vdVatAmountTC
                        tCHist.CHistNettoCredNoteCC = tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC + vdVatAmountCC
                        tCHist.CHistGrossCredNoteLC = tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC 
                        tCHist.CHistGrossCredNoteTC = tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC 
                        tCHist.CHistGrossCredNoteCC = tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC.
            <M-17 run UpdateCBalanceAndCHistAssignCHist
               (input  viYearPeriod (iiYearPeriod), 
                input  tCredBalQCInvoiceMovement.CInvoiceMovementDebitLC - tcredBalQCInvoiceMovement.CInvoiceMovementCreditLC (idCHistBalanceLC), 
                input  tCredBalQCInvoiceMovement.CInvoiceMovementDebitTC - tcredBalQCInvoiceMovement.CInvoiceMovementCreditTC (idCHistBalanceTC), 
                input  tCredBalQCInvoiceMovement.CInvoiceMovementDebitCC - tcredBalQCInvoiceMovement.CInvoiceMovementCreditCC (idCHistBalanceCC), 
                input  tCHist.Project_ID (iiProject), 
                input  tCHist.CostCentre_ID (iiCostCentre), 
                input  tCHist.Division_ID (iiDivision), 
                input  tCHist.Journal_ID (iiJournal), 
                input  tCHist.GL_ID (iiGL), 
                output viFcReturnSuper (oiReturnStatus)) in BCreditorBalance>
            if viFcReturnSuper <> 0 
            then assign viLocalReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then leave QCINVOICEBLOCK.
        end. /* Not if tCHist.CHistYearPeriodFrom = viYearPeriod */
    end. /* History record found for this period */
end. /* for each tCredBalQCInvoiceMovement no-lock: + Block */

/* ============ */
/* Stop Queries */
/* ============ */
<Q-24 run CBalanceByCyCreditorCurrID  (Stop) in BCreditorBalance >
if vlStartedPeriodPrim = true
then do :
    <Q-25 run PeriodPrim (Stop) in BPeriod >
end. /* if vlStartedPeriodPrim = true */

/* ================ */
/* Check for errors */
/* ================ */
assign oiReturnStatus = viLocalReturnStatus.
if oiReturnStatus <> 0
then return.

/* ============ */
/* Validation   */
/* ============ */
<M-26 run ValidateBC (output viFcReturnSuper (oiReturnStatus)) in BCreditorBalance>
if viFcReturnSuper <> 0
then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.
                  
/* ============ */
/* AddUpd       */
/* ============ */
<M-28 run AdditionalUpdates (output viFcReturnSuper (oiReturnStatus)) in BCreditorBalance>
if viFcReturnSuper <> 0
then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.