project QadFinancials > class BCInvoice > method ReverseCInvoice

Description

Reverse of supplier invoice


Parameters


iiReversedCInvoiceIdinputinteger
icReverseInvoiceTypeinputcharacter
iiReversePostingYearinputinteger
iiReversePostingPeriodinputinteger
itReversePostingDateinputdate
icReverseInvoiceJournalinputcharacter
iiReverseInvoiceVoucherinputinteger
icAdjustmentJournalinputcharacter
iiAdjustmentVoucherinputinteger
icReverseDescriptioninputcharacter
oiReverseCInvoiceIdoutputinteger
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFitnesse
method BCInvoice.APICInvoiceReverse


program code (program3/bcinvoice.p)

/* =================================================================================================== */
/* Method      : ReverseCInvoice                                                                       */
/* Desc        : This method does reversing of Supplier invoice                                        */
/* --------------------------------------------------------------------------------------------------- */
/* Params:  (I) ReversedCInvoiceId    ID of supplier invoice to be reversed                            */
/*          (I) ReverseInvoiceType    Invoice type used for reversing of original invoice              */
/*          (I) ReversePostingYear    Posting year of reverse invoice                                  */
/*          (I) ReversePostingPeriod  Posting period of reverse invoice                                */
/*          (I) ReversePostingDate    Posting date of reverse invoice                                  */
/*          (I) ReverseInvoiceJournal Posting journal of journal of reverse invoice                    */
/*          (I) ReverseInvoiceVoucher Posting voucher of reverse invoice                               */
/*          (I) AdjustmentJournal     Posting journal used for adjustment posting of both invoices     */
/*          (I) AdjustmentVoucher     Posting voucher used for adjustment posting of both invoices     */
/*          (I) ReverseDescription    Description of reverse invoice                                   */
/*          (O) ReverseCInvoiceId     ID of reverse supplier invoice                                   */
/* =================================================================================================== */

assign oiReturnStatus = -98.

