USP_DISBURSEMENTPROCESS_REMOVEHOLD_UPDATE

Executes the "Disbursement Process: Remove Hold" record operation.

Parameters

Parameter Parameter Type Mode Description
@ID nvarchar(72) IN Input parameter indicating the ID of the record being updated.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the update.

Definition

Copy


CREATE procedure dbo.USP_DISBURSEMENTPROCESS_REMOVEHOLD_UPDATE
(
    @ID nvarchar(72)
    ,@CHANGEAGENTID uniqueidentifier
)
as begin
    -- Note - this SP takes a string that is two GUIDS connected together, in the order of 

    -- a Disbursement Process ID followed by a Financial Transaction Schedule ID.

    declare @FTSID uniqueidentifier;
    declare @DPID uniqueidentifier;
    declare @DPDID uniqueidentifier;
    declare @INVOICEID uniqueidentifier;
    declare @HELD tinyint = 0;
    declare @CURRENTDATE datetime;

    -- DP settings

    declare @DISBURSEMENTDATE datetime;
    declare @POSTDATE datetime;
    declare @POSTSTATUSCODE tinyint;
    declare @DISCOUNTASOFDATE datetime;
  declare @TRANSACTIONCURRENCYID uniqueidentifier;
  declare @PDACCOUNTSYSTEMID uniqueidentifier;

    -- Temp table for transaction info

    declare @TRANSACTIONS as TABLE
        FTSID uniqueidentifier
        ,[AMOUNT] money 
        ,[FULLAMOUNT] money
        ,[TYPECODE] tinyint
        ,[STATUSCODE] tinyint
        ,[DISCOUNTDATE] datetime
    );

    set @CURRENTDATE = getdate();
    set @DPID = CONVERT(uniqueidentifier,LEFT(@ID, 36));
    set @FTSID = CONVERT(uniqueidentifier,RIGHT(@ID, 36));

    -- validate parameters

    if not exists(select * from dbo.DISBURSEMENTPROCESS where ID = @DPID)
    begin
        exec dbo.USP_RAISE_ERROR;
        return 3;
    end

    if not exists(select * from dbo.FINANCIALTRANSACTIONSCHEDULE where ID = @FTSID and DELETED = 0)
    begin
        exec dbo.USP_RAISE_ERROR;
        return 4;
    end

    -- get DP settings for future use

    select
        @DISBURSEMENTDATE = DP.DISBURSEMENTDATE
        ,@POSTDATE = CASE WHEN DP.POSTSTATUSCODE = 1 THEN DP.POSTDATE ELSE NULL END
        ,@POSTSTATUSCODE = DP.POSTSTATUSCODE
        ,@DISCOUNTASOFDATE = DP.DISCOUNTASOFDATE
    ,@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 = @DPID;

    -- remove hold via SP

    select 
        @INVOICEID = I.ID
        ,@HELD = I.HOLDPAYMENT
    from dbo.FINANCIALTRANSACTIONSCHEDULE FTS
        inner join dbo.INVOICE I on FTS.FINANCIALTRANSACTIONID = I.ID
    where
        I.HOLDPAYMENT = 1 
        and FTS.ID = @FTSID and FTS.DELETED = 0;

    if @INVOICEID is null
        begin
            exec dbo.USP_RAISE_ERROR;
            return 1;
        end

    if @HELD = 0
        begin
            exec dbo.USP_RAISE_ERROR;
            return 2;
        end

    -- Security problem here??

    exec USP_INVOICE_RELEASEPAYMENT @INVOICEID, @CHANGEAGENTID;

    ------ Add to the disbursement process. ------


    -- update Invoice and lock it to a DP

    update dbo.INVOICE set 
        DISBURSEMENTPROCESSID = @DPID
        ,DATECHANGED = @CURRENTDATE
      ,CHANGEDBYID = @CHANGEAGENTID
    where
        ID = @INVOICEID
        and DISBURSEMENTPROCESSID is null;

    ----- Create the FTAs required for the invoice. -----


    -- Insert a row into the temp table for the discount, if any applicable

    -- Currently only applicable if there is one and only one FTS

    insert into @TRANSACTIONS (
        FTSID
        ,AMOUNT
        ,STATUSCODE
        ,TYPECODE
        ,DISCOUNTDATE
    ) 
    select
        FTS.ID
        ,I.DISCOUNTAMOUNT
        ,0
        ,1
        ,I.DISCOUNTEXPIRATIONDATE
    from dbo.INVOICE I
        inner join dbo.FINANCIALTRANSACTIONSCHEDULE FTS on FTS.FINANCIALTRANSACTIONID = I.ID
    where 
        I.ID = @INVOICEID and FTS.DELETED = 0
        and I.DISCOUNTAMOUNT > 0
        and (
            select count(*) from dbo.INVOICE I
            inner join dbo.FINANCIALTRANSACTIONSCHEDULE FTS on FTS.FINANCIALTRANSACTIONID = I.ID and FTS.DELETED = 0
            where I.ID = @INVOICEID
        ) = 1;

    -- insert in the actual transaction information 

    insert into @TRANSACTIONS (
        FTSID
        ,AMOUNT
        ,STATUSCODE
        ,TYPECODE
    ) 
    select
        FTS.ID
        ,FTS.AMOUNT
        ,0
        ,0
    from 
        dbo.FINANCIALTRANSACTIONSCHEDULE FTS
    where 
        FTS.ID = @FTSID and FTS.DELETED = 0;

    -- check if there's a DPD this can go with. if not, create a new one.

    -- Currently relying that the data from the exclusion grid is correct. This might not be right... 

    -- ought to validate this against the DP criteria... crap.

    select 
        @DPDID = DPD.ID
    from dbo.INVOICE I
        inner join dbo.FINANCIALTRANSACTION FT on I.ID = FT.ID
        inner join dbo.VENDOR V on FT.CONSTITUENTID = V.ID
        inner join dbo.FINANCIALTRANSACTION FTDPD on V.ID = FTDPD.CONSTITUENTID and FTDPD.TYPECODE = 255
        inner join dbo.DISBURSEMENTPROCESSDISBURSEMENT DPD on DPD.ID = FTDPD.ID
    where 
        DPD.DISBURSEMENTPROCESSID = @DPID
        and I.ID = @INVOICEID
        and I.SEPARATEPAYMENT = 0
        and (DPD.REMITADDRESSID is null or DPD.REMITADDRESSID = coalesce(I.REMITADDRESSID, V.REMITADDRESSID));

    if @DPDID is null
        begin
            set @DPDID = newid();
            -- create a new DPD for the DP for this Transaction

            -- first the FT

            insert into dbo.FINANCIALTRANSACTION
            ( 
                ID
                , TRANSACTIONAMOUNT
                , CONSTITUENTID
                -- From the process

                ,[DATE]
                , POSTDATE
                , POSTSTATUSCODE
        ,PDACCOUNTSYSTEMID
        ,TRANSACTIONCURRENCYID
                -- Standard stuff

                , DATEADDED
                , DATECHANGED
                , CHANGEDBYID
                , ADDEDBYID
                -- Constants

                , DELETEDON
                , TYPECODE
            ) 
            select
                @DPDID
                ,SUM(T.AMOUNT)
                ,FT.CONSTITUENTID
                -- From the process

                , @DISBURSEMENTDATE
                , @POSTDATE
                , @POSTSTATUSCODE
        ,@PDACCOUNTSYSTEMID
        ,@TRANSACTIONCURRENCYID
                -- Standard stuff

                , @CURRENTDATE DATECHANGED
                , @CURRENTDATE DATEADDED
                , @CHANGEAGENTID CHANGEDYID
                , @CHANGEAGENTID ADDEDBYID
                -- Constants

                , NULL
                , 255 -- System transaction    

            from dbo.INVOICE I
                inner join dbo.FINANCIALTRANSACTION FT on I.ID = FT.ID
                inner join dbo.FINANCIALTRANSACTIONSCHEDULE FTS on FTS.FINANCIALTRANSACTIONID = FT.ID and FTS.DELETED = 0
                inner join @TRANSACTIONS T on T.FTSID = FTS.ID
            group by 
                FT.CONSTITUENTID;

            -- Link those transaction to my process

            insert into dbo.DISBURSEMENTPROCESSDISBURSEMENT
            (
                ID
                ,DISBURSEMENTPROCESSID    
                ,REMITADDRESSID
                -- Standard stuff

                , DATEADDED
                , DATECHANGED
                , CHANGEDBYID
                , ADDEDBYID
            )
            select
                @DPDID
                ,@DPID
                ,coalesce(I.REMITADDRESSID, V.REMITADDRESSID)
                -- Standard stuff

                , @CURRENTDATE DATECHANGED
                , @CURRENTDATE DATEADDED
                , @CHANGEAGENTID CHANGEDYID
                , @CHANGEAGENTID ADDEDBYID
            from @TRANSACTIONS as T
                inner join dbo.FINANCIALTRANSACTIONSCHEDULE FTS on T.FTSID = FTS.ID and FTS.DELETED = 0
                inner join dbo.FINANCIALTRANSACTION FT on FT.ID = FTS.FINANCIALTRANSACTIONID
                inner join dbo.INVOICE I on FT.ID = I.ID
                inner join dbo.VENDOR V on FT.CONSTITUENTID = V.ID
            where T.TYPECODE = 0;
        end

    -- insert FTA for discount information -- May insert a blank 0 value row if the discount can't be taken yet.

    insert into dbo.FINANCIALTRANSACTIONAPPLICATION (
        FINANCIALTRANSACTIONSCHEDULEID
        ,FINANCIALTRANSACTIONID
        ,STATUSCODE
        ,TYPECODE
        ,AMOUNT
        ,ADDEDBYID
        ,CHANGEDBYID
        ,DATEADDED
        ,DATECHANGED
    ) 
    select
        T.FTSID
        ,@DPDID
        ,T.STATUSCODE
        ,T.TYPECODE
        ,case when (T.DISCOUNTDATE is null or T.DISCOUNTDATE >= @DISCOUNTASOFDATE)
            then T.AMOUNT
            else 0
        end [AMOUNT]
        ,@CHANGEAGENTID
        ,@CHANGEAGENTID
        ,@CURRENTDATE
        ,@CURRENTDATE
    from 
        @TRANSACTIONS T
    where T.TYPECODE = 1;

    -- insert FTA for rest of the scheduled amount

    insert into dbo.FINANCIALTRANSACTIONAPPLICATION (
        FINANCIALTRANSACTIONSCHEDULEID
        ,FINANCIALTRANSACTIONID
        ,STATUSCODE
        ,TYPECODE
        ,AMOUNT
        ,ADDEDBYID
        ,CHANGEDBYID
        ,DATEADDED
        ,DATECHANGED
    ) 
    select
        T.FTSID
        ,@DPDID
        ,T.STATUSCODE
        ,T.TYPECODE
        ,T.AMOUNT - coalesce(APPLIED.[AMOUNT], 0)
        ,@CHANGEAGENTID
        ,@CHANGEAGENTID
        ,@CURRENTDATE
        ,@CURRENTDATE
    from 
        @TRANSACTIONS T
        left outer join (
            select 
                FTA.FINANCIALTRANSACTIONSCHEDULEID [FTSID]
                , sum(FTA.AMOUNT) [AMOUNT]
            from 
                dbo.FINANCIALTRANSACTIONAPPLICATION FTA
            group by FTA.FINANCIALTRANSACTIONSCHEDULEID
        ) as APPLIED on APPLIED.FTSID = T.FTSID
    where T.TYPECODE = 0;
    return 0;

end