USP_INSTALLMENT_WRITEOFFINSTALLMENTS

This procedure is used to write off installments for a pledge.

Parameters

Parameter Parameter Type Mode Description
@WRITEOFFID uniqueidentifier IN
@WRITEOFFAMOUNT money IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN
@ISEDIT bit IN
@INSTALLMENTS xml IN

Definition

Copy


            CREATE procedure dbo.USP_INSTALLMENT_WRITEOFFINSTALLMENTS
            (
                @WRITEOFFID uniqueidentifier,
                @WRITEOFFAMOUNT money,
                @CHANGEAGENTID uniqueidentifier,
                @CHANGEDATE datetime,
                @ISEDIT bit,
                @INSTALLMENTS xml
            )
            as
            begin
                declare @WRITEOFFCURSOR cursor
                declare @INSTALLMENTID uniqueidentifier
                declare @PLEDGEID uniqueidentifier
                declare @INSTALLMENTBALANCE money
                declare @SUMINSTALLMENTWRITEOFFAMOUNTS money
                declare @APPLIEDAMOUNT money
                declare @TOTALPLEDGEBALANCE money

                if @ISEDIT = 1
                    set @WRITEOFFCURSOR = cursor local fast_forward for
                    select 
                        ID,
                        BALANCE,
                        isnull(WRITEOFFAMOUNT, 0) as WRITEOFFAMOUNT
                    from 
                        dbo.UFN_WRITEOFF_GETINSTALLMENTSFOREDIT_FROMITEMLISTXML(@INSTALLMENTS);
                else
                    set @WRITEOFFCURSOR = cursor local fast_forward for
                    select 
                        ID,
                        BALANCE,
                        isnull(WRITEOFFAMOUNT,0) as WRITEOFFAMOUNT
                    from 
                        dbo.UFN_INSTALLMENT_GETWRITEOFFINSTALLMENTS_FROMITEMLISTXML(@INSTALLMENTS);

                begin try
                    if @CHANGEDATE is null
                        set @CHANGEDATE = GetDate()
                    select 
                        @TOTALPLEDGEBALANCE = coalesce(sum(BALANCE), 0),
                        @SUMINSTALLMENTWRITEOFFAMOUNTS = coalesce(sum(WRITEOFFAMOUNT), 0)
                    from
                        dbo.UFN_INSTALLMENT_GETWRITEOFFINSTALLMENTS_FROMITEMLISTXML(@INSTALLMENTS)

                    if @WRITEOFFAMOUNT <> @SUMINSTALLMENTWRITEOFFAMOUNTS
                        raiserror('BBERR_TOTAL_NOT_EQUAL_WRITEOFF : The total amount applied does not equal the amount of the write-off.', 13, 1)

                    if @SUMINSTALLMENTWRITEOFFAMOUNTS > @TOTALPLEDGEBALANCE
                        raiserror('BBERR_WRITEOFF_GREATER_THAN_BALANCE : The amount of the write-off is greater than the total balance.', 13, 1)

                    open @WRITEOFFCURSOR

                    fetch next from @WRITEOFFCURSOR into
                        @INSTALLMENTID,
                        @INSTALLMENTBALANCE,
                        @APPLIEDAMOUNT

                    select @PLEDGEID = REVENUEID from dbo.INSTALLMENT where ID = @INSTALLMENTID

                    while @@FETCH_STATUS = 0 
                    begin
                        if @APPLIEDAMOUNT > @INSTALLMENTBALANCE
                            raiserror('BBERR_WRITEOFF_GREATER_THAN_INSTALLMENT_BALANCE : The specified write-off amount is greater than the installment balance.', 13, 1)

                        exec dbo.USP_INSTALLMENT_WRITEOFFINSTALLMENTSPLITS @PLEDGEID, @INSTALLMENTID, @WRITEOFFID, @APPLIEDAMOUNT, @CHANGEAGENTID, @CHANGEDATE

                        fetch next from @WRITEOFFCURSOR into
                            @INSTALLMENTID,
                            @INSTALLMENTBALANCE,
                            @APPLIEDAMOUNT
                    end
                end try

                begin catch
                    deallocate @WRITEOFFCURSOR
                    exec dbo.USP_RAISE_ERROR
                end catch

                --When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long

                close @WRITEOFFCURSOR;
                deallocate @WRITEOFFCURSOR;
            end