/* Clear previous reverse attempt first */
<M-90 run ClearAllData  (output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
if viFcReturnSuper <> 0
then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.

/* =================================================================================================== */
/* Default output values                                                                               */
/* =================================================================================================== */
assign oiReverseCInvoiceId = ?.

/* =================================================================================================== */
/* Load original Supplier invoice to be reversed                                                       */
/* =================================================================================================== */
if iiReversedCInvoiceId <> ?
then do:
    find tCInvoice where
         tCInvoice.CInvoice_ID = iiReversedCInvoiceId
         no-error.
    if not available tCInvoice
    then do:
        <M-1 run DataLoad
           (input  ? (icRowids), 
            input  ? (icPkeys), 
            input  string(iireversedCInvoiceId) (icObjectIds), 
            input  ? (icFreeform), 
            input  true (ilKeepPrevious), 
            output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
        
        find tCInvoice where
             tCInvoice.CInvoice_ID = iiReversedCInvoiceId
             no-error.
        if not available tCInvoice
        then assign viFcReturnSuper = -1.
        
        if viFcReturnSuper <> 0
        then do:
            assign oiReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then do:
                assign vcMessage = substitute(#T-2'The system cannot reverse the selected invoice. The system cannot load data for the supplier invoice (&1) to reverse.':255(69109)T-2#,iiReversedCInvoiceId).
                <M-3 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-7889':U (icFcMsgNumber), 
                    input  '':U (icFcExplanation), 
                    input  '':U (icFcIdentification), 
                    input  '':U (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
                return.
            end. /* if viFcReturnSuper < 0 */
        end. /* if viFcReturnSuper <> 0 */
    end. /* if not available tCInvoice */
end. /* if iiReversedCInvoiceId <> ? */

/* =================================================================================================== */
/* Validate input parameters                                                                           */
/* =================================================================================================== */
<M-4 run ReverseCInvoiceValidate
   (input-output iiReversedCInvoiceId (biReversedCInvoiceId), 
    input-output icReverseInvoiceType (bcReverseInvoiceType), 
    input-output iiReversePostingYear (biReversePostingYear), 
    input-output iiReversePostingPeriod (biReversePostingPeriod), 
    input-output itReversePostingDate (btReversePostingDate), 
    input-output icReverseInvoiceJournal (bcReverseInvoiceJournal), 
    input-output iiReverseInvoiceVoucher (biReverseInvoiceVoucher), 
    input-output icAdjustmentJournal (bcAdjustmentJournal), 
    input-output iiAdjustmentVoucher (biAdjustmentVoucher), 
    input-output icReverseDescription (bcReverseDescription), 
    output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper <  0 then return.

/* =================================================================================================== */
/* Create new invoice which will be reversal of original one                                           */
/* =================================================================================================== */
<M-5 run CopyIntoNew
   (input  iiReversedCInvoiceId (iiOriginalCInvoiceId), 
    input  false (ilClearData), 
    input  icReverseInvoiceJournal (icNewJournal), 
    input  itReversePostingDate (itNewPostingDate), 
    input  iiReversePostingYear (iiNewYear), 
    input  iiReversePostingPeriod (iiNewPeriod), 
    input  iiReverseInvoiceVoucher (iiNewVoucher), 
    input  false (ilRemoveOrigCInvFromInstance), 
    output vcNewInvRowId (ocNewInvRowId), 
    output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper <  0 then return.

find bOrigCInvoice where
     bOrigCInvoice.CInvoice_ID = iiReversedCInvoiceId
    no-error.
find tCInvoice where
     tCInvoice.tc_Rowid = vcNewInvRowId
    no-error.

if not available bOrigCInvoice or
   not available tCInvoice
then do:
     assign vcMessage = #T-7'Cannot process the reversing of the supplier invoice.':255(69124)T-7#
            vcContext = "iiReversedCInvoiceId=&1|available orig CInvoice=&2|vcNewInvRowId=&3|available new CInvoice=&4":U
            vcContext = substitute(vcContext, iiReversedCInvoiceId, available bOrigCInvoice, vcNewInvRowId, available tCInvoice)
            vcContext = replace(vcContext, "|":U, chr(2)).
     <M-6 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-7898':U (icFcMsgNumber), 
         input  '':U (icFcExplanation), 
         input  '':U (icFcIdentification), 
         input  vcContext (icFcContext), 
         output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    assign oiReturnStatus = -1. 
    return.
end.
assign oiReverseCInvoiceId = tCInvoice.CInvoice_ID.
/*Reset the value of original invoice to make sure that they were not overwritten during the Reverse */

<Q-10 run CInvoiceByCyIDYearJrnlVchr (all) (Read) (NoCache)
   (input ?, (CompanyId)
    input iiReversedCInvoiceId, (CInvoiceId)
    input ?, (PeriodYear)
    input ?, (JournalId)
    input ?, (JournalCode)
    input ?, (Voucher)
    output dataset tqCInvoiceByCyIDYearJrnlVchr) in BCInvoice >
find first tqCInvoiceByCyIDYearJrnlVchr no-error.
assign bOrigCInvoice.tcJournalCode         = tqCInvoiceByCyIDYearJrnlVchr.tcJournalCode
       bOrigCInvoice.CInvoicePostingYear   = tqCInvoiceByCyIDYearJrnlVchr.tiCInvoicePostingYear
       bOrigCInvoice.CInvoiceVoucher       = tqCInvoiceByCyIDYearJrnlVchr.tiCInvoiceVoucher.

/* Set Value of new invoice */
assign tCInvoice.CInvoiceType              = icReverseInvoiceType
       tCInvoice.LinkedCInvoice_ID         = bOrigCInvoice.CInvoice_ID
       tCInvoice.tcLinkedJournalCode       = bOrigCInvoice.tcJournalCode
       tCInvoice.tiLinkedPeriodYear        = bOrigCInvoice.CInvoicePostingYear
       tCInvoice.tiLinkedCInvoiceVoucher   = bOrigCInvoice.CInvoiceVoucher
       tCInvoice.tcCAJournalCode           = icAdjustmentJournal
       tCInvoice.tiCAVoucher               = iiAdjustmentVoucher
       tCInvoice.CInvoiceDescription       = icReverseDescription
       tCInvoice.CInvoiceHoldAmountTC      = 0.

assign tCInvoice.tlCInvoiceIsReverseBySign = false.
if (tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICECORRECTION} and
    bOrigCInvoice.CInvoiceType = {&INVOICETYPE-INVOICE}) or
    (tCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTECORRECTION} and
    bOrigCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTE}) or
    (tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICE} and
    bOrigCInvoice.CInvoiceType = {&INVOICETYPE-INVOICECORRECTION}) or
    (tCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTE} and
    bOrigCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTECORRECTION})
