project QadFinancials > class BDInvoice > method CreateFinChgInvoices

Description

Create CreateFinChgInvoices :
create finChginvoice
create di posting, cinvoicemovement
update balance and status
create DInvoiceposting


Parameters


tDIOpenBalanceinput-outputtemp-table
iiBJournalEntryIdinputinteger
iiPostingIdinputinteger
ocNewRecordInfooutputcharacter
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program3/bdinvoice.p)

/* Replace unknown value */
if iiBJournalEntryId = ? then assign iiBJournalEntryId = 0.
if iiPostingId = ? then assign iiPostingId = 0.

for each tDIOpenBalance where 
         tDIOpenBalance.tcDebtorCode <> "":U
no-lock:
    /* create the invoice */
    <M-2 run AddDetailLine (input  'DInvoice':U (icTable), 
                            input  '':U (icParentRowid), 
                            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
    if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)
    then assign oiReturnStatus = viFcReturnSuper.
    
    assign tDInvoice.Company_ID                     = tDIOpenBalance.tiCompanyId
           tDInvoice.DInvoicePostingPeriod          = tDIOpenBalance.tiPeriodPeriod
           tDInvoice.DInvoicePostingYear            = tDIOpenBalance.tiPeriodYear
           tDInvoice.tcDebtorCode                   = tDIOpenBalance.tcDebtorCode
           tDInvoice.tcDivisionCode                 = tDIOpenBalance.tcDivisionCode
           tDInvoice.tcJournalCode                  = tDIOpenBalance.tcJournalCode
           tDInvoice.tcReasonCode                   = tDIOpenBalance.tcReasonCode
           tDInvoice.DInvoicePostingDate            = tDIOpenBalance.ttPostingDate
           tDInvoice.DInvoiceType                   = tDIOpenBalance.tcInvoiceType
           tDInvoice.DInvoiceDate                   = tDIOpenBalance.ttInvoiceDate
           tDInvoice.DInvoiceTaxPointDate           = tDIOpenBalance.ttInvoiceTaxPointDate
           tDInvoice.DInvoiceDescription            = tDIOpenBalance.tcInvoiceDescription
           tDInvoice.tcCurrencyCode                 = tDIOpenBalance.tcTCCurrencyCode
           tDInvoice.tcNormalPaymentConditionCode   = tDIOpenBalance.tcNormalPaymentConditionCode
           tDInvoice.DInvoiceExchangeRate           = tDIOpenBalance.tdExchangeRateTCLC
           tDInvoice.DInvoiceRateScale              = if tDIOpenBalance.tdExchangeRateScale = 0 then 1 else tDIOpenBalance.tdExchangeRateScale 
           tDInvoice.DInvoiceTSMNumber              = tDIOpenBalance.tcInvoiceTSMNumber
           tDInvoice.DInvoiceDueDate                = tDIOpenBalance.ttInvoiceDueDate
           tDInvoice.DInvoiceDiscountDueDate        = tDIOpenBalance.ttInvoiceDiscountDueDate
           tDInvoice.DInvoiceDIText                 = tDIOpenBalance.tcPostingText
           tDInvoice.DInvoiceIsOpen                 = true
           tDInvoice.DInvoiceIsSelected             = false
           tDInvoice.DInvoiceIsPaymentAllowed       = false
           ocNewRecordInfo                          = if tDIOpenBalance.tcKey <> "":U
                                                      then tDIOpenBalance.tcKey + ",":U + string(tDInvoice.DInvoice_ID)
                                                      else "":U.

    if tDIOpenBalance.tcPostingType = {&POSTINGTYPE-DEBIT}
    then assign tDInvoice.DInvoiceOriginalDebitTC = tDIOpenBalance.tdInvoiceAmountTC
                tDInvoice.DInvoiceOriginalDebitLC = tDIOpenBalance.tdInvoiceAmountLC
                tDInvoice.DInvoiceOriginalDebitCC = tDIOpenBalance.tdInvoiceAmountCC
                tDInvoice.tdDInvoiceOriginalTC    = tDIOpenBalance.tdInvoiceAmountTC
                tDInvoice.tdDInvoiceOriginalLC    = tDIOpenBalance.tdInvoiceAmountLC.
    else assign tDInvoice.DInvoiceOriginalCreditTC = tDIOpenBalance.tdInvoiceAmountTC
                tDInvoice.DInvoiceOriginalCreditLC = tDIOpenBalance.tdInvoiceAmountLC
                tDInvoice.DInvoiceOriginalCreditCC = tDIOpenBalance.tdInvoiceAmountCC
                tDInvoice.tdDInvoiceOriginalTC     = tDIOpenBalance.tdInvoiceAmountTC
                tDInvoice.tdDInvoiceOriginalLC     = tDIOpenBalance.tdInvoiceAmountLC.
                
    if tDIOpenBalance.tiInvoiceVoucher = 0
    then do:

        /* Check the type of daybook to be used. */
        if vlJournalQueryStarted = FALSE
        then do:
            <Q-81 run JournalBeginsForJEDefault  (Start) in BJournal >
            assign vlJournalQueryStarted = TRUE.
        end. /* if vlJournalQueryStarted = FALSE. */
        
        <Q-61 run JournalBeginsForJEDefault (all) (Read) (NoCache)
           (input viCompanyId, (CompanyId)
            input tDIOpenBalance.tcJournalCode, (JournalCode)
            input {&JOURNALCONTROL-LOGISTIC}, (JournalControl)
            input '':U, (JournalTypeCode)
            output dataset tqJournalBeginsForJEDefault) in BJournal >
            
            
        find first tqJournalBeginsForJEDefault where
                   tqJournalBeginsForJEDefault.tcJournalCode     = tDIOpenBalance.tcJournalCode and
                   tqJournalBeginsForJEDefault.tcJournalControl  = {&JOURNALCONTROL-LOGISTIC}                   
        no-lock no-error.
        
        if available tqJournalBeginsForJEDefault
        then
            assign vlJournalIsOperational = TRUE.
        else
            assign vlJournalIsOperational = FALSE.

        /* Voucher number generation. */
        if vlCCNIsConsecutNr      = TRUE  and
           vlJournalIsOperational = FALSE
        then do:
            assign tDIOpenBalance.tiInvoiceVoucher = viCCNTempDInvNbr
                   viCCNTempDInvNbr                = viCCNTempDInvNbr + 1.
        end. /* if vlCCNIsConsecutNr = TRUE */
        else do:
            /* Reserve a number for this sheet.                          */
            /* This number will be released again by housekeeping if the */
            /* transaction was not committed by then.                    */
            assign vhFcComponent = ?.
            <M-3 run GetNumber
               (input  tDIOpenBalance.tiCompanyId (iiCompanyId), 
                input  tDIOpenBalance.tiPeriodYear (iiNumbrYear), 
                input  tDIOpenBalance.tcJournalCode (icNumbrType), 
                output tDIOpenBalance.tiInvoiceVoucher (oiNumber), 
                input  viFcCurrentInstanceId (iiInstanceId), 
                input  vcFcComponentName (icClassName), 
                output viFcReturnSuper (oiReturnStatus)) in BNumber>
            if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)
            then assign oiReturnStatus = viFcReturnSuper.
            if oiReturnStatus < 0
            then return.
        end. /* NOT if vlCCNIsConsecutNr = TRUE */
    end.     /* if tDIOpenBalance.tiInvoiceVoucher = 0 */

    assign tDInvoice.DInvoiceVoucher = tDIOpenBalance.tiInvoiceVoucher.
    if not can-do(vcCommitNumber,tDInvoice.tc_Rowid)
    then assign vcCommitNumber = vcCommitNumber + ",":U + tDInvoice.tc_Rowid.

    <Q-4 run DebtorByDebtor (first) (Read) (NoCache)
       (input tDIOpenBalance.tiCompanyId, (CompanyId)
        input {&ADDRESSTYPECODESYSTEM-HEADOFFICE}, (AddressType)
        input ?, (DebtorId)
        input tDIOpenBalance.tcDebtorCode, (DebtorCode)
        output dataset tqDebtorByDebtor) in BDebtor >
    find first tqDebtorByDebtor no-error.
    if not available tqDebtorByDebtor
    then do:
        assign vcMessage      = (#T-15'The specified customer is not defined in the system.':255(49406)t-15#)
               oiReturnStatus = -1.
        <M-5 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-6001':U (icFcMsgNumber),
                     input  '' (icFcExplanation),
                     input  '' (icFcIdentification),
                     input  '' (icFcContext),
                     output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end. /* if not available tqDebtorByDebtor */

    if tDInvoice.DInvoiceType = {&INVOICETYPE-PREPAYMENT}
    then do:
        if tDInvoice.tcNormalPaymentConditionCode = "":U or
           tDInvoice.tcNormalPaymentConditionCode = ?
        then assign tDInvoice.tcNormalPaymentConditionCode = tqDebtorByDebtor.tcNormalPaymentConditionCode.
    end. /* if tDInvoice.DInvoiceType = {&INVOICETYPE-PREPAYMENT} */

    /* default reason of debtor if not yet filled */
    if tDInvoice.tcReasonCode = "":U
    then assign tDInvoice.Reason_ID    = if tqDebtorByDebtor.tiReason_ID = ? then 0 else tqDebtorByDebtor.tiReason_ID
                tDInvoice.tcReasonCode = if tqDebtorByDebtor.tcReasonCode = ? then "":U else tqDebtorByDebtor.tcReasonCode.

    /* default own vat number, transaction end country */
    <Q-6 run CompanyPropertyByBusinessRel (first) (Read) (NoCache)
       (input tDIOpenBalance.tiCompanyId, (CompanyId)
        input ?, (AddressType)
        output dataset tqCompanyPropertyByBusinessRel) in BCompanyProperty >
    find first tqCompanyPropertyByBusinessRel no-error.
    if available tqCompanyPropertyByBusinessRel
    then assign tDInvoice.DInvoiceOwnVatNumber           = tqCompanyPropertyByBusinessRel.tcAddressTaxIDState
                tDInvoice.tcOwnVatNumberCountryCode      = tqCompanyPropertyByBusinessRel.tcAddressCountryCode.
    /* PTW */
    <M-9 run GetDebtorVatNumber
       (input  tqDebtorByDebtor.tcDebtorCode (icDebtorCode), 
        input  tqDebtorByDebtor.tcBillToDebtorCode (icBillToDebtorCode), 
        input  tqDebtorByDebtor.tcDebtorTaxIDState (icDebtorTaxIDState), 
        input  tqDebtorByDebtor.tcCountryCode (icDebtorCountryCode), 
        input  tqDebtorByDebtor.tlCountryIsEUCountry (ilDebtorCountryIsEUCountry), 
        output tDInvoice.DInvoiceDebtorVatNumber (ocDebtorVatNumber), 
        output tDInvoice.tcDebVatNumberCountryCode (ocDebtorVatCountryCode), 
        output vlTransactionEndIsEUCountry (olDebtorVatCountryIsEUCountry), 
        output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
    if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)
    then assign oiReturnStatus = viFcReturnSuper.
    
    /* VAT currency rate - VAT currency itself is defaulted in IntialData */
    <M-10 run GetVatExchangeRate (input  tDInvoice.tcVatCurrencyCode (icOwnVatCurrencyCode), 
                              input  tDInvoice.VatCurrency_ID (iiOwnVatCurrencyId), 
                              input  tDInvoice.tcCurrencyCode (icDInvoiceCurrencyCode), 
                              input  tDInvoice.DInvoiceCurrency_ID (iiDInvoiceCurrencyId), 
                              input  tDInvoice.DInvoiceExchangeRate (idDInvoiceExchangeRate), 
                              input  tDInvoice.DInvoiceRateScale (idDInvoiceRateScale), 
                              input  tDInvoice.DInvoiceTaxPointDate (itTaxPointDate), 
                              output tDInvoice.DInvoiceVatExchangeRate (odVatExchangeRate), 
                              output tDInvoice.DInvoiceVatRateScale (odVatRateScale), 
                              output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
    if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)
    then assign oiReturnStatus = viFcReturnSuper.
    
    /* Create bank record */
    if (tDIOpenBalance.tiBankNumber_ID <> ? and tDIOpenBalance.tiBankNumber_ID <> 0) or
       (tDIOpenBalance.tcBankNumber <> ? and tDIOpenBalance.tcBankNumber <> "":U)
    then do:
        <M-11 run AddDetailLine (input  'DInvoiceBank':U (icTable), 
                         input  tDInvoice.tc_Rowid (icParentRowid), 
                         output viFcReturnSuper (oiReturnStatus)) in BDInvoice>        
        if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)
        then assign oiReturnStatus = viFcReturnSuper.
    
        assign tDInvoiceBank.DInvoice_ID           = tDInvoice.DInvoice_ID
               tDInvoiceBank.BankNumber_ID         = tDIOpenBalance.tiBankNumber_ID
               tDInvoiceBank.tcBankNumber          = tDIOpenBalance.tcBankNumber
               tDInvoiceBank.DInvoiceBankToPayTC   = tDIOpenBalance.tdInvoiceAmountTC
               tDInvoiceBank.tcBankNumberExtension = tDIOpenBalance.tcBankNumberExtension
               tDInvoiceBank.tiParentObject_ID     = tDInvoice.Debtor_ID.
    end. /* if (tDIOpenBalance.tiBankNumber_ID <> ? and */
    else
    if tDIOpenBalance.tcDebtorCode <> '' and tDIOpenBalance.tcDebtorCode <> ?
    then do:

        /* Get the Default BankNumber(s) of the Customer */
        <Q-95 run BankNumberByDebtor (all) (Read) (NoCache)
           (input viCompanyId, (CompanyId)
            input tDIOpenBalance.tcDebtorCode, (DebtorCode)
            input ?, (Debtor_ID)
            input TRUE, (BankNumberIsDefault)
            output dataset tqBankNumberByDebtor) in BBankNumberQuery>

        for first tqBankNumberByDebtor where
                  tqBankNumberByDebtor.tcDebtorCode = tDIOpenBalance.tcDebtorCode and
                  tqBankNumberByDebtor.tlBankNumberIsDefault :

            <M-13 run AddDetailLine
               (input  'DInvoiceBank':U (icTable), 
                input  tDInvoice.tc_Rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BDInvoice>

            if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)
            then assign oiReturnStatus = viFcReturnSuper.
    
            assign tDInvoiceBank.DInvoice_ID           = tDInvoice.DInvoice_ID
                   tDInvoiceBank.BankNumber_ID         = tqBankNumberByDebtor.tiBankNumber_ID
                   tDInvoiceBank.tcBankNumber          = tqBankNumberByDebtor.tcBankNumber
                   tDInvoiceBank.DInvoiceBankToPayTC   = tDIOpenBalance.tdInvoiceAmountTC
                   tDInvoiceBank.tcBankNumberExtension = tqBankNumberByDebtor.tcBankNumberExtension
                   tDInvoiceBank.tiBankPayFormat_ID    = tqBankNumberByDebtor.tiBankPayFormat_ID
                   tDInvoiceBank.tiParentObject_ID     = tqBankNumberByDebtor.tiParentObject_ID.
        end. /* for first tqBankNumberByDebtor */
    end.     /* tDIOpenBalance.tcDebtorCode <> '' */

    /* di posting */
    /* i don't use it but i have to give it as input parameter so i make it empty first */
    empty temp-table tDInvoiceVat.
    empty temp-table tDIAccount.
    assign viPostingId          = 0
           viRepeatingPostingID = iiPostingId. /* to make sure that in case iiPostingId = 0, it stays 0 after the first run */
    /* you don't work with taxes here, so you can left those parameters on unknown value */
    <M-14 run CreateDIPosting
       (input  tDInvoice.DInvoice_ID (iiDInvoiceId), 
        input  ? (iiPeriodId), 
        input  tDIOpenBalance.tiPeriodYear (iiPeriodYear), 
        input  tDIOpenBalance.tiPeriodPeriod (iiPeriodPeriod), 
        input  tDIOpenBalance.ttPostingDate (itPostingDate), 
        input  ? (iiDebtorId), 
        input  tDIOpenBalance.tcDebtorCode (icDebtorCode), 
        input  tDIOpenBalance.tcInvoiceType (icDInvoiceType), 
        input  ? (iiDivisionId), 
        input  tDIOpenBalance.tcTransferAccountDivisionCode (icDivisionCode), 
        input  ? (iiJournalId), 
        input  tDIOpenBalance.tcJournalCode (icJournalCode), 
        input  tDIOpenBalance.tiInvoiceVoucher (iiVoucher), 
        input  tDIOpenBalance.ttInvoiceTaxPointDate (itTaxPointDate), 
        input  tDIOpenBalance.tcInvoiceDescription (icDescription), 
        input  tDIOpenBalance.tdInvoiceAmountTC (idInvoiceAmountTC), 
        input  tDIOpenBalance.tdInvoiceAmountLC (idInvoiceAmountLC), 
        input  tDIOpenBalance.tdInvoiceAmountCC (idInvoiceAmountCC), 
        input  ? (iiCurrencyId), 
        input  tDIOpenBalance.tcTCCurrencyCode (icCurrencyCode), 
        input  tDIOpenBalance.tdExchangeRateTCLC (idExchangeRate), 
        input  if tDIOpenBalance.tdExchangeRateScale = 0 then 1 else tDIOpenBalance.tdExchangeRateScale (idExchangeRateScale), 
        input  tDIOpenBalance.tcPostingText (icDIText), 
        input  tDIOpenBalance.ttInvoiceDate (itInvoiceDate), 
        input  tDIOpenBalance.tcPostingType (icPostingType), 
        input-output viRepeatingPostingID (biPostingId), 
        input-output iiBJournalEntryId (biBJournalEntryId), 
        input  tDIAccount (tDIAccount), 
        input-output tDInvoiceVat (tApiDInvoiceVat), 
        input  tDIOpenBalance.tcTransferAccountGLCode (icGLCode), 
        input  tDIOpenBalance.tcTransferAccountCostCentreCode (icCostCentreCode), 
        input  tDIOpenBalance.tcTransferAccountProjectCode (icProjectCode), 
        input  tDIOpenBalance.tlOnlyControlAccount (ilOnlyControlAccount), 
        input  ? (icShipFromCountryCode), 
        input  ? (icShipToCountryCode), 
        input  ? (ilShipFromCountryIsEUCountry), 
        input  ? (ilShipToCountryIsEUCountry), 
        input  ? (icTxclTaxCls), 
        input  ? (icTxuTaxUsage), 
        input  ? (icShipToTxzTaxZone), 
        input  ? (icTxenvTaxEnv), 
        input  ? (icPaymentCondition), 
        input  ? (ilIsTaxInCityFromShipTo), 
        input  ? (ilIsTaxable), 
        input  ? (icControlCostCentreCode), 
        input  ? (icControlProjectCode), 
        input  0 (iiShipFromAddressId), 
        input  0 (iiShipToAddressId), 
        input  '':U (icSoldToDebtorCode), 
        input  ? (ilDInvoiceIsTaxExcluded), 
        input  tqDebtorByDebtor.tcBusinessRelationCode (icBusinessRelationCode), 
        input  tqDebtorByDebtor.tcBusinessRelationICCode (icBusinessRelationICCode), 
        input  tqDebtorByDebtor.tiInvControlGLProfile_ID (iiInvControlGLProfileId), 
        input  tqDebtorByDebtor.tiCnControlGLProfile_ID (iiCnControlGLProfileId), 
        input  tqDebtorByDebtor.tiPrePayControlGLProfile_ID (iiPrepayControlGLProfileId), 
        input  tqDebtorByDebtor.tiSalesAccountGLProfile_ID (iiSalesAccGLProfileId), 
        input  tqDebtorByDebtor.tiFinChgGLProfile_ID (iiFinChgGLProfileId), 
        input  tDIOpenBalance.tcDivisionCode (icControlDivisionCode), 
        input  0 (iiDeductionControlGLProfileId), 
        input  ? (idExchangeRateCC), 
        input  ? (idExchangeRateScaleCC), 
        output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
    if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)
    then assign oiReturnStatus = viFcReturnSuper.

end. /* for each tDIOpenBalance */

if vlJournalQueryStarted = TRUE
then do:
    <Q-38 run JournalBeginsForJEDefault  (Stop) in BJournal >
    assign vlJournalQueryStarted = FALSE.
end. /* if vlJournalQueryStarted = TRUE. */