| iiCompanyID | input | integer | Entity ID |
| iiBankStateLineID | input | integer | BankStateLine ID wherefor the allocations need to be proposed |
| icBankStateLineTcRowid | input | character | BankStateLine TcRowid wherefor the allocations need to be proposed |
| icBusinessRelationCode | input | character | |
| icCode | input | character | DebtorCreditorEmployeeCode Code of the debtor/creditor/employee |
| icReference | input | character | Reference of the debtor/creditor/employee |
| icCurrencyCode | input | character | CurrencyCode that should fit the Invoice/Collection/Document. This is not used in case iiCurrencyID is passed |
| icBankAccountNumber | input | character | BankAccountNumber that should fit the Creditor-Invoice or the Debtor |
| ilIncludeAllCompanies | input | logical | IncludeAllCompanies |
| iiPeriodYear | input | integer | |
| icJournalCode | input | character | Daybook Code |
| iiVoucher | input | integer | Voucher |
| icBankCurrencyCode | input | character | Bank Currency Code |
| itBankStateLineValueDate | input | date | Value Date of the Bank State Line |
| icTSMNumber | input | character | TSMNumber |
| tPossibleBankStateAlloc | output | temp-table | Table containing all possibilities that fit the selection critaria. |
| tPossibleBankStateStageAlloc | output | temp-table | |
| oiReturnStatus | output | integer | Return status of the method. |
QadFinancials
/* ========================= */
/* Set default return status */
/* ========================= */
assign oiReturnStatus = -98.
<Q-30 run CInvoiceByAllocationInfo (all) (Read) (NoCache)
(input if ilIncludeAllCompanies then ? else iiCompanyID, (CompanyId)
input icBusinessRelationCode, (BusinessRelationCode)
input icCode, (CreditorCode)
input icReference, (CInvoiceRefererence)
input icCurrencyCode, (CurrencyCode)
input ?, (CInvoiceID)
input true, (CInvoiceIsOpen)
input vdMinimumAmount, (CInvoiceAmountTCMinimum)
input vdMaximumAmount, (CInvoiceAmountTCMaximum)
input ?, (PeriodYearMinimum)
input iiPeriodYear, (PeriodYear)
input icJournalCode, (JournalCode)
input iiVoucher, (Voucher)
input {&MOVEMENTTYPE-INITIAL}, (CInvoiceMovementType)
input false, (CInvoiceIsSelected)
input icTSMNumber, (CInvoiceTSMNumber)
input ?, (CorporateGroupCode)
input false, (ReasonIsLockPayment)
input ?, (CompIsOICrossCy)
output dataset tqCInvoiceByAllocationInfo) in BCInvoice>
MAIN_BLOCK:
DO:
/* ============================================================================================ */
/* for withholding taxes */
/* fill the temp-table that will be used to retrieve the wht data for certain supplier invoices */
/* when filled, call bcinvoice to retrieve all data */
/* after calling bcinvoice, make sure you copy the fields of the temp-table in the correct */
/* fields of tCDocumentPossibleAllocations */
/* ============================================================================================ */
for each tqCInvoiceByAllocationInfo where
tqCInvoiceByAllocationInfo.tlCInvoiceIsLockPayment = false and
(tqCInvoiceByAllocationInfo.tdCInvoiceBalanceDebitTC <> 0 or
tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC <> 0)
break by tqCInvoiceByAllocationInfo.tiCInvoice_ID:
if first-of(tqCInvoiceByAllocationInfo.tiCInvoice_ID) and
tqCInvoiceByAllocationInfo.tlCompanyPropertyIsWHT and
tqCInvoiceByAllocationInfo.tlCInvoiceIsWHT
then do:
create tDefaultWHTDataForBE.
assign tDefaultWHTDataForBE.tiCInvoiceID = tqCInvoiceByAllocationInfo.tiCInvoice_ID
tDefaultWHTDataForBE.tiCInvoiceCompanyID = tqCInvoiceByAllocationInfo.tiCompany_ID.
end. /* end first-of(tqCInvoiceByAllocationInfo.tiCInvoice_ID) .. */
end. /* end for each tqCInvoiceByAllocationInfo .. */
/* =========================================================== */
/* retrieve the default wht data of the used supplier invoices */
/* =========================================================== */
if can-find(first tDefaultWHTDataForBE)
then do:
if viBCInvoiceBEID = 0 or
viBCInvoiceBEID = ?
then do:
<I-60 {bFcStartAndOpenInstance
&ADD-TO-TRANSACTION = "yes"
&CLASS = "BCInvoice"}>
assign vlBCInvoiceIsStartedFromBE = true.
end. /* end if viBCInvoiceBEID = 0 or ... */
else do:
<I-73 {bFcOpenInstance
&CLASS = "BCInvoice"}>
end. /* end else if viBCInvoiceBEID = 0 or ... */
<M-78 run DefaultWHTDataBasedOnCInvoice
(input-output tDefaultWHTDataForBE (tDefaultWHTData),
output viExternalReturnStatus (oiReturnStatus)) in BCInvoice>
<I-29 {bFcCloseInstance
&CLASS = "BCInvoice"}>
if viExternalReturnStatus <> 0
then assign oiReturnStatus = viExternalReturnStatus.
if viExternalReturnStatus < 0
then leave MAIN_BLOCK.
end. /* end can-find(first tDefaultWHTDataForBE */
/* ============================= */
/* Populate possible allocations */
/* ============================= */
for each tqCInvoiceByAllocationInfo where
tqCInvoiceByAllocationInfo.tlCInvoiceIsLockPayment = false and
(tqCInvoiceByAllocationInfo.tdCInvoiceBalanceDebitTC <> 0 or
tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC <> 0)
no-lock:
/* =========================================================== */
/* Check if the banknumber fits the input in case it is filled */
/* =========================================================== */
if icBankAccountNumber <> "":U
then do :
<Q-9 assign vlFcQueryRecordsAvailable = BankNumberPrim (NoCache)
(input ?, (BankNumberId)
input tqCInvoiceByAllocationInfo.tiCreditor_ID, (ParentObjectId)
input icBankAccountNumber, (BankNumber)
input ?, (BankNumberExtension)
input ?, (BankPayFormatID)) in BBankNumber>
if vlFcQueryRecordsAvailable = false
then next.
end. /* if icBankAccountNumber <> "":U */
/* Create output records */
create tPossibleBankStateAlloc.
assign tPossibleBankStateAlloc.Company_ID = tqCInvoiceByAllocationInfo.tiCompany_ID
tPossibleBankStateAlloc.tcCompanyCode = tqCInvoiceByAllocationInfo.tcCompanyCode
tPossibleBankStateAlloc.CInvoice_ID = tqCInvoiceByAllocationInfo.tiCInvoice_ID
tPossibleBankStateAlloc.Currency_ID = ?
tPossibleBankStateAlloc.tcCurrencyCode = icBankCurrencyCode
tPossibleBankStateAlloc.BankStateLine_ID = iiBankStateLineID
tPossibleBankStateAlloc.tc_ParentRowid = icBankStateLineTcRowid
tPossibleBankStateAlloc.tc_Rowid = entry(1,tqCInvoiceByAllocationInfo.tc_rowid)
tPossibleBankStateAlloc.tlCreditorIsWHT = tqCInvoiceByAllocationInfo.tlCreditorIsWHT
tPossibleBankStateAlloc.tcDocBusinessRelationCode = tqCInvoiceByAllocationInfo.tcBusinessRelationCode
tPossibleBankStateAlloc.tcDocNumberReference = trim(string(tqCInvoiceByAllocationInfo.tiPeriodYear)) + "/":U + trim(tqCInvoiceByAllocationInfo.tcJournalCode) + "/":U + string(tqCInvoiceByAllocationInfo.tiCInvoiceVoucher,"999999999":U) + "/":U + tqCInvoiceByAllocationInfo.tcCInvoiceReference
tPossibleBankStateAlloc.ttDocDueDate = tqCInvoiceByAllocationInfo.ttCInvoiceDueDate
tPossibleBankStateAlloc.ttDocDiscountDueDate = tqCInvoiceByAllocationInfo.ttCInvoiceDiscountDueDate
tPossibleBankStateAlloc.ttDocInvDate = tqCInvoiceByAllocationInfo.ttCInvoiceDate
tPossibleBankStateAlloc.tdDocBalance = if tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC <> 0 and tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC <> ? then tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC else tqCInvoiceByAllocationInfo.tdCInvoiceBalanceDebitTC
tPossibleBankStateAlloc.tdDocOriginal = abs(tqCInvoiceByAllocationInfo.tdCInvoiceOriginalDebitTC - tqCInvoiceByAllocationInfo.tdCInvoiceOriginalCreditTC)
tPossibleBankStateAlloc.BankStateAllocOpenBalTC = if tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC <> 0 and tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC <> ? then tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC else tqCInvoiceByAllocationInfo.tdCInvoiceBalanceDebitTC
tPossibleBankStateAlloc.tcDocBalanceCrDt = if tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC <> 0 and tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC <> ? then {&CREDITDEBITABBREVIATION-CREDIT} else {&CREDITDEBITABBREVIATION-DEBIT}
tPossibleBankStateAlloc.tdDocVatBase = abs(tqCInvoiceByAllocationInfo.tdCInvoiceVatBaseDebitTC - tqCInvoiceByAllocationInfo.tdCInvoiceVatBaseCreditTC)
tPossibleBankStateAlloc.tcDocVatBaseCrDt = if tqCInvoiceByAllocationInfo.tdCInvoiceVatBaseDebitTC <> 0 and tqCInvoiceByAllocationInfo.tdCInvoiceVatBaseDebitTC <> ? then {&CREDITDEBITABBREVIATION-DEBIT} else {&CREDITDEBITABBREVIATION-CREDIT}
tPossibleBankStateAlloc.tdDocVat = abs(tqCInvoiceByAllocationInfo.tdCInvoiceVatDebitTC - tqCInvoiceByAllocationInfo.tdCInvoiceVatCreditTC)
tPossibleBankStateAlloc.tcDocVatCrDt = if tqCInvoiceByAllocationInfo.tdCInvoiceVatDebitTC <> 0 and tqCInvoiceByAllocationInfo.tdCInvoiceVatDebitTC <> ? then {&CREDITDEBITABBREVIATION-DEBIT} else {&CREDITDEBITABBREVIATION-CREDIT}
tPossibleBankStateAlloc.tcDocCurrencyCode = tqCInvoiceByAllocationInfo.tcCurrencyCode
tPossibleBankStateAlloc.tiDocPostingID = tqCInvoiceByAllocationInfo.tiPosting_ID
tPossibleBankStateAlloc.tcLocalCurrencyCode = vcCompanyLC
tPossibleBankStateAlloc.tdDocExchangeRate = tqCInvoiceByAllocationInfo.tdCInvoiceExchangeRate
tPossibleBankStateAlloc.tdDocExchangeRateScale = tqCInvoiceByAllocationInfo.tdCinvoiceRateScale
tPossibleBankStateAlloc.tdDocCCExchangeRate = tqCInvoiceByAllocationInfo.tdCInvoiceCCRate
tPossibleBankStateAlloc.tdDocCCExchangeRateScale = tqCInvoiceByAllocationInfo.tdCInvoiceCCScale
tPossibleBankStateAlloc.tcDocTSMNumber = tqCInvoiceByAllocationInfo.tcCInvoiceTSMNumber
tPossibleBankStateAlloc.tcNewBalanceCrDt = tPossibleBankStateAlloc.tcDocBalanceCrDt
tPossibleBankStateAlloc.tdNewBalanceTC = if tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC <> 0 and tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC <> ? then tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC else tqCInvoiceByAllocationInfo.tdCInvoiceBalanceDebitTC
tPossibleBankStateAlloc.tcAllocAmountCrDt = (if tPossibleBankStateAlloc.tcDocBalanceCrDt = {&CREDITDEBITABBREVIATION-CREDIT} then {&CREDITDEBITABBREVIATION-DEBIT} else {&CREDITDEBITABBREVIATION-CREDIT})
/* fields must be filled, otherwise errors on save */
tPossibleBankStateAlloc.tcCurrDifferenceCrDt = {&CREDITDEBITABBREVIATION-CREDIT}
tPossibleBankStateAlloc.tcCCCurrDifferenceCrDt = {&CREDITDEBITABBREVIATION-CREDIT}
tPossibleBankStateAlloc.tcCollBalanceCrDt = {&CREDITDEBITABBREVIATION-CREDIT}
tPossibleBankStateAlloc.BankStateAllocType = "?":U
tPossibleBankStateAlloc.BankStateAllocBankRate = vdBankRate
tPossibleBankStateAlloc.BankStateAllocBankRteScale = vdBankRateScale
tPossibleBankStateAlloc.tcReasonCode = tqCInvoiceByAllocationInfo.tcReasonCode
tPossibleBankStateAlloc.tcDInvoiceDIText = "":U /*tqCInvoiceByAllocationInfo.tcCInvoiceCIText*/
tPossibleBankStateAlloc.tcInvoiceDescription = tqCInvoiceByAllocationInfo.tcCInvoiceDescription
tPossibleBankStateAlloc.tdBankStateAllocOpenBalTCSign = if tPossibleBankStateAlloc.tcDocBalanceCrDt = {&CREDITDEBITABBREVIATION-DEBIT}
then tPossibleBankStateAlloc.BankStateAllocOpenBalTC
else (0 - tPossibleBankStateAlloc.BankStateAllocOpenBalTC)
tPossibleBankStateAlloc.tdDiscountPercentage = if /*tqCInvoiceByAllocationInfo.tiDiscPaymentCondition_ID <> 0 and tqCInvoiceByAllocationInfo.tiDiscPaymentCondition_ID <> ? and*/
itBankStateLineValueDate <= tqCInvoiceByAllocationInfo.ttCInvoiceDiscountDueDate
then tqCInvoiceByAllocationInfo.tdPaymentConditionPercentage
else 0
vdInvoiceAmount = if tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC <> 0 and
tqCInvoiceByAllocationInfo.tdCInvoiceBalanceCreditTC <> ?
then tqCInvoiceByAllocationInfo.tdCInvoiceOriginalCreditTC
else tqCInvoiceByAllocationInfo.tdCInvoiceOriginalDebitTC
tPossibleBankStateAlloc.tdNonDiscAmtTC = tqCInvoiceByAllocationInfo.tdCInvoiceNonDiscAmtTC
/* if not wht is used, then give initial value */
tPossibleBankStateAlloc.tlUpdateTax = false
tPossibleBankStateAlloc.tdInitiallyAllocatedWHTAmntTC = 0
tPossibleBankStateAlloc.ttDocPostingDate = tqCInvoiceByAllocationInfo.ttCInvoicePostingDate
tPossibleBankStateAlloc.tcDocDescription = tqCInvoiceByAllocationInfo.tcCInvoiceDescription.
do viCounter = num-entries(vcInvoiceTypes,chr(2)) to 1 by -2 :
if entry(viCounter,vcInvoiceTypes,chr(2)) = tqCInvoiceByAllocationInfo.tcCInvoiceType
then do :
/* put untranslatable value in it */
assign tPossibleBankStateAlloc.BankStateAllocType = entry(viCounter,vcInvoiceTypes,chr(2)) no-error.
leave.
end. /* if entry */
end.
/* ===================================== */
/* everything related to withholding tax */
/* ===================================== */
if tqCInvoiceByAllocationInfo.tlCompanyPropertyIsWHT and
tqCInvoiceByAllocationInfo.tlCInvoiceIsWHT
then do:
/* ================================================================================================= */
/* search the temp-table record that contains the default wht data for a certain supplier invoice */
/* make sure you copy the fields of the temp-table in the correct fields of tPossibleBankStateAlloc */
/* ================================================================================================= */
find first tDefaultWHTDataForBE where
tDefaultWHTDataForBE.tiCInvoiceId = tqCInvoiceByAllocationInfo.tiCInvoice_ID
no-lock no-error.
if available tDefaultWHTDataForBE
then assign tPossibleBankStateAlloc.tdCInvoiceTotWHTBaseTC = tDefaultWHTDataForBE.tdCInvoiceTotalWHTTaxFeeTC
tPossibleBankStateAlloc.tdCInvoiceWHTUnpaidAmtTC = tDefaultWHTDataForBE.tdUnpaidWHTAmountTC
tPossibleBankStateAlloc.tlUpdateTax = tDefaultWHTDataForBE.tlUpdateTaxIsAllowed
tPossibleBankStateAlloc.tdCInvoiceTotWHTTC = tDefaultWHTDataForBE.tdCInvoiceTotalWHTAmountTC
tPossibleBankStateAlloc.tdWHTBalanceTC = tDefaultWHTDataForBE.tdWHTAmountTC
tPossibleBankStateAlloc.tdInitiallyAllocatedWHTAmntTC = tDefaultWHTDataForBE.tdInitiallyAllocatedWHTAmountTC
tPossibleBankStateAlloc.BankStateAllocWHTTxFeeTC = tDefaultWHTDataForBE.tdCInvoiceTotalWHTTaxFeeTC
tPossibleBankStateAlloc.BankStateAllocWHTAmtTC = 0 /* tDefaultWHTDataForBE.tdWHTAmountTC --> Default WHT should be 0, since nothing is allocated yet. */
tPossibleBankStateAlloc.BankStateAllocWHTAmtLC = 0 /* tDefaultWHTDataForBE.tdWHTAmountLC --> Default WHT should be 0, since nothing is allocated yet. */
tPossibleBankStateAlloc.BankStateAllocWHTAmtCC = 0 /* tDefaultWHTDataForBE.tdWHTAmountCC --> Default WHT should be 0, since nothing is allocated yet. */
tPossibleBankStateAlloc.BankStateAllocWHTLCRate = tDefaultWHTDataForBE.tdWHTTCLCExchangeRate
tPossibleBankStateAlloc.BankStateAllocWHTLCScale = tDefaultWHTDataForBE.tdWHTTCLCRateScale
tPossibleBankStateAlloc.BankStateAllocWHTCCRate = tDefaultWHTDataForBE.tdWHTTCCCExchangeRate
tPossibleBankStateAlloc.BankStateAllocWHTCCScale = tDefaultWHTDataForBE.tdWHTTCCCRateScale
tPossibleBankStateAlloc.BankStateAllocWHTPerc = if tDefaultWHTDataForBE.tdCInvoiceTotalWHTTaxFeeTC <> 0
then abs((tDefaultWHTDataForBE.tdWHTAmountTC /
tDefaultWHTDataForBE.tdCInvoiceTotalWHTTaxFeeTC) * 100)
else 0.
/* ======================================================================================== */
/* Adjust the balance of the invoice about Wht amount, which is allocated, but not yet paid */
/* ======================================================================================== */
assign vdInvoiceAmount = vdInvoiceAmount - tPossibleBankStateAlloc.tdInitiallyAllocatedWHTAmntTC
tPossibleBankStateAlloc.tdDocBalance = tPossibleBankStateAlloc.tdDocBalance - tPossibleBankStateAlloc.tdInitiallyAllocatedWHTAmntTC
tPossibleBankStateAlloc.BankStateAllocOpenBalTC = tPossibleBankStateAlloc.BankStateAllocOpenBalTC - tPossibleBankStateAlloc.tdInitiallyAllocatedWHTAmntTC
tPossibleBankStateAlloc.tdNewBalanceTC = tPossibleBankStateAlloc.tdDocBalance.
end. /* if tqCInvoiceBankByAllocationInfo.tlCompanyPropertyIsWHT and */
/* Miz FIN-2314 ====================================================================================== *
* Calculate correct amount of LC and CC for the invoice *
* =================================================================================================== */
<M-66 run GetPossibleAllocationsCInvoiceCrossCy
(input iiCompanyID (iiCompanyID),
output viFcReturnSuper (oiReturnStatus)) in BBankEntry>
if viFcReturnSuper < 0 or viFcReturnSuper > 0 and oiReturnStatus = 0 then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave MAIN_BLOCK.
assign tPossibleBankStateAlloc.tlDiscountTaxAtPayment = false.
<Q-87 run CInvoiceVatByCInvoiceId (all) (Read) (NoCache)
(input tqCInvoiceByAllocationInfo.tiCInvoice_ID, (CInvoiceId)
output dataset tqCInvoiceVatByCInvoiceId) in BCInvoice>
for each tqCInvoiceVatByCInvoiceId where
tqCInvoiceVatByCInvoiceId.tiCInvoice_ID = tqCInvoiceByAllocationInfo.tiCInvoice_ID :
<Q-42 assign vlFcQueryRecordsAvailable = MfgTaxCodeByTaxCode (NoCache)
(input tqCInvoiceVatByCInvoiceId.tcVatCode, (TaxCode)
input tqCInvoiceVatByCInvoiceId.tcDomainCode, (DomainCode)
input true, (DiscountAtPayment)
input ?, (IsTaxByLine)) in BMfgTaxCode >
if vlFcQueryRecordsAvailable = yes or vlFcQueryRecordsAvailable = ?
then do:
assign tPossibleBankStateAlloc.tlDiscountTaxAtPayment = true.
leave.
end.
end.
if tqCInvoiceByAllocationInfo.tcCInvoiceType = {&INVOICETYPE-CREDITNOTECORRECTION} or
tqCInvoiceByAllocationInfo.tcCInvoiceType = {&INVOICETYPE-INVOICECORRECTION}
then assign tPossibleBankStateAlloc.tdDocVat = tPossibleBankStateAlloc.tdDocVat * -1
tPossibleBankStateAlloc.tdDocVatBase = tPossibleBankStateAlloc.tdDocVatBase * -1
tPossibleBankStateAlloc.tdDocOriginal = tPossibleBankStateAlloc.tdDocOriginal * -1.
/* ================================================== */
/* Create extra records for staged payment conditions */
/* ================================================== */
assign vdTotalWhtAmountTC = tPossibleBankStateAlloc.tdWHTBalanceTC.
if tqCInvoiceByAllocationInfo.tcPaymentConditionPaymentTyp = {&PAYMENTCONDITIONPAYMENTTYPE-STAGED}
then do:
assign viCount = 0
vdTotalDefaultPaymentAmountTC = 0
vdTotalDefaultDiscountAmountTC = 0.
/* Calculate discountable amount of whole invoice */
if tPossibleBankStateAlloc.tlDiscountTaxAtPayment
then assign vdDiscountableInvoiceTC = tPossibleBankStateAlloc.tdDocOriginal - tPossibleBankStateAlloc.tdNonDiscAmtTC.
else assign vdDiscountableInvoiceTC = tPossibleBankStateAlloc.tdDocOriginal - tPossibleBankStateAlloc.tdNonDiscAmtTC - tPossibleBankStateAlloc.tdDocVat.
<Q-37 run CInvoiceStageByDueDate (all) (Read) (NoCache)
(input tqCInvoiceByAllocationInfo.tiCInvoice_ID, (CInvoice_ID)
input ?, (DueDate)
output dataset tqCInvoiceStageByDueDate) in BCInvoice>
for last tPossibleBankStateStageAlloc:
assign viCount = integer(tPossibleBankStateStageAlloc.tc_Rowid) no-error.
end.
for each tqCInvoiceStageByDueDate where
tqCInvoiceStageByDueDate.tiCInvoice_ID = tqCInvoiceByAllocationInfo.tiCInvoice_ID
break by tqCInvoiceStageByDueDate.tiCInvoice_ID
by tqCInvoiceStageByDueDate.ttCInvoiceStageDueDate:
assign viCount = viCount + 1.
create tPossibleBankStateStageAlloc.
assign tPossibleBankStateStageAlloc.tc_ParentRowid = tPossibleBankStateAlloc.tc_Rowid
/* Fin-3808 + Fin-2913: This combination of the parent-rowid and the count is needed to avoid that we get duplicate records (tc_rowid) in tDDocPossibleAllocationStages */
tPossibleBankStateStageAlloc.tc_Rowid = string(tqCInvoiceStageByDueDate.tc_rowid,"X(20)":U) + string(viCount)
tPossibleBankStateStageAlloc.CInvoiceStage_ID = tqCInvoiceStageByDueDate.tiCInvoiceStage_ID
tPossibleBankStateStageAlloc.tdDefaultDiscountPerc = tqCInvoiceStageByDueDate.tdCInvoiceStageDiscPerc
tPossibleBankStateStageAlloc.ttDefaultDueDate = tqCInvoiceStageByDueDate.ttCInvoiceStageDueDate
tPossibleBankStateStageAlloc.ttDefaultDiscDate = tqCInvoiceStageByDueDate.ttCInvoiceStageDiscDate
vdDefaultAllocAmountTC = tqCInvoiceStageByDueDate.tdCInvoiceStageAmountTC - tqCInvoiceStageByDueDate.tdCInvoiceStageAmtAppliedTC.
/* Distribute Wht amount to stages */
if not last-of(tqCInvoiceStageByDueDate.tiCInvoice_ID)
then assign tPossibleBankStateStageAlloc.BankStateStageAllocWHTTC = tPossibleBankStateAlloc.tdCInvoiceTotWHTTC
* vdDefaultAllocAmountTC
/ tPossibleBankStateAlloc.tdDocOriginal
tPossibleBankStateStageAlloc.BankStateStageAllocWHTTC = <M-56 RoundAmount
(input tPossibleBankStateStageAlloc.BankStateStageAllocWHTTC (idUnroundedAmount),
input ? (iiCurrencyID),
input tPossibleBankStateAlloc.tcCurrencyCode (icCurrencyCode)) in BBankEntry>
vdTotalWhtAmountTC = vdTotalWhtAmountTC - tPossibleBankStateStageAlloc.BankStateStageAllocWHTTC.
else assign tPossibleBankStateStageAlloc.BankStateStageAllocWHTTC = vdTotalWhtAmountTC
vdTotalWhtAmountTC = 0.
if itBankStateLineValueDate <= tqCInvoiceStageByDueDate.ttCInvoiceStageDiscDate
then assign tPossibleBankStateStageAlloc.tdDefaultDiscountAmountTC = vdDiscountableInvoiceTC * (vdDefaultAllocAmountTC / tPossibleBankStateAlloc.tdDocOriginal)
* (tqCInvoiceStageByDueDate.tdCInvoiceStageDiscPerc / 100)
tPossibleBankStateStageAlloc.tdDefaultDiscountAmountTC = <M-61 RoundAmount
(input tPossibleBankStateStageAlloc.tdDefaultDiscountAmountTC (idUnroundedAmount),
input tqCInvoiceByAllocationInfo.tiCInvoiceCurrency_ID (iiCurrencyID),
input tqCInvoiceByAllocationInfo.tcCurrencyCode (icCurrencyCode)) in BBankEntry>
tPossibleBankStateStageAlloc.tdDefaultPaymentAmountTC = vdDefaultAllocAmountTC
- tPossibleBankStateStageAlloc.tdDefaultDiscountAmountTC
- tPossibleBankStateStageAlloc.BankStateStageAllocWHTTC.
else assign tPossibleBankStateStageAlloc.tdDefaultDiscountAmountTC = 0
tPossibleBankStateStageAlloc.tdDefaultPaymentAmountTC = vdDefaultAllocAmountTC
- tPossibleBankStateStageAlloc.BankStateStageAllocWHTTC.
assign vdTotalDefaultPaymentAmountTC = vdTotalDefaultPaymentAmountTC + tPossibleBankStateStageAlloc.tdDefaultPaymentAmountTC
vdTotalDefaultDiscountAmountTC = vdTotalDefaultDiscountAmountTC + tPossibleBankStateStageAlloc.tdDefaultDiscountAmountTC
tPossibleBankStateStageAlloc.tdDefaultWhtAmtTC = tPossibleBankStateStageAlloc.BankStateStageAllocWHTTC
tPossibleBankStateStageAlloc.tdDefaultAllocAmountTC = vdDefaultAllocAmountTC
tPossibleBankStateStageAlloc.BankStateStageAllocWHTTC = 0 /* --> Default WHT should be 0, since nothing is allocated yet. */.
end. /* for each tqCInvoiceStageByDueDate */
assign tPossibleBankStateAlloc.tdDefaultPaymentAmountTC = vdTotalDefaultPaymentAmountTC
tPossibleBankStateAlloc.tdDefaultDiscountAmountTC = vdTotalDefaultDiscountAmountTC.
end. /* PAYMENTCONDITIONPAYMENTTYPE-STAGED */
else do:
/* ======================================================================================================================================== */
/* Calculation of Discount Amount */
/* ======================================================================================================================================== */
/* 1) In case of Discount Tax at Payment = YES */
/* Discount Amount = Invoice amount with Tax * */
/* ((Invoice amount without Tax ?- Non-discountable amount) / Invoice amount without Tax) * */
/* Discount % * */
/* (Invoice open amount / Invoice amount with Tax). */
/* 2) In case of Discount Tax at Payment = NO */
/* Discount Amount = (Invoice amount without Tax and with the intially allocated WHT that is not yet paid - Non-discountable amount) * */
/* Discount % * */
/* (Invoice open amount / Invoice amount with Tax and with the intially allocated WHT that is not yet paid). */
/* ======================================================================================================================================== */
if itBankStateLineValueDate <= tqCInvoiceByAllocationInfo.ttCInvoiceDiscountDueDate
then do:
assign vdDiscountBaseTC = if tPossibleBankStateAlloc.tlDiscountTaxAtPayment
then vdInvoiceAmount *
(((vdInvoiceAmount - tPossibleBankStateAlloc.tdDocVat) - tPossibleBankStateAlloc.tdNonDiscAmtTC) /
(vdInvoiceAmount - tPossibleBankStateAlloc.tdDocVat)) *
(tPossibleBankStateAlloc.BankStateAllocOpenBalTC / vdInvoiceAmount)
else ((vdInvoiceAmount + tPossibleBankStateAlloc.tdInitiallyAllocatedWHTAmntTC - tPossibleBankStateAlloc.tdDocVat) - tPossibleBankStateAlloc.tdNonDiscAmtTC) *
(tPossibleBankStateAlloc.BankStateAllocOpenBalTC / (vdInvoiceAmount + tPossibleBankStateAlloc.tdInitiallyAllocatedWHTAmntTC))
tPossibleBankStateAlloc.tdDefaultDiscountAmountTC = <M-55 RoundAmount
(input (tqCInvoiceByAllocationInfo.tdPaymentConditionPercentage / 100) * vdDiscountBaseTC (idUnroundedAmount),
input 0 (iiCurrencyID),
input tPossibleBankStateAlloc.tcDocCurrencyCode (icCurrencyCode)) in BApplicationProperty>
tPossibleBankStateAlloc.tdDefaultPaymentAmountTC = tPossibleBankStateAlloc.BankStateAllocOpenBalTC
- tPossibleBankStateAlloc.tdDefaultDiscountAmountTC
- tPossibleBankStateAlloc.tdWHTBalanceTC.
end.
else assign tPossibleBankStateAlloc.tdDefaultPaymentAmountTC = tPossibleBankStateAlloc.BankStateAllocOpenBalTC
- tPossibleBankStateAlloc.tdWHTBalanceTC
tPossibleBankStateAlloc.tdDefaultDiscountAmountTC = 0.
end. /* NOT PAYMENTCONDITIONPAYMENTTYPE-STAGED */
end. /* for each tqCInvoiceByAllocationInfo no-lock */
END. /* end MAIN_BLOCK: */
/* ========================== */
/* Set default return-status */
/* ========================== */
if oiReturnStatus = -98
then assign oiReturnStatus = 0.