project QadFinancials > class BCInvoice > method DefaultValuesReason


Parameters


icCInvoiceRowIdinputcharacterRow ID of the supplier invoice
bcReasonCodeinput-outputcharacter
icJournalCodeinputcharacter
iiPostingYearinputintegerPosting Year
ilCInvoiceIsInitialStatusinputlogicalInitial Status
iiOldVoucherinputinteger
iiCInvoiceIDinputinteger
ocReasonAllocationStatusoutputcharacter
olCInvoiceIsInvoiceApprovedoutputlogical
olCInvoiceIsLockPaymentoutputlogical
olCInvoiceIsLogisticMatchingoutputlogical
ocMFJournalCodeoutputcharacter
olCInvoiceIsInitialStatusoutputlogical
oiCInvoiceVoucheroutputinteger
ocLayerTypeCodeoutputcharacterLayer Type Code
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program3/bcinvoice.p)

/* Validate and normalize input parameters */
if bcReasonCode = ? then assign bcReasonCode = "":U.
if bcReasonCode = ? then return.
    

/* Get Supplier Invoice */
find tCInvoice where
     tCInvoice.tc_Rowid = icCInvoiceRowId
     no-error.

if tCInvoice.tc_Status <> "N":U
then find t_iCInvoice where
         t_iCInvoice.tc_Rowid = tCInvoice.tc_Rowid
         no-error.

if not available tCInvoice          or
   tCInvoice.tc_Status <> "N":U and
   not available t_iCInvoice
