USP_DATAFORMTEMPLATE_DISBURSEMENTPROCESS_PRINT_EDIT

The save procedure used by the edit dataform template "Disbursement Process Print Checks".

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.
@ASSIGNDISBURSEMENTSCODE tinyint IN Assign disbursements value
@CHECKS_NEXTUNUSED int IN Start number
@RANGESGRID xml IN
@CHECKS_PRINTERID uniqueidentifier IN Printer
@CHECKS_FORMAT uniqueidentifier IN Format

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_DISBURSEMENTPROCESS_PRINT_EDIT (
    @ID uniqueidentifier
    ,@CHANGEAGENTID uniqueidentifier = null
  ,@ASSIGNDISBURSEMENTSCODE tinyint
  ,@CHECKS_NEXTUNUSED int  
  ,@RANGESGRID xml 
  ,@CHECKS_PRINTERID uniqueidentifier
  ,@CHECKS_FORMAT uniqueidentifier
)
as
    set nocount on;

    if @CHANGEAGENTID is null  
        exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output            
    declare @CURRENTDATE datetime
    set @CURRENTDATE = getdate()

    begin try
  -- Get parameters from the disbursement process

      declare @BANKACCOUNTID uniqueidentifier;
      declare @POSTSTATUSCODE int;
      declare @POSTDATE date;

      select
          @BANKACCOUNTID = DP.BANKACCOUNTID
          ,@POSTSTATUSCODE = CASE DP.POSTSTATUSCODE WHEN 1 THEN 1 WHEN 3 THEN 2 END -- yippeeee!

          ,@POSTDATE = DP.POSTDATE
      from
          dbo.DISBURSEMENTPROCESS as DP
      where
          DP.ID = @ID;

    -- Do not allow zero for any check numbers as zero is not a valid check number.

    if @CHECKS_NEXTUNUSED = 0 
      raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_INVALIDCHECKNUMBERRANGE', 16, 1)

    -- Do not allow the check number to exceed 9 characters.

    if @CHECKS_NEXTUNUSED > 999999999
      raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_9DIGITSONLYRANGE', 16, 1)

    -- Validate print ranges

    -- @@@@@

    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
            and FTD.ID in (select DPD.ID 
                from dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD
                inner join dbo.FINANCIALTRANSACTIONAPPLICATION FTA on FTA.FINANCIALTRANSACTIONID = DPD.ID
                where FTA.AMOUNT != 0 and DPD.DISBURSEMENTPROCESSID = @ID)
      group by
        DPD.DISBURSEMENTPROCESSID


        if exists(
            select *
            from dbo.BANKACCOUNTTRANSACTION BAT
            where BAT.TRANSACTIONNUMBER >= @CHECKS_NEXTUNUSED and BAT.TRANSACTIONNUMBER <= (@TOTALDISBURSEMENTS + @CHECKS_NEXTUNUSED - 1)
                and  BAT.BANKACCOUNTID = @BANKACCOUNTID and BAT.DELETED = 0)
            raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_CHECKNUMBEREXISTSRANGE', 16,1)

    declare @ValidateTempTbl table
    (
      [ROWID] int identity(1,1)
      ,[ID] uniqueidentifier
      ,[RANGESTART] int
      ,[RANGEEND] int
      ,[RANGECOUNT] int
      ,[BANKACCOUNTID] uniqueidentifier
    )

    if @ASSIGNDISBURSEMENTSCODE=0 --USING RANGE

      begin
        insert into @ValidateTempTbl values
        (
          newid()
          ,@CHECKS_NEXTUNUSED
          ,@CHECKS_NEXTUNUSED + @TOTALDISBURSEMENTS - 1
          ,@TOTALDISBURSEMENTS
          ,@BANKACCOUNTID
        )
      end
    else -- USING GRID

      begin

        if @RANGESGRID is null
          raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_NOTENOUGHDISBURSEMENTS', 16, 1)

        insert into @ValidateTempTbl 
          select
            isnull([ID], newid()) ID
            ,[RANGESTART]
            ,[RANGEEND]
            ,CASE WHEN [RANGEEND]<>0
             THEN
               [RANGEEND]-[RANGESTART]+1 
             ELSE
               0
             END as [RANGECOUNT]
            ,@BANKACCOUNTID
        from dbo.UFN_DISBURSEMENTPROCESSFORMNUMBERRANGE_FROMITEMLISTXML(@RANGESGRID)

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

    -- 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 none of the checks in the range have been used in the check register.

    if dbo.UFN_DISBURSEMENTPROCESS_RANGESGRID_DONOTALLOWDUPLICATECHECKNUMBERS(@ID, @BANKACCOUNTID, @RANGESGRID, 0, 0)=1
      raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_CHECKNUMBEREXISTSGRID', 16,1)

    -- Validate that the total number of disbursements matches the number ranges.

    -- VALIDATE4 START

    declare @TOTALRANGECOUNT int

    select @TOTALRANGECOUNT=SUM(RANGECOUNT) from @ValidateTempTbl 

    if @TOTALRANGECOUNT < @TOTALDISBURSEMENTS 
      raiserror('ERR_DISBURSEMENTPROCESSFORMNUMBERRANGE_NOTENOUGHDISBURSEMENTS', 16, 1)
    -- VALIDATE4 END

    -- @@@@@


    -- Change the user entered values if they used a range that included more changes than exist in this check run

    -- %%%%%

    declare @update_rowid int
    declare @update_rangeStart int
    declare @update_rangeEnd int
    declare @update_rangeCount int
    declare @totalCumulativeRangeCount int = 0

    declare update_cursor scroll cursor for
    select ROWID, RANGESTART, RANGEEND, RANGECOUNT from @ValidateTempTbl order by rowid

    open update_cursor

    fetch next from update_cursor
    into @update_rowid, @update_rangeStart, @update_rangeEnd, @update_rangeCount

    while @@FETCH_STATUS=0
    begin
      if @TOTALDISBURSEMENTS = 0
        delete @ValidateTempTbl where ROWID = @update_rowid
      else
        begin
          if (@TOTALDISBURSEMENTS - @totalCumulativeRangeCount - @update_rangeCount) >= 0 
              set @totalCumulativeRangeCount  = @totalCumulativeRangeCount + @update_rangeCount
          else
            begin
              if @totalCumulativeRangeCount >= 0
                set @totalCumulativeRangeCount = @TOTALDISBURSEMENTS - @totalCumulativeRangeCount - 1
                else
                      set @totalCumulativeRangeCount = @TOTALDISBURSEMENTS - 1                
              update @ValidateTempTbl set RANGEEND = @update_rangeStart + @totalCumulativeRangeCount where ROWID = @update_rowid
              update @ValidateTempTbl set RANGECOUNT = RANGEEND - RANGESTART + 1 where ROWID = @update_rowid
              set @TOTALDISBURSEMENTS = 0
            end
        end
      fetch next from update_cursor into @update_rowid, @update_rangeStart, @update_rangeEnd, @update_rangeCount
    end

    close update_cursor
        deallocate update_cursor
    -- %%%%%



    -- Now that the values are valid insert them into DISBURSEMENTPROCESSPRINTFINALIZERANGE .

      insert into dbo.DISBURSEMENTPROCESSPRINTFINALIZERANGE 
      (
        ID
        ,DISBURSEMENTPROCESSID
        ,RANGESTART
        ,RANGEEND
        ,RANGECOUNT
        ,ADDEDBYID
        ,CHANGEDBYID
        ,DATEADDED
        ,DATECHANGED
      )
      select 
        isnull([ID], newid()) ID
        ,@ID
        ,[RANGESTART]
        ,[RANGEEND]
        ,[RANGECOUNT]
        ,@CHANGEAGENTID ADDEDBYID
        ,@CHANGEAGENTID CHANGEDYID
        ,@CURRENTDATE DATEADDED
        ,@CURRENTDATE DATECHANGED  
      from @ValidateTempTbl

      -- Update the last range to have the RANGEEND blank.

      declare @TEMPID uniqueidentifier
      select 
        top(1) @TEMPID =  ID 
      from dbo.DISBURSEMENTPROCESSPRINTFINALIZERANGE
      where DISBURSEMENTPROCESSID = @ID
      order by dateadded desc
      update dbo.DISBURSEMENTPROCESSPRINTFINALIZERANGE
      set RANGEEND = 0
                ,CHANGEDBYID = @CHANGEAGENTID
                ,DATECHANGED = @CURRENTDATE
      where ID = @TEMPID


        --Cache current context information 

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

      -- Remove all zero amount FTAs 

    -- This needs to be moved to the start of the approvals when approval processes exist.

      delete 
          dbo.FINANCIALTRANSACTIONAPPLICATION 
      from dbo.FINANCIALTRANSACTIONAPPLICATION FTA
          inner join dbo.DISBURSEMENTPROCESSDISBURSEMENT DPD on DPD.ID = FTA.FINANCIALTRANSACTIONID
          inner join dbo.DISBURSEMENTPROCESS DP on DPD.DISBURSEMENTPROCESSID = DP.ID
      where AMOUNT = 0
          and DP.ID = @ID;

    -- Remove all zero amount DPDs and FTs.

    -- This needs to be moved to the start of the approvals when approval processes exist.

    -- #####

      declare @AssignTempTbl as TABLE (
          ID uniqueidentifier
      );

      insert into @AssignTempTbl 
      select
          DPD.ID from dbo.DISBURSEMENTPROCESSDISBURSEMENT DPD
          inner join dbo.FINANCIALTRANSACTION FT on FT.ID = DPD.ID
          left outer join dbo.FINANCIALTRANSACTIONAPPLICATION FTA on FTA.FINANCIALTRANSACTIONID = FT.ID
      where FT.TRANSACTIONAMOUNT = 0 and DPD.DISBURSEMENTPROCESSID = @ID and FTA.ID is null;

    -- Remove all of the 0 amount DPDs.

      delete dbo.DISBURSEMENTPROCESSDISBURSEMENT
      from dbo.DISBURSEMENTPROCESSDISBURSEMENT DPD
          inner join @AssignTempTbl T on DPD.ID = T.ID;

    -- Remove all of the 0 amount FTs.

      delete dbo.FINANCIALTRANSACTION
      from dbo.FINANCIALTRANSACTION FT
          inner join @AssignTempTbl T on FT.ID = T.ID;
    -- #####


    if not @CONTEXTCACHE is null 
          set CONTEXT_INFO @CONTEXTCACHE;

    -- Update the Invoices and CreditMemos that were excluded (since you can no longer work

    -- with the excluded grid after you have moved beyond this step).

    -- $$$$$

    update dbo.INVOICE
        set DISBURSEMENTPROCESSID = null
            ,CHANGEDBYID = @CHANGEAGENTID
            ,DATECHANGED = @CURRENTDATE
    from dbo.INVOICE as I
        where I.ID not in (
            select FTS.FINANCIALTRANSACTIONID
            from dbo.FINANCIALTRANSACTIONSCHEDULE as FTS 
            inner join dbo.FINANCIALTRANSACTIONAPPLICATION as FTA on FTS.ID = FTA.FINANCIALTRANSACTIONSCHEDULEID
            inner join dbo.DISBURSEMENTPROCESSDISBURSEMENT DPD on DPD.ID = FTA.FINANCIALTRANSACTIONID
            where FTS.DELETED = 0 and DPD.DISBURSEMENTPROCESSID = @ID)
        and I.DISBURSEMENTPROCESSID = @ID

    update dbo.CREDITMEMO
        set DISBURSEMENTPROCESSID = null
            ,CHANGEDBYID = @CHANGEAGENTID
            ,DATECHANGED = @CURRENTDATE
    from dbo.CREDITMEMO as CM
        where CM.ID not in(
            select FTS.FINANCIALTRANSACTIONID
            from dbo.FINANCIALTRANSACTIONSCHEDULE as FTS 
            inner join dbo.FINANCIALTRANSACTIONAPPLICATION as FTA on FTS.ID = FTA.FINANCIALTRANSACTIONSCHEDULEID
            inner join dbo.DISBURSEMENTPROCESSDISBURSEMENT DPD on DPD.ID = FTA.FINANCIALTRANSACTIONID
            where FTS.DELETED = 0 and DPD.DISBURSEMENTPROCESSID = @ID)
        and CM.DISBURSEMENTPROCESSID = @ID
    -- $$$$$


    -- Assign check numbers based on user input.

    declare @IDS table 
    (
      FTID uniqueidentifier
      ,NUMBER integer
    )

    if @ASSIGNDISBURSEMENTSCODE=0 --USING RANGE

      begin
          -- Create ids for the BANKACCOUNTTRANSACTION insert so we can create fk

          insert into @IDS
          (
              FTID
              ,NUMBER
          )
          select
              ID
              ,NUMBER = (row_number() over (order by SORTCOLUMN)) + @CHECKS_NEXTUNUSED - 1
          from dbo.UFN_DISBURSEMENTPROCESS_FORMATPRINTORDER(@ID)
      end
    else --USING GRID

      begin
        declare @rangeStart int
        declare @rangeEnd int

        declare @FinancialTransactionTempTbl table (FTID uniqueidentifier, SORTCOLUMN int)
        insert into @FinancialTransactionTempTbl(FTID, SORTCOLUMN)
          select ID, SORTCOLUMN from dbo.UFN_DISBURSEMENTPROCESS_FORMATPRINTORDER(@ID)

        declare grid_cursor scroll cursor for
        select rangeStart, rangeEnd from dbo.DISBURSEMENTPROCESSPRINTFINALIZERANGE where DISBURSEMENTPROCESSID = @ID
        order by rangeStart

        open grid_cursor

        fetch next from grid_cursor
        into @rangeStart, @rangeEnd

        while @@FETCH_STATUS = 0
        begin
          declare @difference int
          set @difference = CASE WHEN @rangeEnd= 0 THEN 2147483647 ELSE @rangeEnd END - @rangeStart + 1

          insert into @IDS
          (
            FTID
            ,NUMBER
          )
          select top (@difference
            FTID 
            ,NUMBER = (row_number() over (order by SORTCOLUMN)) + @rangeStart - 1
          from @FinancialTransactionTempTbl order by SORTCOLUMN

          delete @FinancialTransactionTempTbl    where FTID in 
            (select top (@difference) FTID from @FinancialTransactionTempTbl order by SORTCOLUMN)

          fetch next from grid_cursor into @rangeStart, @rangeEnd
        end

        close grid_cursor
        deallocate grid_cursor

      end

      -- Transform the DISBURSEMENTPROCESSDISBURSEMENTS and their associated FINANCIALTRANSACTION to proper checks

      -- 

      -- 


      insert into dbo.FINANCIALTRANSACTIONLINEITEM
      (
        ID
        ,FINANCIALTRANSACTIONID
        ,TRANSACTIONAMOUNT
        ,BASEAMOUNT
        ,ORGAMOUNT
        ,VISIBLE
        ,[DESCRIPTION]
        ,SEQUENCE
        ,TYPECODE
        ,POSTDATE
        ,POSTSTATUSCODE
        -- Standard stuff

        , DATEADDED
        , DATECHANGED
        , CHANGEDBYID
        , ADDEDBYID
      )
      select
        NEWID()
        ,IDS.FTID
        ,FT.TRANSACTIONAMOUNT
        ,FT.TRANSACTIONAMOUNT
        ,FT.TRANSACTIONAMOUNT
        ,1 -- Visible

        ,'' -- Description

        ,1 -- Sequence

        ,0 -- Typecode, standard

        ,FT.POSTDATE        
        ,FT.POSTSTATUSCODE
        -- Standard stuff

        , @CURRENTDATE DATECHANGED
        , @CURRENTDATE DATEADDED
        , @CHANGEAGENTID CHANGEDYID
        , @CHANGEAGENTID ADDEDBYID
      from @IDS as IDS
      inner join dbo.FINANCIALTRANSACTION as FT on FT.ID = IDS.FTID
      ;

      -- Update the Financialtransaction to be a bankaccounttransaction

      update dbo.FINANCIALTRANSACTION
        set TYPECODE = 9 -- Computer check

      from @IDS as IDS
      inner join dbo.FINANCIALTRANSACTION as FT on FT.ID = IDS.FTID

      insert into dbo.BANKACCOUNTTRANSACTION_EXT 
      (  ID
        ,BANKACCOUNTID
        ,TRANSACTIONNUMBER
        ,TRANSACTIONTYPECODE
        ,TRANSACTIONFLAGCODE
        ,PROCESSING
        ,DISBURSEMENTPROCESSID
        ,COUNTRYID
        ,STATEID
        ,ADDRESSBLOCK
        ,CITY
        ,POSTCODE
        -- Standard stuff

        ,DATEADDED
        ,DATECHANGED
        ,CHANGEDBYID
        ,ADDEDBYID
      )  
      select
        IDS.FTID
        ,@BANKACCOUNTID
        ,IDS.NUMBER
        ,1 TRANSACTIONTYPECODE -- computer check

        ,2 TRANSACTIONFLAGCODE -- check

        ,1 PROCESSING              
        ,@ID
        ,A.COUNTRYID
        ,A.STATEID
        ,isnull(A.ADDRESSBLOCK, '')
        ,isnull(A.CITY,'')
        ,isnull(A.POSTCODE, '')
        -- Standard stuff

        ,@CURRENTDATE DATECHANGED
        ,@CURRENTDATE DATEADDED
        ,@CHANGEAGENTID CHANGEDYID
        ,@CHANGEAGENTID ADDEDBYID
      from 
        @IDS as IDS
        inner join dbo.FINANCIALTRANSACTION as FT on IDS.FTID = FT.ID
        inner join dbo.CONSTITUENT as C on FT.CONSTITUENTID = C.ID
        inner join dbo.DISBURSEMENTPROCESSDISBURSEMENT as DPD on DPD.ID = IDS.FTID
        left outer join dbo.ADDRESS as A on DPD.REMITADDRESSID = A.ID;    


    -- Change the status of the disbursement process    

      update 
          dbo.DISBURSEMENTPROCESS
      set
          STATUSCODE = 1 -- 1 = Created

      ,HASUNSUCCESSFUL = 0
            -- Standard update

          ,CHANGEDBYID = @CHANGEAGENTID
          ,DATECHANGED = @CURRENTDATE
    where
      ID = @ID;      

    -- update the disbursement process printer and format options

    update dbo.DISBURSEMENTPROCESSFORMAT
        set PRINTERID = @CHECKS_PRINTERID
            ,DISBURSEMENTFORMATID = @CHECKS_FORMAT
            ,DATECHANGED = @CURRENTDATE
            ,CHANGEDBYID = @CHANGEAGENTID
        where DISBURSEMENTPROCESSID  = @ID;

    -- insert "reprinted" records into the history tab

        insert into dbo.DISBURSEMENTHISTORY
      (
          ID
            ,FINANCIALTRANSACTIONID
          ,ACTIONCODE
          ,ORIGINALNUMBER
        -- Standard stuff

          , DATEADDED
          , DATECHANGED
          , CHANGEDBYID
          , ADDEDBYID
      )
        select
            NEWID()
            ,IDS.FTID
            ,3 --reprinted

            ,IDS.NUMBER
            -- Standard stuff

          ,@CURRENTDATE
          ,@CURRENTDATE
          ,@CHANGEAGENTID
          ,@CHANGEAGENTID
      from @IDS IDS
        where IDS.FTID in (select FINANCIALTRANSACTIONID from dbo.DISBURSEMENTHISTORY)
            or IDS.FTID in (select FUTUREFINANCIALTRANSACTIONID from dbo.DISBURSEMENTHISTORY where FUTUREFINANCIALTRANSACTIONID is not null)

    -- insert "created" records into the history tab

        insert into dbo.DISBURSEMENTHISTORY
      (
          ID
            ,FINANCIALTRANSACTIONID
          ,ACTIONCODE
          ,ORIGINALNUMBER
        -- Standard stuff

          , DATEADDED
          , DATECHANGED
          , CHANGEDBYID
          , ADDEDBYID
      )
        select
            NEWID()
            ,IDS.FTID
            ,0 --created

            ,IDS.NUMBER
            -- Standard stuff

          ,@CURRENTDATE
          ,@CURRENTDATE
          ,@CHANGEAGENTID
          ,@CHANGEAGENTID
      from @IDS IDS
        left outer join dbo.DISBURSEMENTHISTORY H on H.FINANCIALTRANSACTIONID = IDS.FTID or H.FUTUREFINANCIALTRANSACTIONID = IDS.FTID
        where H.ID is null

  end try
  begin catch

    if left(error_message(), 52) = 'Conversion failed when converting the nvarchar value'
      raiserror ('Starting number or ending number can not contain decimals.', 16, 1)
    else
          exec dbo.USP_RAISE_ERROR
    return 1
    end catch
return 0;