| tApiUpdateDeduction | input-output | temp-table | |
| tNewCrossCyPostingDeduction | output | temp-table | |
| ilIsCalledFromFinancial | input | logical | true: from financial. false: TPM |
| oiReturnStatus | output | integer | Return status of the method. |
QadFinancials
/***************************************************************************************/
/* 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.