project QadFinancials > class BCInvoice > method ReplaceCInvoicePosting


Parameters


icOrigCInvoiceRowIdinputcharacter
icNewCInvoiceRowIdinputcharacter
iiReplaceInvYearinputinteger
iiReplaceInvPeriodinputinteger
icReplaceInvJournalinputcharacter
iiReplaceInvVoucherinputinteger
itReplaceInvPostingDateinputdate
icReplaceInvDescriptioninputcharacter
icNewControlGLCodeinputcharacter
icDivisionCodeinputcharacter
icCostCentreCodeinputcharacter
icProjectCodeinputcharacter
oiCiPostingIdoutputinteger
oiMfPostingIdoutputinteger
oiBJournalEntryIdoutputinteger
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BCInvoice.ReplaceCInvoice


program code (program3/bcinvoice.p)

/* ========================================================================================================== */
/* Replace posting created for original invoice beeing reversed and attach this new posting to new invoice    */
/* ========================================================================================================== */
/* Parameters:   (I)  OrigCInvoiceRowId     RowId of original invoice which was reversed                      */
/*               (I)  NewCInvoiceRowId      RowId of new invoice which reverse original one                   */
/*               (I)  ReplaceInvYear        Replace invoice year                                              */
/*               (I)  ReplaceInvPeriod      Replace invoice period                                            */
/*               (I)  ReplaceInvJorunal     Replace invoice journal                                           */
/*               (I)  ReplaceInvVoucher     Replace invoice voucher                                           */
/*               (I)  ReplaceInvPostingDate Replace invoice posting date                                      */
/*               (I)  ReplaceInvDescription Replace invoice description                                       */
/* ========================================================================================================== */
         
assign oiReturnStatus = -98.
                            
/* Get new invoice */
find tCInvoice where
     tCInvoice.tc_Rowid = icNewCInvoiceRowId no-error.