then assign tCInvoice.tlCInvoiceIsReverseBySign = true.

if  tCInvoice.tlCInvoiceIsReverseBySign = true
then assign tCInvoice.CInvoiceOriginalDebitTC    = - bOrigCInvoice.CInvoiceOriginalDebitTC
            tCInvoice.CInvoiceOriginalDebitLC    = - bOrigCInvoice.CInvoiceOriginalDebitLC
            tCInvoice.CInvoiceOriginalDebitCC    = - bOrigCInvoice.CInvoiceOriginalDebitCC
            tCInvoice.CInvoiceOriginalCreditTC   = - bOrigCInvoice.CInvoiceOriginalCreditTC
            tCInvoice.CInvoiceOriginalCreditLC   = - bOrigCInvoice.CInvoiceOriginalCreditLC
            tCInvoice.CInvoiceOriginalCreditCC   = - bOrigCInvoice.CInvoiceOriginalCreditCC

            tCInvoice.CInvoiceBalanceDebitTC     = - bOrigCInvoice.CInvoiceBalanceDebitTC
            tCInvoice.CInvoiceBalanceDebitLC     = - bOrigCInvoice.CInvoiceBalanceDebitLC
            tCInvoice.CInvoiceBalanceDebitCC     = - bOrigCInvoice.CInvoiceBalanceDebitCC
            tCInvoice.CInvoiceBalanceCreditTC    = - bOrigCInvoice.CInvoiceBalanceCreditTC
            tCInvoice.CInvoiceBalanceCreditLC    = - bOrigCInvoice.CInvoiceBalanceCreditLC
            tCInvoice.CInvoiceBalanceCreditCC    = - bOrigCInvoice.CInvoiceBalanceCreditCC
                
            tCInvoice.CInvoiceVatBaseDebitTC     = - bOrigCInvoice.CInvoiceVatBaseDebitTC
            tCInvoice.CInvoiceVatBaseDebitLC     = - bOrigCInvoice.CInvoiceVatBaseDebitLC
            tCInvoice.CInvoiceVatBaseDebitCC     = - bOrigCInvoice.CInvoiceVatBaseDebitCC
            tCInvoice.CInvoiceVatBaseCreditTC    = - bOrigCInvoice.CInvoiceVatBaseCreditTC
            tCInvoice.CInvoiceVatBaseCreditLC    = - bOrigCInvoice.CInvoiceVatBaseCreditLC
            tCInvoice.CInvoiceVatBaseCreditCC    = - bOrigCInvoice.CInvoiceVatBaseCreditCC
            
            tCInvoice.CInvoiceVatDebitTC         = - bOrigCInvoice.CInvoiceVatDebitTC
            tCInvoice.CInvoiceVatDebitLC         = - bOrigCInvoice.CInvoiceVatDebitLC
            tCInvoice.CInvoiceVatDebitCC         = - bOrigCInvoice.CInvoiceVatDebitCC
            tCInvoice.CInvoiceVatCreditTC        = - bOrigCInvoice.CInvoiceVatCreditTC
            tCInvoice.CInvoiceVatCreditLC        = - bOrigCInvoice.CInvoiceVatCreditLC
            tCInvoice.CInvoiceVatCreditCC        = - bOrigCInvoice.CInvoiceVatCreditCC
            
            tCInvoice.tdCInvoiceOriginalTC       = - tCInvoice.tdCInvoiceOriginalTC
            tCInvoice.tdCInvoiceOriginalLC       = - tCInvoice.tdCInvoiceOriginalLC
            tCInvoice.tdTotalAmountDebitTC       = - tCInvoice.tdTotalAmountDebitTC
            tCInvoice.tdTotalAmountCreditTC      = - tCInvoice.tdTotalAmountCreditTC
            tCInvoice.tdCInvoiceVatBaseTC        = - tCInvoice.tdCInvoiceVatBaseTC
            tCInvoice.tdCInvoiceVatBaseLC        = - tCInvoice.tdCInvoiceVatBaseLC
            tCInvoice.tdCInvoiceOriginalAmount   = - tCInvoice.tdCInvoiceOriginalAmount
            tCInvoice.tdCInvoiceOpenAmount       = - tCInvoice.tdCInvoiceOpenAmount
    
            tCInvoice.tdCInvoiceOriginalAmountLC = - tCInvoice.tdCInvoiceOriginalAmountLC
            tCInvoice.tdCInvoiceOpenAmountLC     = - tCInvoice.tdCInvoiceOpenAmountLC
            
            tCInvoice.CInvoiceWHTTotAmtDebitTC   = - bOrigCInvoice.CInvoiceWHTTotAmtDebitTC
            tCInvoice.CInvoiceWHTTotAmtDebitLC   = - bOrigCInvoice.CInvoiceWHTTotAmtDebitLC
            tCInvoice.CInvoiceWHTTotAmtDebitCC   = - bOrigCInvoice.CInvoiceWHTTotAmtDebitCC
            tCInvoice.CInvoiceWHTTotAmtCreditTC  = - bOrigCInvoice.CInvoiceWHTTotAmtCreditTC
            tCInvoice.CInvoiceWHTTotAmtCreditLC  = - bOrigCInvoice.CInvoiceWHTTotAmtCreditLC
            tCInvoice.CInvoiceWHTTotAmtCreditCC  = - bOrigCInvoice.CInvoiceWHTTotAmtCreditCC
            tCInvoice.CInvoiceWHTBaseAmtDebitTC  = - bOrigCInvoice.CInvoiceWHTBaseAmtDebitTC
            tCInvoice.CInvoiceWHTBaseAmtDebitLC  = - bOrigCInvoice.CInvoiceWHTBaseAmtDebitLC
            tCInvoice.CInvoiceWHTBaseAmtDebitCC  = - bOrigCInvoice.CInvoiceWHTBaseAmtDebitCC
            tCInvoice.CInvoiceWHTBaseAmtCreditTC = - bOrigCInvoice.CInvoiceWHTBaseAmtCreditTC
            tCInvoice.CInvoiceWHTBaseAmtCreditLC = - bOrigCInvoice.CInvoiceWHTBaseAmtCreditLC
            tCInvoice.CInvoiceWHTBaseAmtCreditCC = - bOrigCInvoice.CInvoiceWHTBaseAmtCreditCC.
            
