project QadFinancials > class BDInvoice > method UpdateDeductionDetail

Description

To approve or reject deduction detail record.


Parameters


tApiUpdateDeductioninput-outputtemp-table
tNewCrossCyPostingDeductionoutputtemp-table
ilIsCalledFromFinancialinputlogicaltrue: from financial.
false: TPM
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BDInvoiceMultiCy.UpdateDeductionDetailCy
method BDInvoiceMultiCy.UpdateDeductionDetailCyV01


program code (program3/bdinvoice.p)

/***************************************************************************************/
/* This method will update deduction detail record, approve/reject the deductions detail.
   It's calling by the BDInvoiceMultiCy */
/***************************************************************************************/

/*****************************************
It will run in the following steps:
    Step 1: Validating the input temp-table data
    Step 2: Save the modified deduction detail record
    Step 3: Create transaction for the new deduction detail record with APPROVEDFORWRITEOFF status 
    Step 4: Fill in the DInvoiceDeduction_ID value back to the input-output dataset
*******************************************/

assign oiReturnStatus = -98
       vlIsLoadCalculate = true.


/****************************************************/
/* Step 1: Validating the data */
/****************************************************/
<M-58 run ValidateApiDeductionDetailRecords
   (input  tApiUpdateDeduction (tApiUpdateDeduction), 
    output tApiUpdateDeductionTmp (tApiUpdateDeductionTmp), 
    output tApiDeductionDInvoices (tApiDeductionDInvoices), 
    input  ilIsCalledFromFinancial (ilIsCalledFromFinancial), 
    output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper < 0
then do:
    assign oiReturnStatus = viFcReturnSuper.
    return.
end.

/****************************************************/
/* Step 2: Save the modified deduction detail record */
/****************************************************/
/* get dinvoices id list */
assign vcDInvoiceIdList = '':U.
for each tApiDeductionDInvoices:
    assign vcDInvoiceIdList = vcDInvoiceIdList + string(tApiDeductionDInvoices.tiDInvoiceId) + chr(4).
end.
assign vcDInvoiceIdList = substring(vcDInvoiceIdList, 1, length(vcDInvoiceIdList,'CHARACTER') - 1 , 'CHARACTER').

if vcDInvoiceIdList = '':U
then do:
    assign oiReturnStatus = 0.
    return.
end.

/* load the original dinvoicededuction data */
<M-32 run DataLoad
   (input  ? (icRowids), 
    input  vcDInvoiceIdList (icPkeys), 
    input  ? (icObjectIds), 
    input  ? (icFreeform), 
    input  ? (ilKeepPrevious), 
    output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
assign vlIsLoadCalculate = false.

/* identify which record is new APPROVEDFORWRITEOFF */
for each tApiUpdateDeductionTmp 
    where (tApiUpdateDeductionTmp.tcStatus = 'N':U or tApiUpdateDeductionTmp.tcStatus = 'C':U) and
           tApiUpdateDeductionTmp.tcDInvoiceDeductionStatus = {&INVOICEDEDUCTSTATUS-APPROVEWRITEOFF}:
    assign tApiUpdateDeductionTmp.tlNewApprovedWriteOff = yes.
end.

/* identify which record is new REJECTED */
for each tApiUpdateDeductionTmp 
    where (tApiUpdateDeductionTmp.tcStatus = 'N':U or tApiUpdateDeductionTmp.tcStatus = 'C':U) and
           tApiUpdateDeductionTmp.tcDInvoiceDeductionStatus = {&INVOICEDEDUCTSTATUS-REJECTED}:
    assign tApiUpdateDeductionTmp.tlNewRejected = yes.
end.

/* make sure the sequence is like this: 1000,2000,3000... */
for each tApiDeductionDInvoices:
    viInitialSeq = 1.
    for each tApiUpdateDeductionTmp 
        where tApiUpdateDeductionTmp.tcStatus <> 'D' and
              tApiUpdateDeductionTmp.tiDInvoiceID = tApiDeductionDInvoices.tiDInvoiceId
              by tiDInvoiceDeductionSequence:
        tApiUpdateDeductionTmp.tiDInvoiceDeductionSequence = viInitialSeq * 1000.
        viInitialSeq = viInitialSeq + 1.
    end.
end.
    
/* In order to skip duplicate UK reason to changed the sequence */
for each tApiUpdateDeductionTmp:
    <M-72 run IfDeductionDetailExistsByUK
       (output vlDetailIsExist (olExists), 
        input  tApiUpdateDeductionTmp.tiDInvoiceID (iiDInvoiceId), 
        input  tApiUpdateDeductionTmp.tiDeductionCatLineId (iiDeductionCatLineId), 
        input  tApiUpdateDeductionTmp.tiPaidInvoiceID (iiPaidDInvoiceId), 
        input  tApiUpdateDeductionTmp.tiDInvoiceDeductionSequence (iiDInvoiceDeductionSeq), 
        output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
    if vlDetailIsExist
    then do:
        assign tApiUpdateDeductionTmp.tiDInvoiceDeductionSequence = tApiUpdateDeductionTmp.tiDInvoiceDeductionSequence + 1.
    end.
end.

/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
/* saveing the deduction detail records */
/*--- C --- */
for each tApiUpdateDeductionTmp
    where tApiUpdateDeductionTmp.tcStatus = 'C':U or tApiUpdateDeductionTmp.tcStatus = '':U or tApiUpdateDeductionTmp.tcStatus = ?:

    for each tDInvoiceDeduction where tDInvoiceDeduction.DInvoiceDeduction_ID = tApiUpdateDeductionTmp.tiDInvoiceDeductionID:

        /* Cause in any case we have to change the sequence, skip to change other values if tcStatus is empty */
        /* This is why added this if condition */
        if tApiUpdateDeductionTmp.tcStatus = 'C':U
        then do:
            assign tDInvoiceDeduction.DeductionCatLine_ID            = tApiUpdateDeductionTmp.tiDeductionCatLineId
                   tDInvoiceDeduction.DInvoiceDeductionStatus        = tApiUpdateDeductionTmp.tcDInvoiceDeductionStatus
                   tDInvoiceDeduction.DInvoiceDeductionTC            = tApiUpdateDeductionTmp.tdDInvoiceDeductionTC
                   tDInvoiceDeduction.DInvoiceDeductionLC            = tApiUpdateDeductionTmp.tdDInvoiceDeductionLC
                   tDInvoiceDeduction.DInvoiceDeductionCC            = tApiUpdateDeductionTmp.tdDInvoiceDeductionCC
                   tDInvoiceDeduction.DInvoiceDeductionComment       = tApiUpdateDeductionTmp.tcDInvoiceDeductionComment
                   tDInvoiceDeduction.DInvoiceDeductionApRejCom      = tApiUpdateDeductionTmp.tcDInvoiceDeductionApRejCom
                   tDInvoiceDeduction.DInvoiceDeductionApRejDate     = tApiUpdateDeductionTmp.ttDInvoiceDeductionApRejDate
                   tDInvoiceDeduction.DInvoiceDeductionCustRef       = tApiUpdateDeductionTmp.tcDInvoiceDeductionCustRef
                   tDInvoiceDeduction.PaidDInvoice_ID                = tApiUpdateDeductionTmp.tiPaidInvoiceID
                   tDInvoiceDeduction.DInvoiceDeductionPromotionCode = tApiUpdateDeductionTmp.tcDInvoiceDeductionPromoteCode.
        end.

        /* Any case we always reasign the sequence */
        assign tDInvoiceDeduction.DInvoiceDeductionSequence      = tApiUpdateDeductionTmp.tiDInvoiceDeductionSequence
               tDInvoiceDeduction.tc_Status                      = 'C':U. 

    end. /* end of tDInvoiceDeduction */
end. /* End of tApiUpdateDeductionTmp tApiUpdateDeductionTmp.tcStatus 'C' OR '' OR '?'*/

/*--- D --- */
for each tApiUpdateDeductionTmp where tApiUpdateDeductionTmp.tcStatus = 'D':U:
    for each tDInvoiceDeduction where tDInvoiceDeduction.DInvoiceDeduction_ID = tApiUpdateDeductionTmp.tiDInvoiceDeductionID:
        assign tDInvoiceDeduction.tc_Status = 'D':U.
    end.
end.

/*--- N --- */
for each tApiUpdateDeductionTmp
    where tApiUpdateDeductionTmp.tcStatus = 'N':U:
    find first tDInvoice where tDInvoice.DInvoice_ID = tApiUpdateDeductionTmp.tiDInvoiceID.
    /* add detail line into tDInvoiceDeduction table */
    <M-89 run AddDetailLine
       (input  'DInvoiceDeduction':U (icTable), 
        input  tDInvoice.tc_Rowid (icParentRowid), 
        output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
    if viFcReturnSuper < 0
    then do:
        assign oiReturnStatus = viFcReturnSuper.
        return.
    end.

    assign tDInvoiceDeduction.DeductionCatLine_ID            = tApiUpdateDeductionTmp.tiDeductionCatLineId
           tDInvoiceDeduction.DInvoiceDeductionStatus        = tApiUpdateDeductionTmp.tcDInvoiceDeductionStatus
           tDInvoiceDeduction.DInvoiceDeductionTC            = tApiUpdateDeductionTmp.tdDInvoiceDeductionTC
           tDInvoiceDeduction.DInvoiceDeductionLC            = tApiUpdateDeductionTmp.tdDInvoiceDeductionLC
           tDInvoiceDeduction.DInvoiceDeductionCC            = tApiUpdateDeductionTmp.tdDInvoiceDeductionCC
           tDInvoiceDeduction.DInvoiceDeductionComment       = tApiUpdateDeductionTmp.tcDInvoiceDeductionComment
           tDInvoiceDeduction.DInvoiceDeductionSequence      = tApiUpdateDeductionTmp.tiDInvoiceDeductionSequence
           tDInvoiceDeduction.DInvoiceDeductionApRejCom      = tApiUpdateDeductionTmp.tcDInvoiceDeductionApRejCom
           tDInvoiceDeduction.DInvoiceDeductionApRejDate     = tApiUpdateDeductionTmp.ttDInvoiceDeductionApRejDate
           tDInvoiceDeduction.DInvoiceDeductionCustRef       = tApiUpdateDeductionTmp.tcDInvoiceDeductionCustRef
           tDInvoiceDeduction.PaidDInvoice_ID                = tApiUpdateDeductionTmp.tiPaidInvoiceID
           tDInvoiceDeduction.DInvoiceDeductionCreateDate    = today
           tDInvoiceDeduction.DInvoiceDeductionPromotionCode = tApiUpdateDeductionTmp.tcDInvoiceDeductionPromoteCode
           tApiUpdateDeductionTmp.tiDInvoiceDeductionID      = tDInvoiceDeduction.DInvoiceDeduction_ID.

end. /* end of tApiUpdateDeductionTmp tApiUpdateDeductionTmp.tcStatus 'N'*/

/* --- Pending or Approved For Credited, cannot reject ----*/
for each tDInvoice:
    
    if (can-find (first tDInvoiceDeduction where tDInvoiceDeduction.DInvoice_ID = tDInvoice.DInvoice_ID 
                                   and tDInvoiceDeduction.tc_Status <> 'D'
                                   and tDInvoiceDeduction.DInvoiceDeductionStatus = {&INVOICEDEDUCTSTATUS-REJECTED})) 
       and (can-find (first tDInvoiceDeduction where tDInvoiceDeduction.DInvoice_ID = tDInvoice.DInvoice_ID 
                                   and tDInvoiceDeduction.tc_Status <> 'D'
                                   and tDInvoiceDeduction.DInvoiceDeductionStatus = {&INVOICEDEDUCTSTATUS-APPROVEDCREDIT}) 
        or (can-find (first tDInvoiceDeduction where tDInvoiceDeduction.DInvoice_ID = tDInvoice.DInvoice_ID 
                                   and tDInvoiceDeduction.tc_Status <> 'D'
                                   and tDInvoiceDeduction.DInvoiceDeductionStatus = {&INVOICEDEDUCTSTATUS-PENDING}))
        ) then 
    do:
        assign oiReturnStatus = -1
               vcMessage = trim(substitute(#T-62'Can not reject the deduction invoice if exists &1 or &2 deduction details.':255(959642486)T-62#,trim({&INVOICEDEDUCTSTATUS-APPROVEDCREDIT-TR}),trim({&INVOICEDEDUCTSTATUS-PENDING-TR}))).
        <M-74 run SetMessage
           (input  vcMessage (icMessage), 
            input  ? (icArguments), 
            input  ? (icFieldName), 
            input  ? (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-750701':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
        return.
    end.

    DueDateBlock:
    /* Update Due date for rejected deduction with the linked customer invoice due date. */    
    for each tDInvoiceDeduction where tDInvoiceDeduction.DInvoice_ID = tDInvoice.DInvoice_ID 
                                       and tDInvoiceDeduction.tc_Status <> 'D'
                                       and tDInvoiceDeduction.DInvoiceDeductionStatus = {&INVOICEDEDUCTSTATUS-REJECTED} by tDInvoiceDeduction.DInvoiceDeductionSequence:
        if tDInvoiceDeduction.PaidDInvoice_ID <> 0 and tDInvoiceDeduction.PaidDInvoice_ID <> ? then
        do: 
            <Q-2 run DInvoiceDueDateByID (all) (Read) (NoCache)
               (input ?, (CompanyId)
                input tDInvoiceDeduction.PaidDInvoice_ID, (DInvoice_ID)
                output dataset tqDInvoiceDueDateByID) in BDInvoice>
            find first tqDInvoiceDueDateByID no-lock no-error.
            if available tqDInvoiceDueDateByID then
            do:
               assign tDInvoice.DInvoiceDueDate = tqDInvoiceDueDateByID.ttDInvoiceDueDate
                      tDInvoice.DInvoiceDiscountDueDate = tqDInvoiceDueDateByID.ttDInvoiceDiscountDueDate
                      tDInvoice.tc_Status = 'C':U.
               leave DueDateBlock.
            end.
        end.
             
    end. /* end of the DueDateBlock */
    
end. /* end of tDInvoice. Pending or Approved For Credited, cannot reject */

/***************************************************************************************************/
/* Step 3: Create transacion for the new deduction detail record with APPROVEDFORWRITEOFF status  */
/***************************************************************************************************/
<M-43 run UpdateDeductionDetailPosting
   (input  tApiUpdateDeductionTmp (tApiUpdateDeductionTmp), 
    output tNewCrossCyPostingDeduction (tNewCrossCyPostingDeduction), 
    output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper < 0 then
do:
    assign oiReturnStatus = viFcReturnSuper.
    return.
end.

/***************************************************************************************************/
/* Step 4: Create transacion for the new deduction detail record with APPROVEDFORWRITEOFF status  */
/***************************************************************************************************/
empty temp-table tApiUpdateDeduction.
for each tApiUpdateDeductionTmp:
    create tApiUpdateDeduction.
    buffer-copy tApiUpdateDeductionTmp to tApiUpdateDeduction.
    if tApiUpdateDeduction.tiDInvoiceDeductionSequence >= 1000
    then do:
        tApiUpdateDeduction.tiDInvoiceDeductionSequence = tApiUpdateDeduction.tiDInvoiceDeductionSequence / 1000.
    end.
end.

/***************************************************************************************************/
/* Validate and commit all the changes                                                             */
/***************************************************************************************************/
<M-85 run ValidateBC  (output viFcReturnSuper (oiReturnStatus)) in BDInvoice>

if viFcReturnSuper < 0 then
do:
    assign oiReturnStatus = viFcReturnSuper.
    <M-73 run StopExternalInstances  (output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
    return.
end.


/* stop external instance has been called in this method, no need to re-execute it.*/
<M-14 run AdditionalUpdates  (output viFcReturnSuper (oiReturnStatus)) in BDInvoice>

if viFcReturnSuper < 0 then
do:
    assign oiReturnStatus = viFcReturnSuper.
    return.
end.

<M-39 run DataSave  (output viFcReturnSuper (oiReturnStatus)) in BDInvoice>

if viFcReturnSuper < 0 then
do:
    assign oiReturnStatus = viFcReturnSuper.
    <M-77 run StopExternalInstances  (output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
    return.
end.

<M-37 run StopExternalInstances  (output viFcReturnSuper (oiReturnStatus)) in BDInvoice>

assign oiReturnStatus = 0.