USP_INSTALLMENTS_DEFAULTRECEIPTAMOUNTS

Parameters

Parameter Parameter Type Mode Description
@PLEDGEID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


            CREATE procedure dbo.USP_INSTALLMENTS_DEFAULTRECEIPTAMOUNTS
            (
                @PLEDGEID uniqueidentifier,
                @CHANGEAGENTID uniqueidentifier
            )
            as
            begin
                -----

                -- NOTE:

                -- This function will redefault the receipt amounts of an existing pledge with respect to its

                -- amount, writeoffs, and associated benefits. This stored procedure looks exclusively in the

                -- database, meaning that it must be called after all other database modification is done.

                -- Results may be inaccurate if this procedure is run on out-dated information.

                -----


                declare @TEMP_INSTALLMENTS table
                (
                    ID uniqueidentifier,
                    SEQUENCE tinyint,
                    [DATE] datetime,
                    AMOUNT money,
                    WRITEOFFAMOUNT money,
                    RECEIPTAMOUNT money,
                    BENEFITAMOUNT as case when AMOUNT - WRITEOFFAMOUNT - RECEIPTAMOUNT > 0 then AMOUNT - WRITEOFFAMOUNT - RECEIPTAMOUNT else 0 end,
                    COMMITMENTAMOUNT as AMOUNT - WRITEOFFAMOUNT
                )

                declare @REMAININGCOMMITMENTAMOUNT money
                declare @REMAININGBENEFITAMOUNT money
                declare @REMAININGRECEIPTAMOUNT money
                declare @FIRSTUNPAIDINSTALLMENTSEQUENCE tinyint
                declare @CURRENTINSTALLMENTID uniqueidentifier
                declare @CURRENTINSTALLMENTCOMMITMENTAMOUNT money

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

                -- Get installment details

                insert into @TEMP_INSTALLMENTS (ID, SEQUENCE, [DATE], AMOUNT, WRITEOFFAMOUNT, RECEIPTAMOUNT)
                select
                    INSTALLMENT.ID,
                    INSTALLMENT.SEQUENCE,
                    INSTALLMENT.DATE,
                    INSTALLMENT.TRANSACTIONAMOUNT,
                    coalesce(sum(INSTALLMENTWRITEOFF.TRANSACTIONAMOUNT), 0),
                    INSTALLMENT.TRANSACTIONRECEIPTAMOUNT as RECEIPTAMOUNT
                from dbo.INSTALLMENT
                    left join dbo.INSTALLMENTWRITEOFF on INSTALLMENT.ID = INSTALLMENTWRITEOFF.INSTALLMENTID
                where REVENUEID = @PLEDGEID
                group by SEQUENCE, INSTALLMENT.ID, INSTALLMENT.DATE, INSTALLMENT.TRANSACTIONAMOUNT, INSTALLMENT.TRANSACTIONRECEIPTAMOUNT

                -- Adjust installment receipt amounts for writeoffs

                update @TEMP_INSTALLMENTS
                set RECEIPTAMOUNT = COMMITMENTAMOUNT - BENEFITAMOUNT
                where WRITEOFFAMOUNT > 0

                -- Get cut-off point

                select @FIRSTUNPAIDINSTALLMENTSEQUENCE = SEQUENCE
                from @TEMP_INSTALLMENTS
                where ID = dbo.UFN_PLEDGE_GETNEXTINSTALLMENT(@PLEDGEID,null)

                -- Subtract value of benefits already paid

                select
                    @REMAININGBENEFITAMOUNT =
                    (
                        select coalesce(sum(FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT), 0)
                        from dbo.FINANCIALTRANSACTIONLINEITEM
                        inner join dbo.REVENUEBENEFIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUEBENEFIT_EXT.ID
                        where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @PLEDGEID and REVENUEBENEFIT_EXT.BENEFITTYPECODE = 1
                    ) - coalesce(sum(BENEFITAMOUNT), 0)
                from @TEMP_INSTALLMENTS
                where SEQUENCE < @FIRSTUNPAIDINSTALLMENTSEQUENCE

                -- Set amounts

                set @REMAININGCOMMITMENTAMOUNT = (select sum(COMMITMENTAMOUNT) from @TEMP_INSTALLMENTS where SEQUENCE >= @FIRSTUNPAIDINSTALLMENTSEQUENCE)
                set @REMAININGRECEIPTAMOUNT = @REMAININGCOMMITMENTAMOUNT - @REMAININGBENEFITAMOUNT

                declare cur cursor fast_forward for
                select
                    ID,
                    COMMITMENTAMOUNT
                from @TEMP_INSTALLMENTS
                where SEQUENCE >= @FIRSTUNPAIDINSTALLMENTSEQUENCE
                order by SEQUENCE desc

                -- Default receipt amounts

                open cur
                fetch next from cur into @CURRENTINSTALLMENTID, @CURRENTINSTALLMENTCOMMITMENTAMOUNT
                while @@FETCH_STATUS = 0
                begin
                    if @REMAININGRECEIPTAMOUNT < @CURRENTINSTALLMENTCOMMITMENTAMOUNT
                    begin
                        update @TEMP_INSTALLMENTS
                        set RECEIPTAMOUNT = @REMAININGRECEIPTAMOUNT
                        where ID = @CURRENTINSTALLMENTID

                        set @REMAININGRECEIPTAMOUNT = 0
                    end
                    else
                    begin
                        update @TEMP_INSTALLMENTS
                        set RECEIPTAMOUNT = @CURRENTINSTALLMENTCOMMITMENTAMOUNT
                        where ID = @CURRENTINSTALLMENTID

                        set @REMAININGRECEIPTAMOUNT = @REMAININGRECEIPTAMOUNT - @CURRENTINSTALLMENTCOMMITMENTAMOUNT
                    end

                    if @REMAININGRECEIPTAMOUNT < 0
                        set @REMAININGRECEIPTAMOUNT = 0

                    fetch next from cur into @CURRENTINSTALLMENTID, @CURRENTINSTALLMENTCOMMITMENTAMOUNT
                end

                close cur
                deallocate cur

                -- Update data

                declare @INSTALLMENTS xml
                declare @CURRENTDATE datetime = getdate()
                declare @BASECURRENCYID uniqueidentifier;
                declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
                declare @TRANSACTIONCURRENCYID uniqueidentifier;
                declare @BASEEXCHANGERATEID uniqueidentifier;

                set @INSTALLMENTS = 
                    (
                    select
                        ID,
                        SEQUENCE,
                        [DATE],
                        AMOUNT,
                        RECEIPTAMOUNT
                    from @TEMP_INSTALLMENTS
                    for xml raw('ITEM'),type,elements,root('INSTALLMENTS'),BINARY BASE64
                    )

                select
                    @BASECURRENCYID = CURRENCYSET.BASECURRENCYID,
                    @ORGANIZATIONEXCHANGERATEID = FINANCIALTRANSACTION.ORGEXCHANGERATEID,
                    @TRANSACTIONCURRENCYID = FINANCIALTRANSACTION.TRANSACTIONCURRENCYID,
                    @BASEEXCHANGERATEID = FINANCIALTRANSACTION.BASEEXCHANGERATEID
                from dbo.FINANCIALTRANSACTION
                    inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
                    inner join dbo.PDACCOUNTSYSTEM on FINANCIALTRANSACTION.PDACCOUNTSYSTEMID = PDACCOUNTSYSTEM.ID
                    inner join dbo.CURRENCYSET on PDACCOUNTSYSTEM.CURRENCYSETID = CURRENCYSET.ID
                where
                    FINANCIALTRANSACTION.ID = @PLEDGEID and
                    FINANCIALTRANSACTION.DELETEDON is null

                set @INSTALLMENTS = dbo.UFN_INSTALLMENT_CONVERTAMOUNTSINXML(@INSTALLMENTS, @BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASEEXCHANGERATEID)
                exec dbo.USP_INSTALLMENT_GETINSTALLMENTS_2_UPDATEFROMXML @PLEDGEID, @INSTALLMENTS, @CHANGEAGENTID, @CURRENTDATE;
end