USP_PLEDGE_PAYSINGLEINSTALLMENT

Stored proc to apply a payment to a pledge installment

Parameters

Parameter Parameter Type Mode Description
@INSTALLMENTID uniqueidentifier IN
@REVENUEID uniqueidentifier IN
@AMOUNT money INOUT
@CAID uniqueidentifier IN
@CHANGEDATE datetime IN

Definition

Copy


        CREATE procedure dbo.USP_PLEDGE_PAYSINGLEINSTALLMENT
        (
            @INSTALLMENTID uniqueidentifier, 
            @REVENUEID uniqueidentifier, 
            @AMOUNT money output,
            @CAID uniqueidentifier,
            @CHANGEDATE datetime
        )
        as
        declare @PAYAMOUNT money;
        declare @AMOUNTPAID money;
        declare @AMOUNTLEFT money;
        declare @BALANCE money;
        declare @PLEDGEID uniqueidentifier
        declare @INSTALLMENTSPLITID uniqueidentifier;
        declare @INSTALLMENTPAYMENTID uniqueidentifier;
        declare @PLEDGETYPECODE tinyint;
        declare @DESIGNATIONID uniqueidentifier;
        declare @REVENUESPLITID uniqueidentifier;

        set @AMOUNTPAID = 0;
        set @AMOUNTLEFT = @AMOUNT;

        declare INSTALLMENTCURSOR cursor local fast_forward for 
            select INSTALLMENTSPLIT.PLEDGEID, INSTALLMENTSPLIT.ID, INSTALLMENTSPLIT.DESIGNATIONID, dbo.UFN_INSTALLMENT_GETINSTALLMENTSPLITBALANCE(INSTALLMENTSPLIT.ID), REVENUESPLIT.TYPECODE
            from dbo.INSTALLMENTSPLIT
            inner join dbo.INSTALLMENT
                on INSTALLMENTSPLIT.INSTALLMENTID = INSTALLMENT.ID
            inner join dbo.REVENUESPLIT
                on REVENUESPLIT.REVENUEID = INSTALLMENTSPLIT.PLEDGEID and REVENUESPLIT.DESIGNATIONID = INSTALLMENTSPLIT.DESIGNATIONID
            where dbo.UFN_INSTALLMENT_GETINSTALLMENTSPLITBALANCE(INSTALLMENTSPLIT.ID) > 0
                  and INSTALLMENT.ID = @INSTALLMENTID;

        open INSTALLMENTCURSOR;
        fetch next from INSTALLMENTCURSOR into @PLEDGEID, @INSTALLMENTSPLITID, @DESIGNATIONID, @BALANCE, @PLEDGETYPECODE;

        while @@FETCH_STATUS = 0
        begin
            set @INSTALLMENTPAYMENTID = null;
            set @REVENUESPLITID = null;

            if @AMOUNTPAID = @AMOUNT
                break;

            /* determine payment amount */
            if @AMOUNTLEFT <= @BALANCE
                set @PAYAMOUNT = @AMOUNTLEFT;
            else
                set @PAYAMOUNT = @BALANCE;

            set @AMOUNTPAID = @AMOUNTPAID + @PAYAMOUNT;
            set @AMOUNTLEFT = @AMOUNTLEFT - @PAYAMOUNT;

            /* Create Split    */
            select @REVENUESPLITID = ID
            from REVENUESPLIT
            where REVENUEID = @REVENUEID and DESIGNATIONID = @DESIGNATIONID

            if @REVENUESPLITID is null 
            begin
                set @REVENUESPLITID = newid();
                insert into dbo.REVENUESPLIT(ID, REVENUEID, DESIGNATIONID, AMOUNT, APPLICATIONCODE, TYPECODE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                    values(@REVENUESPLITID, @REVENUEID, @DESIGNATIONID, @PAYAMOUNT, 2,@PLEDGETYPECODE, @CAID, @CAID, @CHANGEDATE, @CHANGEDATE);
            end
            else
                update dbo.INSTALLMENTSPLITPAYMENT
                set AMOUNT = AMOUNT + @PAYAMOUNT,
                    CHANGEDBYID = @CAID,
                    DATECHANGED = @CHANGEDATE
                where ID = @INSTALLMENTPAYMENTID;

            /* see if this payment is already on this installment and just update the balance */
            select @INSTALLMENTPAYMENTID = ID
            from INSTALLMENTSPLITPAYMENT
            where INSTALLMENTSPLITID = @INSTALLMENTSPLITID and PAYMENTID = @REVENUESPLITID

            if @INSTALLMENTPAYMENTID is null
            begin
                insert into dbo.INSTALLMENTSPLITPAYMENT(ID, PAYMENTID, PLEDGEID, INSTALLMENTSPLITID, AMOUNT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                    values(newid(), @REVENUESPLITID, @PLEDGEID, @INSTALLMENTSPLITID, @PAYAMOUNT, @CAID, @CAID, @CHANGEDATE, @CHANGEDATE);
            end
            else
                update dbo.INSTALLMENTSPLITPAYMENT
                set AMOUNT = AMOUNT + @PAYAMOUNT,
                    CHANGEDBYID = @CAID,
                    DATECHANGED = @CHANGEDATE
                where ID = @INSTALLMENTPAYMENTID;

            fetch next from INSTALLMENTCURSOR into @PLEDGEID, @INSTALLMENTSPLITID, @DESIGNATIONID, @BALANCE, @PLEDGETYPECODE;
        end

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

        close INSTALLMENTCURSOR;
        deallocate INSTALLMENTCURSOR;

        set @AMOUNT = @AMOUNTPAID;