else assign tCInvoice.CInvoiceOriginalDebitTC  = bOrigCInvoice.CInvoiceOriginalCreditTC
            tCInvoice.CInvoiceOriginalDebitLC  = bOrigCInvoice.CInvoiceOriginalCreditLC
            tCInvoice.CInvoiceOriginalDebitCC  = bOrigCInvoice.CInvoiceOriginalCreditCC
            tCInvoice.CInvoiceOriginalCreditTC = bOrigCInvoice.CInvoiceOriginalDebitTC
            tCInvoice.CInvoiceOriginalCreditLC = bOrigCInvoice.CInvoiceOriginalDebitLC
            tCInvoice.CInvoiceOriginalCreditCC = bOrigCInvoice.CInvoiceOriginalDebitCC
            
            tCInvoice.CInvoiceBalanceDebitTC   = bOrigCInvoice.CInvoiceBalanceCreditTC
            tCInvoice.CInvoiceBalanceDebitLC   = bOrigCInvoice.CInvoiceBalanceCreditLC
            tCInvoice.CInvoiceBalanceDebitCC   = bOrigCInvoice.CInvoiceBalanceCreditCC
            tCInvoice.CInvoiceBalanceCreditTC  = bOrigCInvoice.CInvoiceBalanceDebitTC
            tCInvoice.CInvoiceBalanceCreditLC  = bOrigCInvoice.CInvoiceBalanceDebitLC
            tCInvoice.CInvoiceBalanceCreditCC  = bOrigCInvoice.CInvoiceBalanceDebitCC
                
            tCInvoice.CInvoiceVatBaseDebitTC   = bOrigCInvoice.CInvoiceVatBaseCreditTC
            tCInvoice.CInvoiceVatBaseDebitLC   = bOrigCInvoice.CInvoiceVatBaseCreditLC
            tCInvoice.CInvoiceVatBaseDebitCC   = bOrigCInvoice.CInvoiceVatBaseCreditCC
            tCInvoice.CInvoiceVatBaseCreditTC  = bOrigCInvoice.CInvoiceVatBaseDebitTC
            tCInvoice.CInvoiceVatBaseCreditLC  = bOrigCInvoice.CInvoiceVatBaseDebitLC
            tCInvoice.CInvoiceVatBaseCreditCC  = bOrigCInvoice.CInvoiceVatBaseDebitCC
            
            tCInvoice.CInvoiceVatDebitTC       = bOrigCInvoice.CInvoiceVatCreditTC
            tCInvoice.CInvoiceVatDebitLC       = bOrigCInvoice.CInvoiceVatCreditLC
            tCInvoice.CInvoiceVatDebitCC       = bOrigCInvoice.CInvoiceVatCreditCC
            tCInvoice.CInvoiceVatCreditTC      = bOrigCInvoice.CInvoiceVatDebitTC
            tCInvoice.CInvoiceVatCreditLC      = bOrigCInvoice.CInvoiceVatDebitLC
            tCInvoice.CInvoiceVatCreditCC      = bOrigCInvoice.CInvoiceVatDebitCC
            
            tCInvoice.CInvoiceWHTTotAmtCreditTC  = bOrigCInvoice.CInvoiceWHTTotAmtDebitTC
            tCInvoice.CInvoiceWHTTotAmtCreditLC  = bOrigCInvoice.CInvoiceWHTTotAmtDebitLC
            tCInvoice.CInvoiceWHTTotAmtCreditCC  = bOrigCInvoice.CInvoiceWHTTotAmtDebitCC
            tCInvoice.CInvoiceWHTTotAmtDebitTC   = bOrigCInvoice.CInvoiceWHTTotAmtCreditTC
            tCInvoice.CInvoiceWHTTotAmtDebitLC   = bOrigCInvoice.CInvoiceWHTTotAmtCreditLC
            tCInvoice.CInvoiceWHTTotAmtDebitCC   = bOrigCInvoice.CInvoiceWHTTotAmtCreditCC
            tCInvoice.CInvoiceWHTBaseAmtCreditTC = bOrigCInvoice.CInvoiceWHTBaseAmtDebitTC
            tCInvoice.CInvoiceWHTBaseAmtCreditLC = bOrigCInvoice.CInvoiceWHTBaseAmtDebitLC
            tCInvoice.CInvoiceWHTBaseAmtCreditCC = bOrigCInvoice.CInvoiceWHTBaseAmtDebitCC
            tCInvoice.CInvoiceWHTBaseAmtDebitTC  = bOrigCInvoice.CInvoiceWHTBaseAmtCreditTC
            tCInvoice.CInvoiceWHTBaseAmtDebitLC  = bOrigCInvoice.CInvoiceWHTBaseAmtCreditLC
            tCInvoice.CInvoiceWHTBaseAmtDebitCC  = bOrigCInvoice.CInvoiceWHTBaseAmtCreditCC.

