| tDIOpenBalance | input-output | temp-table | temp-table used for the creation of Debtor-Opening-Balances |
| iiBJournalEntryId | input | integer | Instance of BJournalEntry |
| iiPostingId | input | integer | Posting ID |
| ocNewRecordInfo | output | character | new record information rowid, dinvoice_id, rowid, dinvoice_id |
| oiReturnStatus | output | integer | Return status of the method. |
QadFinancials
/* replace unknown value */
if iiBJournalEntryId = ? then assign iiBJournalEntryId = 0.
if iiPostingId = ? then assign iiPostingId = 0.
/* exception handling */
assign oiReturnStatus = -98
viLocalReturnStatus = 0.
/* validate input parameters */
<M-1 run CreateDInvoicesValidate
(input-output tDIOpenBalance (tDIOpenBalance),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper <> 0
then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then do:
assign oiReturnStatus = viLocalReturnStatus.
return.
end.
CREATEBLOCK :
for each tDIOpenBalance where
tDIOpenBalance.tcDebtorCode <> "":U:
/* create the invoice */
<M-2 run AddDetailLine (input 'DInvoice':U (icTable),
input '':U (icParentRowid),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave CREATEBLOCK.
assign tDInvoice.Company_ID = tDIOpenBalance.tiCompanyId
tDInvoice.DInvoicePostingPeriod = tDIOpenBalance.tiPeriodPeriod
tDInvoice.DInvoicePostingYear = tDIOpenBalance.tiPeriodYear
tDInvoice.tcDebtorCode = tDIOpenBalance.tcDebtorCode
tDInvoice.tcSoldToDebtorCode = tDIOpenBalance.tcDebtorCode
tDInvoice.tcDivisionCode = tDIOpenBalance.tcDivisionCode
tDInvoice.tcJournalCode = tDIOpenBalance.tcJournalCode
tDInvoice.tcReasonCode = tDIOpenBalance.tcReasonCode
tDInvoice.DInvoicePostingDate = tDIOpenBalance.ttPostingDate
tDInvoice.DInvoiceType = tDIOpenBalance.tcInvoiceType
tDInvoice.DInvoiceDate = tDIOpenBalance.ttInvoiceDate
tDInvoice.DInvoiceTaxPointDate = tDIOpenBalance.ttInvoiceTaxPointDate
tDInvoice.DInvoiceDescription = tDIOpenBalance.tcInvoiceDescription
tDInvoice.tcCurrencyCode = tDIOpenBalance.tcTCCurrencyCode
tDInvoice.tcNormalPaymentConditionCode = tDIOpenBalance.tcNormalPaymentConditionCode
tDInvoice.DInvoiceExchangeRate = tDIOpenBalance.tdExchangeRateTCLC
tDInvoice.DInvoiceRateScale = if tDIOpenBalance.tdExchangeRateScale = 0
then 1
else tDIOpenBalance.tdExchangeRateScale
tDInvoice.DInvoiceCCRate = tDIOpenBalance.tdExchangeRateTCCC
tDInvoice.DInvoiceCCScale = if tDIOpenBalance.tdCCExchangeRateScale = 0
then 1
else tDIOpenBalance.tdCCExchangeRateScale
tDInvoice.DInvoiceTSMNumber = tDIOpenBalance.tcInvoiceTSMNumber
tDInvoice.DInvoiceDueDate = tDIOpenBalance.ttInvoiceDueDate
tDInvoice.DInvoiceDiscountDueDate = tDIOpenBalance.ttInvoiceDiscountDueDate
tDInvoice.DInvoiceDIText = tDIOpenBalance.tcPostingText
tDInvoice.tcProjectCode = tDIOpenBalance.tcProjectCode
tDInvoice.tcCostCentreCode = tDIOpenBalance.tcCostCentreCode
tDInvoice.DInvoiceIsOpen = true
tDInvoice.DInvoiceIsSelected = false
tDInvoice.DInvoiceIsPaymentAllowed = false
tDInvoice.DInvoiceIsTaxable = false
tDInvoice.DInvoiceIsTaxExcluded = false
tDInvoice.DInvoiceIsWithDeduction = if tDInvoice.DInvoiceType = {&INVOICETYPE-DEDUCTION} then true else false
tDInvoice.tcVatCurrencyCode = tDInvoice.tcCurrencyCode
ocNewRecordInfo = if tDIOpenBalance.tcKey <> "":U
then tDIOpenBalance.tcKey + ",":U + string(tDInvoice.DInvoice_ID)
else "":U
tDIOpenBalance.tiInvoiceId = tDInvoice.DInvoice_ID
tDInvoice.DInvoiceCommentNote = tDIOpenBalance.tcInvoiceCommentNote
tDInvoice.DInvoiceSlsPsn1 = tDIOpenBalance.tcSalesPerson1
tDInvoice.DInvoiceSlsPsn2 = tDIOpenBalance.tcSalesPerson2
tDInvoice.DInvoiceSlsPsn3 = tDIOpenBalance.tcSalesPerson3
tDInvoice.DInvoiceSlsPsn4 = tDIOpenBalance.tcSalesPerson4
tDInvoice.DInvoiceComm1 = tDIOpenBalance.tdDInvoiceCom1
tDInvoice.DInvoiceComm2 = tDIOpenBalance.tdDInvoiceCom2
tDInvoice.DInvoiceComm3 = tDIOpenBalance.tdDInvoiceCom3
tDInvoice.DInvoiceComm4 = tDIOpenBalance.tdDInvoiceCom4.
if tDIOpenBalance.tcPostingType = {&POSTINGTYPE-DEBIT}
then assign tDInvoice.DInvoiceOriginalDebitTC = tDIOpenBalance.tdInvoiceAmountTC
tDInvoice.DInvoiceOriginalDebitLC = tDIOpenBalance.tdInvoiceAmountLC
tDInvoice.DInvoiceOriginalDebitCC = tDIOpenBalance.tdInvoiceAmountCC
tDInvoice.tdDInvoiceOriginalTC = tDIOpenBalance.tdInvoiceAmountTC
tDInvoice.tdDInvoiceOriginalLC = tDIOpenBalance.tdInvoiceAmountLC.
else assign tDInvoice.DInvoiceOriginalCreditTC = tDIOpenBalance.tdInvoiceAmountTC
tDInvoice.DInvoiceOriginalCreditLC = tDIOpenBalance.tdInvoiceAmountLC
tDInvoice.DInvoiceOriginalCreditCC = tDIOpenBalance.tdInvoiceAmountCC
tDInvoice.tdDInvoiceOriginalTC = tDIOpenBalance.tdInvoiceAmountTC
tDInvoice.tdDInvoiceOriginalLC = tDIOpenBalance.tdInvoiceAmountLC.
if tDIOpenBalance.tiInvoiceVoucher = 0
then do:
<Q-74 run JournalBeginsForJEDefault (all) (Read) (Cache)
(input viCompanyId, (CompanyId)
input tDIOpenBalance.tcJournalCode, (JournalCode)
input {&JOURNALCONTROL-LOGISTIC}, (JournalControl)
input '':U, (JournalTypeCode)
output dataset tqJournalBeginsForJEDefault) in BJournal>
find first tqJournalBeginsForJEDefault where
tqJournalBeginsForJEDefault.tcJournalCode = tDIOpenBalance.tcJournalCode and
tqJournalBeginsForJEDefault.tcJournalControl = {&JOURNALCONTROL-LOGISTIC}
no-lock no-error.
if available tqJournalBeginsForJEDefault
then assign vlJournalIsOperational = TRUE.
else assign vlJournalIsOperational = FALSE.
/* Voucher number generation */
/* skip the consective numbering check for Deduction and prepayment. */
if vlCCNIsConsecutNr = TRUE and
vlJournalIsOperational = FALSE and
tDInvoice.DInvoiceType <> {&INVOICETYPE-DEDUCTION} and
tDInvoice.DInvoiceType <> {&INVOICETYPE-PREPAYMENT}
then do:
assign tDIOpenBalance.tiInvoiceVoucher = viCCNTempDInvNbr
viCCNTempDInvNbr = viCCNTempDInvNbr + 1.
end. /* if vlCCNIsConsecutNr = TRUE */
else do:
/* Reserve a number for this sheet. */
/* This number will be released again by housekeeping if the */
/* transaction was not committed by then. */
assign vhFcComponent = ?.
<M-3 run GetNumber
(input tDIOpenBalance.tiCompanyId (iiCompanyId),
input tDIOpenBalance.tiPeriodYear (iiNumbrYear),
input tDIOpenBalance.tcJournalCode (icNumbrType),
output tDIOpenBalance.tiInvoiceVoucher (oiNumber),
input viFcCurrentInstanceId (iiInstanceId),
input vcFcComponentName (icClassName),
output viFcReturnSuper (oiReturnStatus)) in BNumber>
if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave CREATEBLOCK.
end. /* NOT if vlCCNIsConsecutNr = TRUE */
end. /* end tDIOpenBalance.tiInvoiceVoucher = 0 */
assign tDInvoice.DInvoiceVoucher = tDIOpenBalance.tiInvoiceVoucher.
if not can-do(vcCommitNumber,tDInvoice.tc_Rowid)
then assign vcCommitNumber = vcCommitNumber + ",":U + tDInvoice.tc_Rowid.
<Q-4 run DebtorByDebtor (first) (Read) (NoCache)
(input tDIOpenBalance.tiCompanyId, (CompanyId)
input {&ADDRESSTYPECODESYSTEM-HEADOFFICE}, (AddressType)
input ?, (DebtorId)
input tDIOpenBalance.tcDebtorCode, (DebtorCode)
output dataset tqDebtorByDebtor) in BDebtor>
find first tqDebtorByDebtor no-error.
if not available tqDebtorByDebtor
then do:
assign vcMessage = (#T-10'The specified customer is not defined in the system.':150(327)T-10#)
viLocalReturnStatus = -1.
<M-5 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-696':U (icFcMsgNumber),
input '' (icFcExplanation),
input '' (icFcIdentification),
input '' (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
leave CREATEBLOCK.
end. /* end not available tqDebtorByDebtor */
/* default the payment condition of the debtor if not yet filled */
if tDInvoice.tcNormalPaymentConditionCode = "":U or
tDInvoice.tcNormalPaymentConditionCode = ?
then do:
/* get credit terms for deduction invoice if the payment type is stage */
if tDInvoice.DInvoiceType = {&INVOICETYPE-DEDUCTION} or tDInvoice.DInvoiceType = {&INVOICETYPE-PREPAYMENT}
then do:
<Q-87 run DomainCreditTermByDomain (all) (Read) (Cache)
(input viDomainID, (Domain_ID)
output dataset tqDomainCreditTermByDomain) in BDomainProperty>
find first tqDomainCreditTermByDomain no-error.
if tDInvoice.DInvoiceType = {&INVOICETYPE-DEDUCTION}
then do:
if not available tqDomainCreditTermByDomain or
tqDomainCreditTermByDomain.tcDeductPaymentConditionCode = '':U or
tqDomainCreditTermByDomain.tcDeductPaymentConditionCode = ?
then do:
<M-96 run SetMessage
(input #T-97'Cannot find credit term deduction in the current domain.':255(134957455)T-97# (icMessage),
input ? (icArguments),
input ? (icFieldName),
input ? (icFieldValue),
input 'E':U (icType),
input 3 (iiSeverity),
input ? (icRowid),
input 'qadfin-326284':U (icFcMsgNumber),
input ? (icFcExplanation),
input ? (icFcIdentification),
input ? (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
Leave CREATEBLOCK.
end.
if tqDomainCreditTermByDomain.tlDeductPaymentConditionIsActive = false
then do:
<M-65 run SetMessage
(input substitute(#T-65'the Credit Terms Deduction &1 is not active':255(495685807)T-65#, tqDomainCreditTermByDomain.tcDeductPaymentConditionCode) (icMessage),
input ? (icArguments),
input ? (icFieldName),
input ? (icFieldValue),
input 'E' (icType),
input 3 (iiSeverity),
input ? (icRowid),
input 'qadfin-364755':U (icFcMsgNumber),
input ? (icFcExplanation),
input ? (icFcIdentification),
input ? (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
Leave CREATEBLOCK.
end.
assign tDInvoice.tcNormalPaymentConditionCode = tqDomainCreditTermByDomain.tcDeductPaymentConditionCode.
end. /* if tDInvoice.DInvoiceType = {&INVOICETYPE-DEDUCTION} */
if tDInvoice.DInvoiceType = {&INVOICETYPE-PREPAYMENT}
then do:
if available tqDomainCreditTermByDomain and tqDomainCreditTermByDomain.tlPrePaymentConditionIsActive = true
then assign tDInvoice.tcNormalPaymentConditionCode = tqDomainCreditTermByDomain.tcPrePaymentConditionCode.
if tDInvoice.tcNormalPaymentConditionCode = '':U or tDInvoice.tcNormalPaymentConditionCode = ?
then do:
assign tDInvoice.tcNormalPaymentConditionCode = tqDebtorByDebtor.tcNormalPaymentConditionCode.
/* prepayment should use no-stage no-discount payment condition code. */
if tqDebtorByDebtor.tcNormalPaymentType = {&PAYMENTCONDITIONPAYMENTTYPE-STAGED}
then do:
<Q-62 run PaymentConditionByProperties (all) (Read) (Cache)
(input ?, (PaymentCondition_ID)
input ?, (PaymentConditionCode)
input TRUE, (PaymentConditionIsActive)
input {&PAYMENTCONDITIONPAYMENTTYPE-NORMAL}, (PaymentConditionPaymentType)
input ?, (PaymentConditionPdDiscType)
input 0, (PaymentConditionPercentage)
output dataset tqPaymentConditionByProperties) in BPaymentCondition>
find first tqPaymentConditionByProperties no-error.
if available tqPaymentConditionByProperties
then assign tDInvoice.tcNormalPaymentConditionCode = tqPaymentConditionByProperties.tcPaymentConditionCode.
end.
end.
end. /* if tDInvoice.DInvoiceType = {&INVOICETYPE-PREPAYMENT} */
end. /* if tDInvoice.DInvoiceType = {&INVOICETYPE-DEDUCTION} or tDInvoice.DInvoiceType = {&INVOICETYPE-PREPAYMENT} */
else assign tDInvoice.tcNormalPaymentConditionCode = tqDebtorByDebtor.tcNormalPaymentConditionCode.
end. /* if tDInvoice.tcNormalPaymentConditionCode = "":U */
/* default reason of debtor if not yet filled */
if tDInvoice.tcReasonCode = "":U
then assign tDInvoice.Reason_ID = if tqDebtorByDebtor.tiReason_ID = ? then 0 else tqDebtorByDebtor.tiReason_ID
tDInvoice.tcReasonCode = if tqDebtorByDebtor.tcReasonCode = ? then "":U else tqDebtorByDebtor.tcReasonCode.
/* default own vat number, transaction end country */
<Q-6 run CompanyPropertyByBusinessRel (first) (Read) (Cache)
(input tDIOpenBalance.tiCompanyId, (CompanyId)
input ?, (AddressType)
output dataset tqCompanyPropertyByBusinessRel) in BCompanyProperty>
find first tqCompanyPropertyByBusinessRel no-error.
if available tqCompanyPropertyByBusinessRel
then assign tDInvoice.DInvoiceOwnVatNumber = tqCompanyPropertyByBusinessRel.tcAddressTaxIDState
tDInvoice.tcOwnVatNumberCountryCode = tqCompanyPropertyByBusinessRel.tcAddressCountryCode.
/* fill ship to address */
<M-17 run DefaultValuesShipFromShipTo
(input ? (iiDebtorId),
input tDInvoice.tcDebtorCode (icDebtorCode),
output tDInvoice.tcShipToBusinessRelationCode (ocShipToBusinessRelationCode),
output tDInvoice.tcShipToAddressTypeCode (ocShipToAddressTypeCode),
output tDInvoice.tcShipToAddressStreet1 (ocShipToAddressStreet1),
output tDInvoice.tcShipToAddressStreet2 (ocShipToAddressStreet2),
output tDInvoice.tcShipToAddressStreet3 (ocShipToAddressStreet3),
output tDInvoice.tcShipToAddressZip (ocShipToAddressZip),
output tDInvoice.tcShipToAddressCity (ocShipToAddressCity),
output tDInvoice.tcShipToAddressState (ocShipToAddressState),
output tDInvoice.tcShipToCountryCode (ocShipToCountryCode),
output vlDummy (olShipToAddressIsTaxInCity),
output vlDummy (olShipToCountryIsEUCountry),
output vcDummy (ocShipToTxzTaxZone),
output tDInvoice.ShipToAddress_ID (oiShipToAddressId),
output vcDummy (ocDebtorShipToCode),
output vcShipFromBusinessRelationCode (ocShipFromBusinessRelationCode),
output vcShipFromAddressTypeCode (ocShipFromAddressTypeCode),
output vcShipFromAddressStreet1 (ocShipFromAddressStreet1),
output vcShipFromAddressStreet2 (ocShipFromAddressStreet2),
output vcShipFromAddressStreet3 (ocShipFromAddressStreet3),
output vcShipFromAddressZip (ocShipFromAddressZip),
output vcShipFromAddressCity (ocShipFromAddressCity),
output vcShipFromAddressState (ocShipFromAddressState),
output vcShipFromCountryCode (ocShipFromCountryCode),
output vcShipFromTaxIdState (ocShipFromTaxIdState),
output vlShipFromCountryIsEUCountry (olShipFromCountryIsEUCountry),
output vcShipFromTaxZone (ocShipFromTaxZone),
output viShipFromAddressId (oiShipFromAddressId),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave CREATEBLOCK.
if viShipFromAddressId <> 0
then assign tDInvoice.ShipFromAddress_ID = viShipFromAddressId
tDInvoice.tcShipFromBusinessRelationCode = vcShipFromBusinessRelationCode
tDInvoice.tcShipFromAddressTypeCode = vcShipFromAddressTypeCode
tDInvoice.tcShipFromAddressStreet1 = vcShipFromAddressStreet1
tDInvoice.tcShipFromAddressStreet2 = vcShipFromAddressStreet2
tDInvoice.tcShipFromAddressStreet3 = vcShipFromAddressStreet3
tDInvoice.tcShipFromAddressZip = vcShipFromAddressZip
tDInvoice.tcShipFromAddressCity = vcShipFromAddressCity
tDInvoice.tcShipFromAddressState = vcShipFromAddressState
tDInvoice.tcShipFromCountryCode = vcShipFromCountryCode
tDInvoice.tcShipFromTaxIdState = vcShipFromTaxIdState
tDInvoice.tlShipFromCountryIsEUCountry = vlShipFromCountryIsEUCountry
tDInvoice.tcShipFromTaxZone = vcShipFromTaxZone.
/* PTW */
<M-13 run GetDebtorVatNumber
(input tqDebtorByDebtor.tcDebtorCode (icDebtorCode),
input tqDebtorByDebtor.tcBillToDebtorCode (icBillToDebtorCode),
input tqDebtorByDebtor.tcDebtorTaxIDState (icDebtorTaxIDState),
input tqDebtorByDebtor.tcCountryCode (icDebtorCountryCode),
input tqDebtorByDebtor.tlCountryIsEUCountry (ilDebtorCountryIsEUCountry),
output tDInvoice.DInvoiceDebtorVatNumber (ocDebtorVatNumber),
output tDInvoice.tcDebVatNumberCountryCode (ocDebtorVatCountryCode),
output vlTransactionEndIsEUCountry (olDebtorVatCountryIsEUCountry),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave CREATEBLOCK.
/* VAT currency rate - VAT currency itself is defaulted in IntialData */
<M-12 run GetVatExchangeRate (input tDInvoice.tcVatCurrencyCode (icOwnVatCurrencyCode),
input tDInvoice.VatCurrency_ID (iiOwnVatCurrencyId),
input tDInvoice.tcCurrencyCode (icDInvoiceCurrencyCode),
input tDInvoice.DInvoiceCurrency_ID (iiDInvoiceCurrencyId),
input tDInvoice.DInvoiceExchangeRate (idDInvoiceExchangeRate),
input tDInvoice.DInvoiceRateScale (idDInvoiceRateScale),
input tDInvoice.DInvoiceTaxPointDate (itTaxPointDate),
output tDInvoice.DInvoiceVatExchangeRate (odVatExchangeRate),
output tDInvoice.DInvoiceVatRateScale (odVatRateScale),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave CREATEBLOCK.
/* create bank record */
if (tDIOpenBalance.tiBankNumber_ID <> ? and tDIOpenBalance.tiBankNumber_ID <> 0) or
(tDIOpenBalance.tcBankNumber <> ? and tDIOpenBalance.tcBankNumber <> "":U)
then do:
<M-11 run AddDetailLine (input 'DInvoiceBank':U (icTable),
input tDInvoice.tc_Rowid (icParentRowid),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave CREATEBLOCK.
assign tDInvoiceBank.DInvoice_ID = tDInvoice.DInvoice_ID
tDInvoiceBank.BankNumber_ID = tDIOpenBalance.tiBankNumber_ID
tDInvoiceBank.tcBankNumber = tDIOpenBalance.tcBankNumber
tDInvoiceBank.DInvoiceBankToPayTC = tDIOpenBalance.tdInvoiceAmountTC
tDInvoiceBank.tcBankNumberExtension = tDIOpenBalance.tcBankNumberExtension
tDInvoiceBank.tiParentObject_ID = tDInvoice.Debtor_ID
tDInvoiceBank.tcOwnBankNumber = if tDIOpenBalance.tcOwnBankNumber <> ? and tDIOpenBalance.tcOwnBankNumber <> "" then tDIOpenBalance.tcOwnBankNumber else ?
tDInvoiceBank.tcPayFormatTypeCode = if tDIOpenBalance.tcPaymentFormat <> ? and tDIOpenBalance.tcPaymentFormat <> "" then tDIOpenBalance.tcPaymentFormat else ?.
<Q-20 run BankNumberForParentObject (all) (Read) (NoCache)
(input viCompanyId, (CompanyId)
input tDInvoice.Debtor_ID, (ParentObjectID)
input tDIOpenBalance.tcBankNumber, (BankNumber)
input tDIOpenBalance.tcOwnBankNumber, (OwnBankNumber)
input tDIOpenBalance.tcPaymentFormat, (PayFormatTypeCode)
output dataset tqBankNumberForParentObject) in BBankNumber>
for first tqBankNumberForParentObject no-lock:
tDInvoiceBank.BankNumber_ID = tqBankNumberForParentObject.tiBankNumber_ID.
<Q-58 run BankNumberForPayFormatBank (all) (Read) (NoCache)
(input viCompanyId, (CompanyId)
input tDInvoice.Debtor_ID, (ParentObjectID)
input tqBankNumberForParentObject.tiBankNumber_ID, (BankNumberID)
output dataset tqBankNumberForPayFormatBank) in BBankNumber>
for first tqBankNumberForPayFormatBank no-lock:
assign tDInvoiceBank.tiBankPayFormat_ID = tqBankNumberForPayFormatBank.tiBankPayFormat_ID.
end.
end.
if not available tqBankNumberForParentObject
then do:
assign vcMessage = trim(substitute(#T-49'Bank number (&1) not found with Own Bank Number (&2) for Customer (&3) with Payment Format (&4).':255(602301135)T-49#,tDIOpenBalance.tcBankNumber,tDIOpenBalance.tcOwnBankNumber,tDIOpenBalance.tcDebtorCode,tDIOpenBalance.tcPaymentFormat))
oiReturnStatus = -1.
<M-68 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-877379':U (icFcMsgNumber),
input '':U (icFcExplanation),
input '':U (icFcIdentification),
input '':U (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
leave CREATEBLOCK.
end. /* end not available tqDebtorByDebtor */
end. /* end tDIOpenBalance.tiBankNumber_ID <> ? and .. */
else if tDIOpenBalance.tcDebtorCode <> '' and tDIOpenBalance.tcDebtorCode <> ?
then do :
/* Get the Default BankNumber(s) of the Customer */
<Q-51 run BankNumberByDebtor (all) (Read) (NoCache)
(input viCompanyId, (CompanyId)
input tDIOpenBalance.tcDebtorCode, (DebtorCode)
input ?, (Debtor_ID)
input TRUE, (BankNumberIsDefault)
output dataset tqBankNumberByDebtor) in BBankNumberQuery>
for first tqBankNumberByDebtor where
tqBankNumberByDebtor.tcDebtorCode = tDIOpenBalance.tcDebtorCode and
tqBankNumberByDebtor.tlBankNumberIsDefault :
<M-15 run AddDetailLine
(input 'DInvoiceBank':U (icTable),
input tDInvoice.tc_Rowid (icParentRowid),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave CREATEBLOCK.
assign tDInvoiceBank.DInvoice_ID = tDInvoice.DInvoice_ID
tDInvoiceBank.BankNumber_ID = tqBankNumberByDebtor.tiBankNumber_ID
tDInvoiceBank.tcBankNumber = tqBankNumberByDebtor.tcBankNumber
tDInvoiceBank.DInvoiceBankToPayTC = tDIOpenBalance.tdInvoiceAmountTC
tDInvoiceBank.tcBankNumberExtension = tqBankNumberByDebtor.tcBankNumberExtension
tDInvoiceBank.tiBankPayFormat_ID = tqBankNumberByDebtor.tiBankPayFormat_ID
tDInvoiceBank.tiParentObject_ID = tqBankNumberByDebtor.tiParentObject_ID.
end. /* for first tqBankNumberByDebtor */
end. /* tDIOpenBalance.tcDebtorCode <> '' */
assign viDummy = int(entry(lookup(tDInvoice.tcVatCurrencyCode, vcCurrencyDecimalsList) + 1, vcCurrencyDecimalsList)) no-error.
assign vdInvoiceAmountTC = if tDInvoice.DInvoiceType = {&INVOICETYPE-INVOICE} or tDInvoice.DInvoiceType = {&INVOICETYPE-FINANCECHARGE}
then tDInvoice.DInvoiceOriginalDebitTC
else
if tDInvoice.DInvoiceType = {&INVOICETYPE-CREDITNOTE}
then tDInvoice.DInvoiceOriginalCreditTC
else 0.
/* If field tDIOpenBalance.tcBLWIGroupCode is set to SKIPGTMCALLFORNONTAXOPENBAL and the invoice is non-taxable */
/* then we just look for the non-taxable VAT of the domain and create DInvoiceVat ourself */
/* else we call DefaultValuesTax that will create all required data after calling GTM */
/* This was implemented to increase the performance for opening-balances (as they are always non-taxable) */
if tDIOpenBalance.tcBLWIGroupCode = {&SKIPGTMCALLFORNONTAXOPENBAL} and
tDInvoice.DInvoiceIsTaxable = false and
tDInvoice.Company_ID <> 0 and
tDInvoice.Company_ID <> ?
then do :
/* Find the domain of the invoice */
if tDInvoice.Company_ID = viCompanyID
then assign vcDomainCodeOfDInvoice = vcDomainCode.
else do :
<Q-59 run CompanyByCompanyIdCode (all) (Read) (Cache)
(input tDInvoice.Company_ID, (CompanyId)
input ?, (CompanyCode)
output dataset tqCompanyByCompanyIdCode) in BCompany>
Find tqCompanyByCompanyIdCode where
tqCompanyByCompanyIdCode.tiCompany_ID = tDInvoice.Company_ID
no-lock no-error.
if not available tqCompanyByCompanyIdCode
then do :
assign vcMessage = trim(substitute(#T-38'Unable to find the Domain based upon the ID of the Company (&1) of the Invoice':250(211246318)T-38#,tDInvoice.Company_ID))
viLocalReturnStatus = -1.
<M-29 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-416271':U (icFcMsgNumber),
input '' (icFcExplanation),
input '' (icFcIdentification),
input '' (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
leave CREATEBLOCK.
end. /* if not available tqCompanyByCompanyIdCode */
assign vcDomainCodeOfDInvoice = tqCompanyByCompanyIdCode.tcDomainCode.
end. /* Not if tDInvoice.Company_ID = viCompanyID */
/* Remove any taxes that were already on the invoice */
for each tDInvoiceVat where
tDInvoiceVat.tc_ParentRowid = tDInvoice.tc_Rowid :
if tDInvoiceVat.tc_Status = "N":U
then delete tDInvoiceVat.
else assign tDInvoiceVat.tc_Status = "D":U.
end. /* for each tDInvoiceVat where */
/* Query the non-taxable VAT of the domain used for output */
<Q-76 run VATPrim (all) (Read) (Cache)
(input ?, (VatId)
input '00000000':U, (VatCode)
input ?, (DomainId)
input vcDomainCode, (DomainCode)
input {&VATINOUT-OUTPUT}, (VatInOut)
output dataset tqVATPrim) in BVAT>
for first tqVATPrim where
tqVATPrim.tcVatCode = "00000000":U and
tqVATPrim.tcVatInOut = {&VATINOUT-OUTPUT} and
tqVATPrim.tcDomainCode = vcDomainCode
no-lock :
/* Create a tDInvoiceVat with all default values */
<M-873 run AddDetailLine
(input 'DInvoiceVat':U (icTable),
input tDInvoice.tc_Rowid (icParentRowid),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave CREATEBLOCK.
assign tDInvoiceVat.tcVatCode = tqVATPrim.tcVatCode
tDInvoiceVat.tcDomainCode = tqVATPrim.tcDomainCode
tDInvoiceVat.tcVatInOut = tqVATPrim.tcVatInOut
tDInvoiceVat.tcNormalTaxGLCode = "":U
tDInvoiceVat.tcNormalTaxDivisionCode = "":U
tDInvoiceVat.tcAbsRetTaxGLCode = "":U
tDInvoiceVat.tcAbsRetTaxDivisionCode = "":U
tDInvoiceVat.DInvoiceVatIsTaxable = tDInvoice.DInvoiceIsTaxable
tDInvoiceVat.DInvoiceVatSequence = 1
tDInvoiceVat.DInvoiceVatUILinkedRowID = "0":U
tDInvoiceVat.DInvoiceVatVatBaseDebitLC = 0
tDInvoiceVat.DInvoiceVatVatBaseDebitTC = 0
tDInvoiceVat.DInvoiceVatVatBaseCreditLC = 0
tDInvoiceVat.DInvoiceVatVatBaseCreditTC = 0
tDInvoiceVat.DInvoiceVatVatBaseDebitCC = 0
tDInvoiceVat.DInvoiceVatVatBaseCreditCC = 0
tDInvoiceVat.DInvoiceVatNTBaseDebitTC = 0
tDInvoiceVat.DInvoiceVatNTBaseCreditTC = 0
tDInvoiceVat.DInvoiceVatVatDebitTC = 0
tDInvoiceVat.DInvoiceVatVatDebitLC = 0
tDInvoiceVat.DInvoiceVatVatCreditTC = 0
tDInvoiceVat.DInvoiceVatVatCreditLC = 0
tDInvoiceVat.DInvoiceVatIsUpdAllow = false
tDInvoiceVat.DInvoiceVatIsAbsRet = false
tDInvoiceVat.DInvoiceVatIsAccrRcpUs = false
tDInvoiceVat.DInvoiceVatIsRevCharge = false
tDInvoiceVat.DInvoiceVatTaxTrType = {&VATTAXTRANSACTIONTYPE-ARDTCRMEMO}
tDInvoiceVat.TxtyTaxType = {&VATTAXTYPE-NONTAX}
tDInvoiceVat.TxenvTaxEnv = "":U
tDInvoiceVat.TxclTaxCls = "":U
tDInvoiceVat.TxuTaxUsage = "":U.
end. /* for first tqVATPrim where */
end. /* if tDIOpenBalance.tcBLWIGroupCode = {&SKIPGTMCALLFORNONTAXOPENBAL} and */
else do :
<M-16 run DefaultValuesTax
(input tDInvoice.DInvoice_ID (iiDinvoiceId),
input tDInvoice.tcCurrencyCode (icCurrencyCode),
input tDInvoice.DInvoiceVoucher (icDocumentReference),
input tDInvoice.DInvoiceTaxPointDate (itTaxPointDate),
input tDInvoice.tcShipFromTaxZone (icShipFromTaxZone),
input tqDebtorByDebtor.tcAddressTxzTaxZone (icShipToTaxZone),
input tDInvoice.tcDebtorCode (icDebtorCode),
input tqDebtorByDebtor.tcTxclTaxCls (icTxclTaxClass),
input tqDebtorByDebtor.tcTxuTaxUsage (icTxuTaxUsage),
input vdInvoiceAmountTC (idInvoiceAmountTC),
input tDInvoice.DInvoiceExchangeRate (idExchangeRate),
input tDInvoice.DInvoiceRateScale (idExchangeRateScale),
input tDInvoice.tcNormalPaymentConditionCode (icPaymentConditionCode),
input tDInvoice.DInvoicePostingDate (itPostingDate),
input false (ilTaxable),
input tDInvoice.DInvoiceIsTaxExcluded (ilDInvoiceIsTaxExcluded),
input tDInvoice.DInvoiceType (icInvoiceType),
input ? (ilShipToAddressIsTaxInCity),
input tDInvoice.DInvoiceVatExchangeRate (idVatExchangeRate),
input tDInvoice.DInvoiceVatRateScale (idVatRateScale),
input tDInvoice.DInvoiceCCRate (idCCExchangeRate),
input tDInvoice.DInvoiceCCScale (idCCExchangeRateScale),
input tDInvoice.ShipToAddress_ID (iiShipToAddressID),
input viShipFromAddressId (iiShipFromAddressID),
output vcDummy (ocTxenvTaxEnv),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave CREATEBLOCK.
end. /* Not if tDIOpenBalance.tcBLWIGroupCode = {&SKIPGTMCALLFORNONTAXOPENBAL} and */
/* get default subaccount and cost centre if control gl code is defined with it and values are not passed */
assign viControlGLProfileId = if tDInvoice.DInvoiceType = {&INVOICETYPE-PREPAYMENT}
then tqDebtorByDebtor.tiPrePayControlGLProfile_ID
else if tDInvoice.DInvoiceType = {&INVOICETYPE-DEDUCTION}
then tqDebtorByDebtor.tiDeductionCtrlGLProfile_ID
else if tDInvoice.DInvoiceType = {&INVOICETYPE-INVOICE} or
tDInvoice.DInvoiceType = {&INVOICETYPE-FINANCECHARGE} or
tDInvoice.DInvoiceType = {&INVOICETYPE-INVOICECORRECTION}
then tqDebtorByDebtor.tiInvControlGLProfile_ID
else tqDebtorByDebtor.tiCnControlGLProfile_ID
vlError = false
vcControlProfileType = if tDInvoice.DInvoiceType = {&INVOICETYPE-DEDUCTION}
then #T-75'(Deduction)':20(689711431)T-75#
else '':U.
if viControlGLProfileId = ? or viControlGLProfileId = 0
then assign vcMessage = trim(#T-177'The Control GL Profile $1 is not specified in the customer definition':255(450896101)T-177#)
viLocalReturnStatus = -1
vlError = true.
else do:
<Q-56 run ProfileById (all) (Read) (Cache)
(input viControlGLProfileId, (Profile_ID)
output dataset tqProfileById) in BProfile>
find first tqProfileById no-error.
if not available tqProfileById
then do:
assign vcMessage = trim(#T-71'The specified customer Control GL Profile $1 is not defined in the system.':255(477916609)T-71#)
viLocalReturnStatus = -1
vlError = true.
end.
else do:
if tqProfileById.tlProfileIsActive <> true
then do:
assign vcMessage = trim(#T-57'the Control GL Profile $1 of the customer is not active':255(960422682)T-57#)
viLocalReturnStatus = -1
vlError = true.
end.
else do:
<Q-18 run ProfileLinkByGL (all) (Read) (Cache)
(input viControlGLProfileId, (GlProfileId)
input tDInvoice.Company_ID, (CompanyId)
output dataset tqProfileLinkByGL) in BProfile>
find first tqProfileLinkByGl where
tqProfileLinkByGL.tiProfile_ID = viControlGLProfileId
no-error.
if not available tqProfileLinkByGl
then assign vcMessage = trim(#T-239'The specified customer Control GL Profile $1 has no linked GL account':255(488726368)T-239#)
viLocalReturnStatus = -1
vlError = true.
else
do:
if tqProfileLinkByGL.tlGLIsActive <> true
then assign vcMessage = trim(#T-19'the linked GL account of Control GL Profile $1 of the cutomer is not active':255(120191634)T-19#)
viLocalReturnStatus = -1
vlError = true.
end.
end. /*tqProfileById.tlProfileIsActive <> true*/
end. /*end else not available tqProfileById*/
end. /* end else viControlGLProfileId = ? .. */
if vlError
then do:
<M-23 run SetMessage
(input vcMessage (icMessage),
input vcControlProfileType (icArguments),
input '':U (icFieldName),
input '':U (icFieldValue),
input 'E':U (icType),
input 3 (iiSeverity),
input '':U (icRowid),
input 'QadFin-9707':U (icFcMsgNumber),
input '' (icFcExplanation),
input '' (icFcIdentification),
input '' (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
leave CREATEBLOCK.
end. /* end vlError */
assign tDInvoice.tcControlGLCode = tqProfileLinkByGL.tcGLCode
tDInvoice.ControlGL_ID = tqProfileLinkByGL.tiGL_ID.
<M-22 run CreateDIPostingGLAccount
(input tDInvoice.tcControlGLCode (icGLCode),
input ? (iiDivisionId),
input-output tDInvoice.tcDivisionCode (bcDivisionCode),
output vldummy (olGLIsDivisionAcount),
input-output tDInvoice.tcCostCentreCode (bcCostCentreCode),
input-output tDInvoice.tcProjectCode (bcProjectCode),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave CREATEBLOCK.
for each tDInvoiceBank where
tDInvoiceBank.tc_ParentRowid = tDInvoice.tc_Rowid:
<M-36 run CreateDIBankPayCode
(input tDInvoiceBank.DInvoiceBank_ID (iiDInvoiceBankId),
input tDInvoiceBank.tc_Rowid (icDInvoiceBankRowid),
input tDInvoiceBank.BankNumber_ID (iiBankNumberId),
output tApiDInvoiceBankPayCode (tApiDInvoiceBankPayCode),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave CREATEBLOCK.
end. /*FOR EACH tDInvoiceBank */
/* di posting */
/* i don't use it but i have to give it as input parameter so i make it empty first */
empty temp-table tDIAccount.
assign viPostingId = 0
viRepeatingPostingID = iiPostingId. /* to make sure that in case iiPostingId = 0, it stays 0 after the first run */
/* you don't work with taxes here, so you can left those parameters on unknown value */
<M-9 run CreateDIPosting
(input tDInvoice.DInvoice_ID (iiDInvoiceId),
input ? (iiPeriodId),
input tDIOpenBalance.tiPeriodYear (iiPeriodYear),
input tDIOpenBalance.tiPeriodPeriod (iiPeriodPeriod),
input tDIOpenBalance.ttPostingDate (itPostingDate),
input ? (iiDebtorId),
input tDIOpenBalance.tcDebtorCode (icDebtorCode),
input tDIOpenBalance.tcInvoiceType (icDInvoiceType),
input ? (iiDivisionId),
input if tDIOpenBalance.tcTransferAccountDivisionCode = '':U then tDInvoice.tcDivisionCode else tDIOpenBalance.tcTransferAccountDivisionCode (icDivisionCode),
input ? (iiJournalId),
input tDIOpenBalance.tcJournalCode (icJournalCode),
input tDIOpenBalance.tiInvoiceVoucher (iiVoucher),
input tDIOpenBalance.ttInvoiceTaxPointDate (itTaxPointDate),
input tDIOpenBalance.tcInvoiceDescription (icDescription),
input tDIOpenBalance.tdInvoiceAmountTC (idInvoiceAmountTC),
input tDIOpenBalance.tdInvoiceAmountLC (idInvoiceAmountLC),
input tDIOpenBalance.tdInvoiceAmountCC (idInvoiceAmountCC),
input ? (iiCurrencyId),
input tDIOpenBalance.tcTCCurrencyCode (icCurrencyCode),
input tDIOpenBalance.tdExchangeRateTCLC (idExchangeRate),
input if tDIOpenBalance.tdExchangeRateScale = 0 then 1 else tDIOpenBalance.tdExchangeRateScale (idExchangeRateScale),
input tDIOpenBalance.tcPostingText (icDIText),
input tDIOpenBalance.ttInvoiceDate (itInvoiceDate),
input tDIOpenBalance.tcPostingType (icPostingType),
input-output viRepeatingPostingID (biPostingId),
input-output iiBJournalEntryId (biBJournalEntryId),
input tDIAccount (tDIAccount),
input-output tDInvoiceVat (tApiDInvoiceVat),
input tDIOpenBalance.tcTransferAccountGLCode (icGLCode),
input if tDIOpenBalance.tcTransferAccountCostCentreCode = '':U then tDInvoice.tcCostCentreCode else tDIOpenBalance.tcTransferAccountCostCentreCode (icCostCentreCode),
input if tDIOpenBalance.tcTransferAccountProjectCode = '':U then tDInvoice.tcProjectCode else tDIOpenBalance.tcTransferAccountProjectCode (icProjectCode),
input tDIOpenBalance.tlOnlyControlAccount (ilOnlyControlAccount),
input ? (icShipFromCountryCode),
input ? (icShipToCountryCode),
input ? (ilShipFromCountryIsEUCountry),
input ? (ilShipToCountryIsEUCountry),
input ? (icTxclTaxCls),
input ? (icTxuTaxUsage),
input ? (icShipToTxzTaxZone),
input ? (icTxenvTaxEnv),
input ? (icPaymentCondition),
input ? (ilIsTaxInCityFromShipTo),
input ? (ilIsTaxable),
input tDInvoice.tcCostCentreCode (icControlCostCentreCode),
input tDInvoice.tcProjectCode (icControlProjectCode),
input 0 (iiShipFromAddressId),
input 0 (iiShipToAddressId),
input '':U (icSoldToDebtorCode),
input ? (ilDInvoiceIsTaxExcluded),
input tqDebtorByDebtor.tcBusinessRelationCode (icBusinessRelationCode),
input tqDebtorByDebtor.tcBusinessRelationICCode (icBusinessRelationICCode),
input tqDebtorByDebtor.tiInvControlGLProfile_ID (iiInvControlGLProfileId),
input tqDebtorByDebtor.tiCnControlGLProfile_ID (iiCnControlGLProfileId),
input tqDebtorByDebtor.tiPrePayControlGLProfile_ID (iiPrepayControlGLProfileId),
input tqDebtorByDebtor.tiSalesAccountGLProfile_ID (iiSalesAccGLProfileId),
input tqDebtorByDebtor.tiFinChgGLProfile_ID (iiFinChgGLProfileId),
input tDInvoice.tcDivisionCode (icControlDivisionCode),
input tqDebtorByDebtor.tiDeductionCtrlGLProfile_ID (iiDeductionControlGLProfileId),
input if tDIOpenBalance.tcCCCurrencyCode = tDIOpenBalance.tcTCCurrencyCode then ? else tDIOpenBalance.tdExchangeRateTCCC (idExchangeRateCC),
input if tDIOpenBalance.tcCCCurrencyCode = tDIOpenBalance.tcTCCurrencyCode then ? else tDIOpenBalance.tdccExchangeRateScale (idExchangeRateScaleCC),
output viFcReturnSuper (oiReturnStatus)) in BDInvoice>
if viFcReturnSuper <> 0 then assign viLocalReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then leave CREATEBLOCK.
end. /* end for each tDIOpenBalance */
/* exception handling */
assign oiReturnStatus = viLocalReturnStatus.