project QadFinancials > class BCInvoice > method CreateCInvoicesValidate

Description

Validations for creation of creditor invoices


Parameters


tOpenBalanceCIinput-outputtemp-tableOpen Balance
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BCInvoice.CreateCInvoices


program code (program3/bcinvoice.p)

/* check if there is one record available */
find first tOpenBalanceCI where tOpenBalanceCI.tcCreditorCode <> "":U no-error.
if not available tOpenBalanceCI
then do:
    assign oiReturnStatus = -1.
    <M-1 run SetMessage
       (input  trim(#T-27'No input record found. You must define for which fields the value must default.':255(1236)T-27#) (icMessage), 
        input  '':U (icArguments), 
        input  '':U (icFieldName), 
        input  '':U (icFieldValue), 
        input  'E':U (icType), 
        input  3 (iiSeverity), 
        input  '':U (icRowid), 
        input  'QADFIN-662':U (icFcMsgNumber), 
        input  '' (icFcExplanation), 
        input  '' (icFcIdentification), 
        input  '' (icFcContext), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    return.
end.

for each tOpenBalanceCI where 
         tOpenBalanceCI.tcCreditorCode <> "":U:    
    
    /* Ensure the company-ID is set correctly */
    if tOpenBalanceCI.tiCompanyId = 0 or 
       tOpenBalanceCI.tiCompanyId = ? 
    then assign tOpenBalanceCI.tiCompanyId = viCompanyId.
    else if tOpenBalanceCI.tiCompanyId <> viCompanyId
         then do :
            assign vcMessage      = trim(substitute(#T-12'The entity-ID of the invoice (&1) must match the entity-ID of the current-entity (&2)':255(97993011)T-12#, tOpenBalanceCI.tiCompanyId , viCompanyId))
                   oiReturnStatus = -1.
            <M-85 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'qadfin-118224':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
            return.
         end. /* if tOpenBalanceCI.tiCompanyId <> viCompanyId */
    
    /* replace unknown values */
    if tOpenBalanceCI.tcAction = ? then assign tOpenBalanceCI.tcAction = "":U.
    if tOpenBalanceCI.tcBankNumber = ? then assign tOpenBalanceCI.tcBankNumber = "":U.
    if tOpenBalanceCI.tcCCCurrencyCode = ? then assign tOpenBalanceCI.tcCCCurrencyCode = "":U.
    if tOpenBalanceCI.tiCompanyId = ? then assign tOpenBalanceCI.tiCompanyId = 0.
    if tOpenBalanceCI.tcCreditorCode = ? then assign tOpenBalanceCI.tcCreditorCode = "":U.
    if tOpenBalanceCI.tcReasonCode = ? then assign tOpenBalanceCI.tcReasonCode = "":U.
    if tOpenBalanceCI.tcDivisionCode = ? then assign tOpenBalanceCI.tcDivisionCode = "":U.
    if tOpenBalanceCI.tdExchangeRateTCLC = ? then assign tOpenBalanceCI.tdExchangeRateTCLC = 0.
    if tOpenBalanceCI.tdExchangeRateScale = ? or tOpenBalanceCI.tdExchangeRateScale = 0 then assign tOpenBalanceCI.tdExchangeRateScale = 1.
    if tOpenBalanceCI.tdInvoiceAmountLC = ? then assign tOpenBalanceCI.tdInvoiceAmountLC = 0.
    if tOpenBalanceCI.tdInvoiceAmountTC = ? then assign tOpenBalanceCI.tdInvoiceAmountTC = 0.
    if tOpenBalanceCI.tdInvoiceAmountCC = ? then assign tOpenBalanceCI.tdInvoiceAmountCC = 0.
    if tOpenBalanceCI.tcInvoiceDescription = ? then assign tOpenBalanceCI.tcInvoiceDescription = "":U.
    if tOpenBalanceCI.tcInvoiceReference = ? then assign tOpenBalanceCI.tcInvoiceReference = "":U.
    if tOpenBalanceCI.tcInvoiceTSMNumber = ? then assign tOpenBalanceCI.tcInvoiceTSMNumber = "":U.
    if tOpenBalanceCI.tcInvoiceType = ? then assign tOpenBalanceCI.tcInvoiceType = "":U.
    if tOpenBalanceCI.tiInvoiceVoucher = ? then assign tOpenBalanceCI.tiInvoiceVoucher = 0.
    if tOpenBalanceCI.tcJournalCode = ? then assign tOpenBalanceCI.tcJournalCode = "":U.
    if tOpenBalanceCI.tcLCCurrencyCode = ? then assign tOpenBalanceCI.tcLCCurrencyCode = "":U.
    if tOpenBalanceCI.tcNormalPaymentConditionCode = ? then assign tOpenBalanceCI.tcNormalPaymentConditionCode = "":U.
    if tOpenBalanceCI.tcPaymentMeans = ? then assign tOpenBalanceCI.tcPaymentMeans = "":U.
    if tOpenBalanceCI.tiPeriodPeriod = ? then assign tOpenBalanceCI.tiPeriodPeriod = 0.
    if tOpenBalanceCI.tiPeriodYear = ? then assign tOpenBalanceCI.tiPeriodYear = 0.
    if tOpenBalanceCI.tcPostingText = ? then assign tOpenBalanceCI.tcPostingText = "":U.
    if tOpenBalanceCI.tcPostingType = ? then assign tOpenBalanceCI.tcPostingType = "":U.
    if tOpenBalanceCI.tcTCCurrencyCode = ? then assign tOpenBalanceCI.tcTCCurrencyCode = "":U.
    if tOpenBalanceCI.tcTransferAccountCostCentreCode = ? then assign tOpenBalanceCI.tcTransferAccountCostCentreCode = "":U.
    if tOpenBalanceCI.tcTransferAccountDivisionCode = ? then assign tOpenBalanceCI.tcTransferAccountDivisionCode = "":U.
    if tOpenBalanceCI.tcTransferAccountGLCode = ? then assign tOpenBalanceCI.tcTransferAccountGLCode = "":U.
    if tOpenBalanceCI.tcTransferAccountProjectCode = ? then assign tOpenBalanceCI.tcTransferAccountProjectCode = "":U.
    if tOpenBalanceCI.tlInvoiceIsERS = ? then assign tOpenBalanceCI.tlInvoiceIsERS = false.
    if tOpenBalanceCI.tcVatCode = ? then assign tOpenBalanceCI.tcVatCode = "":U.
    if tOpenBalanceCI.tdWHTFeeDebitTC = ? then assign tOpenBalanceCI.tdWHTFeeDebitTC = 0.
    if tOpenBalanceCI.tdWHTFeeCreditTC = ? then assign tOpenBalanceCI.tdWHTFeeCreditTC = 0.
    if tOpenBalanceCI.tdWHTExpenseDebitTC = ? then assign tOpenBalanceCI.tdWHTExpenseDebitTC = 0.
    if tOpenBalanceCI.tdWHTExpenseCreditTC = ? then assign tOpenBalanceCI.tdWHTExpenseCreditTC = 0.
    
    /* don't do a thing when it is not save */
    if tOpenBalanceCI.tcAction <> {&DAEMONACTION-SAVE}
    then do:
        assign oiReturnStatus = -1.
        <M-10 run SetMessage
           (input  trim(subst(#T-28'Action must be &1.':255(998684119)T-28#, {&DAEMONACTION-SAVE-TR})) (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  '':U (icRowid), 
            input  'QADFIN-707':U (icFcMsgNumber), 
            input  '' (icFcExplanation), 
            input  '' (icFcIdentification), 
            input  '' (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
        return.
    end.

    /* ********************* */
    /* Check the InvoiceType */
    /* ********************* */
    if tOpenBalanceCI.tcInvoiceType <> {&INVOICETYPE-INVOICE} and
       tOpenBalanceCI.tcInvoiceType <> {&INVOICETYPE-CREDITNOTE} and
       tOpenBalanceCI.tcInvoiceType <> {&INVOICETYPE-ADJUSTMENT} and
       tOpenBalanceCI.tcInvoiceType <> {&INVOICETYPE-PREPAYMENT} and
       tOpenBalanceCI.tcInvoiceType <> {&INVOICETYPE-INVOICECORRECTION} and
       tOpenBalanceCI.tcInvoiceType <> {&INVOICETYPE-CREDITNOTECORRECTION}
    then do:
        assign vcMessage      = trim(subst(#T-29'The invoice type must be &1, &2, &3, &4, &5, or &6.':255(13956)T-29#, {&INVOICETYPE-INVOICE-TR},{&INVOICETYPE-CREDITNOTE-TR},{&INVOICETYPE-ADJUSTMENT-TR},{&INVOICETYPE-PREPAYMENT-TR}, {&INVOICETYPE-INVOICECORRECTION-TR}, {&INVOICETYPE-CREDITNOTECORRECTION-TR}))
               oiReturnStatus = -1.
        <M-2 run SetMessage (input  vcMessage (icMessage), 
                 input  '':U (icArguments), 
                 input  'tOpenBalanceCI.tcInvoiceType':U (icFieldName), 
                 input  tOpenBalanceCI.tcInvoiceType (icFieldValue), 
                 input  'E':U (icType), 
                 input  3 (iiSeverity), 
                 input  '':U (icRowid), 
                 input  'QADFIN-663':U (icFcMsgNumber), 
                 input  '' (icFcExplanation), 
                 input  '' (icFcIdentification), 
                 input  '' (icFcContext), 
                 output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
        return.
    end.

    /* ========================== */
    /* check mandatory parameters */
    /* ========================== */
    if (tOpenBalanceCI.tiPeriodYear = 0 and tOpenBalanceCI.tiPeriodPeriod = 0) or
       (tOpenBalanceCI.tcJournalCode = "":U)
    then do:
        assign oiReturnStatus = -1.
        <M-5 run SetMessage
           (input  trim(#T-30'You must enter the GL period and daybook.':150(1064)T-30#) (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  '':U (icRowid), 
            input  'QADFIN-665':U (icFcMsgNumber), 
            input  '' (icFcExplanation), 
            input  '' (icFcIdentification), 
            input  '' (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    end.

    /* ========================= */
    /* posting date is mandatory */
    /* ========================= */
    if tOpenBalanceCI.ttPostingDate = ?
    then do:
        assign oiReturnStatus = -1.
        <M-20 run SetMessage
           (input  trim(#T-31'You must enter the posting date.':150(1068)T-31#) (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  '':U (icRowid), 
            input  'QADFIN-1637':U (icFcMsgNumber), 
            input  '' (icFcExplanation), 
            input  '' (icFcIdentification), 
            input  '' (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    end.

    /* ========================== */
    /* check Creditor Code        */
    /* ========================== */
    if tOpenBalanceCI.tcCreditorCode = "":U
    then do:
        assign oiReturnStatus = -1.
        <M-6 run SetMessage
           (input  trim(#T-32'You must enter the supplier.':150(1065)T-32#) (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  '':U (icRowid), 
            input  'QADFIN-666':U (icFcMsgNumber), 
            input  '' (icFcExplanation), 
            input  '' (icFcIdentification), 
            input  '' (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    end.
    else do:
        <Q-3 run CreditorPrim (all) (Read) (NoCache)
           (input tOpenBalanceCI.tiCompanyId, (CompanyId)
            input ?, (CreditorId)
            input tOpenBalanceCI.tcCreditorCode, (CreditorCode)
            output dataset tqCreditorPrim) in BCreditor >
        find first tqCreditorPrim no-error.
        if not available tqCreditorPrim
        then do:
             assign oiReturnStatus = -1.
             <M-4 run SetMessage
                (input  trim(#T-33'The supplier is not defined in the system.':255(1134)T-33#) (icMessage), 
                 input  '':U (icArguments), 
                 input  'tOpenBalanceCI.tcCreditorCode':U (icFieldName), 
                 input  tOpenBalanceCI.tcCreditorCode (icFieldValue), 
                 input  'E':U (icType), 
                 input  3 (iiSeverity), 
                 input  '':U (icRowid), 
                 input  'QADFIN-664':U (icFcMsgNumber), 
                 input  '' (icFcExplanation), 
                 input  '' (icFcIdentification), 
                 input  '' (icFcContext), 
                 output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
             return.
        end.
    end.
    
    /* ========================== */
    /* check Posting Type         */
    /* ========================== */
    if tOpenBalanceCI.tcPostingType  = "":U
    then do:
        assign oiReturnStatus = -1.
        <M-8 run SetMessage
           (input  trim(#T-34'You must enter the posting type.':150(1070)T-34#) (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  '':U (icRowid), 
            input  'QADFIN-667':U (icFcMsgNumber), 
            input  '' (icFcExplanation), 
            input  '' (icFcIdentification), 
            input  '' (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    end.
    else do:
        assign vlFound        = false
               vcPostingTypes = {&POSTINGTYPES}.
        do viCounter = num-entries(vcPostingTypes,chr(2)) to 2 by -1 :
             if tOpenBalanceCI.tcPostingType = entry(viCounter,vcPostingTypes,chr(2)) 
             then do:
                 assign vlFound = true.
                 leave.
             end.
        end.
    
        if not vlFound
        then do:
            assign oiReturnStatus = -1.
            <M-9 run SetMessage
               (input  trim(subst(#T-35'The posting type must be &1 or &2.':150(1071)T-35#,{&POSTINGTYPE-DEBIT-TR},{&POSTINGTYPE-CREDIT-TR})) (icMessage), 
                input  '':U (icArguments), 
                input  'tOpenBalanceCI.tcPostingType':U (icFieldName), 
                input  tOpenBalanceCI.tcPostingType (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'QADFIN-668':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCInvoice> 
        end.
    end.

    /* Creditor Invoice should be CREDIT, Creditor CreditNotes should be DEBIT */
    if ((tOpenBalanceCI.tcInvoiceType = {&INVOICETYPE-INVOICE} or tOpenBalanceCI.tcInvoiceType = {&INVOICETYPE-INVOICECORRECTION}) and tOpenBalanceCI.tcPostingType <> {&POSTINGTYPE-CREDIT}) or
       ((tOpenBalanceCI.tcInvoiceType = {&INVOICETYPE-CREDITNOTE} or tOpenBalanceCI.tcInvoiceType = {&INVOICETYPE-CREDITNOTECORRECTION}) and tOpenBalanceCI.tcPostingType <> {&POSTINGTYPE-DEBIT})
    then do :
            assign oiReturnStatus = -1.
            <M-13 run SetMessage
               (input  trim(subst(#T-36'Posting type &1 is not valid for invoice type &2.':150(261087847)T-36#,tOpenBalanceCI.tcPostingType,tOpenBalanceCI.tcInvoiceType)) (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'QADFIN-1634':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCInvoice> 
    end.

    /* Get The JournalType */
    <Q-16 run JournalByJournalLayerType (all) (Read) (NoCache)
       (input ?, (JournalId)
        input tOpenBalanceCI.tcJournalCode, (JournalCode)
        input viCompanyId, (CompanyId)
        input ?, (LayerTypeCode)
        output dataset tqJournalByJournalLayerType) in BJournal >
    find first tqJournalByJournalLayerType where
               tqJournalByJournalLayerType.tcJournalCode = tOpenBalanceCI.tcJournalCode 
               no-error.
    if not available tqJournalByJournalLayerType
    then do:
        assign oiReturnStatus = -1.
        <M-19 run SetMessage
           (input  trim(#T-37'The daybook specified is not defined in the system.':150(1240)T-37#) (icMessage), 
            input  '':U (icArguments), 
            input  'tOpenBalanceCI.tcJournalCode':U (icFieldName), 
            input  tOpenBalanceCI.tcJournalCode (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  '':U (icRowid), 
            input  'QADFIN-1636':U (icFcMsgNumber), 
            input  '' (icFcExplanation), 
            input  '' (icFcIdentification), 
            input  '' (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    end.
    else do :
        /* Check the Invoice Type with the Journal Type */
        if (tOpenBalanceCI.tcInvoiceType = {&INVOICETYPE-INVOICE}    and tqJournalByJournalLayerType.tcJournalTypeCode <> {&JOURNALTYPE-CREDITORINVOICE})    or
           (tOpenBalanceCI.tcInvoiceType = {&INVOICETYPE-INVOICECORRECTION} and tqJournalByJournalLayerType.tcJournalTypeCode <> {&JOURNALTYPE-CREDITORINVOICECORRECT}) or
           (tOpenBalanceCI.tcInvoiceType = {&INVOICETYPE-CREDITNOTE} and tqJournalByJournalLayerType.tcJournalTypeCode <> {&JOURNALTYPE-CREDITORCREDITNOTE}) or
           (tOpenBalanceCI.tcInvoiceType = {&INVOICETYPE-CREDITNOTECORRECTION} and tqJournalByJournalLayerType.tcJournalTypeCode <> {&JOURNALTYPE-CREDITORCREDITNOTECORRECT}) or
           (tOpenBalanceCI.tcInvoiceType = {&INVOICETYPE-ADJUSTMENT} and tqJournalByJournalLayerType.tcJournalTypeCode <> {&JOURNALTYPE-CREDITORADJUSTMENT})
        then do :
            assign oiReturnStatus = -1.
            <M-18 run SetMessage
               (input  trim(subst(#T-38'Daybook &1 is not valid for invoice type &2.':150(1241)T-38#,tOpenBalanceCI.tcJournalCode,tOpenBalanceCI.tcInvoiceType)) (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'QADFIN-1635':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
        end.

        if (tOpenBalanceCI.tcInvoiceType = {&INVOICETYPE-INVOICECORRECTION} or
            tOpenBalanceCI.tcInvoiceType = {&INVOICETYPE-CREDITNOTECORRECTION}) and
            tqJournalByJournalLayerType.tlJournalTypeIsCorrection = false
        then do:
            assign oiReturnStatus = -1.
            <M-42 run SetMessage
               (input  trim(subst(#T-43'The daybook (&1) must be a correction daybook.':150(13969)T-43#,tOpenBalanceCI.tcJournalCode)) (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'QADFIN-3150':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
        end.
    end.

    /* check if reason code does exist */
    if tOpenBalanceCI.tcReasonCode <> "":U
    then do:
        <Q-25 run ReasonByIdCode (all) (Read) (NoCache)
           (input ?, (ReasonId)
            input tOpenBalanceCI.tcReasonCode, (ReasonCode)
            output dataset tqReasonByIdCode) in BReason >
        find first tqReasonByIdCode no-error.
        if not available tqReasonByIdCode
        then do:
            assign oiReturnStatus = -1.
            <M-24 run SetMessage
               (input  trim(#T-39'The invoice status code specified is not defined in the system.':150(1242)T-39#) (icMessage), 
                input  '':U (icArguments), 
                input  'tOpenBalanceCI.tcReasonCode':U (icFieldName), 
                input  tOpenBalanceCI.tcReasonCode (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'QADFIN-2965':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
        end.
    end.

    /* Wouter - 27 jan 2005 : Test only on BankNumber when specified */        
    /* however, when not specified and creditor pays electronically, we continue */
    if tOpenBalanceCI.tcBankNumber <> "":U
    then do :
        assign tOpenBalanceCI.tcBankNumber = replace(tOpenBalanceCI.tcBankNumber," ":U,"":U)
               tOpenBalanceCI.tcBankNumber = replace(tOpenBalanceCI.tcBankNumber,".":U,"":U)
               tOpenBalanceCI.tcBankNumber = replace(tOpenBalanceCI.tcBankNumber,"/":U,"":U)
               tOpenBalanceCI.tcBankNumber = replace(tOpenBalanceCI.tcBankNumber,"-":U,"":U).
        <Q-21 assign vlFcQueryRecordsAvailable = BankNumberPrim (NoCache)
          (input ?, (BankNumberId)
           input tqCreditorPrim.tiCreditor_ID, (ParentObjectId)
           input tOpenBalanceCI.tcBankNumber, (BankNumber)
           input tOpenBalanceCI.tcBankNumberExtension, (BankNumberExtension)
           input ?, (BankPayFormatID)) in BBankNumber >
        if not vlFcQueryRecordsAvailable
        then do:
            assign oiReturnStatus = -1.
            <M-22 run SetMessage
               (input  trim(#T-41'The bank account number specified is not defined in the system.':150(1244)T-41#) (icMessage), 
                input  '':U (icArguments), 
                input  'tOpenBalanceCI.tcBankNumber':U (icFieldName), 
                input  tOpenBalanceCI.tcBankNumber (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'QADFIN-1640':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCInvoice> 
        end.
    end. /* tOpenBalanceCI.tcBankNumber <> "":U */
    
    /* === Set the CC-amounts and / or CC-exchange-rate/scale in case they were left empty === */
    if tOpenBalanceCI.tdInvoiceAmountCC = 0 or 
       tOpenBalanceCI.tdInvoiceAmountCC = ?
    then do :
        if viCompanyCCId = viCompanyLCId
        then /* Set the CC-amount = LC-amount and set the CC-Rate/Scale = LC-Rate/Scale */
            assign tOpenBalanceCI.tdInvoiceAmountCC     = tOpenBalanceCI.tdInvoiceAmountLC
                   tOpenBalanceCI.tdExchangeRateTCCC    = tOpenBalanceCI.tdExchangeRateTCLC 
                   tOpenBalanceCI.tdCCExchangeRateScale = tOpenBalanceCI.tdExchangeRateScale.
        else 
            if tOpenBalanceCI.tdInvoiceAmountTC <> 0 and 
               tOpenBalanceCI.tdInvoiceAmountTC <> ?
            then do :
                /* Retrieve the TCCC-Rate/Scale when empty */
                if (tOpenBalanceCI.tdExchangeRateTCCC = 0 or  
                    tOpenBalanceCI.tdExchangeRateTCCC = ?) and 
                   (tOpenBalanceCI.tdCCExchangeRateScale = 0 or
                    tOpenBalanceCI.tdCCExchangeRateScale = ?)
                then do :
                    /* Fill in the SC-amount and the TCCC-Rate/Scale based upon the TC-amount and Rate/Scale we retrieve */
                    <M-7 run GetExRateByEntityInvoiceFlag
                       (input  tOpenBalanceCI.ttInvoiceDate (itCInvoiceDate), 
                        input  tOpenBalanceCI.ttPostingDate (itCInvoicePostingDate), 
                        input  ? (iiFromCurrencyId), 
                        input  tOpenBalanceCI.tcTCCurrencyCode (icFromCurrencyCode), 
                        input  viCompanyCCId (iiToCurrencyId), 
                        input  ? (icToCurrencyCode), 
                        input  0 (iiExchangeRateTypeId), 
                        input  {&EXCHANGERATETYPE-STATUTORY} (icExchangeRateTypeCode), 
                        output tOpenBalanceCI.tdExchangeRateTCCC (odCInvoiceExchangeRate), 
                        output tOpenBalanceCI.tdCCExchangeRateScale (odCInvoiceRateScale), 
                        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>  
                          
                    if viFcReturnSuper < 0 or 
                       (viFcReturnSuper > 0 and oiReturnStatus = 0)
                    then assign oiReturnStatus = viFcReturnSuper.    
                    if viFcReturnSuper < 0
                    then Return.
                end. /* if (tOpenBalanceCI.tdExchangeRateTCCC = 0 or */
                /* Fill in the SC-amount based upon the TC-amount and the TCCC-Rate/Scale */
                assign tOpenBalanceCI.tdInvoiceAmountCC = <M-51 RoundAmount
                                                             (input  tOpenBalanceCI.tdInvoiceAmountTC * tOpenBalanceCI.tdExchangeRateTCCC * tOpenBalanceCI.tdCCExchangeRateScale (idUnroundedAmount), 
                                                              input  viCompanyCCId (iiCurrencyID), 
                                                              input  ? (icCurrencyCode)) in BCInvoice>.
            end. /* if tOpenBalanceCI.tdInvoiceAmountTC <> 0 and  */
    end. /* if tOpenBalanceCI.tdInvoiceAmountCC = 0 or */        
    if tOpenBalanceCI.tdInvoiceAmountCC <> 0 and 
       tOpenBalanceCI.tdInvoiceAmountCC <> ? and
       tOpenBalanceCI.tdInvoiceAmountTC <> 0 and 
       tOpenBalanceCI.tdInvoiceAmountTC <> ? and 
       (tOpenBalanceCI.tdExchangeRateTCCC = 0 or  
        tOpenBalanceCI.tdExchangeRateTCCC = ?) and 
       (tOpenBalanceCI.tdCCExchangeRateScale = 0 or
        tOpenBalanceCI.tdCCExchangeRateScale = ?)        
    then /* Fill in the TCCC-Rate/Scale based upon the TC-amount and the SC-amount  */
        assign tOpenBalanceCI.tdExchangeRateTCCC    = tOpenBalanceCI.tdInvoiceAmountCC / tOpenBalanceCI.tdInvoiceAmountTC
               tOpenBalanceCI.tdCCExchangeRateScale = 1.                
    
    /* Check for SC amount <> (Supplier TC * TCCC Exchange rate * Rate Scale) when TC Currency <> CC Currency */
    if(vlDomainIsStatutory = true and
       tOpenBalanceCI.tcTCCurrencyCode <> tOpenBalanceCI.tcCCCurrencyCode and
       tOpenBalanceCI.tdInvoiceAmountCC     <> 0 and
       tOpenBalanceCI.tdInvoiceAmountCC     <> ? and
       tOpenBalanceCI.tdExchangeRateTCCC    <> 0 and
       tOpenBalanceCI.tdExchangeRateTCCC    <> ? and
       tOpenBalanceCI.tdCCExchangeRateScale <> 0 and
       tOpenBalanceCI.tdCCExchangeRateScale <> ?)
    then do:
        assign tOpenBalanceCI.tdInvoiceAmountCC = <M-95 RoundAmount
                                                     (input  tOpenBalanceCI.tdInvoiceAmountCC (idUnroundedAmount), 
                                                      input  viCompanyCCId (iiCurrencyID), 
                                                      input  ? (icCurrencyCode)) in BCInvoice>.
                                                      
        assign vdAmountCC = <M-77 RoundAmount
                               (input  tOpenBalanceCI.tdInvoiceAmountTC * tOpenBalanceCI.tdExchangeRateTCCC * tOpenBalanceCI.tdCCExchangeRateScale (idUnroundedAmount), 
                                input  viCompanyCCId (iiCurrencyID), 
                                input  ? (icCurrencyCode)) in BCInvoice>.
                                
        vdRoundingDiff = absolute(vdAmountCC - tOpenBalanceCI.tdInvoiceAmountCC).
        
        if vdRoundingDiff > 0.01
        then do:
            assign vcMessage = trim(subst(#T-82'There is a difference between the calculated Statutory Currency Amount &1 using the TC Invoice Amount &2 and Exchange Rate &3 compared to the SC Invoice Amount &4 . Please check.':255(306444220)T-82#,vdAmountCC,tOpenBalanceCI.tdInvoiceAmountTC,tOpenBalanceCI.tdExchangeRateTCCC,tOpenBalanceCI.tdInvoiceAmountCC))
                   oiReturnStatus = -1. 
                   
            <M-26 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  'tOpenBalanceCI.tcInvoiceReference':U (icFieldName), 
                input  tOpenBalanceCI.tcInvoiceReference (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'qadfin-629107':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
        end.
    end.  /* if(vlDomainIsStatutory = true and */                                                                                          
    
end. /* for each tOpenBalanceCI */