then do:
    <M-42 run SetMessage
       (input  #T-43'The specified supplier invoice is not defined in the system or is invalid.':80(999890907)T-43# (icMessage), 
        input  '':U (icArguments), 
        input  '':U (icFieldName), 
        input  '':U (icFieldValue), 
        input  'D':U (icType), 
        input  3 (iiSeverity), 
        input  '':U (icRowid), 
        input  'QadFin-9580':U:U (icFcMsgNumber), 
        input  '':U (icFcExplanation), 
        input  '':U (icFcIdentification), 
        input  '':U (icFcContext), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    assign oiReturnStatus = -1.
    return.
end.

/* Get Details about new Reason Code */
<Q-38 run ReasonBeginsCode (all) (Read) (NoCache)
   (input bcReasonCode, (ReasonCode)
    output dataset tqReasonBeginsCode) in BReason >    

find first tqReasonBeginsCode where 
           tqReasonBeginsCode.tcReasonCode = bcReasonCode 
           no-error.
if not available tqReasonBeginsCode
then do:
    find tqReasonBeginsCode where 
         tqReasonBeginsCode.tcReasonCode BEGINS bcReasonCode 
         no-error.
    
    /* if there's only one record - ambiguous records will not be found and available will be false */
    if available tqReasonBeginsCode
    then assign bcReasonCode = tqReasonBeginsCode.tcReasonCode.
    else do:
        assign oiReturnStatus = -4.
        return.                  
    end. 
end.

if not available tqReasonBeginsCode
then return.

/* ================================================================================================ *
 * Change of reason code is limitted to certain transitions only                                    *
 * ================================================================================================ */
/* In activity InitialCreate invoice in Initial status can be created only */
if vcActivityCode                             = "InitialCreate":U and 
   tqReasonBeginsCode.tlReasonIsInitialStatus = false
then do:         
    <M-30 run SetMessage
       (input   #T-33'You must select an invoice status code of type Initial for initial invoices':100(69057)T-33# (icMessage), 
        input  ' ':U (icArguments), 
        input  '':U (icFieldName), 
        input  '':U (icFieldValue), 
        input  'E':U (icType), 
        input  3 (iiSeverity), 
        input  ' ':U (icRowid), 
        input  'QadFin-7841':U (icFcMsgNumber), 
        input  '':U (icFcExplanation), 
        input  '':U (icFcIdentification), 
        input  '':U (icFcContext), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    assign oiReturnStatus = -1.
    return.
end.

/* Reason code cannot be never changed from Allocation to anything else */
if tCInvoice.tc_Status                         <> "N"                   and
   t_iCInvoice.CInvoiceIsInitialStatus         <> true                  and
 ((t_iCInvoice.tcReasonAllocationStatus         = {&ALLOCSTATUS-ALLOC}  and
   tqReasonBeginsCode.tcReasonAllocationStatus <> {&ALLOCSTATUS-ALLOC}) or
  (t_iCInvoice.CInvoiceAllocationStatus         = {&ALLOCSTATUS-ALLOC}  and
   t_iCInvoice.tcReasonAllocationStatus         = {&ALLOCSTATUS-ANY}    and
   tqReasonBeginsCode.tcReasonAllocationStatus <> {&ALLOCSTATUS-ALLOC}  and
   tqReasonBeginsCode.tcReasonAllocationStatus <> {&ALLOCSTATUS-ANY}))
then do:
     assign vcMessage = #T-46'You cannot change the Invoice status code with allocation to official layer to other allocation type.':255(332032812)T-46#.
     <M-44 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-9603':U:U (icFcMsgNumber), 
         input  '':U (icFcExplanation), 
         input  '':U (icFcIdentification), 
         input  '':U (icFcContext), 
         output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
     assign oiReturnStatus = -1.
     return.
end.

/* Reason code in Approve activity have to keep original allocation type */
if (vcActivityCode                        = "Approve":U or
    vcActivityCode                        = "Release For Payment":U)    and
   t_iCInvoice.tcReasonAllocationStatus <> tqReasonBeginsCode.tcReasonAllocationStatus
then do:
     assign vcMessage = #T-52'This activity does not allow change of Allocation type.':255(733752331)T-52#.
     <M-51 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-9550':U:U (icFcMsgNumber), 
         input  '':U (icFcExplanation), 
         input  '':U (icFcIdentification), 
         input  '':U (icFcContext), 
         output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
     assign oiReturnStatus = -1.
     return.
end.

/* Reason code in activity Prepare Allocation can be changed to Any Or Transient */
if vcActivityCode                               = "Prepare Allocation":U and
   tqReasonBeginsCode.tcReasonAllocationStatus <> {&ALLOCSTATUS-TRANSALLOC} and
   tqReasonBeginsCode.tcReasonAllocationStatus <> {&ALLOCSTATUS-ANY}
then do:
     assign vcMessage = #T-50'You can select Invoice status code with Transient or Any allocation in this activity.':255(583956633)T-50#.
     <M-49 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-9637':U:U (icFcMsgNumber), 
         input  '':U (icFcExplanation), 
         input  '':U (icFcIdentification), 
         input  '':U (icFcContext), 
         output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
     assign oiReturnStatus = -1.
     return.
end.

/* Reason code in activity Allocate can be changed to Allocation type only */
if vcActivityCode                               = "Allocate":U         and
   tqReasonBeginsCode.tcReasonAllocationStatus <> {&ALLOCSTATUS-ALLOC}  and
   tqReasonBeginsCode.tcReasonAllocationStatus <> {&ALLOCSTATUS-ANY}
then do:
     assign vcMessage = #T-48'You can select Invoice status code with Allocation or Any allocation in this activity.':255(606023410)T-48#.
     <M-47 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-9571':U:U (icFcMsgNumber), 
         input  '':U (icFcExplanation), 
         input  '':U (icFcIdentification), 
         input  '':U (icFcContext), 
         output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
     assign oiReturnStatus = -1.
     return.
end.

/* Assign output values */
assign ocReasonAllocationStatus     = tqReasonBeginsCode.tcReasonAllocationStatus
       olCInvoiceIsInvoiceApproved  = tqReasonBeginsCode.tlReasonIsInvoiceApproved
       olCInvoiceIsLockPayment      = tqReasonBeginsCode.tlReasonIsLockPayment
       olCInvoiceIsLogisticMatching = tqReasonBeginsCode.tlReasonIsLogisticMatching
       olCInvoiceIsInitialStatus    = tqReasonBeginsCode.tlReasonIsInitialStatus.


/* Get details for MF Posting */
if not olCInvoiceIsLogisticMatching
then do:
    <M-26 run GetMFJournal
       (input  viCompanyId (iiCompanyId), 
        input  tqReasonBeginsCode.tcReasonAllocationStatus (icReasonAllocationStatus), 
        output ocMFJournalCode (ocMFJournalCode), 
        output ocLayerTypeCode (ocLayerTypeCode), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
end.

assign oiCInvoiceVoucher = iiOldVoucher.

/* if changing from initial to non initial */
if ilCInvoiceIsInitialStatus = true and 
   olCInvoiceIsInitialStatus = false 
then do:
    /* ============================================== */
    /* Check if consecutive numbering is enabled.     */
    /* If so, use a temporary number.                 */
    /* Otherwise use standard numbering functionality */
    /* ============================================== */
    if vlCIDomainIsConsecutNr = true
    then assign viTempCInvoiceVoucher = viTempCInvoiceVoucher + 1
                oiCInvoiceVoucher     = viTempCInvoiceVoucher.
    else do:
        assign vhFcComponent = ?.
    
        <M-27 run GetNumber
           (input  viCompanyId (iiCompanyId), 
            input  iiPostingYear (iiNumbrYear), 
            input  icJournalCode (icNumbrType), 
            output oiCInvoiceVoucher (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. /* else do: */

    assign tCInvoice.CInvoicePostingYear = iiPostingYear
           tCInvoice.tcJournalCode       = icJournalCode
           tCInvoice.CInvoiceVoucher     = oiCInvoiceVoucher.    
end.

/* release invoice number when status is changed from non-initial into initial */
if (ilCInvoiceIsInitialStatus =  false and 
    olCInvoiceIsInitialStatus =  true  and 
    iiOldVoucher              <> ? and 
    iiOldVoucher              <> 0)
then do:
    /* ============================================== */
    /* Check if consecutive numbering is enabled.     */
    /* If so, use a temporary number.                 */
    /* Otherwise use standard numbering functionality */
    /* ============================================== */
    if vlCIDomainIsConsecutNr = false
    then do:
        assign vhFcComponent = ?.
        <M-28 run ReleaseNumber
           (input  viCompanyId (iiCompanyId), 
            input  iiPostingYear (iiNumbrYear), 
            input  icJournalCode (icNumbrType), 
            input  iiOldVoucher (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. 

    assign oiCInvoiceVoucher = 0.
end.