if not available tCInvoice
then do:
    assign vcMessage = #T-43'The system cannot find the date for the new (reverse) invoice.':255(69128)T-43#.
           vcContext = "NewCInvoiceRowId=":U + icNewCInvoiceRowId.
    <M-39 run SetMessage
       (input  vcMessage (icMessage), 
        input  '':U (icArguments), 
        input  '':U (icFieldName), 
        input  '':U (icFieldValue), 
        input  'S':U (icType), 
        input  3 (iiSeverity), 
        input  '':U (icRowid), 
        input  'qadfin-798009':U (icFcMsgNumber), 
        input  '':U (icFcExplanation), 
        input  '':U (icFcIdentification), 
        input  vcContext (icFcContext), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    assign oiReturnStatus = -1.
    return.
end.


/* Create list of postings created for original (reversed) invoice */
assign vcPostingIdList = '':U.
for each bOrigCInvoicePosting where
         bOrigCInvoicePosting.tc_ParentRowid = icOrigCInvoiceRowId:
    
   assign vcPostingIdList = if vcPostingIdList = "":U 
                            then string(bOrigCInvoicePosting.Posting_ID)
                            else vcPostingIdList + chr(4) + string(bOrigCInvoicePosting.Posting_ID).
end. /* for each tPendingVoucherUpdate */
    
/* Start comminication with journal entry component */
if viBJournalEntryCIID <> 0 and
   viBJournalEntryCIID <> ?
then do:
    <I-75 {bFcOpenInstance
         &CLASS           = "BJournalEntry"}>         
end.
else do:
    <I-35 {bFcStartAndOpenInstance
         &ADD-TO-TRANSACTION   = "true"
         &CLASS                = "BJournalEntry"}>
    assign vlBJEIsStartedFromCI = true.
end.

assign viLocalReturn = 0.

POSTING_BLOCK:
do:
    /* Load created posting for original invoice to instance of BJournal component */    
    if vcPostingIdList <> '':U
    then do:
        /* keep previous can be set on false because we only work with one invoice */
        <M-44 run DataLoad
           (input  ? (icRowids), 
            input  vcPostingIdList (icPkeys), 
            input  ? (icObjectIds), 
            input  ? (icFreeform), 
            input  false (ilKeepPrevious), 
            output viFcReturnSuper (oiReturnStatus)) in BJournalEntry>
        if viFcReturnSuper <> 0 then assign viLocalReturn = viFcReturnSuper.
        if viFcReturnSuper <  0
        then do:
            assign vcMessage = #T-31'The system cannot reverse the original posting created for the reversed supplier invoice.':255(69126)T-31#
                   vcContext = "vcPostingIdList=":U + vcPostingIdList.
            <M-92 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'S':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'qadfin-329827':U (icFcMsgNumber), 
                input  '':U (icFcExplanation), 
                input  '':U (icFcIdentification), 
                input  vcContext (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
            leave POSTING_BLOCK.
        end.
    end. /* if vcPostingIdList <> '':U */
    
    if iiReplaceInvYear = ? and iiReplaceInvPeriod = ?
    then do:
        /* get the default period and year based on today */
        assign vhFcComponent = ?.
        <M-69 run GetDefaultPeriodDate
           (input  ? (iiYearIn), 
            input  ? (iiPeriodIn), 
            input  ? (itDateIn), 
            input  true (ilOpenForPurchase), 
            input  ? (ilOpenForSales), 
            input  ? (ilOpenForInventory), 
            output iiReplaceInvYear (oiYear), 
            output iiReplaceInvPeriod (oiPeriod), 
            output vtDummy (otPostingDate), 
            output viFcReturnSuper (oiReturnStatus)) in BPeriod>
            
        if viFcReturnSuper < 0 or viFcReturnSuper > 0 and viLocalReturn = 0 then assign viLocalReturn = viFcReturnSuper.
        if viLocalReturn   < 0 then leave POSTING_BLOCK.
    end. /* end iiPeriodYear = ? ... */
    
    /* Performe replace of original posting */
    for each bOrigCInvoicePosting where
             bOrigCInvoicePosting.tc_ParentRowID = icOrigCInvoiceRowId:
         
         <M-55 run GetPostingRowidBasedOnPostingID
           (input  bOrigCInvoicePosting.Posting_ID (iiPostingID), 
            output vcPostingRowId (ocPostingRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BJournalEntry>
        if viFcReturnSuper <> 0 then assign viLocalReturn = viFcReturnSuper.
        if viFcReturnSuper <  0 then leave POSTING_BLOCK.

        if bOrigCInvoicePosting.CInvoicePostingType = {&INVOICEPOSTINGTYPE-INITIAL}
        then do:
            <M-9 run GetPostingHeaderByPostingId
               (input  bOrigCInvoicePosting.Posting_ID (iiPostingId), 
                input  ? (icPostingRowID), 
                output viDummy (oiPostingYear), 
                output viDummy (oiPostingPeriod), 
                output vtDummy (otPostingDate), 
                output vcOrigJournalCode (ocPostingJournalCode), 
                output viFcReturnSuper (oiReturnStatus)) in BJournalEntry>
            if viFcReturnSuper <> 0 then assign viLocalReturn = viFcReturnSuper.
            if viFcReturnSuper <  0 then leave POSTING_BLOCK.
            
            <M-82 run CreateReplaceEntry
               (input  vcPostingRowId (icPostingTcRowid), 
                input  iiReplaceInvYear (iiNewPeriodYear), 
                input  iiReplaceInvPeriod (iiNewPeriodPeriod), 
                input  vcOrigJournalCode (icNewJournalCode), 
                input  iiReplaceInvVoucher (iiNewVoucher), 
                input  vtDummy (itNewPostingDate), 
                input  icReplaceInvDescription (icNewPostingText), 
                output viNewPostingId (oiNewPostingID), 
                input  ? (iiOriginVoucher), 
                input  false (ilIsValidateJournalType), 
                input  vcOrigJournalCode (icReportingJournalCode), 
                input  viBQCrossCyPostingID (iiBQCrossCyPostingID), 
                input  false (ilCallFromDaemon), 
                output viNewPostingLineID (oiNewPostingLineID), 
                output viFcReturnSuper (oiReturnStatus)) in BJournalEntry>
            
            assign oiCiPostingId = viNewPostingId.
                
            if viFcReturnSuper <> 0 then assign viLocalReturn = viFcReturnSuper.
            if viFcReturnSuper <  0 then leave POSTING_BLOCK.    
    
            /* Create CInvoiceMovement for new (replace) invoice */
            find bOrigCInvoiceMovement where
                 bOrigCInvoiceMovement.tc_ParentRowid = icOrigCInvoiceRowId and
                 bOrigCInvoiceMovement.CInvoiceMovementType = {&MOVEMENTTYPE-INITIAL} no-error.
            if not available bOrigCInvoiceMovement
            then do:
                assign vcMessage = #T-79'The system cannot reverse the original posting created for the reversed supplier invoice. The system cannot find original INIT movement.':255(69127)T-79#.
                       vcContext = "CInvoice_ID=":U + string(bOrigCInvoicePosting.CInvoice_ID).
                <M-16 run SetMessage
                   (input  vcMessage (icMessage), 
                    input  '':U (icArguments), 
                    input  '':U (icFieldName), 
                    input  '':U (icFieldValue), 
                    input  'S':U (icType), 
                    input  3 (iiSeverity), 
                    input  '':U (icRowid), 
                    input  'qadfin-540167':U (icFcMsgNumber), 
                    input  '':U (icFcExplanation), 
                    input  '':U (icFcIdentification), 
                    input  vcContext (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
                assign viLocalReturn = -1.
                leave POSTING_BLOCK.
            end.
    
            <M-98 run AddDetailLine
               (input  'CInvoiceMovement':U (icTable), 
                input  tCInvoice.tc_Rowid (icParentRowid), 
                output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
            if viFcReturnSuper <> 0 then assign viLocalReturn = viFcReturnSuper.
            if viFcReturnSuper <  0 then leave POSTING_BLOCK.
    
            buffer-copy bOrigCInvoiceMovement
                except CInvoice_ID
                       CInvoiceMovement_ID
                       tc_ParentRowid
                       tc_Rowid
                       tc_Status
                to tCInvoiceMovement.

            <M-76 run GetPostingLineByGL
               (input  ? (icPostingRowId), 
                input  viNewPostingId (iiPostingID), 
                input  tCInvoice.tcControlGLCode (icGLCode), 
                output vcDummy (ocPostingLineRowId), 
                output tCInvoiceMovement.PostingLine_ID (oiPostingLineID), 
                output viFcReturnSuper (oiReturnStatus)) in BJournalEntry>
            if viFcReturnSuper <> 0 then assign viLocalReturn = viFcReturnSuper.
            if viFcReturnSuper <  0 then leave POSTING_BLOCK.
            
            <M-42 run GetPostingInfoByPostingLineID
               (input  tCInvoiceMovement.PostingLine_ID (iiPostingLineID), 
                output tCInvoiceMovement.CInvoiceMovementPostDate (otPostingDate), 
                output tCInvoiceMovement.Period_ID (oiPeriodID), 
                output tCInvoiceMovement.CInvoiceMovementYearPeriod (oiPostingYearPeriod), 
                output vcDummy (ocJournalCode), 
                output vcDummy (ocJournalTypeCode), 
                output vcDummy (ocLayerTypeCode), 
                output viFcReturnSuper (oiReturnStatus)) in BJournalEntry>
            if viFcReturnSuper <> 0 then assign viLocalReturn = viFcReturnSuper.
            if viFcReturnSuper <  0 then leave POSTING_BLOCK.

            /* Change control G/L account */
            if icNewControlGLCode <> ? and
               icNewControlGLCode <> "":U
            then do:
                 <Q-65 run BusinessRelationByIDCodeIC (all) (Read) (NoCache)
                    (input ?, (BusinessRelationID)
                     input tCInvoice.tcBusinessRelationCode, (BusinessRelationCode)
                     input ?, (BusinessRelationIntercoCode)
                     input true, (BusinessRelationIsActive)
                     output dataset tqBusinessRelationByIDCodeIC) in BBusinessRelation>
    
                find first tqBusinessRelationByIDCodeIC where 
                           tqBusinessRelationByIDCodeIC.tcBusinessRelationCode = tCInvoice.tcBusinessRelationCode
                no-lock no-error.
                if available tqBusinessRelationByIDCodeIC then
                assign vcBusinessRelationICCode = tqBusinessRelationByIDCodeIC.tcBusinessRelationICCode.

                 <M-4 run UpdatePostingLine
                    (input  ? (icPostingLineRowId), 
                     input  tCInvoiceMovement.PostingLine_ID (iiPostingLineId), 
                     input  icNewControlGLCode (icNewGLCode), 
                     input  ? (iiNewGLId), 
                     input  true (ilIsUpdateGLAccount), 
                     input  icDivisionCode (icNewDivisionCode), 
                     input  true (ilIsUpdateDivision), 
                     input  icCostCentreCode (icNewCostCentreCode), 
                     input  true (ilIsUpdateCostCentre), 
                     input  icProjectCode (icNewProjectCode), 
                     input  true (ilIsUpdateProject), 
                     input  ? (idDebitTC), 
                     input  ? (idDebitCC), 
                     input  ? (idDebitLC), 
                     input  ? (idCreditTC), 
                     input  ? (idCreditCC), 
                     input  ? (idCreditLC), 
                     input  false (ilIsUpdateAmount), 
                     input  vcBusinessRelationICCode (icBusinessRelationIntercoCode), 
                     output viFcReturnSuper (oiReturnStatus)) in BJournalEntry>
                if viFcReturnSuper <> 0 then assign viLocalReturn = viFcReturnSuper.
                if viFcReturnSuper <  0 then leave POSTING_BLOCK.

                assign tCInvoice.tcControlGLCode = icNewControlGLCode
                       tCInvoice.ControlGL_ID    = ?.
            end.
        end. /* if bOrigCInvoicePosting.CInvoicePostingType = {&INVOICEPOSTINGTYPE-INITIAL} */
        else do:
            <M-68 run GetPostingHeaderByPostingId
               (input  bOrigCInvoicePosting.Posting_ID (iiPostingId), 
                input  ? (icPostingRowID), 
                output viDummy (oiPostingYear), 
                output viDummy (oiPostingPeriod), 
                output vtDummy (otPostingDate), 
                output vcOrigJournalCode (ocPostingJournalCode), 
                output viFcReturnSuper (oiReturnStatus)) in BJournalEntry>
            if viFcReturnSuper <> 0 then assign viLocalReturn = viFcReturnSuper.
            if viFcReturnSuper <  0 then leave POSTING_BLOCK.
            
            <M-59 run CreateReplaceEntry
               (input  vcPostingRowId (icPostingTcRowid), 
                input  iiReplaceInvYear (iiNewPeriodYear), 
                input  iiReplaceInvPeriod (iiNewPeriodPeriod), 
                input  vcOrigJournalCode (icNewJournalCode), 
                input  0 (iiNewVoucher), 
                input  vtDummy (itNewPostingDate), 
                input  icReplaceInvDescription (icNewPostingText), 
                output viNewPostingId (oiNewPostingID), 
                input  ? (iiOriginVoucher), 
                input  false (ilIsValidateJournalType), 
                input  vcOrigJournalCode (icReportingJournalCode), 
                input  viBQCrossCyPostingID (iiBQCrossCyPostingID), 
                input  false (ilCallFromDaemon), 
                output viNewPostingLineID (oiNewPostingLineID), 
                output viFcReturnSuper (oiReturnStatus)) in BJournalEntry>
                
            assign oiMfPostingId = viNewPostingId.    
            
            assign tCInvoice.CInvoiceBalanceCreditTC = tCInvoice.CInvoiceOriginalCreditTC
                   tCInvoice.CInvoiceBalanceDebitTC  = tCInvoice.CInvoiceOriginalDebitTC
                   tCInvoice.CInvoiceBalanceCreditLC = tCInvoice.CInvoiceOriginalCreditLC
                   tCInvoice.CInvoiceBalanceDebitLC  = tCInvoice.CInvoiceOriginalDebitLC
                   tCInvoice.CInvoiceBalanceCreditCC = tCInvoice.CInvoiceOriginalCreditCC
                   tCInvoice.CInvoiceBalanceDebitCC  = tCInvoice.CInvoiceOriginaldebitCC
                   tCInvoice.CInvoiceBalanceTC       = tCInvoice.CInvoiceBalanceDebitTC - tCInvoice.CInvoiceBalanceCreditTC
                   tCInvoice.CInvoiceBalanceLC       = tCInvoice.CInvoiceBalanceDebitLC - tCInvoice.CInvoiceBalanceCreditLC
                   tCInvoice.CInvoiceBalanceCC       = tCInvoice.CInvoiceBalanceDebitCC - tCInvoice.CInvoiceBalanceCreditCC
                   tCInvoice.CInvoiceIsOpen          = tCInvoice.CInvoiceBalanceTC <> 0 or
                                                       tCInvoice.CInvoiceBalanceLC <> 0 or
                                                       tCInvoice.CInvoiceBalanceCC <> 0
                   tCInvoice.tc_Status               = if tCInvoice.tc_Status = "":U
                                                       then "C":U
                                                       else tCInvoice.tc_Status.
                    
            if viFcReturnSuper <> 0 then assign viLocalReturn = viFcReturnSuper.
            if viFcReturnSuper <  0 then leave POSTING_BLOCK.
        end. /* else bOrigCInvoicePosting.CInvoicePostingType = {&INVOICEPOSTINGTYPE-INITIAL} */
    
        /* Create CInvoicePosting record for new (replaced) posting */
        <M-21 run AddDetailLine
           (input  'CInvoicePosting':U (icTable), 
            input  tCInvoice.tc_Rowid (icParentRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
        if viFcReturnSuper <> 0 then assign viLocalReturn = viFcReturnSuper.
        if viFcReturnSuper <  0 then leave POSTING_BLOCK.
    
        buffer-copy bOrigCInvoicePosting
            except CInvoice_ID
                   CInvoicePosting_ID
                   tc_ParentRowid
                   tc_Rowid
                   tc_Status
            to tCInvoicePosting.
    
        assign tCInvoicePosting.Posting_ID = viNewPostingId.

        <M-14 run GetCIRECPostingLineID
           (input  tCInvoicePosting.Posting_ID (iiPostingId), 
            output tCInvoicePosting.CIRECPostingLine_ID (oiCIRECPostingLineId), 
            output viFcReturnSuper (oiReturnStatus)) in BJournalEntry>
        if viFcReturnSuper <> 0 then assign viLocalReturn = viFcReturnSuper.
        if viFcReturnSuper <  0 then leave POSTING_BLOCK.
        
        for each tcinvoicevat where tCInvoiceVat.CInvoice_ID = tCInvoicePosting.CInvoice_ID and
                                    tCInvoiceVat.tc_Status   <> "D":U :
            assign  vipostingvatid = 0.
            <M-17 run UpdateCinvoiceVatPostingVatID
               (input  tCInvoicePosting.Posting_ID (iiReversePostingid), 
                input  tCInvoiceVat.TxclTaxCls (icTaxClass), 
                input  tCInvoiceVat.TxtyTaxType (icTaxType), 
                input  tCInvoiceVat.TxuTaxUsage (ictaxUsage), 
                input  tCInvoiceVat.TxenvTaxEnv (icTaxEnv), 
                output vipostingvatid (oiPostingVatid), 
                input  tCInvoiceVat.Vat_ID (iiVatid), 
                input  tCInvoiceVat.tcVatCode (icvatcode), 
                output viFcReturnSuper (oiReturnStatus)) in BJournalEntry>
                
            if viFcReturnSuper <  0 then viLocalReturn = viFcReturnSuper.
            if vipostingvatid <> 0 and vipostingvatid <> ?
            then
                tCInvoiceVat.PostingVat_ID = vipostingvatid.
        end.

    end. /* for each bOrigCInvoicePosting where */
end. /* POSTING_BLOCK */

/* Close communication with journal entry component */
<I-8 {bFcCloseInstance
     &CLASS           = "BJournalEntry"}>
assign oiBJournalEntryId = viBJournalEntryCIID.     
     
/* Return */
if viLocalReturn <> 0 then assign oiReturnStatus = viLocalReturn.
if oiReturnStatus = -98 then assign oiReturnStatus = 0.