UFN_SALESORDER_GETSPLITSFORPAYMENT

Returns the splits for a payment, pro-rated to the given amount.

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@PAYMENTID uniqueidentifier IN
@AMOUNT money IN

Definition

Copy


            create function dbo.UFN_SALESORDER_GETSPLITSFORPAYMENT
            (
                @PAYMENTID uniqueidentifier,
                @AMOUNT money
            )
            returns @PAYMENTSPLITS table
            (
                ID uniqueidentifier,
                APPLICATIONCODE tinyint,
                TYPECODE tinyint,
                DESIGNATIONID uniqueidentifier,
                AMOUNT money
            )
            as
            begin
                declare @WEIGHTSUM decimal(30, 5);
                declare @IDEALAMOUNT decimal(30, 5);
                declare @AMOUNTDISTRIBUTEDIDEAL decimal(30, 5); 
                declare @AMOUNTDISTRIBUTED decimal(30, 5);

                declare @WEIGHTAMOUNT decimal(30, 5);
                declare @DESIGNATIONID uniqueidentifier;
                declare @APPLICATIONID uniqueidentifier;

                set @AMOUNTDISTRIBUTEDIDEAL = 0;
                set @AMOUNTDISTRIBUTED = 0;

                insert into @PAYMENTSPLITS(ID, TYPECODE, APPLICATIONCODE, DESIGNATIONID, AMOUNT)
                    select ID, TYPECODE, APPLICATIONCODE, DESIGNATIONID, AMOUNT
                    from dbo.REVENUESPLIT
                    where REVENUEID = @PAYMENTID
                    order by DATEADDED;

                select
                    @WEIGHTSUM = sum(AMOUNT) 
                from @PAYMENTSPLITS

                declare PAYMENTSPLITS cursor local fast_forward for 
                    select ID, AMOUNT
                    from @PAYMENTSPLITS

                open PAYMENTSPLITS;
                    fetch next from PAYMENTSPLITS into @APPLICATIONID, @WEIGHTAMOUNT;

                    while @@FETCH_STATUS = 0
                    begin
                        if @WEIGHTSUM <> 0
                            set @IDEALAMOUNT = (@WEIGHTAMOUNT / @WEIGHTSUM) * @AMOUNT;
                        else
                            set @IDEALAMOUNT = 0;

                        set @WEIGHTAMOUNT = ROUND(@IDEALAMOUNT + @AMOUNTDISTRIBUTEDIDEAL - @AMOUNTDISTRIBUTED, 2);

                        update @PAYMENTSPLITS 
                            set AMOUNT = @WEIGHTAMOUNT
                        where ID = @APPLICATIONID;

                        set @AMOUNTDISTRIBUTEDIDEAL = @AMOUNTDISTRIBUTEDIDEAL + @IDEALAMOUNT;
                        set @AMOUNTDISTRIBUTED = @AMOUNTDISTRIBUTED + @WEIGHTAMOUNT;

                        fetch next from PAYMENTSPLITS into @APPLICATIONID, @WEIGHTAMOUNT;
                    end

                close PAYMENTSPLITS;
                deallocate PAYMENTSPLITS;

            return;
        end