olSwitchDebitCredit | output | logical | This parameter indicates if the compensating posting lines should switch the debit and the credit. If false then the debit will remain the debit (and credit will remain credit) but the values will be multiplies with -1. |
oiReturnStatus | output | integer | Return status of the method. |
/* ================== */ /* Exception Handling */ /* ================== */ assign oiReturnStatus = -98 viLocalReturnStatus = 0. /* =========== */ /* Start Block */ /* =========== */ VALBLOCK: DO: /* =========================================================== */ /* Go though all invoices that hold a link, are new or changed */ /* =========================================================== */ for each tCInvoice where tCInvoice.LinkedCInvoice_ID <> 0 and tCInvoice.LinkedCInvoice_ID <> ? and (tCInvoice.tc_Status = "N":U or tCInvoice.tc_Status = "C":U) and (tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICE} or tCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTE} or tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICECORRECTION} or tCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTECORRECTION}) : /* ======================= */ /* Read the linked invoice */ /* ======================= */ if tCInvoice.tc_Status = 'C':U then do : find first t_iCInvoice where t_iCInvoice.tc_Rowid = tCInvoice.tc_Rowid no-error. if not available t_iCInvoice then next. end. /* ======================= */ /* Read the linked invoice */ /* ======================= */ <Q-2 run CInvoiceByIDForCA (all) (Read) (NoCache) (input ?, (CompanyId) input tCInvoice.LinkedCInvoice_ID, (CInvoiceID) output dataset tqCInvoiceByIDForCA) in BCInvoice> find first tqCInvoiceByIDForCA where tqCInvoiceByIDForCA.tiCInvoice_ID = tCInvoice.LinkedCInvoice_ID no-error. if not available tqCInvoiceByIDForCA then do: assign vcMessage = trim(#T-3'The system encountered an error when retrieving the linked invoice.':255(65735)T-3#) viLocalReturnStatus = -1. <M-4 run SetMessage (input vcMessage (icMessage), input '':U (icArguments), input '':U (icFieldName), input '':U (icFieldValue), input 'E':U (icType), input 3 (iiSeverity), input '':U (icRowid), input 'QadFin-9764':U (icFcMsgNumber), input '':U (icFcExplanation), input '':U (icFcIdentification), input '':U (icFcContext), output viFcReturnSuper (oiReturnStatus)) in BCInvoice> leave VALBLOCK. end. /* if not available tqCInvoiceByIDForCA */ /* ============================================================= */ /* 1- Make sure the exchange-rates of both invoices are the same */ /* ============================================================= */ if (tCInvoice.tc_Status = 'N':U) or (tCInvoice.tc_Status = 'C':U and (tCInvoice.CInvoiceExchangeRate <> t_iCInvoice.CInvoiceExchangeRate or tCInvoice.CInvoiceRateScale <> t_iCInvoice.CInvoiceRateScale or tCInvoice.CInvoiceCCRate <> t_iCInvoice.CInvoiceCCRate or tCInvoice.CInvoiceCCScale <> t_iCInvoice.CInvoiceCCScale)) then do: if tCInvoice.CInvoiceExchangeRate <> tqCInvoiceByIDForCA.tdCInvoiceExchangeRate or tCInvoice.CInvoiceRateScale <> tqCInvoiceByIDForCA.tdCInvoiceRateScale or tCInvoice.CInvoiceCCRate <> tqCInvoiceByIDForCA.tdCInvoiceCCRate or tCInvoice.CInvoiceCCScale <> tqCInvoiceByIDForCA.tdCInvoiceCCScale then do: /* to make sure that the translatable value of the invoice type is shown */ assign vcPreprocessorInvoiceTypes = {&INVOICETYPES}. do viCounter = num-entries(vcPreprocessorInvoiceTypes,chr(2)) to 1 by -2 : if entry(viCounter,vcPreprocessorInvoiceTypes,chr(2)) = tCInvoice.CInvoiceType then assign vcCInvoiceTypeTrans = entry(viCounter - 1,vcPreprocessorInvoiceTypes,chr(2)) no-error. if entry(viCounter,vcPreprocessorInvoiceTypes,chr(2)) = tqCInvoiceByIDForCA.tcCInvoiceType then assign vcLinkedCInvoiceTypeTrans = entry(viCounter - 1,vcPreprocessorInvoiceTypes,chr(2)) no-error. if vcCInvoiceTypeTrans <> "":U and vcCInvoiceTypeTrans <> ? and vcLinkedCInvoiceTypeTrans <> "":U and vcLinkedCInvoiceTypeTrans <> ? then Leave. end. /* do viCounter = num-entries */ assign vcMessage = trim(substitute(#T-5'The exchange-rates on the &1 (&2) should match the exchange-rates on the linked &3 (&4).':255(617126916)T-5#, vcCInvoiceTypeTrans, string(tCInvoice.CInvoicePostingYear) + "/":U + tCInvoice.tcJournalCode + "/":U + string(tCInvoice.CInvoiceVoucher), vcLinkedCInvoiceTypeTrans, string(tqCInvoiceByIDForCA.tiCInvoicePostingYear) + "/":U + tqCInvoiceByIDForCA.tcJournalCode + "/":U + string(tqCInvoiceByIDForCA.tiCInvoiceVoucher))) + chr(10) + trim(substitute(#T-6'Base-Currency rate of the &1 : &2, &3':255(413957962)T-6#, vcCInvoiceTypeTrans, tCInvoice.CInvoiceExchangeRate, tCInvoice.CInvoiceRateScale)) + chr(10) + trim(substitute(#T-7'Base-Currency rate of the &1 : &2, &3':255(413957962)T-7#, vcLinkedCInvoiceTypeTrans, tqCInvoiceByIDForCA.tdCInvoiceExchangeRate, tqCInvoiceByIDForCA.tdCInvoiceRateScale)) + chr(10) + trim(substitute(#T-8'Statutory-Currency rate of the &1 : &2, &3':255(591281008)T-8#, vcCInvoiceTypeTrans, tCInvoice.CInvoiceCCRate, tCInvoice.CInvoiceCCScale)) + chr(10) + trim(substitute(#T-9'Statutory-Currency rate of the &1 : &2, &3':255(591281008)T-9#, vcLinkedCInvoiceTypeTrans, tqCInvoiceByIDForCA.tdCInvoiceCCRate, tqCInvoiceByIDForCA.tdCInvoiceCCScale)) viLocalReturnStatus = -1. <M-10 run SetMessage (input vcMessage (icMessage), input '':U (icArguments), input '':U (icFieldName), input '':U (icFieldValue), input 'E':U (icType), input 3 (iiSeverity), input '':U (icRowid), input 'QadFin-9765':U (icFcMsgNumber), input '':U (icFcExplanation), input '':U (icFcIdentification), input '':U (icFcContext), output viFcReturnSuper (oiReturnStatus)) in BCInvoice> leave VALBLOCK. end. /* if tCInvoice.CInvoiceExchangeRate <> tqCInvoiceByIDForCA.tdCInvoiceExchangeRate or */ end. /* if */ /* ================================================================================================ */ /* 2- Make sure the WHT percentage of the CInvoice and the WHT percentage of the LinkedCInvoice are */ /* are the same as otherwise the CA-posting becomes unbalanced. */ /* So you can have a CInvoice of 100 with 10 WHT linked to a CInvoice of 5000 with 500 WHT but */ /* you cannot have a CInvoice of 100 with 10 WHT linked to a CInvoice of 5000 with 100 WHT */ /* Note that we allow a margin of 1 % as this can be cause by our dividing to get a percentage */ /* ================================================================================================ */ if (tCInvoice.tc_Status = 'N':U) or (tCInvoice.tc_Status = 'C':U and (tCInvoice.CInvoiceWHTTotAmtDebitTC <> t_iCInvoice.CInvoiceWHTTotAmtDebitTC or tCInvoice.CInvoiceWHTTotAmtCreditTC <> t_iCInvoice.CInvoiceWHTTotAmtCreditTC or tCInvoice.CInvoiceOriginalDebitTC <> t_iCInvoice.CInvoiceOriginalDebitTC or tCInvoice.CInvoiceOriginalCreditTC <> t_iCInvoice.CInvoiceOriginalCreditTC)) then do: assign vdCInvoiceWHTPercentage = Absolute(tCInvoice.CInvoiceWHTTotAmtDebitTC - tCInvoice.CInvoiceWHTTotAmtCreditTC) / Absolute(tCInvoice.CInvoiceOriginalDebitTC - tCInvoice.CInvoiceOriginalCreditTC) vdLinkedCInvoiceWHTPercentage = Absolute(tqCInvoiceByIDForCA.tdCInvoiceWHTTotAmtDebitTC - tqCInvoiceByIDForCA.tdCInvoiceWHTTotAmtCreditTC) / Absolute(tqCInvoiceByIDForCA.tdCInvoiceOriginalDebitTC - tqCInvoiceByIDForCA.tdCInvoiceOriginalCreditTC). if vdCInvoiceWHTPercentage < vdLinkedCInvoiceWHTPercentage * 0.99 Or vdCInvoiceWHTPercentage > vdLinkedCInvoiceWHTPercentage * 1.01 then do : /* to make sure that the translatable value of the invoice type is shown */ if vcCInvoiceTypeTrans = "":U or vcCInvoiceTypeTrans = ? or vcLinkedCInvoiceTypeTrans = "":U or vcLinkedCInvoiceTypeTrans = ? then do : assign vcPreprocessorInvoiceTypes = {&INVOICETYPES}. do viCounter = num-entries(vcPreprocessorInvoiceTypes,chr(2)) to 1 by -2 : if entry(viCounter,vcPreprocessorInvoiceTypes,chr(2)) = tCInvoice.CInvoiceType then assign vcCInvoiceTypeTrans = entry(viCounter - 1,vcPreprocessorInvoiceTypes,chr(2)) no-error. if entry(viCounter,vcPreprocessorInvoiceTypes,chr(2)) = tqCInvoiceByIDForCA.tcCInvoiceType then assign vcLinkedCInvoiceTypeTrans = entry(viCounter - 1,vcPreprocessorInvoiceTypes,chr(2)) no-error. if vcCInvoiceTypeTrans <> "":U and vcCInvoiceTypeTrans <> ? and vcLinkedCInvoiceTypeTrans <> "":U and vcLinkedCInvoiceTypeTrans <> ? then Leave. end. /* do viCounter = num-entries */ end. /* if vcCInvoiceTypeTrans = "":U or */ assign vcMessage = trim(substitute(#T-28'The WHT-percentage on the &1 (&2) should match the WHT-percentage on the linked &3 (&4).':255(68992322)T-28#, vcCInvoiceTypeTrans, string(tCInvoice.CInvoicePostingYear) + "/":U + tCInvoice.tcJournalCode + "/":U + string(tCInvoice.CInvoiceVoucher), vcLinkedCInvoiceTypeTrans, string(tqCInvoiceByIDForCA.tiCInvoicePostingYear) + "/":U + tqCInvoiceByIDForCA.tcJournalCode + "/":U + string(tqCInvoiceByIDForCA.tiCInvoiceVoucher))) + chr(10) + trim(substitute(#T-42'WHT-percentage of the &1 : &2':255(961488532)T-42#, vcCInvoiceTypeTrans, vdCInvoiceWHTPercentage * 100)) + chr(10) + trim(substitute(#T-36'WHT-percentage of the &1 : &2':255(163406922)T-36#, vcLinkedCInvoiceTypeTrans, vdLinkedCInvoiceWHTPercentage * 100)) viLocalReturnStatus = -1. <M-69 run SetMessage (input vcMessage (icMessage), input '':U (icArguments), input '':U (icFieldName), input '':U (icFieldValue), input 'E':U (icType), input 3 (iiSeverity), input '':U (icRowid), input 'qadfin-609557':U (icFcMsgNumber), input '':U (icFcExplanation), input '':U (icFcIdentification), input '':U (icFcContext), output viFcReturnSuper (oiReturnStatus)) in BCInvoice> leave VALBLOCK. end. /* if vdCInvoiceWHTPercentage < vdLinkedCInvoiceWHTPercentage * 0.99 Or */ end. /* if */ /* ============================================================================================= */ /* 3- Verify if the type of the invoice and type of the linked invoice make a valid combination */ /* ============================================================================================= */ if (tCInvoice.tc_Status = 'N':U) or (tCInvoice.tc_Status = 'C':U and tCInvoice.Cinvoicetype <> t_iCInvoice.CInvoiceType) then do: assign vcMessage = "":U. if vcMessage = "":U and tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICE} and tqCInvoiceByIDForCA.tcCInvoiceType <> {&INVOICETYPE-CREDITNOTE} and tqCInvoiceByIDForCA.tcCInvoiceType <> {&INVOICETYPE-PREPAYMENT} and tqCInvoiceByIDForCA.tcCInvoiceType <> {&INVOICETYPE-INVOICECORRECTION} then assign vcMessage = trim(substitute(#T-43'An invoice of type &1 can only be linked to an invoice of type &2, &3 or &4.':255(455789087)T-43#, {&INVOICETYPE-INVOICE-TR}, {&INVOICETYPE-CREDITNOTE-TR}, {&INVOICETYPE-PREPAYMENT-TR}, {&INVOICETYPE-INVOICECORRECTION-TR})). if vcMessage = "":U and tCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTE} and tqCInvoiceByIDForCA.tcCInvoiceType <> {&INVOICETYPE-CREDITNOTECORRECTION} and tqCInvoiceByIDForCA.tcCInvoiceType <> {&INVOICETYPE-INVOICE} then assign vcMessage = trim(substitute(#T-52'An invoice of type &1 can only be linked to an invoice of type &2 or &3.':255(30547212)T-52#, {&INVOICETYPE-CREDITNOTE-TR}, {&INVOICETYPE-CREDITNOTECORRECTION-TR}, {&INVOICETYPE-INVOICE-TR})). if vcMessage = "":U and tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICECORRECTION} and tqCInvoiceByIDForCA.tcCInvoiceType <> {&INVOICETYPE-INVOICE} and tqCInvoiceByIDForCA.tcCInvoiceType <> {&INVOICETYPE-CREDITNOTECORRECTION} then assign vcMessage = trim(substitute(#T-58'An invoice of type &1 can only be linked to an invoice of type &2 or &3.':255(30547212)T-58#, {&INVOICETYPE-INVOICECORRECTION-TR}, {&INVOICETYPE-INVOICE-TR}, {&INVOICETYPE-CREDITNOTECORRECTION-TR})). if vcMessage = "":U and tCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTECORRECTION} and tqCInvoiceByIDForCA.tcCInvoiceType <> {&INVOICETYPE-CREDITNOTE} and tqCInvoiceByIDForCA.tcCInvoiceType <> {&INVOICETYPE-INVOICECORRECTION} then assign vcMessage = trim(substitute(#T-80'An invoice of type &1 can only be linked to an invoice of type &2 or &3.':255(30547212)T-80#, {&INVOICETYPE-CREDITNOTECORRECTION-TR}, {&INVOICETYPE-CREDITNOTE-TR}, {&INVOICETYPE-INVOICECORRECTION-TR})). if vcMessage <> "":U then do : assign viLocalReturnStatus = -1. <M-33 run SetMessage (input vcMessage (icMessage), input '':U (icArguments), input '':U (icFieldName), input '':U (icFieldValue), input 'E':U (icType), input 3 (iiSeverity), input '':U (icRowid), input 'qadfin-695277':U (icFcMsgNumber), input '':U (icFcExplanation), input '':U (icFcIdentification), input '':U (icFcContext), output viFcReturnSuper (oiReturnStatus)) in BCInvoice> Leave VALBLOCK. end. /* if vcMessage <> "":U */ end. /* if */ /* ===================================================================================== */ /* 4- Compare the amount on tCInvoice against the open-balance of tqCInvoiceByIDForCA: */ /* In absolute terms the amount on tCInvoice cannot be more than the Open-Balance */ /* of tqCInvoiceByIDForCA subtracted with the Pending-WHT of tqCInvoiceByIDForCA */ /* ===================================================================================== */ if (tCInvoice.tc_Status = 'N':U) or (tCInvoice.tc_Status = 'C':U and (tCInvoice.CInvoiceOriginalDebitTC <> t_iCInvoice.CInvoiceOriginalDebitTC or tCInvoice.CInvoiceOriginalCreditTC <> t_iCInvoice.CInvoiceOriginalCreditTC)) then do : assign vdPendingWHTAmountTC = 0. if tqCInvoiceByIDForCA.tlCInvoiceIsWHT then do : <Q-18 run WHTByCInvoice (all) (Read) (NoCache) (input ?, (CompanyId) input tqCInvoiceByIDForCA.tiCInvoice_ID, (CInvoiceId) input ?, (WHTStatusDiffersFrom) input {&WHTSTATUS-INIT}, (WHTStatus) output dataset tqWHTByCInvoice) in BWithholdingTax> assign vdPendingWHTAmountTC = 0. for each tqWHTByCInvoice where tqWHTByCInvoice.tiCInvoice_ID = tqCInvoiceByIDForCA.tiCInvoice_ID and tqWHTByCInvoice.tcWHTStatus = {&WHTSTATUS-INIT} no-lock : assign vdPendingWHTAmountTC = vdPendingWHTAmountTC + abs(tqWHTByCInvoice.tdWHTAmtDebitTC - tqWHTByCInvoice.tdWHTAmtCreditTC). end. /* end for each tqWHTByCInvoice .. */ end. /* if tqCInvoiceByIDForCA.tlCInvoiceIsWHT */ if Absolute(tCInvoice.CInvoiceOriginalDebitTC - tCInvoice.CInvoiceOriginalCreditTC) > Absolute(tqCInvoiceByIDForCA.tdCInvoiceBalanceDebitTC - tqCInvoiceByIDForCA.tdCInvoiceBalanceCreditTC) - vdPendingWHTAmountTC then do : /* to make sure that the translatable value of the invoice type is shown */ if vcCInvoiceTypeTrans = "":U or vcCInvoiceTypeTrans = ? or vcLinkedCInvoiceTypeTrans = "":U or vcLinkedCInvoiceTypeTrans = ? then do : assign vcPreprocessorInvoiceTypes = {&INVOICETYPES}. do viCounter = num-entries(vcPreprocessorInvoiceTypes,chr(2)) to 1 by -2 : if entry(viCounter,vcPreprocessorInvoiceTypes,chr(2)) = tCInvoice.CInvoiceType then assign vcCInvoiceTypeTrans = entry(viCounter - 1,vcPreprocessorInvoiceTypes,chr(2)) no-error. if entry(viCounter,vcPreprocessorInvoiceTypes,chr(2)) = tqCInvoiceByIDForCA.tcCInvoiceType then assign vcLinkedCInvoiceTypeTrans = entry(viCounter - 1,vcPreprocessorInvoiceTypes,chr(2)) no-error. if vcCInvoiceTypeTrans <> "":U and vcCInvoiceTypeTrans <> ? and vcLinkedCInvoiceTypeTrans <> "":U and vcLinkedCInvoiceTypeTrans <> ? then Leave. end. /* do viCounter = num-entries */ end. /* if vcCInvoiceTypeTrans = "":U or */ assign vcMessage = trim(substitute(#T-31'The amount on the &1 (&2) cannot be more than the open-balance of the linked &3 (&4) minus its WHT.':255(802102773)T-31#, vcCInvoiceTypeTrans, string(tCInvoice.CInvoicePostingYear) + "/":U + tCInvoice.tcJournalCode + "/":U + string(tCInvoice.CInvoiceVoucher), vcLinkedCInvoiceTypeTrans, string(tqCInvoiceByIDForCA.tiCInvoicePostingYear) + "/":U + tqCInvoiceByIDForCA.tcJournalCode + "/":U + string(tqCInvoiceByIDForCA.tiCInvoiceVoucher))) + chr(10) + trim(substitute(#T-64'Amount of the &1 : &2':255(997069175)T-64#, vcCInvoiceTypeTrans, Absolute(tCInvoice.CInvoiceOriginalDebitTC - tCInvoice.CInvoiceOriginalCreditTC))) + chr(10) + trim(substitute(#T-73'Open-balance of the &1 : &2':255(207127399)T-73#, vcLinkedCInvoiceTypeTrans, Absolute(tqCInvoiceByIDForCA.tdCInvoiceBalanceDebitTC - tqCInvoiceByIDForCA.tdCInvoiceBalanceCreditTC))) + chr(10) + trim(substitute(#T-92'WHT-amount of the &1 : &2':255(546801047)T-92#, vcLinkedCInvoiceTypeTrans, vdPendingWHTAmountTC)) viLocalReturnStatus = -1. <M-41 run SetMessage (input vcMessage (icMessage), input '':U (icArguments), input '':U (icFieldName), input '':U (icFieldValue), input 'E':U (icType), input 3 (iiSeverity), input '':U (icRowid), input 'qadfin-756933':U (icFcMsgNumber), input '':U (icFcExplanation), input '':U (icFcIdentification), input '':U (icFcContext), output viFcReturnSuper (oiReturnStatus)) in BCInvoice> leave VALBLOCK. end. /* if Absolute((tCInvoice.CInvoiceOriginalDebitTC - tCInvoice.CInvoiceOriginalCreditTC) > Absolute(tqCInvoiceByIDForCA.tdCInvoiceBalanceDebitTC - tqCInvoiceByIDForCA.tdCInvoiceBalanceCreditTC) - vdPendingWHTAmountTC */ end. /* if */ /* ==================================================================================================================================================== */ /* The movements etc for the invoice and for the linked-invoice are very similar as the rates, the movement-amount and the wht are the same: */ /* The only difference between them is that either the credit and debit are switched, either the sign (+ or -) differs depending upon the invoice-types */ /* ==================================================================================================================================================== */ /* This is the overview of possible combination and what is the difference between the invoice and the linked-invoice: */ /* InvoiceType Linked-InvoiceType Difference Invoice - LinkedInvoice */ /* Invoice CreditNote SwitchCredDeb */ /* Invoice InvoiceCorr SwitchSign */ /* CreditNote Invoice SwitchCredDeb */ /* CreditNote CreditNoteCorr SwitchSign */ /* InvoiceCorr Invoice SwitchSign */ /* InvoiceCorr CreditNoteCorr SwitchCredDeb */ /* CreditNoteCorr CreditNote SwitchSign */ /* CreditNoteCorr InvoiceCorr SwitchCredDeb */ /* Note that a prepayment is considered the same as a CreditNote */ /* ==================================================================================================================================================== */ if (tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICE} and tqCInvoiceByIDForCA.tcCInvoiceType = {&INVOICETYPE-CREDITNOTE}) Or (tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICE} and tqCInvoiceByIDForCA.tcCInvoiceType = {&INVOICETYPE-PREPAYMENT}) Or (tCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTE} and tqCInvoiceByIDForCA.tcCInvoiceType = {&INVOICETYPE-INVOICE}) Or (tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICECORRECTION} and tqCInvoiceByIDForCA.tcCInvoiceType = {&INVOICETYPE-CREDITNOTECORRECTION}) Or (tCInvoice.CInvoiceType = {&INVOICETYPE-CREDITNOTECORRECTION} and tqCInvoiceByIDForCA.tcCInvoiceType = {&INVOICETYPE-INVOICECORRECTION}) then assign olSwitchDebitCredit = true. else assign olSwitchDebitCredit = false. end. /* for each tCInvoice */ END. /* VALBLOCK */ /* ================== */ /* Exception handling */ /* ================== */ assign oiReturnStatus = viLocalReturnStatus.