project QadFinancials > class BDInvoice > method ValidateApiDeductionDetailRecords


Parameters


tApiUpdateDeductioninputtemp-table
tApiUpdateDeductionTmpoutputtemp-table
tApiDeductionDInvoicesoutputtemp-table
ilIsCalledFromFinancialinputlogicaltrue: from financial
false: from TPM
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BDInvoice.UpdateDeductionDetail


program code (program3/bdinvoice.p)

/***************************************************************************************/
/* This method will validate the records of deduction details */
/***************************************************************************************/
assign oiReturnStatus = -98.

/* empty temp-table tApiDeductionDInvoices */
empty temp-table tApiDeductionDInvoices.
empty temp-table tApiUpdateDeductionTmp.

/* go through the input temp-table */
for each tApiUpdateDeduction:
    /**************************************/
    /* validating the DInvoice_ID */
    /**************************************/
    if tApiUpdateDeduction.tiDInvoiceID <= 0 or tApiUpdateDeduction.tiDInvoiceID = ?
    then do:
        assign oiReturnStatus = -1
               vcErrMessage   = trim(#T-69'You must specify an invoice.':100(347286977)T-69#).
        <M-31 run SetMessage
           (input  vcErrMessage (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-268956':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end. /* end if tApiUpdateDeduction.tiDInvoiceID <= 0 or tApiUpdateDeduction.tiDInvoiceID = ? */
    /**************************************/
    /* validating the tc_Status column */
    /**************************************/
    if tApiUpdateDeduction.tcStatus <> 'N':U and    
       tApiUpdateDeduction.tcStatus <> 'C':U and
       tApiUpdateDeduction.tcStatus <> 'D':U and
       tApiUpdateDeduction.tcStatus <> '':U and
       tApiUpdateDeduction.tcStatus <> ?
    then do:
        assign oiReturnStatus = -1
               vcErrMessage   = trim(#T-16'You must enter a valid API activity code, such as N, C, D, ''.':100(225729845)T-16#).
        <M-41 run SetMessage
           (input  vcErrMessage (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-856688':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end.

    /******************************************/
    /* validating the tiDInvoiceDeduction_ID */
    /*****************************************/
    if tApiUpdateDeduction.tcStatus <> 'N':U and
       (tApiUpdateDeduction.tiDInvoiceDeductionID = ? or tApiUpdateDeduction.tiDInvoiceDeductionID <=0)
    then do:
        assign oiReturnStatus = -1
               vcErrMessage = trim(#T-13'You must specify deduction details if the API activity is not N.':100(730933055)T-13#).
        <M-45 run SetMessage
           (input  vcErrMessage (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-566455':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end.
    if tApiUpdateDeduction.tcStatus <> 'N':U and tApiUpdateDeduction.tcStatus <> '':U
       and tApiUpdateDeduction.tcStatus <> ?
    then do:
        <Q-40 run DInvoiceDeductionById (all) (Read) (NoCache)
           (input tApiUpdateDeduction.tiDInvoiceDeductionID, (DInvoiceDeductionID)
            output dataset tqDInvoiceDeductionById) in BDInvoice>
        find first tqDInvoiceDeductionById no-error.
        if not available tqDInvoiceDeductionById
        then do:
            assign oiReturnStatus = -1
               vcErrMessage = trim(substitute(#T-76'The system cannot find deduction (&1).':100(528573576)T-76#,
                              string(tApiUpdateDeduction.tiDInvoiceDeductionID))).
            <M-73 run SetMessage
               (input  vcErrMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  ? (icRowid), 
                input  'qadfin-64889':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
            return.
        end.
        /* deduction category type check */
        assign vcOriginalDeductionCatType = tqDInvoiceDeductionById.tcDeductionCatType
               vcOriginalStatus = tqDInvoiceDeductionById.tcDInvoiceDeductionStatus.
        
        if vcOriginalStatus <> ? and
           vcOriginalStatus <> {&INVOICEDEDUCTSTATUS-PENDING} and
           vcOriginalStatus <> {&INVOICEDEDUCTSTATUS-APPROVEDCREDIT} and
           (tApiUpdateDeduction.tcStatus = 'C':U or tApiUpdateDeduction.tcStatus = 'D':U )
        then do:
            assign oiReturnStatus = -1
               vcErrMessage = trim(substitute(#T-8'You can only modify Pending or Approved for Credit lines for customer invoice &1 and deduction &2.':150(85729632)T-8#,
                              string(tApiUpdateDeduction.tiDInvoiceID), 
                              tApiUpdateDeduction.tcDeductionCatCode)).
            <M-26 run SetMessage
               (input  vcErrMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  ? (icRowid), 
                input  'qadfin-209044':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
            return.
        end.
    end. /* end if tApiUpdateDeduction.tcStatus <> 'N':U and tApiUpdateDeduction.tcStatus <> '':U
       and tApiUpdateDeduction.tcStatus <> ? */
    
    /* add the dinvoice_id info the tApiDeductionDInvoices table */
    if not can-find(first tApiDeductionDInvoices where tApiDeductionDInvoices.tiDInvoiceId = tApiUpdateDeduction.tiDInvoiceID)
    then do:
        create tApiDeductionDInvoices.
        assign tApiDeductionDInvoices.tiDInvoiceId  = tApiUpdateDeduction.tiDInvoiceID.
    end.

    /* build the temp-table tApiUpdateDeductionTmp */
    create tApiUpdateDeductionTmp.
    buffer-copy tApiUpdateDeduction to tApiUpdateDeductionTmp.
    assign tApiUpdateDeductionTmp.tlNewApprovedWriteOff          = no
           tApiUpdateDeductionTmp.tlNewRejected                  = no
           tApiUpdateDeductionTmp.tcDInvoiceDeductionPromoteCode = tApiUpdateDeduction.tcDInvoiceDeductionPromoteCode.

    /* calculate the total amount tc by dinvoice_id and save it to temp-table: tApiDeductionDInvoices */
    find first tApiDeductionDInvoices where tApiDeductionDInvoices.tiDInvoiceId = tApiUpdateDeduction.tiDInvoiceID no-error.
    if tApiUpdateDeduction.tcStatus <> 'D':U
    then assign tApiDeductionDInvoices.tdTotalAmountTC = tApiDeductionDInvoices.tdTotalAmountTC + tApiUpdateDeduction.tdDInvoiceDeductionTC.

    /*************************************************************/
    /* validating if it's a valid DInvoice_ID */
    /* get customer deduction invoice company id and domain info */
    /****************************************************************/
    <Q-67 run DInvoicePrim (all) (Read) (NoCache)
       (input ?, (CompanyId)
        input tApiUpdateDeduction.tiDInvoiceID, (DInvoiceId)
        input ?, (PeriodYear)
        input ?, (JournalId)
        input ?, (JournalCode)
        input ?, (DInvoiceVoucher)
        output dataset tqDInvoicePrim) in BDInvoice>
    find first tqDInvoicePrim no-error.
    
    if not available tqDInvoicePrim
    then do:
        assign oiReturnStatus = -1
               vcErrMessage = trim(substitute(#T-57'You specified an incorrect invoice (&1).':100(496498946)T-57#,
                              string(tApiUpdateDeduction.tiDInvoiceID))).
        <M-63 run SetMessage
           (input  vcErrMessage (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-872451':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end.
    else do: 
        assign tApiUpdateDeductionTmp.tiEntityIdTmp = tqDInvoicePrim.tiCompany_ID.
        /* get domain info */
        <Q-2 run DomainsForCompanies (all) (Read) (NoCache)
           (input ?, (DomainId)
            input ?, (DomainCode)
            input tApiUpdateDeductionTmp.tiEntityIdTmp, (CompanyId)
            output dataset tqDomainsForCompanies) in BDomain>
        find first tqDomainsForCompanies no-error.
        if available tqDomainsForCompanies
        then do:
            assign tApiUpdateDeductionTmp.tcDomainCodeTmp = tqDomainsForCompanies.tcDomainCode
                   tApiUpdateDeductionTmp.tiDomainIdTmp   = tqDomainsForCompanies.tiDomain_ID.
        end.
    end. /* end if available tqDInvoicePrim*/

    /*****************************************************/
    /* validate if the status has the right value */
    /*****************************************************/
    if tApiUpdateDeduction.tcDInvoiceDeductionStatus <> {&INVOICEDEDUCTSTATUS-APPROVEDCREDIT} and
       tApiUpdateDeduction.tcDInvoiceDeductionStatus <> {&INVOICEDEDUCTSTATUS-CREDITED} and
       tApiUpdateDeduction.tcDInvoiceDeductionStatus <> {&INVOICEDEDUCTSTATUS-PENDING} and
       tApiUpdateDeduction.tcDInvoiceDeductionStatus <> {&INVOICEDEDUCTSTATUS-WRITE-OFF} and
       tApiUpdateDeduction.tcDInvoiceDeductionStatus <> {&INVOICEDEDUCTSTATUS-APPROVEWRITEOFF} and
       tApiUpdateDeduction.tcDInvoiceDeductionStatus <> {&INVOICEDEDUCTSTATUS-REJECTED}
    then do:
        assign oiReturnStatus = -1
               vcErrMessage = trim(substitute(#T-10'The deduction status &1 is incorrect for customer invoice &2 and deduction &3.':100(22692708)T-10#,
                              tApiUpdateDeduction.tcDInvoiceDeductionStatus,
                              string(tApiUpdateDeduction.tiDInvoiceID), 
                              tApiUpdateDeduction.tcDeductionCatCode)).
        <M-94 run SetMessage
           (input  vcErrMessage (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-897808':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end.

    /* validate the status when tc_status is N */
    if (tApiUpdateDeduction.tcStatus = 'N':U or tApiUpdateDeduction.tcStatus = 'C':U) and
       tApiUpdateDeduction.tcDInvoiceDeductionStatus <> {&INVOICEDEDUCTSTATUS-REJECTED} and
       tApiUpdateDeduction.tcDInvoiceDeductionStatus <> {&INVOICEDEDUCTSTATUS-APPROVEWRITEOFF} and
       tApiUpdateDeduction.tcDInvoiceDeductionStatus <> {&INVOICEDEDUCTSTATUS-PENDING} and
       tApiUpdateDeduction.tcDInvoiceDeductionStatus <> {&INVOICEDEDUCTSTATUS-APPROVEDCREDIT}
    then do:
        assign oiReturnStatus = -1
               vcErrMessage = trim(substitute(#T-6'You can only change the deduction status to Pending, Rejected, Approved for Write-Off, or Approved for Credit for customer invoice &1 and deduction &2.':200(741045268)T-6#,
                              string(tApiUpdateDeduction.tiDInvoiceID), 
                              tApiUpdateDeduction.tcDeductionCatCode)).
        <M-37 run SetMessage
           (input  vcErrMessage (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-577124':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end.
       
    /*****************************************************/
    /* validate if the entity code has the right value */
    /*****************************************************/
    /* only check tc_status with N or C */
    if tApiUpdateDeduction.tcStatus = 'N':U or
       tApiUpdateDeduction.tcStatus = 'C':U
    then do:
        if tApiUpdateDeduction.tcEntityCode = ? or
           tApiUpdateDeduction.tcEntityCode = '':U
        then do:
            assign oiReturnStatus = -1
                   vcErrMessage = trim(substitute(#T-11'You must specify an entity code for customer invoice &1 and deduction &2.':100(566442221)T-11#,
                                  string(tApiUpdateDeduction.tiDInvoiceID),
                                  tApiUpdateDeduction.tcDeductionCatCode)). 
            <M-23 run SetMessage
               (input  vcErrMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  ? (icRowid), 
                input  'qadfin-797290':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
            return.
        end.
        <Q-46 run CompanyByCompanyCodeDomainCode (all) (Read) (NoCache)
           (input ?, (CompanyId)
            input tApiUpdateDeduction.tcEntityCode, (CompanyCode)
            input ?, (DomainCode)
            input ?, (DomainId)
            input ?, (CompanyIsActive)
            output dataset tqCompanyByCompanyCodeDomainCode) in BCompany>
        find first tqCompanyByCompanyCodeDomainCode no-error.
        if not available tqCompanyByCompanyCodeDomainCode
        then do:
            assign oiReturnStatus = -1
                   vcErrMessage   = trim(substitute(#T-32'The entity code is incorrect for customer invoice &1 and deduction &2.':100(621999460)T-32#,
                                  string(tApiUpdateDeduction.tiDInvoiceID),
                                  tApiUpdateDeduction.tcDeductionCatCode)). 
            <M-35 run SetMessage
               (input  vcErrMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  ? (icRowid), 
                input  'qadfin-929881':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
            return.
        end.
        assign tApiUpdateDeductionTmp.tiExpensedCompanyID = tqCompanyByCompanyCodeDomainCode.tiCompany_ID
               tApiUpdateDeductionTmp.tiExpensedDomainID  = tqCompanyByCompanyCodeDomainCode.tiDomain_ID
               tApiUpdateDeductionTmp.tcExpensedDomainCode = tqCompanyByCompanyCodeDomainCode.tcDomainCode.
    end. /* end if tApiUpdateDeduction.tcStatus = 'N':U or tApiUpdateDeduction.tcStatus = 'C':U*/
    
    /*****************************************************/
    /* validate if the deduction has the right value */
    /*****************************************************/
    /* only check tc_status with N or C */
    if tApiUpdateDeduction.tcStatus = 'N':U or
       tApiUpdateDeduction.tcStatus = 'C':U
    then do:
        if tApiUpdateDeduction.tcDeductionCatCode = ? or
           tApiUpdateDeduction.tcDeductionCatCode = '':U
        then do:
            assign oiReturnStatus = -1
                   vcErrMessage = trim(substitute(#T-25'You must specify a deduction category code for customer invoice &1.':100(328450366)T-25#,
                                  string(tApiUpdateDeduction.tiDInvoiceID))).
            <M-88 run SetMessage
               (input  vcErrMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  ? (icRowid), 
                input  'qadfin-340168':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
            return.
        end.
        
        if tApiUpdateDeduction.tcDInvoiceDeductionStatus = {&INVOICEDEDUCTSTATUS-APPROVEWRITEOFF}
        then do:
            <Q-89 run GetDeductionByCodeDomain (all) (Read) (NoCache)
               (input tApiUpdateDeductionTmp.tcExpensedDomainCode, (DomainCode)
                input tApiUpdateDeductionTmp.tcDeductionCatCode, (DeductionCatCode)
                output dataset tqGetDeductionByCodeDomain) in BDeductionCat>
            find first tqGetDeductionByCodeDomain no-error.            
            if not available tqGetDeductionByCodeDomain
            then do:
                assign oiReturnStatus = -1
                       vcErrMessage = trim(substitute(#T-80'Deduction category code &1 is incorrect for customer invoice &2.':100(305528134)T-80#,
                                      tApiUpdateDeduction.tcDeductionCatCode,
                                      string(tApiUpdateDeduction.tiDInvoiceID))). 
                <M-29 run SetMessage
                   (input  vcErrMessage (icMessage), 
                    input  '':U (icArguments), 
                    input  '':U (icFieldName), 
                    input  '':U (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  ? (icRowid), 
                    input  'qadfin-846912':U (icFcMsgNumber), 
                    input  ? (icFcExplanation), 
                    input  ? (icFcIdentification), 
                    input  ? (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
                return.
            end.
        end.     
        <Q-91 run GetDeductionByCodeDomain (all) (Read) (NoCache)
               (input tApiUpdateDeductionTmp.tcDomainCodeTmp, (DomainCode)
                input tApiUpdateDeductionTmp.tcDeductionCatCode, (DeductionCatCode)
                output dataset tqGetDeductionByCodeDomain) in BDeductionCat>
                     find first tqGetDeductionByCodeDomain no-error.            
         if not available tqGetDeductionByCodeDomain
         then do:
                assign oiReturnStatus = -1
                       vcErrMessage = trim(substitute(#T-85'Deduction category code &1 is incorrect for customer invoice &2.':100(305528134)T-85#,
                                      tApiUpdateDeduction.tcDeductionCatCode,
                                      string(tApiUpdateDeduction.tiDInvoiceID))). 
                <M-179 run SetMessage
                   (input  vcErrMessage (icMessage), 
                    input  '':U (icArguments), 
                    input  '':U (icFieldName), 
                    input  '':U (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  ? (icRowid), 
                    input  'qadfin-879865':U (icFcMsgNumber), 
                    input  ? (icFcExplanation), 
                    input  ? (icFcIdentification), 
                    input  ? (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
                return.
         end.
         else do:
                /* update deduction cat type info */
                assign tApiUpdateDeductionTmp.tcDeductionCatType = tqGetDeductionByCodeDomain.tcDeductionCatType
                       tApiUpdateDeductionTmp.tiDeductionCatLineId = tqGetDeductionByCodeDomain.tiDeductionCatLine_ID.
         end.
       
    end. /* end if tApiUpdateDeduction.tcStatus = 'N':U or tApiUpdateDeduction.tcStatus = 'C':U*/
    
    /* fix defect FIN-7350 */
    if tApiUpdateDeductionTmp.tcStatus = '':U or tApiUpdateDeductionTmp.tcStatus = ?
    then do:
        <Q-72 run GetDeductionByCodeDomain (all) (Read) (NoCache)
           (input tApiUpdateDeductionTmp.tcDomainCodeTmp, (DomainCode)
            input tApiUpdateDeductionTmp.tcDeductionCatCode, (DeductionCatCode)
            output dataset tqGetDeductionByCodeDomain) in BDeductionCat>
        find first tqGetDeductionByCodeDomain no-error.
        if not available tqGetDeductionByCodeDomain
        then do:
            assign oiReturnStatus = -1
                   vcErrMessage = trim(substitute(#T-33'Deduction category code &1 is incorrect for customer invoice &2.':100(305528134)T-33#,
                                  tApiUpdateDeduction.tcDeductionCatCode,
                                  string(tApiUpdateDeduction.tiDInvoiceID))). 
            <M-4 run SetMessage
               (input  vcErrMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  ? (icRowid), 
                input  'qadfin-417742':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
            return.
        end.
        else do:
            /* update deduction cat type info */
            assign tApiUpdateDeductionTmp.tcDeductionCatType = tqGetDeductionByCodeDomain.tcDeductionCatType.
            /* update deduction catline id info */
            assign tApiUpdateDeductionTmp.tiDeductionCatLineId = tqGetDeductionByCodeDomain.tiDeductionCatLine_ID.
        end.
    end. /* end if tApiUpdateDeductionTmp.tcStatus = '':U or tApiUpdateDeductionTmp.tcStatus = '':U. */
  
    /* validate deduction type */
    if  (tApiUpdateDeductionTmp.tcStatus = 'N':U or tApiUpdateDeductionTmp.tcStatus = 'C':U) and
        ilIsCalledFromFinancial = yes  and 
        tApiUpdateDeductionTmp.tcDeductionCatType = {&DEDUCTIONCATTYPE-PROMOTION} and
        tApiUpdateDeductionTmp.tcDInvoiceDeductionStatus <> {&INVOICEDEDUCTSTATUS-PENDING}
    then do: 
        assign oiReturnStatus = -1
               vcErrMessage = trim(substitute(#T-48'The status of the new deduction detail &1 with type 'Promotion' must be 'Pending'.':150(19445522)T-48#,
               tApiUpdateDeductionTmp.tcDeductionCatCode)).
        <M-177 run SetMessage
           (input  vcErrMessage (icMessage), 
            input  ? (icArguments), 
            input  ? (icFieldName), 
            input  tApiUpdateDeductionTmp.tcDeductionCatCode (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-416757':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end.
    if tApiUpdateDeductionTmp.tcStatus = 'C':U then
    do:
        if (ilIsCalledFromFinancial) and vcOriginalDeductionCatType = {&DEDUCTIONCATTYPE-PROMOTION} then
        do: 
           assign oiReturnStatus = -1
                  vcErrMessage = trim(substitute(#T-77'&1 deduction detail is not allowed to change.':255(154344583)T-77#, {&DEDUCTIONCATTYPE-PROMOTION})).
           <M-50 run SetMessage
              (input  vcErrMessage (icMessage), 
               input  ? (icArguments), 
               input  ? (icFieldName), 
               input  string(tApiUpdateDeductionTmp.tiDInvoiceDeductionID) (icFieldValue), 
               input  'E':U (icType), 
               input  3 (iiSeverity), 
               input  ? (icRowid), 
               input  'qadfin-185640':U (icFcMsgNumber), 
               input  ? (icFcExplanation), 
               input  ? (icFcIdentification), 
               input  ? (icFcContext), 
               output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
           return.
        end.
        if (ilIsCalledFromFinancial = false) and vcOriginalDeductionCatType = {&DEDUCTIONCATTYPE-STANDARD} then
        do: 
           assign oiReturnStatus = -1
                  vcErrMessage = trim(substitute(#T-60'&1 deduction detail is not allowed to change.':255(154344583)T-60#, {&DEDUCTIONCATTYPE-STANDARD})).
           <M-12 run SetMessage
              (input  vcErrMessage (icMessage), 
               input  ? (icArguments), 
               input  ? (icFieldName), 
               input  string(tApiUpdateDeductionTmp.tiDInvoiceDeductionID) (icFieldValue), 
               input  'E':U (icType), 
               input  3 (iiSeverity), 
               input  ? (icRowid), 
               input  'qadfin-968613':U (icFcMsgNumber), 
               input  ? (icFcExplanation), 
               input  ? (icFcIdentification), 
               input  ? (icFcContext), 
               output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
           return.
        end.
         
    end. /* end if tApiUpdateDeductionTmp.tcStatus = 'C':U */
    if tApiUpdateDeductionTmp.tcStatus = 'D':U and tApiUpdateDeductionTmp.tiDInvoiceDeductionID > 0 then
    do:
        if (ilIsCalledFromFinancial) and vcOriginalDeductionCatType = {&DEDUCTIONCATTYPE-PROMOTION} then
        do:
            assign oiReturnStatus = -1
                   vcErrMessage = trim(substitute(#T-9'&1 deduction detail can not be deleted.':255(83399466)T-9#,{&DEDUCTIONCATTYPE-PROMOTION})).
            <M-19 run SetMessage
               (input  vcErrMessage (icMessage), 
                input  ? (icArguments), 
                input  ? (icFieldName), 
                input  string(tApiUpdateDeductionTmp.tiDInvoiceDeductionID) (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  ? (icRowid), 
                input  'qadfin-713881':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
           return.
        end.
        if (ilIsCalledFromFinancial = false ) and vcOriginalDeductionCatType = {&DEDUCTIONCATTYPE-STANDARD} then
        do:
            assign oiReturnStatus = -1
                   vcErrMessage = trim(substitute(#T-1'&1 deduction detail can not be deleted.':255(83399466)T-1#,{&DEDUCTIONCATTYPE-STANDARD})).
            <M-42 run SetMessage
               (input  vcErrMessage (icMessage), 
                input  ? (icArguments), 
                input  ? (icFieldName), 
                input  string(tApiUpdateDeductionTmp.tiDInvoiceDeductionID) (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  ? (icRowid), 
                input  'qadfin-965686':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
           return.
        end.
    end. /* end if tApiUpdateDeductionTmp.tcStatus = 'D':U and tApiUpdateDeductionTmp.tiDInvoiceDeductionID > 0 */
    /*****************************************************/
    /* validate if the intercompany code has the right value */
    /*****************************************************/
    /* only check tc_status with N, C */
    if tApiUpdateDeduction.tcStatus = 'N':U or
       tApiUpdateDeduction.tcStatus = 'C':U
    then do:
        if tApiUpdateDeduction.tcInterCompanyCode <> ? and 
           tApiUpdateDeduction.tcInterCompanyCode <> ''
        then do:            
            <Q-7 run CompanyPrim (all) (Read) (NoCache)
               (input ?, (LookupCompanyId)
                input tApiUpdateDeduction.tcInterCompanyCode, (CompanyCode)
                output dataset tqCompanyPrim) in BCompany>
            find first tqCompanyPrim no-error.
            if not available tqCompanyPrim
            then do:
                assign oiReturnStatus = -1
                   vcErrMessage = trim(substitute(#T-44'The intercompany code you specified for customer invoice &1 and deduction &2 is incorrect.':100(597992233)T-44#,
                                  string(tApiUpdateDeduction.tiDInvoiceID),
                                  tApiUpdateDeduction.tcDeductionCatCode)). 
                <M-86 run SetMessage
                   (input  vcErrMessage (icMessage), 
                    input  '':U (icArguments), 
                    input  '':U (icFieldName), 
                    input  '':U (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  ? (icRowid), 
                    input  'qadfin-125345':U (icFcMsgNumber), 
                    input  ? (icFcExplanation), 
                    input  ? (icFcIdentification), 
                    input  ? (icFcContext), 
                    output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
                return.
            end.
        end.
    end.

    /*****************************************************/
    /* validate if the tc has the right value */
    /*****************************************************/
    /* only check status with N, C */
    if tApiUpdateDeduction.tcStatus = 'N':U or
       tApiUpdateDeduction.tcStatus = 'C':U
    then do:
        if tApiUpdateDeduction.tdDInvoiceDeductionTC <= 0
        then do:
            assign oiReturnStatus = -1
                   vcErrMessage = trim(substitute(#T-27'The amount (TC) must be greater than zero (0) for customer invoice &1 and deduction &2.':100(557979377)T-27#,
                                  string(tApiUpdateDeduction.tiDInvoiceID),
                                  tApiUpdateDeduction.tcDeductionCatCode)). 
            <M-84 run SetMessage
               (input  vcErrMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  ? (icRowid), 
                input  'qadfin-162065':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
            return.
        end.
    end.

    /*****************************************************/
    /* validate if DInvoiceDeductionPostingDate column */
    /*****************************************************/
    if ( tApiUpdateDeduction.tcStatus = 'N':U or tApiUpdateDeduction.tcStatus = 'C':U ) and
       tApiUpdateDeduction.tcDInvoiceDeductionStatus = {&INVOICEDEDUCTSTATUS-APPROVEWRITEOFF} and
       ( tApiUpdateDeduction.ttDInvoiceDeductionPostingDate = ? or string(tApiUpdateDeduction.ttDInvoiceDeductionPostingDate) = '':U )
    then do:
        assign oiReturnStatus = -1
               vcErrMessage = trim(substitute(#T-49'You must specify a posting date if the deduction status is &1 for deduction &2.':150(788906194)T-49#,
                              trim({&INVOICEDEDUCTSTATUS-APPROVEWRITEOFF-TR}),
                              tApiUpdateDeduction.tcDeductionCatCode)). 
        <M-47 run SetMessage
           (input  vcErrMessage (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-448869':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end.
    
    /*****************************************************/
    /* validate ttDInvoiceDeductionApRejDate column */
    /*****************************************************/
    if ( tApiUpdateDeduction.tcStatus = 'N':U or tApiUpdateDeduction.tcStatus = 'C':U ) and
       ( tApiUpdateDeduction.tcDInvoiceDeductionStatus = {&INVOICEDEDUCTSTATUS-APPROVEWRITEOFF} or
         tApiUpdateDeduction.tcDInvoiceDeductionStatus = {&INVOICEDEDUCTSTATUS-REJECTED} ) and
       ( tApiUpdateDeduction.ttDInvoiceDeductionApRejDate = ? or string(tApiUpdateDeduction.ttDInvoiceDeductionApRejDate ) = '':U )
    then do:
        assign oiReturnStatus = -1
               vcErrMessage = trim(substitute(#T-38'You must specify approve/reject date if the deduction status is &1 or &2 for deduction &3.':150(249937196)T-38#,
                              trim({&INVOICEDEDUCTSTATUS-APPROVEWRITEOFF-TR}),
                              trim({&INVOICEDEDUCTSTATUS-REJECTED-TR}),
                              tApiUpdateDeduction.tcDeductionCatCode)). 
        <M-87 run SetMessage
           (input  vcErrMessage (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-699216':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end.

    /*****************************************************/
    /* validating the sequence column */
    /*****************************************************/ 
    if tApiUpdateDeductionTmp.tcStatus <> 'D':U and
       tApiUpdateDeductionTmp.tiDInvoiceDeductionSequence = ?
    then do:
        assign oiReturnStatus = -1
               vcErrMessage = trim(substitute(#T-14'You must specify a sequence for customer invoice &1 and deduction &2.':200(794687172)T-14#,
                                  string(tApiUpdateDeduction.tiDInvoiceID),
                                  tApiUpdateDeduction.tcDeductionCatCode)). 
        <M-39 run SetMessage
           (input  vcErrMessage (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-350698':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end.

    /*****************************************************/
    /* calculating the LC & CC values */
    /*****************************************************/
    if tApiUpdateDeductionTmp.tcStatus = 'N':U or
       tApiUpdateDeductionTmp.tcStatus = 'C':U or
       tApiUpdateDeductionTmp.tcStatus = '':U  or
       tApiUpdateDeductionTmp.tcStatus = ?
    then do:
        <Q-74 run DInvoiceByIDAllInfo (all) (Read) (NoCache)
           (input ?, (CompanyId)
            input tApiUpdateDeductionTmp.tiDInvoiceID, (DInvoiceID)
            output dataset tqDInvoiceByIDAllInfo) in BDInvoice>
        find first tqDInvoiceByIDAllInfo no-error.
        if available tqDInvoiceByIDAllInfo
        then do: 
            /* calculate LC */
            tApiUpdateDeductionTmp.tdDInvoiceDeductionLC = tApiUpdateDeductionTmp.tdDInvoiceDeductionTC * 
                tqDInvoiceByIDAllInfo.tdDInvoiceExchangeRate * tqDInvoiceByIDAllInfo.tdDInvoiceRateScale.
            
            /* calculate CC */
            tApiUpdateDeductionTmp.tdDInvoiceDeductionCC = tApiUpdateDeductionTmp.tdDInvoiceDeductionTC * 
                tqDInvoiceByIDAllInfo.tdDInvoiceCCRate * tqDInvoiceByIDAllInfo.tdDInvoiceCCScale.
        end.
    end.
    if tApiUpdateDeductionTmp.tiPaidInvoiceID = ? then 
    do:
        assign tApiUpdateDeductionTmp.tiPaidInvoiceID = 0.
    end.
end. /* for each tApiUpdateDeduction: */

/*****************************************************/
/* validate if the total amount has the correct value */
/*****************************************************/
for each tApiDeductionDInvoices:
    /* load invoice financial info by dinvoice_id */
    <Q-70 run DInvoiceForFinInfo (all) (Read) (NoCache)
       (input ?, (CompanyId)
        input tApiDeductionDInvoices.tiDInvoiceId, (DInvoice_ID)
        output dataset tqDInvoiceForFinInfo) in BDInvoice>
    find first tqDInvoiceForFinInfo no-error.
    if available tqDInvoiceForFinInfo
    then do:
        /* checking the total amount */
        if tApiDeductionDInvoices.tdTotalAmountTC <> tqDInvoiceForFinInfo.tdDInvoiceOriginalDebitTC
        then do:
            assign oiReturnStatus = -1
                   vcErrMessage = trim(substitute(#T-15'The total TC amount entered (&1) does not equal the original debit TC amount (&3) for customer invoice (&2).':150(32365984)T-15#,
                                  string(tApiDeductionDInvoices.tdTotalAmountTC),
                                  string(tApiDeductionDInvoices.tiDInvoiceId),
                                  string(tqDInvoiceForFinInfo.tdDInvoiceOriginalDebitTC))). 
            <M-96 run SetMessage
               (input  vcErrMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  ? (icRowid), 
                input  'qadfin-573773':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
            return.
        end.
    end. /* available tqDInvoiceForFinInfo */
    else do:
        /* not a valid dinvoice_id */
        assign oiReturnStatus = -1
               vcErrMessage = trim(substitute(#T-24'The invoice specified, customer invoice &1, is incorrect.':100(95677132)T-24#,
                              string(tApiDeductionDInvoices.tiDInvoiceId))).
        <M-21 run SetMessage
           (input  vcErrMessage (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-793440':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end. /* not available tqDInvoiceForFinInfo */
end. /* end ach tApiDeductionDInvoices.  */

/*********************************************************************************************/
/* Check if there exists Rejected status then Pending or Approved for credit is not allowed. */
/*********************************************************************************************/
for each tApiDeductionDInvoices:
    assign vlExistNewRejectedStatus = no.
    for each tApiUpdateDeductionTmp 
        where tApiUpdateDeductionTmp.tlNewRejected and
              tApiUpdateDeductionTmp.tiDInvoiceID = tApiDeductionDInvoices.tiDInvoiceId:
        vlExistNewRejectedStatus = yes.
    end.
    
    if vlExistNewRejectedStatus 
    then do:
        for each tApiUpdateDeductionTmp 
            where tApiUpdateDeductionTmp.tiDInvoiceID = tApiDeductionDInvoices.tiDInvoiceId and
            (tApiUpdateDeductionTmp.tcStatus = {&INVOICEDEDUCTSTATUS-PENDING} or
             tApiUpdateDeductionTmp.tcStatus = {&INVOICEDEDUCTSTATUS-APPROVEDCREDIT}):
            assign oiReturnStatus = -1
                   vcErrMessage = trim(substitute(#T-90'The Deduction Details contain deduction lines with the Pending or Approved for Credit status. You cannot reject the deduction.':200(724480253)T-90#)).
            <M-34 run SetMessage
               (input  vcErrMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  ? (icRowid), 
                input  'qadfin-99486':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
            return.
        end.
    end.
end.

assign oiReturnStatus = 0.