project QadFinancials > class BCInvoice > method ValidateHoldAmountAndLockPayment

Description

This method provides a central location for validating that payment for a supplier invoice does not cause the remaining invoice balance to drop below the invoice's hold amount.
There is also implemented validation for checking, whether payment is locked for this invoice.


Parameters


iiCInvoiceIDinputintegerCreditor Invoice ID
idAllocAmountinputdecimalAllocation Amount
icFieldNameinputcharacterField Name
icFieldValueinputcharacterField Value
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BBankEntry.ValidateComponentPreUpdateBankStateAlloc
method BCDocument.AdditionalUpdatesPostingXrefCI
method BPaymentSelection.ValidateComponent


program code (program1/bcinvoice.p)

/* =================================================================================================== */
/* Method      : ValidateHoldAmount                                                                    */
/* Desc        : This method validates, whether amount to be payed is greater then hold amount         */
/* --------------------------------------------------------------------------------------------------- */
/* Params:  (I)  Name                 Description                                                      */
/*          (O)  Name                 Description                                                      */
/* =================================================================================================== */

assign oiReturnStatus = -98.

/* =================================================================================================== */
/* Normalize input parameters                                                                          */
/* =================================================================================================== */
if iiCInvoiceID = 0 then assign iiCInvoiceID = ?.

/* =================================================================================================== */
/* Validate input parameters                                                                           */
/* =================================================================================================== */
if iiCInvoiceID = ?
then do:
    assign vcMessage = #T-4'You have not entered all the mandatory values.':255(63250)t-4#
           vcContext = substitute("iiCInvoiceId=&1":U, iiCInvoiceID).
    <M-5 run SetMessage
       (input  vcMessage (icMessage), 
        input  '':U (icArguments), 
        input  '':U (icFieldName), 
        input  icFieldValue (icFieldValue), 
        input  'S':U (icType), 
        input  3 (iiSeverity), 
        input  '':U (icRowid), 
        input  'QadFin-7994':U (icFcMsgNumber), 
        input  '':U (icFcExplanation), 
        input  '':U (icFcIdentification), 
        input  vcContext (icFcContext), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    assign oiReturnStatus = -1.
    return.
end.

/* =================================================================================================== */
/* Get Invoice details                                                                                 */
/* =================================================================================================== */
<Q-10 run CInvoiceForHoldAmountVal (all) (Read) (NoCache)
   (input ?, (CompanyId)
    input iiCInvoiceID, (CInvoiceId)
    output dataset tqCInvoiceForHoldAmountVal) in BCInvoice >
find first tqCInvoiceForHoldAmountVal no-error.
if not available tqCInvoiceForHoldAmountVal
then do:
    assign vcMessage = #T-8'The system cannot read the supplier invoice definition.':255(69256)t-8#
           vcContext = substitute("iiCInvoiceId=&1":U, iiCInvoiceID).
    <M-7 run SetMessage
       (input  vcMessage (icMessage), 
        input  '':U (icArguments), 
        input  '':U (icFieldName), 
        input  icFieldValue (icFieldValue), 
        input  'S':U (icType), 
        input  3 (iiSeverity), 
        input  '':U (icRowid), 
        input  'QadFin-7995':U (icFcMsgNumber), 
        input  '':U (icFcExplanation), 
        input  '':U (icFcIdentification), 
        input  vcContext (icFcContext), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    assign oiReturnStatus = -1.
    return.
end.

/* =================================================================================================== */
/* Validate Payment is not locked for this Supplier Invoice                                            */
/* =================================================================================================== */
if tqCInvoiceForHoldAmountVal.tlCInvoiceIsLockPayment
then do:
    assign vcMessage      = #T-11'Payment is locked for Supplier Invoice &1. This can be changed by changing of Invoice Status Code on the Supplier Invoice.':255(413916070)T-11#
           vcMessage      = trim(substitute(vcMessage, tqCInvoiceForHoldAmountVal.tcCInvoiceReference))
           oiReturnStatus = -1.
    <M-12 run SetMessage
       (input  vcMessage (icMessage), 
        input  '':U (icArguments), 
        input  icFieldName (icFieldName), 
        input  icFieldValue (icFieldValue), 
        input  'E':U (icType), 
        input  3 (iiSeverity), 
        input  '' (icRowid), 
        input  'QadFin-9753':U (icFcMsgNumber), 
        input  '' (icFcExplanation), 
        input  '' (icFcIdentification), 
        input  '' (icFcContext), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    assign oiReturnStatus = -1.
    return.
end.

/* =================================================================================================== */
/* Validate Payment is Unapproved for this Supplier Invoice                                            */
/* =================================================================================================== */
if tqCInvoiceForHoldAmountVal.tlCInvoiceIsInvoiceApproved = false
then do:
    assign vcMessage = #T-16'Payment is Unapproved for Supplier Invoice &1. This can be changed by changing the Invoice Status Code on the Supplier Invoice':255(103340501)T-16#
           vcMessage = trim(substitute(vcMessage,tqCInvoiceForHoldAmountVal.tcCInvoiceReference))
           oiReturnStatus = -1.
    <M-59 run SetMessage
       (input  vcMessage (icMessage), 
        input  '':U (icArguments), 
        input  icFieldName (icFieldName), 
        input  icFieldValue (icFieldValue), 
        input  'E':U (icType), 
        input  3 (iiSeverity), 
        input  '' (icRowid), 
        input  'qadfin-788809':U (icFcMsgNumber), 
        input  '' (icFcExplanation), 
        input  '' (icFcIdentification), 
        input  '' (icFcContext), 
        output oiReturnStatus (oiReturnStatus)) in BCInvoice>
   assign oiReturnStatus = -1.
   return.
end.   

/* =================================================================================================== */
/* Validate hold amount is kept as unpaied on invoice                                                  */
/* =================================================================================================== */
assign vdBalance    = abs(tqCInvoiceForHoldAmountVal.tdCInvoiceBalanceCreditTC
                    - tqCInvoiceForHoldAmountVal.tdCInvoiceBalanceDebitTC)
                    - idAllocAmount
       vdHoldAmount = tqCInvoiceForHoldAmountVal.tdCInvoiceHoldAmountTC.
    
if vdHoldAmount <> 0 and 
   vdHoldAmount <> ? and 
   vdBalance    < vdHoldAmount
then do:
    <M-2 run SetMessage
       (input  trim(#T-3'Remaining balance of $1 is less than the hold amount ($2) for invoice $3.':100(56444)t-3#) (icMessage), 
        input  STRING(vdBalance) + chr(2) + STRING(vdHoldAmount) + chr(2) + tqCInvoiceForHoldAmountVal.tcCInvoiceReference (icArguments), 
        input  icFieldName (icFieldName), 
        input  icFieldValue (icFieldValue), 
        input  'E':U (icType), 
        input  3 (iiSeverity), 
        input  '' (icRowid), 
        input  'QadFin-5669':U (icFcMsgNumber), 
        input  '' (icFcExplanation), 
        input  '' (icFcIdentification), 
        input  '' (icFcContext), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    assign oiReturnStatus = -1.
end.

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