USP_DATAFORMTEMPLATE_EDIT_DISBURSEMENTPROCESS_FINALIZE_EDIT

The save procedure used by the edit dataform template "Disbursement Process Review And Commit Checks Edit Data Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN The input ID parameter indicating the ID of the record being edited.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@UNSUCESSFULACTION tinyint IN Action
@SUCCESSFULCHECKPRINTINGCODE tinyint IN Successful check printing value
@RANGESGRID xml IN

Definition

Copy

CREATE procedure [dbo].[USP_DATAFORMTEMPLATE_EDIT_DISBURSEMENTPROCESS_FINALIZE_EDIT](
    @ID uniqueidentifier
    ,@CHANGEAGENTID uniqueidentifier = null
  ,@UNSUCESSFULACTION tinyint
  ,@SUCCESSFULCHECKPRINTINGCODE tinyint
  ,@RANGESGRID xml
)
as

    set nocount on;

  begin try 

    declare @TRANSACTIONCURRENCYID uniqueidentifier;
    declare @PDACCOUNTSYSTEMID uniqueidentifier;
    declare @BANKACCOUNTID uniqueidentifier;
    declare @HASUNSUCCESSFUL bit
    set @HASUNSUCCESSFUL=0
    declare @CHANGESTATUSREPRINTED bit
    set @CHANGESTATUSREPRINTED=0
    declare @CHANGESTATUSCOMMITTED bit
    set @CHANGESTATUSCOMMITTED=0
    declare @PERFORMREPRINTACTION bit
    set @PERFORMREPRINTACTION=0
    declare @PERFORMVOIDACTION bit
    set @PERFORMVOIDACTION=0
    declare @PERFORMREPRINTANDVOIDACTION bit
    set @PERFORMREPRINTANDVOIDACTION=0
    declare @ReprintIDs table([DISBURSEMENTPROCESSDISBURSEMENTID] uniqueidentifier)
    declare @VoidBATIDs udt_genericid
    declare @VoidReprintBATIds udt_genericid
    declare @VoidReprintDPDIDs table([DISBURSEMENTPROCESSDISBURSEMENTID] uniqueidentifier, [NEWID] uniqueidentifier, [POSTDATE] date, [POSTSTATUSCODE] tinyint)
    declare @RenumberIDs table([ROWID] int, [DISBURSEMENTPROCESSDISBURSEMENTID] uniqueidentifier)

    --Make sure the process is in the printing state.
    if not exists( select * from dbo.DISBURSEMENTPROCESS where ID = @ID and (STATUSCODE = 1 or HASUNSUCCESSFUL = 1)) -- 1 = Created
      raiserror ('Cannot commit a process that has a status other than created', 16, 1);


    if @CHANGEAGENTID is null  
          exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output


      declare @CURRENTDATE datetime
      set @CURRENTDATE = getdate()    


      select
          @BANKACCOUNTID = DP.BANKACCOUNTID
      ,@TRANSACTIONCURRENCYID = BA.TRANSACTIONCURRENCYID
      ,@PDACCOUNTSYSTEMID = BA.PDACCOUNTSYSTEMID
      from
          dbo.DISBURSEMENTPROCESS as DP
      inner join dbo.BANKACCOUNT as BA on DP.BANKACCOUNTID = BA.ID
      where
          DP.ID = @ID;


    if @SUCCESSFULCHECKPRINTINGCODE=1 -- Marking all unsuccessful
      begin
        set @HASUNSUCCESSFUL = 1  
        if @UNSUCESSFULACTION=0 --Reprint
          insert into @ReprintIDs
            select 
              DPD.ID
            from dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD
            where DPD.DISBURSEMENTPROCESSID = @ID
        if @UNSUCESSFULACTION=1 --Void
          insert into @VoidBATIDs
            select 
              DPD.ID
            from dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD
            where DPD.DISBURSEMENTPROCESSID = @ID
        if @UNSUCESSFULACTION=2 --Void and Reprint
          begin
            insert into @VoidReprintBATIDs
              select 
                DPD.ID
              from dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD 
              where DPD.DISBURSEMENTPROCESSID = @ID
            insert into @VoidReprintDPDIDs
              select 
                DPD.ID
                ,newid()
                ,FT.[POSTDATE]
                ,FT.[POSTSTATUSCODE]
              from dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD 
                inner join dbo.FINANCIALTRANSACTION as FT on FT.ID = DPD.ID
              where DPD.DISBURSEMENTPROCESSID = @ID
          end
      end

    if @SUCCESSFULCHECKPRINTINGCODE=2 -- Marking some unsuccessful
      begin
        set @HASUNSUCCESSFUL = 1      

        declare @TOTALDISBURSEMENTS int
        select    
            @TOTALDISBURSEMENTS=COUNT(*)
          from
            dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD
            inner join dbo.FINANCIALTRANSACTION as FTD on DPD.ID = FTD.ID
        where
          DPD.DISBURSEMENTPROCESSID = @ID
          group by
            DPD.DISBURSEMENTPROCESSID        

        declare @TempTbl table
        (
          [ID] uniqueidentifier
          ,[DISBURSEMENTPROCESSID] uniqueidentifier
          ,[RANGESTART] int
          ,[RANGEEND] int
          ,[RANGECOUNT] int
          ,[USERACTION] tinyint
          ,[STARTNUMBER] nvarchar(max)
        )

        insert into @TempTbl 
          select
            isnull([ID], newid()) ID
            ,@ID
            ,[RANGESTART]
            ,[RANGEEND]
            ,case when [RANGEEND]<>0
              THEN
                [RANGEEND]-[RANGESTART]+1 
              ELSE
                0
              END
             as [RANGECOUNT]
            ,[USERACTION]
            ,[STARTNUMBER]
          from dbo.UFN_DISBURSEMENTPROCESSFORMNUMBERRANGE_FROMITEMLISTXML(@RANGESGRID)

        update @TempTbl
        set RANGECOUNT = @TOTALDISBURSEMENTS - (select SUM(RANGECOUNT) from @TempTbl)
        where RANGECOUNT = 0


        -- Do not allow zero for any check numbers as zero is not a valid check number.
        if dbo.UFN_DISBURSEMENTPROCESS_RANGESGRID_DONOTALLOWZERO(@RANGESGRID) = 1
          raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_INVALIDCHECKNUMBERGRID', 16, 1)


        -- Do not allow the check number to exceed 9 characters.
        if dbo.UFN_DISBURSEMENTPROCESS_RANGESGRID_DONOTALLOWCHECKNUMBERGREATERTHANNINE(@RANGESGRID)=1
          raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_9DIGITSONLYGRID',16,1)


        -- Validate that the start numbers are less than the end numbers.
        if dbo.UFN_DISBURSEMENTPROCESS_RANGESGRID_DONOTALLOWSTARTGREATERTHANEND(@ID, @RANGESGRID)=1
          raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_RANGESTARTGREATERTHANRANGEEND', 16, 1)


        -- Validate that the ranges do not overlap.
        if dbo.UFN_DISBURSEMENTPROCESS_RANGESGRID_DONOTALLOWOVERLAPPINGRANGES(@ID, @RANGESGRID)=1
          raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_RANGESCANNOTOVERLAP', 16, 1)


        -- Validate that the range falls within the available range.
        if dbo.UFN_DISBURSEMENTPROCESS_RANGESGRID_DONOTALLOWOUTSIDERANGE(@ID, @RANGESGRID)=1
          raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_INCORRECTRANGE', 16, 1)

                -- Validate that the STARTNUMBER is set when the action is set to renumber
                if exists(select * from @TempTbl where [USERACTION] = 3 and len([STARTNUMBER]) = 0)
                    raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_STARTNUMBER_REQUIRED', 16, 1)

        -- Get a list of disbursement process disbursement ids which will not be committed since they will be reprinted.
        insert into @ReprintIDs
          select 
            DPD.ID
          from dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD 
            inner join dbo.BANKACCOUNTTRANSACTION as BAT on DPD.ID = BAT.ID
            inner join @TempTbl as TEMP on 
              (case when TEMP.RANGEEND=0 then TEMP.RANGESTART+TEMP.RANGECOUNT-1 else TEMP.RANGEEND end >= BAT.TRANSACTIONNUMBER) 
              and 
              (TEMP.RANGESTART <= BAT.TRANSACTIONNUMBER)            
          where DPD.DISBURSEMENTPROCESSID = @ID
            and TEMP.USERACTION=0 -- 0 = Reprint

        -- Get a list of disbursement process disbursement ids which will be voided.
        insert into @VoidBATIDs
          select
            BAT.ID
          from dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD 
            inner join dbo.BANKACCOUNTTRANSACTION as BAT on DPD.ID = BAT.ID
            inner join @TempTbl as TEMP on 
              (case when TEMP.RANGEEND=0 then TEMP.RANGESTART+TEMP.RANGECOUNT-1 else TEMP.RANGEEND end >= BAT.TRANSACTIONNUMBER) 
              and 
              (TEMP.RANGESTART <= BAT.TRANSACTIONNUMBER)            
          where DPD.DISBURSEMENTPROCESSID = @ID
            and TEMP.USERACTION=1  -- 1 = Void

        -- Get a list of disbursement process disbursement ids which will be voided and reprinted.
        insert into @VoidReprintBATIDs
          select
            BAT.ID
          from dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD
            inner join dbo.BANKACCOUNTTRANSACTION as BAT on DPD.ID = BAT.ID
            inner join @TempTbl as TEMP on 
     (case when TEMP.RANGEEND=0 then TEMP.RANGESTART+TEMP.RANGECOUNT-1 else TEMP.RANGEEND end >= BAT.TRANSACTIONNUMBER) 
              and 
              (TEMP.RANGESTART <= BAT.TRANSACTIONNUMBER)            
          where DPD.DISBURSEMENTPROCESSID = @ID
            and TEMP.USERACTION=2  -- 1 = Void and Reprint        
        insert into @VoidReprintDPDIDs
          select 
            DPD.ID
            ,newid()
            ,FT.[POSTDATE]
            ,FT.[POSTSTATUSCODE]
          from dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD 
            inner join dbo.FINANCIALTRANSACTION as FT on FT.ID = DPD.ID
            inner join dbo.BANKACCOUNTTRANSACTION as BAT on DPD.ID = BAT.ID
            inner join @TempTbl as TEMP on 
              (case when TEMP.RANGEEND=0 then TEMP.RANGESTART+TEMP.RANGECOUNT-1 else TEMP.RANGEEND end >= BAT.TRANSACTIONNUMBER) 
              and 
              (TEMP.RANGESTART <= BAT.TRANSACTIONNUMBER)            
          where DPD.DISBURSEMENTPROCESSID = @ID
            and TEMP.USERACTION=2 -- 0 = Void and Reprint


        -- Get a list of disbursement process disbursement ids which will be renumbered.
        insert into @RenumberIDs
          select
            ROW_NUMBER() over (order by DPD.DATEADDED) + TEMP.STARTNUMBER - 1 as ROWID
            ,DPD.ID
          from dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD
            inner join dbo.BANKACCOUNTTRANSACTION as BAT on DPD.ID = BAT.ID
            inner join @TempTbl as TEMP on (TEMP.RANGESTART <= BAT.TRANSACTIONNUMBER and (TEMP.RANGESTART + TEMP.RANGECOUNT - 1) >= BAT.TRANSACTIONNUMBER)
          where DPD.DISBURSEMENTPROCESSID = @ID
            and (TEMP.USERACTION=3) -- Renumber


        --Check to see if we are trying to renumber any checks.
        if (select count(*) from @RenumberIDs)>0
          -- Validate that the new numbers are not in the bank account transaction table.
          if dbo.UFN_DISBURSEMENTPROCESS_RANGESGRID_DONOTALLOWDUPLICATECHECKNUMBERS(@ID, @BANKACCOUNTID, @RANGESGRID, 1, 0)=1
            raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_CHECKNUMBEREXISTSGRID', 16, 1)

      end    

        declare @CONTEXTCACHE varbinary(128); 
        set @CONTEXTCACHE = CONTEXT_INFO();

        if @CHANGEAGENTID is not null 
            set CONTEXT_INFO @CHANGEAGENTID

    -- Delete all the rows in DISBURSEMENTPROCESSPRINTFINALIZERANGE that match our disbursementprocess
    delete from dbo.DISBURSEMENTPROCESSPRINTFINALIZERANGE 
    where DISBURSEMENTPROCESSID = @ID

        if not @CONTEXTCACHE is null 
            set CONTEXT_INFO @CONTEXTCACHE;

    -- Take corrective action as needed.
    if @HASUNSUCCESSFUL=1
      begin
        if @SUCCESSFULCHECKPRINTINGCODE=1
          if @UNSUCESSFULACTION=0 
            set @PERFORMREPRINTACTION=1
          if @UNSUCESSFULACTION=1
            set @PERFORMVOIDACTION=1
          if @UNSUCESSFULACTION=2
            set @PERFORMREPRINTANDVOIDACTION=1
        else
          begin
            -- Reprint any items in the ReprintIDs table.
            set @PERFORMREPRINTACTION=1

            -- Void any items in the VoidBATIDs table.
            set @PERFORMVOIDACTION=1

            -- Void and Reprint any items in the table.
            set @PERFORMREPRINTANDVOIDACTION = 1

                        --insert "renumbered" records for the history tab
                        insert into dbo.DISBURSEMENTHISTORY
                        (
                            ID
                            ,FINANCIALTRANSACTIONID
                            ,ACTIONCODE
                            ,ORIGINALNUMBER
                            ,CHANGEDNUMBER
                          -- Standard stuff
                            , DATEADDED
                            , DATECHANGED
                            , CHANGEDBYID
                            , ADDEDBYID
                        )
                        select
                            NEWID()
                            ,IDS.DISBURSEMENTPROCESSDISBURSEMENTID
                            ,4 --renumbered
                            ,BAT.TRANSACTIONNUMBER
                            ,IDS.ROWID
                            -- Standard stuff
                            ,@CURRENTDATE
                            ,@CURRENTDATE
                            ,@CHANGEAGENTID
                            ,@CHANGEAGENTID
                        from @RenumberIDs IDS
                        inner join dbo.BANKACCOUNTTRANSACTION BAT on BAT.ID = IDS.DISBURSEMENTPROCESSDISBURSEMENTID


                        update dbo.BANKACCOUNTTRANSACTION_EXT
                        set 
                          TRANSACTIONNUMBER = REN.ROWID
                          -- Boilerplate
                          ,CHANGEDBYID = @CHANGEAGENTID
                          ,DATECHANGED = @CURRENTDATE
                        from dbo.BANKACCOUNTTRANSACTION_EXT
                          inner join @RenumberIDs as REN on REN.DISBURSEMENTPROCESSDISBURSEMENTID = BANKACCOUNTTRANSACTION_EXT.ID
                        where 
                          DISBURSEMENTPROCESSID = @ID 
                        ;

          end

        if @PERFORMREPRINTACTION=1
          begin
            declare @RemoveIDs table([BANKACCOUNTTRANSACTIONID] uniqueidentifier)
            insert into @RemoveIDs
              select 
                BAT.ID
              from dbo.BANKACCOUNTTRANSACTION as BAT 
              where
                BAT.ID in (select DISBURSEMENTPROCESSDISBURSEMENTID from @ReprintIDs)
            -- update the bankaccount transaction table to remove the checks that were in the register
                        set @CONTEXTCACHE = CONTEXT_INFO(); 

                        if @CHANGEAGENTID is not null 
                          set CONTEXT_INFO @CHANGEAGENTID

            delete from dbo.BANKACCOUNTTRANSACTION where ID in (select BANKACCOUNTTRANSACTIONID from @RemoveIDs)

                        if not @CONTEXTCACHE is null 
                          set CONTEXT_INFO @CONTEXTCACHE;

          end

        declare @Schedules UDT_GENERICID;

        if @PERFORMVOIDACTION=1
          exec USP_BANKACCOUNTDISBURSEMENTS_VOID @VoidBATIDs, null, null, null, null, @CHANGEAGENTID, @Schedules

        if @PERFORMREPRINTANDVOIDACTION=1
          begin

                        --Get the schedule IDs so they will not be deleted for a void and reprint action
                        declare @SCHEDULESNOTTODELETE UDT_GENERICID;
                        insert into @SCHEDULESNOTTODELETE (ID)
                        select
                    distinct FTA.FINANCIALTRANSACTIONSCHEDULEID
            from @VoidReprintDPDIDs as VOID
              inner join dbo.FINANCIALTRANSACTIONAPPLICATION as FTA on FTA.FINANCIALTRANSACTIONID = VOID.DISBURSEMENTPROCESSDISBURSEMENTID

            -- Void the checks.
            exec USP_BANKACCOUNTDISBURSEMENTS_VOID @VoidReprintBATIDs, null, null, null, null, @CHANGEAGENTID, @SCHEDULESNOTTODELETE

            -- Add back in new FTs, FTAs, and DPDs so that the next create will be able to add new checks.
            insert into dbo.FINANCIALTRANSACTION
                  ( 
                      ID
                      ,TRANSACTIONAMOUNT
              ,BASEAMOUNT
              ,ORGAMOUNT
                      ,CONSTITUENTID
                      -- From the process
                      ,[DATE]
                      ,POSTDATE
                      ,POSTSTATUSCODE
              ,PDACCOUNTSYSTEMID
              ,TRANSACTIONCURRENCYID
                      -- Standard stuff
                      ,DATEADDED
                      ,DATECHANGED
                      ,CHANGEDBYID
                      ,ADDEDBYID
                      -- Constants
                      ,DELETEDON
                      ,TYPECODE
                  )
            select 
              VOID.[NEWID]
                      ,FT.TRANSACTIONAMOUNT
              ,FT.TRANSACTIONAMOUNT
              ,FT.TRANSACTIONAMOUNT
                      ,FT.CONSTITUENTID
                      -- From the process
                      ,FT.[DATE]
                      ,VOID.POSTDATE
                      ,VOID.POSTSTATUSCODE
              ,@PDACCOUNTSYSTEMID
              ,@TRANSACTIONCURRENCYID
                      -- Standard stuff
                      ,FT.DATEADDED
                      ,FT.DATECHANGED
                      ,FT.CHANGEDBYID
                      ,FT.ADDEDBYID
                      -- Constants
                      ,NULL
                      ,FT.TYPECODE
            from @VoidReprintDPDIDs as VOID
              inner join dbo.FINANCIALTRANSACTION as FT on FT.ID = VOID.DISBURSEMENTPROCESSDISBURSEMENTID

            insert into dbo.DISBURSEMENTPROCESSDISBURSEMENT
                (
                    ID
                    ,DISBURSEMENTPROCESSID    
                    ,REMITADDRESSID
                    -- Standard stuff
                    , DATEADDED
                    , DATECHANGED
                    , CHANGEDBYID
                    , ADDEDBYID
                )
            select
              VOID.[NEWID]
                    ,DPD.DISBURSEMENTPROCESSID    
                    ,DPD.REMITADDRESSID
                    -- Standard stuff
                    ,DPD.DATEADDED
                    ,DPD.DATECHANGED
                    ,DPD.CHANGEDBYID
                    ,DPD.ADDEDBYID
            from @VoidReprintDPDIDs as VOID
              inner join DISBURSEMENTPROCESSDISBURSEMENT as DPD on DPD.ID = VOID.DISBURSEMENTPROCESSDISBURSEMENTID

            insert into dbo.FINANCIALTRANSACTIONAPPLICATION
                (
                    ID
                    ,AMOUNT
                    ,FINANCIALTRANSACTIONID
                    ,FINANCIALTRANSACTIONSCHEDULEID
                    ,TYPECODE
                    -- Standard stuff
                    ,DATEADDED
                    ,DATECHANGED
                    ,CHANGEDBYID
                    ,ADDEDBYID
                )    
            select
              newid()
                    ,FTA.AMOUNT
                    ,VOID.[NEWID]
                    ,FTA.FINANCIALTRANSACTIONSCHEDULEID
                    ,FTA.TYPECODE
                    -- Standard stuff
                    ,FTA.DATEADDED
                    ,FTA.DATECHANGED
                    ,FTA.CHANGEDBYID
                    ,FTA.ADDEDBYID
            from @VoidReprintDPDIDs as VOID
              inner join dbo.FINANCIALTRANSACTIONAPPLICATION as FTA on FTA.FINANCIALTRANSACTIONID = VOID.DISBURSEMENTPROCESSDISBURSEMENTID

                        -- update the history records with the future disbursement IDs
                        update dbo.DISBURSEMENTHISTORY
                            set FUTUREFINANCIALTRANSACTIONID = VOID.[NEWID]
                                ,CHANGEDBYID = @CHANGEAGENTID
                                ,DATECHANGED = @CURRENTDATE
                        from @VoidReprintDPDIDs VOID
                        inner join dbo.BANKACCOUNTTRANSACTION BAT on BAT.ID =  VOID.DISBURSEMENTPROCESSDISBURSEMENTID
                        inner join dbo.DISBURSEMENTHISTORY H on H.FINANCIALTRANSACTIONID =  VOID.DISBURSEMENTPROCESSDISBURSEMENTID and H.ACTIONCODE = 1 and H.ORIGINALNUMBER = BAT.TRANSACTIONNUMBER

          end        
      end


    -- Update the bank account transaction table and set the processing flag to 0 so the transactions can
    -- start appearing in the register.

    update
      dbo.BANKACCOUNTTRANSACTION_EXT
    set
      PROCESSING = 0
      ,DATECHANGED = @CURRENTDATE
      ,CHANGEDBYID = @CHANGEAGENTID
    from
      dbo.BANKACCOUNTTRANSACTION as BAT
      inner join dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD on BAT.ID = DPD.ID
    where
      BANKACCOUNTTRANSACTION_EXT.DISBURSEMENTPROCESSID = @ID 
      and DPD.ID not in (select [DISBURSEMENTPROCESSDISBURSEMENTID] from @ReprintIDs)
      and DPD.ID not in (select [NEWID] from @VoidReprintDPDIDs)

    -- Update the FINANCIALTRANSACTIONAPPLICATION's status from pending to active
    update
      dbo.FINANCIALTRANSACTIONAPPLICATION
    set 
      STATUSCODE = 1 -- active
      ,DATECHANGED = @CURRENTDATE
      ,CHANGEDBYID = @CHANGEAGENTID
    from
      dbo.FINANCIALTRANSACTIONAPPLICATION as FTA
      inner join dbo.FINANCIALTRANSACTIONSCHEDULE as FTS
        on FTA.FINANCIALTRANSACTIONSCHEDULEID = FTS.ID
      left outer join dbo.INVOICE as
        on I.ID = FTS.FINANCIALTRANSACTIONID
      left outer join dbo.CREDITMEMO as CM
        on CM.ID = FTS.FINANCIALTRANSACTIONID
    where
      COALESCE(I.DISBURSEMENTPROCESSID,CM.DISBURSEMENTPROCESSID) = @ID
      and STATUSCODE = 0 -- pending
      and FTA.FINANCIALTRANSACTIONID not in (select [DISBURSEMENTPROCESSDISBURSEMENTID] from @ReprintIDs)
      and FTA.FINANCIALTRANSACTIONID not in (select [NEWID] from @VoidReprintDPDIDs)


        exec dbo.USP_FINANCIALTRANSACTION_APPLIACTION_CREATE_1099DISTRIBUTION @ID, @CHANGEAGENTID

      -- Remove the flag from invoices and credit memos
      -- and update the invoice and credit memo zerobalance flag.    
      update 
          dbo.INVOICE
      set
          DISBURSEMENTPROCESSID=null
          ,ZEROBALANCE = case when dbo.UFN_INVOICE_GETBALANCE(I.ID) = 0 then 1 else 0 end
          ,DATECHANGED = @CURRENTDATE
          ,CHANGEDBYID = @CHANGEAGENTID
    from dbo.INVOICE as I
      where
          DISBURSEMENTPROCESSID=@ID 
            and I.ID not in (select FTS.FINANCIALTRANSACTIONID
                from dbo.FINANCIALTRANSACTIONSCHEDULE as FTS
                inner join dbo.FINANCIALTRANSACTIONAPPLICATION as FTA on FTS.ID = FTA.FINANCIALTRANSACTIONSCHEDULEID
                where FTA.FINANCIALTRANSACTIONID in (select [DISBURSEMENTPROCESSDISBURSEMENTID] from @ReprintIDs)
                    or FTA.FINANCIALTRANSACTIONID in (select [DISBURSEMENTPROCESSDISBURSEMENTID] from @VoidReprintDPDIDs)
                    or FTA.FINANCIALTRANSACTIONID in (select [NEWID] from @VoidReprintDPDIDs))

      update
          dbo.CREDITMEMO
      set
          DISBURSEMENTPROCESSID=null
          ,ZEROBALANCE = case when dbo.UFN_CREDITMEMO_GETBALANCE(CM.ID) = 0 then 1 else 0 end
          ,DATECHANGED = @CURRENTDATE
          ,CHANGEDBYID = @CHANGEAGENTID
    from dbo.CREDITMEMO as CM
      where 
          DISBURSEMENTPROCESSID=@ID
            and CM.ID not in (select FTS.FINANCIALTRANSACTIONID
                from dbo.FINANCIALTRANSACTIONSCHEDULE as FTS
                inner join dbo.FINANCIALTRANSACTIONAPPLICATION as FTA on FTS.ID = FTA.FINANCIALTRANSACTIONSCHEDULEID
                where FTA.FINANCIALTRANSACTIONID in (select [DISBURSEMENTPROCESSDISBURSEMENTID] from @ReprintIDs)
                    or FTA.FINANCIALTRANSACTIONID in (select [DISBURSEMENTPROCESSDISBURSEMENTID] from @VoidReprintDPDIDs)
                    or FTA.FINANCIALTRANSACTIONID in (select [NEWID] from @VoidReprintDPDIDs))

    --insert "renumbered" records for the history tab
        insert into dbo.DISBURSEMENTHISTORY
        (
            ID
            ,FINANCIALTRANSACTIONID
            ,ACTIONCODE
            ,ORIGINALNUMBER
            -- Standard stuff
            , DATEADDED
            , DATECHANGED
            , CHANGEDBYID
            , ADDEDBYID
        )
        select
            NEWID()
            ,BAT.ID
            ,5
            ,BAT.TRANSACTIONNUMBER
            -- Standard stuff
            ,@CURRENTDATE
            ,@CURRENTDATE
            ,@CHANGEAGENTID
            ,@CHANGEAGENTID
        from dbo.BANKACCOUNTTRANSACTION BAT
      inner join dbo.BANKACCOUNTTRANSACTION_EXT as BATEXT on BAT.ID = BATEXT.ID
            inner join dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD on BAT.ID = DPD.ID
    where
      BATEXT.DISBURSEMENTPROCESSID = @ID 
      and BAT.ID not in (select [DISBURSEMENTPROCESSDISBURSEMENTID] from @ReprintIDs)
      and BAT.ID not in (select [DISBURSEMENTPROCESSDISBURSEMENTID] from @VoidReprintDPDIDs)
            and BAT.ID not in (select [NEWID] from @VoidReprintDPDIDs)
            and BAT.ID not in (select [ID] from @VoidBATIDs)

      -- Delete the DISBURSEMENTPROCESSDISBURSEMENT entries
      delete
          from dbo.DISBURSEMENTPROCESSDISBURSEMENT 
      where
          DISBURSEMENTPROCESSID = @ID 
      and ID not in (select [DISBURSEMENTPROCESSDISBURSEMENTID] from @ReprintIDs)
      and ID not in (select [NEWID] from @VoidReprintDPDIDs)


    -- If applicable we need to change the status of the disbursement process.
    if @HASUNSUCCESSFUL=0
      set @CHANGESTATUSCOMMITTED=1
    else
      begin
        if @SUCCESSFULCHECKPRINTINGCODE=1 
          begin
            if (@UNSUCESSFULACTION=0 or @UNSUCESSFULACTION=2)
              set @CHANGESTATUSREPRINTED=1
            else
              set @CHANGESTATUSCOMMITTED=1
          end
        if @SUCCESSFULCHECKPRINTINGCODE=2
          begin
            if (((select count(*) from @ReprintIDs)>0) or ((select count(*) from @VoidReprintDPDIDs)>0))
              set @CHANGESTATUSREPRINTED=1
            else
              set @CHANGESTATUSCOMMITTED=1
          end
      end

    if @CHANGESTATUSCOMMITTED=1
      update 
            dbo.DISBURSEMENTPROCESS
        set
            STATUSCODE = 2  -- 2 = Committed
        ,HASUNSUCCESSFUL = 0
            ,DATECHANGED = @CURRENTDATE
            ,CHANGEDBYID = @CHANGEAGENTID
      where
        ID = @ID

    if @CHANGESTATUSREPRINTED=1
      update
        dbo.DISBURSEMENTPROCESS
      set
        STATUSCODE = 1  -- 1 = Created
        ,HASUNSUCCESSFUL = 1
        ,DATECHANGED = @CURRENTDATE
        ,CHANGEDBYID = @CHANGEAGENTID
      where
        ID = @ID


  end try

  begin catch
    exec dbo.USP_RAISE_ERROR
    return 1
  end catch

return 0;