assign tCInvoice.CInvoiceBalanceTC        = tCInvoice.CInvoiceBalanceDebitTC - tCInvoice.CInvoiceBalanceCreditTC
       tCInvoice.CInvoiceBalanceLC        = tCInvoice.CInvoiceBalanceDebitLC - tCInvoice.CInvoiceBalanceCreditLC
       tCInvoice.CInvoiceBalanceCC        = tCInvoice.CInvoiceBalanceDebitCC - tCInvoice.CInvoiceBalanceCreditCC
       tCInvoice.CInvoiceIsOpen           = true
       tCInvoice.CInvoiceClosingDate      = ?
       tCInvoice.CInvoiceCirecClosingDate = if tCInvoice.CInvoiceAllocationStatus = {&ALLOCSTATUS-NOALLOC} 
                                            then 12/31/9999 
                                            else bOrigCInvoice.CInvoicePostingDate. 
       
       assign tCInvoice.CInvoiceIsLogisticMatching = No.
       
       <Q-73 run APMatchingByCInvoice (all) (Read) (NoCache)
          (input ?, (CompanyId)
           input iiReversedCInvoiceId, (CInvoiceId)
           input ?, (CInvoiceYear)
           input ?, (CInvoiceJournalCode)
           input ?, (CInvoiceVoucher)
           output dataset tqAPMatchingByCInvoice) in BAPMatching>
           
       find first tqAPMatchingByCInvoice where 
                  tqAPMatchingByCInvoice.tiCInvoice_ID = iiReversedCInvoiceId
                  no-error.
       if not available tqAPMatchingByCInvoice
       then do:
          assign bOrigCInvoice.CInvoiceIsLogisticMatching = No.
       end.   
       

