UFN_REVENUEBATCH_GENERATEINSTALLMENTS2

Return

Return Type
xml

Parameters

Parameter Parameter Type Mode Description
@AMOUNT money IN
@INSTALLMENTFREQUENCYCODE tinyint IN
@INSTALLMENTSTARTDATE datetime IN
@NUMBEROFINSTALLMENTS int IN
@TRANSACTIONCURRENCYID uniqueidentifier IN
@TOTALBENEFITS xml IN

Definition

Copy


CREATE function dbo.UFN_REVENUEBATCH_GENERATEINSTALLMENTS2
(
    @AMOUNT money,
    @INSTALLMENTFREQUENCYCODE tinyint,
    @INSTALLMENTSTARTDATE datetime,
    @NUMBEROFINSTALLMENTS integer,
    @TRANSACTIONCURRENCYID uniqueidentifier,
    @TOTALBENEFITS xml = null
)
returns xml
with execute as caller
as begin
    declare @INSTALLMENTS xml;
    declare @TRANSACTIONCURRENCYDECIMALDIGITS tinyint = 2;
    declare @i integer = 0;
    declare @TYPICALAMOUNT money;
    declare @INSTALLMENTTABLE table
        (
            DATE datetime,
            AMOUNT money,
            RECEIPTAMOUNT money,
            SEQUENCE int
        );

    select
        @TRANSACTIONCURRENCYDECIMALDIGITS = coalesce(DECIMALDIGITS, 2)
    from dbo.UFN_CURRENCY_GETPROPERTIES(@TRANSACTIONCURRENCYID);

    set @TYPICALAMOUNT = ROUND(@AMOUNT / @NUMBEROFINSTALLMENTS, @TRANSACTIONCURRENCYDECIMALDIGITS);

    if @AMOUNT > 0
        begin
            if @AMOUNT - (@TYPICALAMOUNT * (@NUMBEROFINSTALLMENTS - 1)) < 0 
            set @TYPICALAMOUNT = @TYPICALAMOUNT - power(10, -1 * @TRANSACTIONCURRENCYDECIMALDIGITS); 
        end

    -- Do not generate installments for Irregular frequency

    if @INSTALLMENTFREQUENCYCODE <> 4
        begin
            while @i < @NUMBEROFINSTALLMENTS
                begin

                    if @i = @NUMBEROFINSTALLMENTS - 1
                        set @TYPICALAMOUNT = @AMOUNT - (@TYPICALAMOUNT * (@NUMBEROFINSTALLMENTS - 1));

                    if @INSTALLMENTFREQUENCYCODE = 0
                        insert into @INSTALLMENTTABLE values (dateadd(yy, @i, @INSTALLMENTSTARTDATE), @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);
                    else if @INSTALLMENTFREQUENCYCODE = 1
                        insert into @INSTALLMENTTABLE values (dateadd(mm, @i * 6, @INSTALLMENTSTARTDATE), @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);
                    else if @INSTALLMENTFREQUENCYCODE = 2
                        insert into @INSTALLMENTTABLE values (dateadd(qq, @i, @INSTALLMENTSTARTDATE), @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);
                    else if @INSTALLMENTFREQUENCYCODE = 3
                        insert into @INSTALLMENTTABLE values (dateadd(mm, @i, @INSTALLMENTSTARTDATE), @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);
                    else if @INSTALLMENTFREQUENCYCODE = 5
                        insert into @INSTALLMENTTABLE values (@INSTALLMENTSTARTDATE, @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);
                    else if @INSTALLMENTFREQUENCYCODE = 7
                        begin
                            -- This is based on the algorithm for calculating semi-monthly dates found in RecurringGiftScheduleDataList.vb

                            declare @NUMMONTHS int;
                            declare @NEXTDATE datetime;

                            set @NUMMONTHS = @i / 2;
                            set @NEXTDATE = dateadd(mm,@NUMMONTHS,@INSTALLMENTSTARTDATE);

                            if @i % 2 <> 0
                                begin
                                    declare @NEXTDATE2 datetime;

                                    if datepart(dd,@INSTALLMENTSTARTDATE) <= 15
                                        begin

                                            set @NEXTDATE2 = dateadd(dd,15,@NEXTDATE);

                                            if datepart(mm,@NEXTDATE2) > datepart(mm,@NEXTDATE)
                                                set @NEXTDATE2 = dbo.UFN_DATE_THISMONTH_LASTDAY(@NEXTDATE,0)

                                            set @NEXTDATE = @NEXTDATE2;
                                        end
                                    else
                                        begin
                                            if datepart(dd,@INSTALLMENTSTARTDATE) > 15
                                                begin
                                                    set @NEXTDATE2 = dateadd(dd,15,@NEXTDATE);

                                                    if datepart(mm,@NEXTDATE2) = datepart(mm,@NEXTDATE) and datepart(dd,@NEXTDATE2) = 31
                                                        set @NEXTDATE2 = dateadd(dd,1,@NEXTDATE2);

                                                    set @NEXTDATE = @NEXTDATE2;
                                                end
                                            else
                                                set @NEXTDATE = dateadd(dd,15,@NEXTDATE);
                                        end
                                end

                            insert into @INSTALLMENTTABLE values (@NEXTDATE, @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);

                    end
                    else if @INSTALLMENTFREQUENCYCODE = 8
                        insert into @INSTALLMENTTABLE values (dateadd(ww, @i * 2, @INSTALLMENTSTARTDATE), @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);

                    set @i = @i + 1;
                end

            declare @TOTALBENEFITAMOUNT money = 0

            if @TOTALBENEFITS is not null
            begin
                select @TOTALBENEFITAMOUNT = coalesce(sum(TOTALVALUE), 0)
                from dbo.UFN_REVENUE_GETBENEFITS_3_FROMITEMLISTXML(@TOTALBENEFITS);
            end

            declare @TOTALRECEIPTAMOUNT money = @AMOUNT - @TOTALBENEFITAMOUNT
            set @i = @NUMBEROFINSTALLMENTS

            -- calculate receipt amount for pledge

            while @i > 0
            begin
                declare @INSTALLMENTAMOUNT money
                select @INSTALLMENTAMOUNT = AMOUNT
                from @INSTALLMENTTABLE
                where SEQUENCE = @i

                if @TOTALRECEIPTAMOUNT > @INSTALLMENTAMOUNT
                begin
                    update @INSTALLMENTTABLE
                    set RECEIPTAMOUNT = @INSTALLMENTAMOUNT
                    where SEQUENCE = @i
                end
                else
                begin
                    update @INSTALLMENTTABLE
                    set RECEIPTAMOUNT = @TOTALRECEIPTAMOUNT
                    where SEQUENCE = @i
                end

                set @TOTALRECEIPTAMOUNT = @TOTALRECEIPTAMOUNT - @INSTALLMENTAMOUNT
                if @TOTALRECEIPTAMOUNT < 0
                    set @TOTALRECEIPTAMOUNT = 0

                set @i = @i - 1
            end

            set @INSTALLMENTS = 
            (
                select DATE, AMOUNT, RECEIPTAMOUNT, SEQUENCE
                from @INSTALLMENTTABLE
                for xml raw ('ITEM'), type, elements, root ('INSTALLMENTS'), binary base64    
            );
        end

    return @INSTALLMENTS;
end