project QadFinancials > class BReason > method ValidateComponent

Description

Write here all tests on database update (new / modify / delete) that cannot be coded with a validation mask.
The type of update can be found in tc_status (N/C/D).
If you find incorrect data, you must write an entry in tFcMessages (using SetMessage) and set the return status of this method to either +1 or -1.
Return status +1 = data will still be accepted.
Return status -1 = data will not be accepted.
This method is run from SetPublicTables, before transferring the received data into the class temp-tables.

Validations:
- When the flag "Initial Status" is checked: the Lock Payment is checked; the Invoice Approved is un-checked; the Allocation Status is "No Allocation".
- Initial status flag can only be set if the allocation status is "No Allocation".
- Logistic matching is allowed only if the allocation status is None, Allocation or Any.


Parameters


oiReturnStatusoutputinteger


Internal usage


unused


program code (program/breason.p)

<ANCESTOR-CODE>

for each t_sReason where
         t_sReason.tc_Status = "N":U or t_sReason.tc_Status = "C":U:

    /* When the flag "Initial Status" is checked:
       the Lock Payment is checked;  
       the Invoice Approved is un-checked; 
       the Allocation Status is "No Allocation"*/
    if t_sReason.ReasonIsInitialStatus 
        then do:
            if ( (not t_sReason.ReasonIsLockPayment) or
                  (t_sReason.ReasonIsInvoiceApproved) or
                  (t_sReason.ReasonAllocationStatus <> {&ALLOCSTATUS-NOALLOC}) )
                then do:
                         assign vcMessage = trim(#T-24'An Invoice Status cannot be of Initial status unless it is also Locked for Payment, is not Approved and has an Allocation Status of No Allocation':150(71116)T-24#) 
                             oiReturnStatus = -1.
                        <M-25 run SetMessage
                           (input  vcMessage (icMessage), 
                            input  '':U (icArguments), 
                            input  't_sReason.ReasonIsInitialStatus':U (icFieldName), 
                            input  t_sReason.ReasonIsInitialStatus (icFieldValue), 
                            input  'E':U (icType), 
                            input  3 (iiSeverity), 
                            input  '':U (icRowid), 
                            input  'QadFin-7993':U (icFcMsgNumber), 
                            input  '':U (icFcExplanation), 
                            input  '':U (icFcIdentification), 
                            input  '':U (icFcContext), 
                            output viFcReturnSuper (oiReturnStatus)) in BReason>

                end.
    end.

    /* Initial status flag can only be set if the allocation status is "No Allocation"*/
    if t_sReason.ReasonIsInitialStatus and t_sReason.ReasonAllocationStatus <> {&ALLOCSTATUS-NOALLOC}
        then do:
            assign vcMessage = trim(#T-22'Allocation status must be No Allocation to set initial status field.':150(68776)t-22#) 
                    oiReturnStatus = -1.

                <M-23 run SetMessage
                   (input  vcMessage (icMessage), 
                    input  '':U (icArguments), 
                    input  'tReason.ReasonAllocationStatus':U (icFieldName), 
                    input  t_sReason.ReasonAllocationStatus (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  '':U (icRowid), 
                    input  'QadFin-7825':U (icFcMsgNumber), 
                    input  '':U (icFcExplanation), 
                    input  '':U (icFcIdentification), 
                    input  '':U (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BReason>
    end. /*  End - if t_sReason.ReasonIsInitialStatus and t_sReason.ReasonAllocationStatus */ 

    /* Logistic matching is allowed only if the allocation status is None, Allocation or Any */
    if t_sReason.ReasonIsLogisticMatching
    then do:
        if t_sReason.ReasonAllocationStatus <> {&ALLOCSTATUS-NOALLOC} and
           t_sReason.ReasonAllocationStatus <> {&ALLOCSTATUS-ALLOC}   and
           t_sReason.ReasonAllocationStatus <> {&ALLOCSTATUS-ANY}
        then do:
            assign vcMessage      = trim(#T-1'The allocation status for receiver matching must be set to Any, No Allocation, or Allocation.':150(65361)t-1#)
                   oiReturnStatus = -1.

            <M-2 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  'tReason.ReasonAllocationStatus':U (icFieldName), 
                input  t_sReason.ReasonAllocationStatus (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'QadFin-6431':U (icFcMsgNumber), 
                input  '':U (icFcExplanation), 
                input  '':U (icFcIdentification), 
                input  '':U (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BReason>
        end.
        
        if t_sReason.ReasonAllocationStatus = {&ALLOCSTATUS-NOALLOC}
        then do:
            if (t_sReason.MatchingReason_ID    = ? or t_sReason.MatchingReason_ID    = 0) and
               (t_sReason.tcMatchingReasonCode = ? or t_sReason.tcMatchingReasonCode = "":U)
            then do:
                assign vcMessage      = trim(#T-3'You must specify the Status after Matching for the receiver matching.':150(63284)t-3#)
                       oiReturnStatus = -1.
    
                 <M-4 run SetMessage
                    (input  vcMessage (icMessage), 
                     input  '':U (icArguments), 
                     input  'tReason.MatchingReason_ID':U (icFieldName), 
                     input  t_sReason.MatchingReason_ID (icFieldValue), 
                     input  'E':U (icType), 
                     input  3 (iiSeverity), 
                     input  '':U (icRowid), 
                     input  'QadFin-6432':U (icFcMsgNumber), 
                     input  '':U (icFcExplanation), 
                     input  '':U (icFcIdentification), 
                     input  '':U (icFcContext), 
                     output viFcReturnSuper (oiReturnStatus)) in BReason>
            end.
        
            else do: /* Matching reason is specified */
                <Q-5 run ReasonByIdCode (all) (Read) (NoCache)
                   (input t_sReason.MatchingReason_ID, (ReasonId)
                    input t_sReason.tcMatchingReasonCode, (ReasonCode)
                    output dataset tqReasonByIdCode) in BReason >
                find first tqReasonByIdCode no-error.
                if not available tqReasonByIdCode
                then do:
                    assign vcMessage      = trim(substitute(#T-6'The invoice status code (&1) specifed for the After Matching status is invalid.':150(63287)t-6#,t_sReason.tcMatchingReasonCode))
                           oiReturnStatus = -1.
    
                    <M-7 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-6433':U (icFcMsgNumber), 
                        input  '':U (icFcExplanation), 
                        input  '':U (icFcIdentification), 
                        input  '':U (icFcContext), 
                        output viFcReturnSuper (oiReturnStatus)) in BReason>
                end.
                else if tqReasonByIdCode.tcReasonAllocationStatus <> {&ALLOCSTATUS-ALLOC}
                then do:
                    assign vcMessage      = trim(#T-21'The After Matching status must have the Allocation option selected.':150(63286)t-21#)
                           oiReturnStatus = -1.
    
                    <M-20 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'ReasonAllocationStatus':U (icFieldName), 
                        input  tqReasonByIdCode.tcReasonAllocationStatus (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'QadFin-6998':U (icFcMsgNumber), 
                        input  '':U (icFcExplanation), 
                        input  '':U (icFcIdentification), 
                        input  '':U (icFcContext), 
                        output viFcReturnSuper (oiReturnStatus)) in BReason>
                end. /* else if tqReasonByIdCode.tcReasonAllocationStatus <> {&ALLOCSTATUS-ALLOC} */
            end. /* else do: /* Matching reason is specified */ */
        end. /* if t_sReason.ReasonAllocationStatus = {&ALLOCSTATUS-NOALLOC} */
    end.  /* if t_sReason.ReasonIsLogisticMatching */

    if t_sReason.tc_Status = "C":U
    then do:
        find first t_iReason where
                   t_iReason.tc_Rowid = t_sReason.tc_Rowid no-error.
        if not available t_iReason
        then next.

        if (t_iReason.ReasonAllocationStatus   <> t_sReason.ReasonAllocationStatus or
            t_iReason.ReasonIsLogisticMatching <> t_sReason.ReasonIsLogisticMatching)
        then do:
            <Q-10 assign vlFcQueryRecordsAvailable = ReasonByMatchingReasonId (NoCache)  (input t_sReason.Reason_ID, (MatchingReasonId)) in BReason >
        
            if vlFcQueryRecordsAvailable <> false
            then do:
                if t_iReason.ReasonAllocationStatus <> t_sReason.ReasonAllocationStatus
                then do:
                    assign vcMessage      = trim(#T-11'You cannot modify the allocation status. The invoice status code is defined as the Status After Match status of another invoice status.':255(64058)t-11#)
                           oiReturnStatus = -1.

                    <M-12 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tReason.ReasonAllocationStatus':U (icFieldName), 
                        input  t_sReason.ReasonAllocationStatus (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'QadFin-6675':U (icFcMsgNumber), 
                        input  '':U (icFcExplanation), 
                        input  '':U (icFcIdentification), 
                        input  '':U (icFcContext), 
                        output viFcReturnSuper (oiReturnStatus)) in BReason>
                end.

                if t_iReason.ReasonIsLogisticMatching <> t_sReason.ReasonIsLogisticMatching
                then do:
                    assign vcMessage      = trim(#T-13'You cannot modify thereceiver matching setting. The invoice status code is defined as the Status After Match status of another invoice status.':255(64059)t-13#)
                           oiReturnStatus = -1.

                    <M-14 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tReason.ReasonIsLogisticMatching':U (icFieldName), 
                        input  t_sReason.ReasonIsLogisticMatching (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'QadFin-6676':U (icFcMsgNumber), 
                        input  '':U (icFcExplanation), 
                        input  '':U (icFcIdentification), 
                        input  '':U (icFcContext), 
                        output viFcReturnSuper (oiReturnStatus)) in BReason>
                end.
            end.  /* Reason has been used as MatchReason */

            <Q-15 assign vlFcQueryRecordsAvailable = CInvoiceByReasonID (NoCache)
               (input ?, (CompanyId)
                input t_sReason.Reason_ID, (ReasonId)) in BCInvoice >

            if vlFcQueryRecordsAvailable <> false
            then do:
                if t_iReason.ReasonAllocationStatus <> t_sReason.ReasonAllocationStatus
                then do:
                    assign vcMessage      = trim(#T-16'You cannot modify the allocation status. The invoice status code is defined as the Status Before Match status on a supplier invoice.':255(64060)t-16#)
                           oiReturnStatus = -1.

                    <M-17 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tReason.ReasonAllocationStatus':U (icFieldName), 
                        input  t_sReason.ReasonAllocationStatus (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'QadFin-6677':U (icFcMsgNumber), 
                        input  '':U (icFcExplanation), 
                        input  '':U (icFcIdentification), 
                        input  '':U (icFcContext), 
                        output viFcReturnSuper (oiReturnStatus)) in BReason>
                end.
                if t_iReason.ReasonIsLogisticMatching <> t_sReason.ReasonIsLogisticMatching
                then do:
                    assign vcMessage      = trim(#T-18'You cannot modify the receiver matching setting. The invoice status code is defined as the Status Before Match on a supplier invoice.':255(64061)t-18#)
                           oiReturnStatus = -1.

                    <M-19 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tReason.ReasonIsLogisticMatching':U (icFieldName), 
                        input  t_sReason.ReasonIsLogisticMatching (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'QadFin-6678':U (icFcMsgNumber), 
                        input  '':U (icFcExplanation), 
                        input  '':U (icFcIdentification), 
                        input  '':U (icFcContext), 
                        output viFcReturnSuper (oiReturnStatus)) in BReason>
                end.
            end.  /* Reason has been used as before match code in supplier invoice */
        end.  /* Allocation or logistic matching changed */
    end.  /* t_sReason.tc_Status = "C" */
end.  /* for each t_sReason */