/* =================================================================================================== */
/* reverse subtables : CInvoiceVat, CInvoiceBank, CInvoiceStage                                        */
/* =================================================================================================== */
<M-20 run ReverseCInvoiceSubTables
   (input  tCInvoice.tc_Rowid (icCInvoiceRowId), 
    input  tCInvoice.tlCInvoiceIsReverseBySign (ilReverseBySign), 
    output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper <  0 then return.

/* =================================================================================================== */
/* Change Supplier control account if needed                                                           */
/* =================================================================================================== */
assign vcNewControlGLCode = ?.

if ((bOrigCInvoice.CInvoiceType = {&INVOICETYPE-INVOICE} or 
     bOrigCInvoice.CInvoiceType = {&INVOICETYPE-INVOICECORRECTION}) and
    (tCInvoice.CInvoiceType     = {&INVOICETYPE-CREDITNOTE} or
     tCInvoice.CInvoiceType     = {&INVOICETYPE-CREDITNOTECORRECTION}))   or
   ((bOrigCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTE} or 
     bOrigCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTECORRECTION}) and
    (tCInvoice.CInvoiceType     = {&INVOICETYPE-INVOICE} or
     tCInvoice.CInvoiceType     = {&INVOICETYPE-INVOICECORRECTION}))
then do:
    /* Get correct control G/L account */
    <Q-11 run CreditorForCInvoiceDefault (all) (Read) (NoCache)
       (input viCompanyId, (CompanyId)
        input tCInvoice.tcCreditorCode, (CreditorCode)
        input {&ADDRESSTYPECODESYSTEM-HEADOFFICE}, (AddressTypeCode)
        output dataset tqCreditorForCInvoiceDefault) in BCreditor >

    find first tqCreditorForCInvoiceDefault where
               tqCreditorForCInvoiceDefault.tcCreditorCode     = tCInvoice.tcCreditorCode and
               tqCreditorForCInvoiceDefault.tlCreditorIsActive = true                     and
               tqCreditorForCInvoiceDefault.tcAddressTypeCode  = {&ADDRESSTYPECODESYSTEM-HEADOFFICE}
               no-error.
    if not available tqCreditorForCInvoiceDefault
    then do:
        assign vcMessage = #T-16'Some data is missing for supplier &1.':255(69587)T-16#
               vcMessage = substitute(vcMessage, tCInvoice.tcCreditorCode).
        <M-14 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-8176':U (icFcMsgNumber), 
            input  '':U (icFcExplanation), 
            input  '':U (icFcIdentification), 
            input  '':U (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
        assign oiReturnStatus = -1.
        return.
    end.

    assign viControlGLProfileId = if tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICE} or
                                     tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICECORRECTION}
                                  then tqCreditorForCInvoiceDefault.tiInvControlGLProfile_ID
                                  else tqCreditorForCInvoiceDefault.tiCnControlGLProfile_ID.
    
    <Q-13 run ProfileLinkByGL (all) (Read) (NoCache)
       (input viControlGLProfileId, (GlProfileId)
        input viCompanyId, (CompanyId)
        output dataset tqProfileLinkByGL) in BProfile >

    find tqProfileLinkByGL where
         tqProfileLinkByGL.tiProfile_ID = viControlGlProfileId
         no-error.

    if not available tqProfileLinkByGL
    then do:
        assign vcMessage = #T-18'The supplier control account is not defined in the system.':255(69590)T-18#.
        <M-17 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-8177':U (icFcMsgNumber), 
            input  '':U (icFcExplanation), 
            input  '':U (icFcIdentification), 
            input  '':U (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
        assign oiReturnStatus = -1.
        return.
    end.

    assign vcNewControlGLCode = tqProfileLinkByGL.tcGLCode.
end.

/* =================================================================================================== */
/* Reverse Posting and Movements or original invoice                                                   */
/* =================================================================================================== */
<M-19 run ReverseCInvoicePosting
   (input  bOrigCInvoice.tc_Rowid (icOrigCInvoiceRowId), 
    input  tCInvoice.tc_Rowid (icNewCInvoiceRowId), 
    input  iiReversePostingYear (iiReverseInvYear), 
    input  iiReversePostingPeriod (iiReverseInvPeriod), 
    input  icReverseInvoiceJournal (icReverseInvJournal), 
    input  iiReverseInvoiceVoucher (iiReverseInvVoucher), 
    input  itReversePostingDate (itReverseInvPostingDate), 
    input  icReverseDescription (icReverseInvDescription), 
    input  tCInvoice.tlCInvoiceIsReverseBySign (ilReverseBySign), 
    input  vcNewControlGLCode (icNewControlGLCode), 
    input  tCInvoice.tcDivisionCode (icDivisionCode), 
    input  tCInvoice.tcCostCentreCode (icCostCentreCode), 
    input  tCInvoice.tcProjectCode (icProjectCode), 
    output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper <  0 then return.

/* ====================================================================================================================== */
/* Specific actions in case the Invoice is based upon a legal-document: then CInvoiceReference consists of 2 entries      */
/* The financials should flag in this case the Legal-Document as being non-posted when the associated Invoice is reversed */
/* ====================================================================================================================== */
<M-64 run ReverseCInvoiceUpdateLegalDocument
   (input  bOrigCInvoice.CInvoice_ID (iiCInvoice_ID), 
    output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper <  0 then return.

/* ====== */
/* Return */
/* ====== */ 
if oiReturnStatus = -98 then assign oiReturnStatus = 0.