project QadFinancials > class BCInvoice > method CopyIntoNew

Description

This method accepts CInvoice_ID and create a copy of this invoice


Parameters


iiOriginalCInvoiceIdinputinteger
ilClearDatainputlogical
icNewJournalinputcharacter
itNewPostingDateinputdate
iiNewYearinputinteger
iiNewPeriodinputinteger
iiNewVoucherinputinteger
ilRemoveOrigCInvFromInstanceinputlogical
ocNewInvRowIdoutputcharacter
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BCInvoice.ReplaceCInvoice
method BCInvoice.ReverseCInvoice


program code (program3/bcinvoice.p)

/* =================================================================================================== */
/* Method      : CopyIntoNew                                                                           */
/* Desc        : This method create a copy of the supplier invoice with the input CInvoiceId           */
/* --------------------------------------------------------------------------------------------------- */
/* Params:  (I)  iiOriginalCInvoiceId             id of supplier invoice to be copied                  */
/*          (I)  ilClearData                      flag to determine clear data of the instance or not  */
/*          (I)  icNewJournal                     Journal code of the new invoice                      */
/*          (I)  itNewPostingDate                 Posting Date of the new invoice                      */
/*          (I)  iiNewYear                        Posting Year of the new invoice                      */
/*          (I)  iiNewPeriod                      Posting Period of the new invoice                    */
/*          (I)  iiNewVoucher                     Voucher Number of the new invoice                    */
/* =================================================================================================== */
assign oiReturnStatus = -98.

/* =================================================================================================== */
/* Normalize input parameters                                                                          */
/* =================================================================================================== */
if iiOriginalCInvoiceId = 0           then assign iiOriginalCInvoiceId = ?.
if icNewJournal         = "":U        then assign icNewJournal         = ?.
if iiNewYear            = 0           then assign iiNewYear            = ?.
if iiNewPeriod          = 0           then assign iiNewPeriod          = ?.
if iiNewVoucher         = 0           then assign iiNewVoucher         = ?.

