Parameters
iiOriginalCInvoiceId | input | integer | |
oiCIPostingID | output | integer | |
oiMFPostingID | output | integer | |
oiBJournalEntryID | output | integer | |
oiReturnStatus | output | integer | Return status of the method. |
Internal usage
unused
program code (program3/bcinvoice.p)
/* =================================================================================================== */
/* Method : ReplaceCInvoice */
/* Desc : This method replace the supplier invoice with the input CInvoiceId */
/* --------------------------------------------------------------------------------------------------- */
/* Params: (I) iiOriginalCInvoiceId id of supplier invoice to be copied */
/* =================================================================================================== */
assign oiReturnStatus = -98.
if iiOriginalCInvoiceId <> ?
then do:
<M-79 run DataLoad
(input ? (icRowids),
input ? (icPkeys),
input string(iiOriginalCInvoiceId) (icObjectIds),
input ? (icFreeform),
input true (ilKeepPrevious),
output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
find tCInvoice where
tCInvoice.CInvoice_ID = iiOriginalCInvoiceId
no-error.
if not available tCInvoice
then assign viFcReturnSuper = -1.
if viFcReturnSuper <> 0
then do:
assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then do:
assign vcMessage = substitute(#T-60'The system cannot replace the selected invoice. The system cannot load data for the supplier invoice (&1) to replace.':255(222153383)T-60#,iiOriginalCInvoiceId).
<M-42 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-533963':U (icFcMsgNumber),
input '':U (icFcExplanation),
input '':U (icFcIdentification),
input '':U (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
return.
end. /* if viFcReturnSuper < 0 */
end. /* if viFcReturnSuper <> 0 */
end. /* if iiOriginalCInvoiceId <> ? */
/* =================================================================================================== */
/* Copy data from the original invoice */
/* =================================================================================================== */
<M-6 run CopyIntoNew
(input iiOriginalCInvoiceId (iiOriginalCInvoiceId),
input true (ilClearData),
input ? (icNewJournal),
input ? (itNewPostingDate),
input ? (iiNewYear),
input ? (iiNewPeriod),
input ? (iiNewVoucher),
input false (ilRemoveOrigCInvFromInstance),
output vcReplacingCInvoiceID (ocNewInvRowId),
output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then return.
find bOrigCInvoice where
bOrigCInvoice.CInvoice_ID = iiOriginalCInvoiceId
no-error.
find tCInvoice where
tCInvoice.tc_Rowid = vcReplacingCInvoiceID
no-error.
if not available bOrigCInvoice or
not available tCInvoice
then do:
assign vcMessage = #T-93'Cannot process the replacement of the supplier invoice.':255(988713502)T-93#
vcContext = "iiOriginalCInvoiceId=&1|available orig CInvoice=&2|vcNewInvRowId=&3|available new CInvoice=&4":U
vcContext = substitute(vcContext,iiOriginalCInvoiceId, available bOrigCInvoice, vcReplacingCInvoiceID, available tCInvoice)
vcContext = replace(vcContext, "|":U, chr(2)).
<M-82 run SetMessage
(input vcMessage (icMessage),
input '':U (icArguments),
input '':U (icFieldName),
input '':U (icFieldValue),
input 'S':U (icType),
input 3 (iiSeverity),
input '':U (icRowid),
input 'qadfin-407309':U (icFcMsgNumber),
input '':U (icFcExplanation),
input '':U (icFcIdentification),
input vcContext (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
assign oiReturnStatus = -1.
return.
end.
find tCInvoice where
tCInvoice.tc_Rowid = vcReplacingCInvoiceID no-error.
/* Assign the Balance fields and other fields to make the invoice as a open one */
assign tCInvoice.ReplacedCInvoice_ID = iiOriginalCInvoiceId
tCInvoice.CInvoiceBalanceDebitLC = 0
tCInvoice.CInvoiceBalanceDebitCC = 0
tCInvoice.CInvoiceBalanceDebitTC = 0
tCInvoice.CInvoiceBalanceCreditLC = 0
tCInvoice.CInvoiceBalanceCreditCC = 0
tCInvoice.CInvoiceBalanceCreditTC = 0
tCInvoice.CInvoiceBalanceTC = 0
tCInvoice.CInvoiceBalanceLC = 0
tCInvoice.CInvoiceBalanceCC = 0
tCInvoice.tdCInvoiceOpenAmount = 0
tCInvoice.tdCInvoiceOriginalAmount = 0
tCInvoice.CInvoiceHoldAmountTC = 0
tCInvoice.CInvoiceIsOpen = true
tCInvoice.CInvoiceClosingDate = 12/31/9999
tCInvoice.CInvoiceCirecClosingDate = 12/31/9999.
if tCInvoice.CInvoiceAllocationStatus = {&ALLOCSTATUS-NOALLOC}
then do:
<Q-67 run ReasonById (all) (Read) (NoCache)
(input tCInvoice.Reason_ID, (ReasonId)
output dataset tqReasonById) in BReason>
find first tqReasonById where tqReasonById.tiReason_ID = tCInvoice.Reason_ID no-error.
if available tqReasonById
then assign tCInvoice.CInvoiceIsLogisticMatching = tqReasonById.tlReasonIsLogisticMatching.
end.
/* If invoice was logistically matched, there was assigned another reason code indicating, */
/* that this invoice is matched -> therefor we have to restore original invoice status */
/* code. This is quite difficult, becuase there is not kept history or this status codes */
/* System will look for invoice status code, which has this status code as "after matching" */
/* the one currently assigned to supplier invoice and does defaulting of this */
/* If this fails, default supplier's invoice status code is retrieved */
if tCInvoice.CInvoiceAllocationStatus = {&ALLOCSTATUS-ALLOC} and
tCInvoice.CInvoiceIsLogisticMatching = true
then do:
assign vcReasonIDs = "":U
vcReasonCodes = "":U
vcAllocationStatuses = "":U
vcIsLogisMatchings = "":U
vcIsLockPayment = "":U
vcIsInitialStatus = "":U
vcIsInvoiceApproved = "":U
viCandidateReasonNum = 0.
<Q-23 run ReasonByMatchingReasonId (all) (Read) (NoCache)
(input tCInvoice.Reason_ID, (MatchingReasonId)
output dataset tqReasonByMatchingReasonId) in BReason >
for each tqReasonByMatchingReasonId where
tqReasonByMatchingReasonId.tiMatchingReason_ID = tCInvoice.Reason_ID:
assign vcReasonIDs = vcReasonIDs + string(tqReasonByMatchingReasonId.tiReason_ID) + ",":U
vcReasonCodes = vcReasonCodes + tqReasonByMatchingReasonId.tcReasonCode + ",":U
vcAllocationStatuses = vcAllocationStatuses + tqReasonByMatchingReasonId.tcReasonAllocationStatus + ",":U
vcIsLogisMatchings = vcIsLogisMatchings + string(tqReasonByMatchingReasonId.tlReasonIsLogisticMatching) + ",":U
vcIsLockPayment = vcIsLockPayment + string(tqReasonByMatchingReasonId.tlReasonIsLockPayment) + ",":U
vcIsInitialStatus = vcIsInitialStatus + string(tqReasonByMatchingReasonId.tlReasonIsInitialStatus) + ",":U
vcIsInvoiceApproved = vcIsInvoiceApproved + string(tqReasonByMatchingReasonId.tlReasonIsInvoiceApproved) + ",":U.
end. /* for each tqReasonByMatchingReasonId where */
if vcReasonIDs <> "":U
then do:
assign vcReasonIDs = trim(vcReasonIDs, ",":U)
vcReasonCodes = trim(vcReasonCodes, ",":U)
vcAllocationStatuses = trim(vcAllocationStatuses, ",":U)
vcIsLogisMatchings = trim(vcIsLogisMatchings, ",":U)
vcIsLockPayment = trim(vcIsLockPayment, ",":U)
vcIsInitialStatus = trim(vcIsInitialStatus, ",":U)
vcIsInvoiceApproved = trim(vcIsInvoiceApproved, ",":U).
assign viCandidateReasonNum = num-entries(vcReasonIDs).
if viCandidateReasonNum = 1
then assign tCInvoice.Reason_ID = integer(vcReasonIDs)
tCInvoice.tcReasonCode = vcReasonCodes
tCInvoice.tcReasonAllocationStatus = vcAllocationStatuses
tCInvoice.CInvoiceAllocationStatus = vcAllocationStatuses
tCInvoice.CInvoiceIsLogisticMatching = logical(vcIsLogisMatchings)
tCInvoice.CInvoiceIsLockPayment = logical(vcIsLockPayment)
tCInvoice.CInvoiceIsInitialStatus = logical(vcIsInitialStatus)
tCInvoice.CInvoiceIsInvoiceApproved = logical(vcIsInvoiceApproved).
end. /* if vcReasonIDs <> "":U */
if viCandidateReasonNum <> 1
then do:
/* Get supplier definition and take reason code from there */
<Q-27 run CreditorForCInvoiceDefault (all) (Read) (NoCache)
(input viCompanyId, (CompanyId)
input tCInvoice.tcCreditorCode, (CreditorCode)
input {&ADDRESSTYPECODESYSTEM-HEADOFFICE}, (AddressTypeCode)
output dataset tqCreditorForCInvoiceDefault) in BCreditor >
if viCandidateReasonNum > 1
then do:
for each tqCreditorForCInvoiceDefault where
tqCreditorForCInvoiceDefault.tcCreditorCode = tCInvoice.tcCreditorCode:
assign viSelectedReason = lookup(tqCreditorForCInvoiceDefault.tcReasonCode, vcReasonCodes).
if viSelectedReason <> 0
then do:
assign tCInvoice.Reason_ID = integer(entry(viSelectedReason, vcReasonIDs))
tCInvoice.tcReasonCode = tqCreditorForCInvoiceDefault.tcReasonCode
tCInvoice.tcReasonAllocationStatus = tqCreditorForCInvoiceDefault.tcReasonAllocationStatus
tCInvoice.CInvoiceAllocationStatus = tqCreditorForCInvoiceDefault.tcReasonAllocationStatus
tCInvoice.CInvoiceIsLogisticMatching = tqCreditorForCInvoiceDefault.tlReasonIsLogisticMatching
tCInvoice.CInvoiceIsLockPayment = tqCreditorForCInvoiceDefault.tlReasonIsLockPayment
tCInvoice.CInvoiceIsInitialStatus = tqCreditorForCInvoiceDefault.tlReasonIsInitialStatus
tCInvoice.CInvoiceIsInvoiceApproved = tqCreditorForCInvoiceDefault.tlReasonIsInvoiceApproved
viCandidateReasonNum = -1.
leave.
end. /* if viSelectedReason <> 0 */
end. /* for each tqCreditorForCInvoiceDefault where */
if viCandidateReasonNum <> -1
then assign tCInvoice.Reason_ID = integer(entry(1, vcReasonIDs))
tCInvoice.tcReasonCode = entry(1, vcReasonCodes)
tCInvoice.tcReasonAllocationStatus = entry(1, vcAllocationStatuses)
tCInvoice.CInvoiceAllocationStatus = entry(1, vcAllocationStatuses)
tCInvoice.CInvoiceIsLogisticMatching = logical(entry(1, vcIsLogisMatchings))
tCInvoice.CInvoiceIsLockPayment = logical(entry(1, vcIsLockPayment))
tCInvoice.CInvoiceIsInitialStatus = logical(entry(1, vcIsInitialStatus))
tCInvoice.CInvoiceIsInvoiceApproved = logical(entry(1, vcIsInvoiceApproved)).
end. /* if viCandidateReasonNum > 1 */
else do:
find first tqCreditorForCInvoiceDefault where
tqCreditorForCInvoiceDefault.tcCreditorCode = tCInvoice.tcCreditorCode no-error.
if available tqCreditorForCInvoiceDefault and
tqCreditorForCInvoiceDefault.tlReasonIsLogisticMatching = true and
tqCreditorForCInvoiceDefault.tcReasonAllocationStatus = {&ALLOCSTATUS-NOALLOC}
then assign tCInvoice.Reason_ID = ?
tCInvoice.tcReasonCode = tqCreditorForCInvoiceDefault.tcReasonCode
tCInvoice.tcReasonAllocationStatus = tqCreditorForCInvoiceDefault.tcReasonAllocationStatus
tCInvoice.CInvoiceAllocationStatus = tqCreditorForCInvoiceDefault.tcReasonAllocationStatus
tCInvoice.CInvoiceIsLogisticMatching = tqCreditorForCInvoiceDefault.tlReasonIsLogisticMatching
tCInvoice.CInvoiceIsLockPayment = tqCreditorForCInvoiceDefault.tlReasonIsLockPayment
tCInvoice.CInvoiceIsInitialStatus = tqCreditorForCInvoiceDefault.tlReasonIsInitialStatus
tCInvoice.CInvoiceIsInvoiceApproved = tqCreditorForCInvoiceDefault.tlReasonIsInvoiceApproved.
else do:
assign vcMessage = #T-24'The system was unable to restore the original invoice status code.':255(69227)t-24#.
<M-25 run SetMessage
(input vcMessage (icMessage),
input '':U (icArguments),
input 'tCInvoice.tcReasonCode':U (icFieldName),
input tCInvoice.tcReasonCode (icFieldValue),
input 'W':U (icType),
input 4 (iiSeverity),
input tCInvoice.tc_Rowid (icRowid),
input 'QadFin-7969':U (icFcMsgNumber),
input '':U (icFcExplanation),
input '':U (icFcIdentification),
input '':U (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
assign oiReturnStatus = 1.
end. /* else */
end. /* else */
end. /* if viCandidateReasonNum <> 1 */
end. /* if tCInvoice.CInvoiceAllocationStatus = {&ALLOCSTATUS-ALLOC} and */
/* If the status is set to initial the voucher needs to be reverted back to zero */
if vlCIDomainIsConsecutNr = true and
tCInvoice.CInvoiceIsInitialStatus = true and
tCInvoice.CInvoiceVoucher <> 0
then assign tCInvoice.CInvoiceVoucher = 0.
/* Reinitialize cinvoice bank - because closed invoice does not have details about amounts */
/* which should be payed by each line, whole open amount is assigned to first bank line */
for each tCInvoiceBank where
tCInvoiceBank.tc_ParentRowid = tCInvoice.tc_Rowid:
assign tCInvoiceBank.CInvoiceBankToPayTC = tCInvoice.tdCInvoiceOriginalTC.
leave.
end.
/* Open communication with the component BDocumentLink */
if viBDocumentLinkCIID = 0 or
viBDocumentLinkCIID = ?
then do:
<I-13 {bFcStartAndOpenInstance
&ADD-TO-TRANSACTION = "true"
&CLASS = "BDocumentLink"}>
assign vlBDocLinkSartedFromCI = true.
end.
else if not valid-handle(vhBDocumentLinkCIInst)
then do:
<I-14 {bFcOpenInstance
&CLASS = "BDocumentLink"}>
end.
/* Copy the Link from the Original Invoice to the Replacement invoice */
<M-15 run CopyObjectsDocuments
(input 'BCInvoice':U (icSourceComponent),
input iiOriginalCInvoiceId (iiSourceObjectId),
input 'BCInvoice':U (icDestinationComponent),
input tCInvoice.CInvoice_ID (iiDestinationObjectId),
output viLocalReturnStatus (oiReturnStatus)) in BDocumentLink>
/* Close communication with BDocumentLink */
if valid-handle(vhBDocumentLinkCIInst)
then do:
<I-28 {bFcCloseInstance
&CLASS = "BDocumentLink"}>
end.
if viLocalReturnStatus <> 0 then assign oiReturnStatus = viLocalReturnStatus.
if viLocalReturnStatus < 0
then do:
<M-16 run StopExternalInstances (output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
return.
end.
assign vcNewControlGLCode = ?.
<Q-69 run CreditorForCInvoiceDefault (all) (Read) (NoCache)
(input viCompanyId, (CompanyId)
input tCInvoice.tcCreditorCode, (CreditorCode)
input {&ADDRESSTYPECODESYSTEM-HEADOFFICE}, (AddressTypeCode)
output dataset tqCreditorForCInvoiceDefault) in BCreditor>
find first tqCreditorForCInvoiceDefault where
tqCreditorForCInvoiceDefault.tcCreditorCode = tCInvoice.tcCreditorCode and
tqCreditorForCInvoiceDefault.tlCreditorIsActive = true and
tqCreditorForCInvoiceDefault.tcAddressTypeCode = {&ADDRESSTYPECODESYSTEM-HEADOFFICE}
no-error.
if not available tqCreditorForCInvoiceDefault
then do:
assign vcMessage = #T-38'Some data is missing for supplier &1.':255(69587)T-38#
vcMessage = substitute(vcMessage, tCInvoice.tcCreditorCode).
<M-17 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-969285':U (icFcMsgNumber),
input '':U (icFcExplanation),
input '':U (icFcIdentification),
input '':U (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
assign oiReturnStatus = -1.
return.
end.
assign viControlGLProfileId = if tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICE} or
tCInvoice.CInvoiceType = {&INVOICETYPE-INVOICECORRECTION}
then tqCreditorForCInvoiceDefault.tiInvControlGLProfile_ID
else tqCreditorForCInvoiceDefault.tiCnControlGLProfile_ID.
<Q-85 run ProfileLinkByGL (all) (Read) (NoCache)
(input viControlGLProfileId, (GlProfileId)
input viCompanyId, (CompanyId)
output dataset tqProfileLinkByGL) in BProfile>
find tqProfileLinkByGL where
tqProfileLinkByGL.tiProfile_ID = viControlGlProfileId
no-error.
if not available tqProfileLinkByGL
then do:
assign vcMessage = #T-58'The supplier control account is not defined in the system.':255(69590)T-58#.
<M-54 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-626547':U (icFcMsgNumber),
input '':U (icFcExplanation),
input '':U (icFcIdentification),
input '':U (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
assign oiReturnStatus = -1.
return.
end.
assign vcNewControlGLCode = tqProfileLinkByGL.tcGLCode.
if tCInvoice.tcReasonAllocationStatus = {&ALLOCSTATUS-ALLOC} and
tCInvoice.CInvoiceIsLogisticMatching <> true
then do:
<M-10 run ReplaceCInvoicePosting
(input bOrigCInvoice.tc_Rowid (icOrigCInvoiceRowId),
input tCInvoice.tc_Rowid (icNewCInvoiceRowId),
input tCInvoice.CInvoicePostingYear (iiReplaceInvYear),
input tCInvoice.CInvoicePostingPeriod (iiReplaceInvPeriod),
input ? (icReplaceInvJournal),
input tCInvoice.CInvoiceVoucher (iiReplaceInvVoucher),
input tCInvoice.CInvoicePostingDate (itReplaceInvPostingDate),
input tCInvoice.CInvoiceDescription (icReplaceInvDescription),
input vcNewControlGLCode (icNewControlGLCode),
input tCInvoice.tcDivisionCode (icDivisionCode),
input tCInvoice.tcCostCentreCode (icCostCentreCode),
input tCInvoice.tcProjectCode (icProjectCode),
output oiCIPostingID (oiCiPostingId),
output oiMFPostingID (oiMfPostingId),
output oiBJournalEntryID (oiBJournalEntryId),
output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then return.
end.
/* =================================================================================================== */
/* Do some post validations */
/* This code is executed here quite late. Because UI requires one invoice in instance, we created */
/* this one invoice. If error during validation is reased, UI blocks further processing */
/* =================================================================================================== */
/* Check the Activity code, if it is not 'Replace' do nothing and return error */
/* =================================================================================================== */
if vcActivityCode <> "Replace":U
then do:
assign vcMessage = trim(substitute(#T-21'Invalid Activity (&1): the Replace operation of the supplier invoice could only be done for Replace activity':255(69106)t-21#,vcActivityCode)).
<M-18 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-7924':U (icFcMsgNumber),
input '':U (icFcExplanation),
input '':U (icFcIdentification),
input '':U (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
assign oiReturnStatus = -1.
return.
end.
/* Make sure that invoice replace is not allowed when fiscal confirm is active */
/* For backwards compatibility reasons we should check the mfg pro version number */
/* Also, need to consider that not all supplier invoices are created via ERS Processor */
if tCInvoice.tlCInvoiceIsForLegalDoc
then do:
if viMfgProMajorVersionBCI > 3 /* Meaning eB3 */ or
(viMfgProMajorVersionBCI = 3 /* Meaning eB3 */ and
viMfgProMinorVersionBCI >= 7 /* Meaning SP7 */)
then do:
/* Check if the Fiscal confirmation is required */
/* value is stored in PurchaseControl file (poc_ctrl) */
<Q-7 run POAccountingControlByDomainV01 (all) (Read) (NoCache)
(input vcDomainCode, (Domain)
output dataset tqPOAccountingControlByDomainV01) in BMfgPOAccountingControl>
find first tqPOAccountingControlByDomainV01 where
tqPOAccountingControlByDomainV01.tcpoc_domain = vcDomainCode.
if available tqPOAccountingControlByDomainV01 and
tqPOAccountingControlByDomainV01.tlpoc_fiscal_confirm = true
then do:
assign vcMessage = trim(#T-51'You cannot replace an ERS supplier invoice whilst fiscal confirm required is active.':255(77851874)T-51#).
<M-74 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-90874':U (icFcMsgNumber),
input '':U (icFcExplanation),
input '':U (icFcIdentification),
input '':U (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
assign oiReturnStatus = -1.
return.
end. /* if available tqPOAccountingControlByDomainV01 and*/
end. /* if viMfgProMajorVersionBCI > 3 */
end. /* if tCInvoice.tlCInvoiceIsForLegalDoc */
/* Make sure that the invoice we are going to Replace is a Reverse Invoice */
<Q-19 assign vlFcQueryRecordsAvailable = CInvoiceForLinkedCInvoice (NoCache)
(input viCompanyId, (CompanyId)
input iiOriginalCInvoiceId, (CInvoiceId)) in BCInvoice >
if not vlFcQueryRecordsAvailable
then do:
assign vcMessage = trim(#T-22'You can only replace reversed invoices.':255(69102)t-22#).
<M-20 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-7925':U (icFcMsgNumber),
input '':U (icFcExplanation),
input '':U (icFcIdentification),
input '':U (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
assign oiReturnStatus = -1.
return.
end.
<Q-40 run JournalPrim (all) (Read) (NoCache)
(input viCompanyId, (CompanyId)
input ?, (JournalCode)
input tCInvoice.Journal_ID, (JournalID)
output dataset tqJournalPrim) in BJournal>
find first tqJournalPrim where tqJournalPrim.tiJournal_ID = tCInvoice.Journal_ID no-error.
if available tqJournalPrim
then do:
/* New number was retrived only when Consecutive number is not active and this is not preypayment or adjustment */
if not (vlCIDomainIsConsecutNr = true and
tCInvoice.CInvoiceType <> {&INVOICETYPE-PREPAYMENT} and
tCInvoice.CInvoiceType <> {&INVOICETYPE-ADJUSTMENT})
then do:
/* release invoice number when status is changed from non-initial into initial */
if (tCInvoice.CInvoiceIsInitialStatus = true and
tCInvoice.CInvoiceVoucher <> ? and
tCInvoice.CInvoiceVoucher <> 0)
then do:
assign vhFcComponent = ?.
<M-94 run ReleaseNumber
(input viCompanyId (iiCompanyId),
input tCInvoice.CInvoicePostingYear (iiNumbrYear),
input tqJournalPrim.tcJournalCode (icNumbrType),
input tCInvoice.CInvoiceVoucher (iiNumbr),
input viFcCurrentInstanceId (iiInstanceId),
input vcFcComponentName (icClassName),
output viFcReturnSuper (oiReturnStatus)) in BNumber>
if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then return.
assign tCInvoice.CInvoiceVoucher = 0.
end.
end. /* if not (vlCIDomainIsConsecutNr = true */
end. /* if available tqJournalPrim */
if tCInvoice.CInvoiceIsInitialStatus = true
then do:
for each tCInvoiceMovement where
tCInvoiceMovement.tc_ParentRowid = tCInvoice.tc_Rowid:
delete tCInvoiceMovement.
end.
for each tCInvoicePosting where
tCInvoicePosting.tc_ParentRowid = tCInvoice.tc_Rowid:
delete tCInvoicePosting.
end.
if viBJournalEntryCIID = 0
then do:
<I-1 {bFcStartAndOpenInstance
&ADD-TO-TRANSACTION = "true"
&CLASS = "BJournalEntry"}>
assign vlBJEIsStartedFromCI = true.
end.
else if not valid-handle(vhBJournalEntryCIInst)
then do:
<I-88 {bFcOpenInstance
&CLASS = "BJournalEntry"}>
end.
/* ======================================================================== */
/* make instance of posting empty */
/* ======================================================================== */
<M-56 run ClearData (output viExternalStatus (oiReturnStatus)) in BJournalEntry>
<I-57 {bFcCloseInstance
&CLASS = "BJournalEntry"}>
if viExternalStatus <> 0 then assign oiReturnStatus = viExternalStatus.
if viExternalStatus < 0 then return.
end.
/* ========================================================================================= */
/* Remove the origianl invoice from instance */
/* ========================================================================================= */
<M-96 run RemoveInvoiceFromInstance
(input iiOriginalCInvoiceId (iiOriginalCInvoiceId),
output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0 then return.
/* ======= */
/* Return */
/* ======= */
if oiReturnStatus = -98
then assign oiReturnStatus = 0.