UFN_SPLITS_GETPRORATEDSPLITS

Returns split amounts

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@ORIGINALAMOUNT money IN
@NEWAMOUNT money IN
@AMOUNTSTOPRORATE xml IN

Definition

Copy


CREATE function dbo.UFN_SPLITS_GETPRORATEDSPLITS
(
    @ORIGINALAMOUNT money,
    @NEWAMOUNT money,
    @AMOUNTSTOPRORATE xml
)
returns @PRORATEDAMOUNTS table
(
    ID uniqueidentifier,
    AMOUNT money,
    CREDITITEMID uniqueidentifier
)
as begin
    -- adjust splits for new amount

    declare @CURRENTAMOUNT decimal(30, 5);
    declare @WEIGHT decimal(30, 10);
    declare @ID uniqueidentifier;

    -- Load return table with current amounts to prorate

    insert into @PRORATEDAMOUNTS(AMOUNT, ID, CREDITITEMID)
    select
        T.c.value('(AMOUNT)[1]','money') AS 'AMOUNT',
        T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
        T.c.value('(CREDITITEMID)[1]','uniqueidentifier') AS 'CREDITITEMID'
    from @AMOUNTSTOPRORATE.nodes('/AMOUNTSTOPRORATE/ITEM') T(c)

    -- Loop through and calculate new split amounts

    declare AMOUNTSTOPRORATECURSOR cursor local fast_forward 
    for 
        select isnull(CREDITITEMID, ID), AMOUNT from @PRORATEDAMOUNTS;

    open AMOUNTSTOPRORATECURSOR;

    fetch next from AMOUNTSTOPRORATECURSOR into @ID, @WEIGHT;

    while @@FETCH_STATUS = 0 begin
        if @ORIGINALAMOUNT <> 0
            set @CURRENTAMOUNT = round((@WEIGHT / @ORIGINALAMOUNT) * @NEWAMOUNT, 2);
        else
            set @CURRENTAMOUNT = 0;

        update
            @PRORATEDAMOUNTS 
        set
            AMOUNT = @CURRENTAMOUNT
        where
            CREDITITEMID = @ID
            or ID=@ID;

        set @NEWAMOUNT = @NEWAMOUNT - @CURRENTAMOUNT;
        set @ORIGINALAMOUNT = @ORIGINALAMOUNT - @WEIGHT;

        fetch next from AMOUNTSTOPRORATECURSOR into @ID, @WEIGHT;
    end

    close AMOUNTSTOPRORATECURSOR;
    deallocate AMOUNTSTOPRORATECURSOR;

    return
end