/* =================================================================================================== */
/* Validate input parameters                                                                           */
/* =================================================================================================== */
if iiOriginalCInvoiceId = ?
then do:
    assign vcMessage = trim(#T-1'Invalid input supplier invoice id provided':255(69100)T-1#)
           vcContext = "iiOriginalCInvoiceId = ?":U .
     <M-2 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-7873':U (icFcMsgNumber), 
         input  '':U (icFcExplanation), 
         input  '':U (icFcIdentification), 
         input  vcContext (icFcContext), 
         output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    assign oiReturnStatus = -1.
    return.
end.

/* =================================================================================================== */
/* Clear the intance data otherwise it causes issues when executed multiple times                      */
/* =================================================================================================== */
if ilClearData = true
then do:
    <M-3 run ClearData  (output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper <  0 then return.
end.

/* =================================================================================================== */
/* Load the origianl invoice if it not existing in the instance                                        */
/* =================================================================================================== */
find first tCInvoice where 
           tCInvoice.CInvoice_ID = iiOriginalCinvoiceId 
           no-error.
if not available tCInvoice
then do:
    <M-4 run DataLoad
       (input  '':U (icRowids), 
        input  string(iiOriginalCinvoiceId) (icPkeys), 
        input  '':U (icObjectIds), 
        input  '':U (icFreeform), 
        input  not ilClearData (ilKeepPrevious), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    if viFcReturnSuper <> 0 
    then do:
        assign oiReturnStatus = viFcReturnSuper.
        if viFcReturnSuper < 0
        then do:
            assign vcMessage = trim(substitute(#T-5'Data could not be loaded: unable to load the supplier invoice with ID (&1)':255(69101)T-5#,iiOriginalCInvoiceId)).
            <M-6 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  '':U (icFieldName), 
                input  '':U (icFieldValue), 
                input  'S':U (icType), 
                input  1 (iiSeverity), 
                input  '':U (icRowid), 
                input  'QadFin-7874':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 not available tCInvoice */

/* =================================================================================================== */
/*Create CInvoice CIvnoiceBank CInvoiceBankPayCode CInvoicePO  CInvoiceStage CInvoiceVat CInvoiceWHT   */
/* =================================================================================================== */
/* Create CInvoice Record and copy the data in the original invoice to it */
find first bCInvoice where 
           bCInvoice.CInvoice_ID = iiOriginalCInvoiceId 
           no-error.
<M-9 run AddDetailLine
   (input  'CInvoice':U (icTable), 
    input  '':U (icParentRowid), 
    output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper <  0 then return.

assign viOriginalPostingYear = tCInvoice.CInvoicePostingYear.

buffer-copy bCInvoice 
    except  bCInvoice.CInvoice_ID
            bCInvoice.tc_ParentRowId
            bCInvoice.tc_RowId
            bCInvoice.tc_Status
            bCInvoice.LinkedCInvoice_ID
            bCInvoice.CInvoiceRegistrationNr
         to tCInvoice.

assign tCInvoice.CInvoicePostingYear   = (if iiNewYear    <> ? then iiNewYear    else tCInvoice.CInvoicePostingYear)
       tCInvoice.CInvoicePostingPeriod = (if iiNewPeriod  <> ? then iiNewPeriod  else tCInvoice.CInvoicePostingPeriod)
       tCInvoice.tcJournalCode         = (if icNewJournal <> ? then icNewJournal else tCInvoice.tcJournalCode)
       tCInvoice.CInvoiceVoucher       = (if iiNewVoucher <> ? then iiNewVoucher else tCInvoice.CInvoiceVoucher)
       tCInvoice.CInvoiceTaxPointDate  = (if itNewPostingDate <> ? and itNewPostingDate <> tCInvoice.CInvoicePostingDate then itNewPostingDate else tCInvoice.CInvoiceTaxPointDate)
       tCInvoice.CInvoicePostingDate   = (if itNewPostingDate <> ? then itNewPostingDate else tCInvoice.CInvoicePostingDate).
       
if iiNewVoucher = ?
then do:
    /* Initate the CInvoiceVoucher */
    /* ============================================== */
    /* Check if consecutive numbering is enabled.     */
    /* If so, use a temporary number.                 */
    /* Otherwise use standard numbering functionality */
    /* ============================================== */
    if vlCIDomainIsConsecutNr = true                        and
       (tCInvoice.CInvoiceType <> {&INVOICETYPE-PREPAYMENT} and
        tCInvoice.CInvoiceType <> {&INVOICETYPE-ADJUSTMENT})
    then assign viTempCInvoiceVoucher     = viTempCInvoiceVoucher + 1
                tCInvoice.CInvoiceVoucher = viTempCInvoiceVoucher.
    else do:
        assign vhFcComponent = ?.
        <M-19 run GetNumber
           (input  viCompanyId (iiCompanyId), 
            input  tCInvoice.CInvoicePostingYear (iiNumbrYear), 
            input  tCInvoice.tcJournalCode (icNumbrType), 
            output tCInvoice.CInvoiceVoucher (oiNumber), 
            input  viFcCurrentInstanceId (iiInstanceId), 
            input  vcFcComponentName (icClassName), 
            output viFcReturnSuper (oiReturnStatus)) in BNumber>
        if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
        if viFcReturnSuper <  0 then return.
    end. /* else do: */
end.

/* Registration number */
if viOriginalPostingYear <> tCInvoice.CInvoicePostingYear
then do:
    assign vhFcComponent = ?.
    <M-22 run ReleaseNumber
       (input  viCompanyId (iiCompanyId), 
        input  9999 (iiNumbrYear), 
        input  {&SUPPLIERINVOICEREGNUMBER} (icNumbrType), 
        input  tCInvoice.CInvoiceRegistrationNr (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 vhFcComponent = ?.
    <M-20 run GetNumber
       (input  viCompanyId (iiCompanyId), 
        input  9999 (iiNumbrYear), 
        input  {&SUPPLIERINVOICEREGNUMBER} (icNumbrType), 
        output tCInvoice.CInvoiceRegistrationNr (oiNumber), 
        input  viFcCurrentInstanceId (iiInstanceId), 
        input  vcFcComponentName (icClassName), 
        output viFcReturnSuper (oiReturnStatus)) in BNumber>
    if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper <  0 then return.
end.

assign ocNewInvRowId = tCInvoice.tc_Rowid.

/* Create CInvoiceBank and CInvoiceBankPayCode records */
for each bCInvoiceBank where
         bCInvoiceBank.tc_ParentRowId = bCInvoice.tc_RowId:
    
    <M-10 run AddDetailLine
       (input  'CInvoiceBank':U (icTable), 
        input  tCInvoice.tc_Rowid (icParentRowid), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper <  0 then return.
    
    buffer-copy bCInvoiceBank
        except  bCInvoiceBank.CInvoice_ID
                bCInvoiceBank.CInvoiceBank_ID
                bCInvoiceBank.tc_ParentRowId
                bCInvoiceBank.tc_RowId
                bCInvoiceBank.tc_Status
             to tCInvoiceBank.
    
    assign tCInvoiceBank.CInvoice_ID = tCInvoice.CInvoice_ID.
    for each bCInvoiceBankPayCode where
              bCInvoiceBankPayCode.tc_ParentRowId = bCInvoiceBank.tc_RowId:
        
        <M-11 run AddDetailLine
           (input  'CInvoiceBankPayCode':U (icTable), 
            input  tCInvoiceBank.tc_Rowid (icParentRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
        if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
        if viFcReturnSuper <  0 then return.
        
        buffer-copy bCInvoiceBankPayCode
            except  bCInvoiceBankPayCode.CInvoiceBank_ID
                    bCInvoiceBankPayCode.CInvoiceBankPayCode_ID
                    bCInvoiceBankPayCode.tc_ParentRowId
                    bCInvoiceBankPayCode.tc_RowId
                    bCInvoiceBankPayCode.tc_Status
                 to tCInvoiceBankPayCode.
        assign tCInvoiceBankPayCode.CInvoiceBank_ID = tCInvoiceBank.CInvoiceBank_ID.
    end. /* for each bCInvoiceBankPayCode */
end. /* for each bCInvoiceBank */

/* Create CInvoicePO record */
for each bCInvoicePO where
         bCInvoicePO.tc_ParentRowId = bCInvoice.tc_RowId:
    
    <M-12 run AddDetailLine
       (input  'CInvoicePO':U (icTable), 
        input  tCInvoice.tc_Rowid (icParentRowid), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper <  0 then return.
    
    assign tCInvoicePO.CInvoice_ID        = tCInvoice.CInvoice_ID
           tCInvoicePO.CInvoicePOPoDomain = bCInvoicePO.CInvoicePOPoDomain
           tCInvoicePO.CInvoicePOPoNbr    = bCInvoicePO.CInvoicePOPoNbr.
end.

for each tCInvoicePO where
         tCInvoicePO.tc_ParentRowid = tCInvoice.tc_Rowid and
         (tCInvoicePO.CInvoicePOPoNbr = "":U    or 
          tCInvoicePO.CInvoicePOPoNbr = ?):
    delete tCInvoicePO.
end.

/* Create CInvoiceStage record */
for each bCInvoiceStage where
         bCInvoiceStage.tc_ParentRowId = bCInvoice.tc_RowId:
    
    <M-13 run AddDetailLine
       (input  'CInvoiceStage':U (icTable), 
        input  tCInvoice.tc_Rowid (icParentRowid), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper <  0 then return.
    
    buffer-copy bCInvoiceStage
        except  bCInvoiceStage.CInvoice_ID
                bCInvoiceStage.CInvoiceStage_ID
                bCInvoiceStage.tc_ParentRowid
                bCInvoiceStage.tc_Rowid
                bCInvoiceStage.tc_Status
             to tCInvoiceStage.
    
    assign tCInvoiceStage.CInvoice_ID = tCInvoice.CInvoice_ID.
end.

/* Create CInvoiceVat record */
for each bCInvoiceVat where
         bCInvoiceVat.tc_ParentRowId = bCInvoice.tc_RowId:
    
    <M-48 run AddDetailLine
       (input  'CInvoiceVat':U (icTable), 
        input  tCInvoice.tc_Rowid (icParentRowid), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice> 
    if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper <  0 then return.
    
    buffer-copy bCInvoiceVat
        except  bCInvoiceVat.CInvoice_ID
                bCInvoiceVat.CInvoiceVat_ID
                bCInvoiceVat.tc_ParentRowId
                bCInvoiceVat.tc_RowID
                bCInvoiceVat.tc_Status
        to tCInvoiceVat.
    
    assign tCInvoiceVat.CInvoice_ID = tCInvoice.CInvoice_ID.
    
    /* copy any related CInvoiceWHT records 
       as they have a reference to CInvoiceVat_ID it needs to be done here
    */
    for each bCInvoiceWHT where
         bCInvoiceWHT.tc_ParentRowId = bCInvoice.tc_RowId and 
         bCInvoiceWHT.CInvoiceVat_ID = bCInvoiceVat.CInvoiceVat_ID:
    
        <M-59 run AddDetailLine
           (input  'CInvoiceWHT':U (icTable), 
            input  tCInvoice.tc_Rowid (icParentRowid), 
            output viFcReturnSuper (oiReturnStatus)) in BCInvoice> 
        if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
        if viFcReturnSuper <  0 then return.
        
        buffer-copy bCInvoiceWHT 
            except  bCInvoiceWHT.CInvoice_ID
                    bCInvoiceWHT.CInvoiceWHT_ID
                    bCInvoiceWHT.CInvoiceVat_ID
                    bCInvoiceWHT.tc_ParentRowId
                    bCInvoiceWHT.tc_RowID
                    bCInvoiceWHT.tc_Status
            to tCInvoiceWHT.
        
        assign  tCInvoiceWHT.CInvoice_ID = tCInvoice.CInvoice_ID
                tCInvoiceWHT.CInvoiceVat_ID = tCInvoiceVat.CInvoiceVat_ID.
    end. /* for each bCInvoiceWHT */
end.

/* Create CInvoiceWHT which are not related to CInvoiceVAT record 
    i.e. created manually */
for each bCInvoiceWHT where
         bCInvoiceWHT.tc_ParentRowId = bCInvoice.tc_RowId and
         (bCInvoiceWHT.CInvoiceVat_ID = ? or
          bCInvoiceWHT.CInvoiceVat_ID = 0
         ):
    
    <M-17 run AddDetailLine
       (input  'CInvoiceWHT':U (icTable), 
        input  tCInvoice.tc_Rowid (icParentRowid), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice> 
    if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper <  0 then return.
    
    buffer-copy bCInvoiceWHT 
        except  bCInvoiceWHT.CInvoice_ID
                bCInvoiceWHT.CInvoiceWHT_ID
                bCInvoiceWHT.CInvoiceVat_ID
                bCInvoiceWHT.tc_ParentRowId
                bCInvoiceWHT.tc_RowID
                bCInvoiceWHT.tc_Status
        to tCInvoiceWHT.
    
    assign tCInvoiceWHT.CInvoice_ID = tCInvoice.CInvoice_ID.
end.
/* Check, if there was already created MF posting and default MF Journal from that */
if tCInvoice.CInvoiceIsLogisticMatching = false and
   tCInvoice.tcReasonAllocationStatus   <> {&ALLOCSTATUS-NOALLOC} /* CA672164 */
then do:
    find first bCInvoicePosting where
               bCInvoicePosting.tc_ParentRowid = bCInvoice.tc_Rowid and
               bCInvoicePosting.CInvoicePostingType = {&INVOICEPOSTINGTYPE-ALLOCATION}
        no-error.
    if available bCInvoicePosting
    then do:
        <Q-23 run PostingByPostingId (all) (Read) (NoCache)
          (input viCompanyId, (CompanyId)
           input bCInvoicePosting.Posting_ID, (PostingId)
           input ?, (JournalTypeCode)
           output dataset tqPostingByPostingId) in BPosting >
        find first tqPostingByPostingId where
                   tqPostingByPostingId.tiPosting_ID = bCInvoicePosting.Posting_ID
                   no-error.
        if available tqPostingByPostingId
        then assign tCInvoice.tcMFJournalCode = tqPostingByPostingId.tcJournalCode.
    end. /* if available bCInvoicePosting */
end. /* if bCInvoice.CInvoiceIsLogisticMatching = true and */ 

/* ========================================================================================= */
/* Remove the original invoice from instance                                                 */
/* ========================================================================================= */
if ilRemoveOrigCInvFromInstance
then do:
    <M-8 run RemoveInvoiceFromInstance
       (input  iiOriginalCInvoiceId (iiOriginalCInvoiceId), 
        output viFcReturnSuper (oiReturnStatus)) in BCInvoice>
    if viFcReturnSuper <> 0 then assign oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper <  0 then return. end. /* if ilRemoveOriginalInvFromInstance */

/* =================================================================================================== */
/* Return                                                                                              */
/* =================================================================================================== */
if oiReturnStatus = -98 then assign oiReturnStatus = 0.