project QadFinancials > class BCInvoice > method ExitInstance

Description

This method can be extended with code to execute when an instance of a business class is stopped.

Standard functionality in this method is
- Clean up instance data in the fcInstance table.
- Create or update a draft instance if applicable.

plus transaction handling
- Remove the instance from the transaction if it was added to a transaction in InitInstance.
- Abort the transaction if one was started from inside the business code.

PreCondition

This method is executed when :
- A business instance is stopped (release object + delete instance data)
(icDraftReference = "" + viCurrentDraftInstanceId = 0)
- A business instance is saved as a draft (release object + create draft)
(icDraftReference <> "")
- A draft instance is stopped (release object, delete copy of draft, release original draft)
(icDraftReference = "" + viCurrentDraftInstanceId <> 0)

This method is NOT run when a business instance is only closed (release object + keep instance data).


Parameters


icDraftReferenceinputcharacterDescription for the draft instance.
This parameter will have a value when creating a draft instance.
icDraftFormNameinputcharacterThis parameter will have a value when creating a draft instance.
ilDraftIsSharedinputlogicalThis parameter will have a value when creating a draft instance.
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program/bcinvoice.p)

<ANCESTOR-CODE>

/* ================================================================= */
/* If the instance contains uncommitted cinvoices, do not wait for   */
/* housekeeping to release the reserved number. Release it now.      */
/* When saving a draft instance, store the number to protect it      */
/* from being released by housekeeping.                              */
/* (do not release numbr when cancelling a draft)                    */
/* ================================================================= */
if viCurrentDraftInstanceId = 0
then for each tCInvoice where
              tCInvoice.CInvoiceVoucher <> 0 and
              tCInvoice.CInvoiceVoucher <> ?:
    if tCInvoice.tc_Status = "C":U or
       tCInvoice.tc_Status = "":U
    then do:
        find first t_iCInvoice where
                   t_iCInvoice.tc_Rowid = tCInvoice.tc_Rowid
                   no-lock no-error.
        if not available t_iCInvoice
        then do:
            <M-12 run SetMessage
               (input  trim(#T-13'The system cannot find initial values for supplier invoice $1 $2 $3.':255(65420)t-13#) (icMessage), 
                input  string(tCInvoice.CInvoicePostingYear) + chr(2) + tCInvoice.tcJournalCode + chr(2) + string(tCInvoice.CInvoiceVoucher) (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  tCInvoice.tc_Rowid (icRowid), 
                input  'QadFin-7959':U (icFcMsgNumber), 
                input  '':U (icFcExplanation), 
                input  '':U (icFcIdentification), 
                input  '':U (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
            assign oiReturnStatus = -1.
            next.
        end.
    end.

    if tCInvoice.tc_Status                 = "N":U or
     ((tCInvoice.tc_Status                 = "C":U or
       tCInvoice.tc_Status                 = "":U) and
       t_iCInvoice.CInvoiceIsInitialStatus = true and
      (t_iCInvoice.CInvoiceVoucher         = 0 or
       t_iCInvoice.CInvoiceVoucher         = ?) and
      (tCInvoice.CInvoiceVoucher          <> 0 and
       tCInvoice.CInvoiceVoucher          <> ?))
    then do:
        if vlCIDomainIsConsecutNr = false
        then do:    
            assign vhFcComponent = ?.
            if icDraftReference = "":U
            then do:         
                <M-2 run ReleaseNumber
                   (input  viCompanyId (iiCompanyId), 
                    input  tCInvoice.CInvoicePostingYear (iiNumbrYear), 
                    input  tCInvoice.tcJournalCode (icNumbrType), 
                    input  tCInvoice.CInvoiceVoucher (iiNumbr), 
                    input  viFcCurrentInstanceId (iiInstanceId), 
                    input  vcFcComponentName (icClassName), 
                    output viFcReturnSuper (oiReturnStatus)) in BNumber>
                /* ===================================================================================================== */
                /* Following test is needed in case the posting was created externaly (methods ApiStdMaintainTT()        */
                /* and ApiStdMaintainMultiTT() in BCInvoiceJournalEntry, BDInvoiceJournalEntry and BPosting              */
                /* If the number was provided externaly and the action was 'validate', then Transaction.AbortTransaction */
                /* is called (end thus ExitInstance in all components) which will try to release a number that was never */
                /* picked-up by a call towards BNumber.GetNumber()                                                       */
                /* ===================================================================================================== */
                if viFcReturnSuper = -4 /* -4 means an invalid read : thus the number-record does not yet even exists */
                then assign viFcReturnSuper = 0.
            end.
            else do:
                <M-4 run StoreNumber (input  viCompanyId (iiCompanyID), 
                          input  tCInvoice.CInvoicePostingYear (iiNumbrYear), 
                          input  tCInvoice.tcJournalCode (icNumbrType), 
                          input  tCInvoice.CInvoiceVoucher (iiNumbr), 
                          output viFcReturnSuper (oiReturnStatus)) in BNumber>
            end.
            if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)
            then assign oiReturnStatus = viFcReturnSuper.
            if oiReturnStatus < 0
            then return.
        end. /* if vlCIDomainIsConsecutNr = false */        
    end.
end.

if viCurrentDraftInstanceId = 0
then for each tCInvoice where
         tCInvoice.tc_Status = "N":U and
         tCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTE} and
         tCInvoice.tiCAVoucher <> 0 and
         tCInvoice.tiCAVoucher <> ?:

    assign vhFcComponent = ?.
    if icDraftReference = "":U
    then do:
        <M-3 run ReleaseNumber
           (input  viCompanyId (iiCompanyId), 
            input  tCInvoice.CInvoicePostingYear (iiNumbrYear), 
            input  tCInvoice.tcCAJournalCode (icNumbrType), 
            input  tCInvoice.tiCAVoucher (iiNumbr), 
            input  viFcCurrentInstanceId (iiInstanceId), 
            input  vcFcComponentName (icClassName), 
            output viFcReturnSuper (oiReturnStatus)) in BNumber>
        /* ===================================================================================================== */
        /* Following test is needed in case the posting was created externaly (methods ApiStdMaintainTT()        */
        /* and ApiStdMaintainMultiTT() in BCInvoiceJournalEntry, BDInvoiceJournalEntry and BPosting              */
        /* If the number was provided externaly and the action was 'validate', then Transaction.AbortTransaction */
        /* is called (end thus ExitInstance in all components) which will try to release a number that was never */
        /* picked-up by a call towards BNumber.GetNumber()                                                       */
        /* ===================================================================================================== */
        if viFcReturnSuper = -4 /* -4 means an invalid read : thus the number-record does not yet even exists */
        then assign viFcReturnSuper = 0.
    end.
    else do:
        <M-5 run StoreNumber (input  viCompanyId (iiCompanyID), 
                  input  tCInvoice.CInvoicePostingYear (iiNumbrYear), 
                  input  tCInvoice.tcCAJournalCode (icNumbrType), 
                  input  tCInvoice.tiCAVoucher (iiNumbr), 
                  output viFcReturnSuper (oiReturnStatus)) in BNumber>
    end.
    if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)
    then assign oiReturnStatus = viFcReturnSuper.
    if oiReturnStatus < 0
    then return.
end.

if viCurrentDraftInstanceId = 0
then 
    for each tCInvoice where
         tCInvoice.tc_Status = "N":U and
         tCInvoice.CInvoiceRegistrationNr <> 0 and
         tCInvoice.CInvoiceRegistrationNr <> ? :
        assign vhFcComponent = ?. 
        if icDraftReference = "":U
        then do:
           /* release the registration number */    
            <M-9 run ReleaseNumber
               (input  viCompanyId (iiCompanyId), 
                input  9999 (iiNumbrYear), 
                input  {&SUPPLIERINVOICEREGNUMBER} (icNumbrType), 
                input  tCInvoice.CInvoiceRegistrationNr (iiNumbr), 
                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.
        else do:
            <M-11 run StoreNumber
               (input  viCompanyId (iiCompanyID), 
                input  9999 (iiNumbrYear), 
                input  {&SUPPLIERINVOICEREGNUMBER} (icNumbrType), 
                input  tCInvoice.CInvoiceRegistrationNr (iiNumbr), 
                output viFcReturnSuper (oiReturnStatus)) in BNumber>

        end.
        if viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0)        
            then assign oiReturnStatus = viFcReturnSuper.
        if oiReturnStatus < 0
            then return.
end.

/* ====================================================================================== */
/* Release or store the WHT number                                                        */
/* WHT Numbers are retrieved in BCInvoice, BBankEntry, BCDocument and BOpenItemAdjustment */
/* The Numbers are stored in BWithHoldingTax.PostSave                                     */
/* ====================================================================================== */
if viCurrentDraftInstanceId = 0
then do:
    /* The WHT Numbers that are retrieved are stored in a data item, since the normal temp-table can be cleared when errors occured somewhere */
    do viReleaseNumberCount = num-entries(vcReleaseWHTNumberListCI, chr(4)) to 1 by -1
        on error undo, throw:
        
        assign viReleaseWHTNumber = integer(entry(viReleaseNumberCount, vcReleaseWHTNumberListCI, chr(4))) no-error.
        if error-status:error 
        then do:                 
            assign vcMessage      = trim(substitute(#T-74'Error releasing WHT Number.':255(183355101)T-74#))  + chr(10) +                                
                                    trim(substitute(#T-73'WHT Number List: &1':255(517036178)T-73#, trim(vcReleaseWHTNumberListCI))).
                   oiReturnStatus = -3.
            <M-46 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'S':U (icType), 
                input  2 (iiSeverity), 
                input  '':U (icRowid), 
                input  'qadfin-817042':U (icFcMsgNumber), 
                input  '' (icFcExplanation), 
                input  '' (icFcIdentification), 
                input  '' (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
             return.
         end.  /* if error-status:error */          
        
        assign vhFcComponent = ?.
        if icDraftReference = "":U
        then do:
            <M-60 run ReleaseNumber
               (input  viCompanyId (iiCompanyId), 
                input  9999 (iiNumbrYear), 
                input  'WHT':U (icNumbrType), 
                input  viReleaseWHTNumber (iiNumbr), 
                input  viFcCurrentInstanceId (iiInstanceId), 
                input  vcFcComponentName (icClassName), 
                output viFcReturnSuper (oiReturnStatus)) in BNumber>
        end.
        else do:
            <M-70 run StoreNumber
               (input  viCompanyId (iiCompanyID), 
                input  9999 (iiNumbrYear), 
                input  'WHT':U (icNumbrType), 
                input  viReleaseWHTNumber (iiNumbr), 
                output viFcReturnSuper (oiReturnStatus)) in BNumber>
        end.
        if viFcReturnSuper <> -4 and /* it can be that the number is already committed in BWHT */
           (viFcReturnSuper < 0 or (viFcReturnSuper > 0 and oiReturnStatus = 0))
        then assign oiReturnStatus = viFcReturnSuper.
        if oiReturnStatus < 0
        then return.
    end. /* do viReleaseNumberCount = num-entries(vcReleaseWHTNumberListCI, chr(4)) to 1 by -1 */        
end. /* if viCurrentDraftInstanceId = 0 */