USP_INSTALLMENT_WRITEOFFINSTALLMENTSPLITS

This procedure is used to write off splits for an installment.

Parameters

Parameter Parameter Type Mode Description
@PLEDGEID uniqueidentifier IN
@INSTALLMENTID uniqueidentifier IN
@WRITEOFFID uniqueidentifier IN
@WRITEOFFAMOUNT money IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN

Definition

Copy


        CREATE procedure dbo.USP_INSTALLMENT_WRITEOFFINSTALLMENTSPLITS
        (
            @PLEDGEID uniqueidentifier, 
            @INSTALLMENTID uniqueidentifier, 
            @WRITEOFFID uniqueidentifier, 
            @WRITEOFFAMOUNT money,
            @CHANGEAGENTID uniqueidentifier,
            @CHANGEDATE datetime
        )
        as
            set nocount on;

            -- All amounts are in the transaction currency of the installment (and also pledge)

            -- unless otherwise noted.


            declare @TRANSACTIONCURRENCYID uniqueidentifier;
            declare @BASEEXCHANGERATEID uniqueidentifier;
            declare @BASECURRENCYID uniqueidentifier;
            declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
            declare @BASECURRENCYDECIMALDIGITS tinyint;
            declare @TRANSACTIONCURRENCYDECIMALDIGITS tinyint;
            declare @ORGANIZATIONCURRENCYID uniqueidentifier;
            declare @ORGANIZATIONCURRENCYDECIMALDIGITS tinyint;
            declare @ORGANIZATIONAMOUNTORIGINCODE tinyint;

            set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
            select @ORGANIZATIONCURRENCYDECIMALDIGITS = CURRENCY.DECIMALDIGITS from dbo.CURRENCY where CURRENCY.ID = @ORGANIZATIONCURRENCYID;

            set @ORGANIZATIONAMOUNTORIGINCODE = coalesce((select ORGANIZATIONAMOUNTORIGINCODE from dbo.MULTICURRENCYCONFIGURATION), 0);

            select
                @TRANSACTIONCURRENCYID = FINANCIALTRANSACTION.TRANSACTIONCURRENCYID,
                @BASECURRENCYID = CURRENCYSET.BASECURRENCYID,
                @BASEEXCHANGERATEID = FINANCIALTRANSACTION.BASEEXCHANGERATEID,
                @ORGANIZATIONEXCHANGERATEID = FINANCIALTRANSACTION.ORGEXCHANGERATEID,
                @BASECURRENCYDECIMALDIGITS = BASECURRENCY.DECIMALDIGITS,
                @TRANSACTIONCURRENCYDECIMALDIGITS = TRANSACTIONCURRENCY.DECIMALDIGITS 
            from
                dbo.FINANCIALTRANSACTION
                inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
                inner join dbo.PDACCOUNTSYSTEM on FINANCIALTRANSACTION.PDACCOUNTSYSTEMID = PDACCOUNTSYSTEM.ID
                inner join dbo.CURRENCYSET on PDACCOUNTSYSTEM.CURRENCYSETID = CURRENCYSET.ID
                inner join dbo.CURRENCY BASECURRENCY on CURRENCYSET.BASECURRENCYID = BASECURRENCY.ID
                inner join dbo.CURRENCY TRANSACTIONCURRENCY on FINANCIALTRANSACTION.TRANSACTIONCURRENCYID = TRANSACTIONCURRENCY.ID
            where
                FINANCIALTRANSACTION.ID = @PLEDGEID
                and FINANCIALTRANSACTION.DELETEDON is null;

            -- initialize the writeoff amount for each installment split as its balance; we can adjust later if only a portion of the installment is being written off

            declare @SPLITS table(
                INSTALLMENTSPLITID uniqueidentifier, 
                DESIGNATIONID uniqueidentifier, 
                AMOUNTWRITEOFFTX money, 
                AMOUNTWRITEOFFBASE money, 
                AMOUNTWRITEOFFORG money
            );

            --AdamBu 10/19/10

            --    1) Don't need to track writeoff ID.

            --    2) Don't just use the installment split balance.  In the event that we are editing an existing 

            --        writeoff, we want to ignore any affect that writeoff had on the IS's balance.  As such,

            --        start from that balance, but add back the amount that had been written off by this writeoff

            --        before it was edited.

            insert into @SPLITS(
                INSTALLMENTSPLITID, 
                AMOUNTWRITEOFFTX, 
                DESIGNATIONID
            )
            select 
                INSTALLMENTSPLIT.ID, 
                dbo.UFN_INSTALLMENT_GETINSTALLMENTSPLITBALANCE(INSTALLMENTSPLIT.ID)
                    + coalesce(
                        (
                            select sum(INSTALLMENTSPLITWRITEOFF.AMOUNT)
                            from dbo.INSTALLMENTSPLITWRITEOFF
                            where INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
                                and INSTALLMENTSPLITWRITEOFF.WRITEOFFID = @WRITEOFFID
                        )
                    ,0), 
                INSTALLMENTSPLIT.DESIGNATIONID
            from dbo.INSTALLMENTSPLIT 
                inner join dbo.INSTALLMENT on INSTALLMENTSPLIT.INSTALLMENTID = INSTALLMENT.ID
            where INSTALLMENT.ID = @INSTALLMENTID 

            declare @installmentBalance money
            select
                @installmentBalance = SUM(AMOUNTWRITEOFFTX) 
            from @SPLITS

            if @WRITEOFFAMOUNT <> @installmentBalance
            begin
                -- only a portion of the installment is being written off, so pro-rate among designations

                declare @SPLITSXML xml = (
                    select 
                        AMOUNTWRITEOFFTX as AMOUNT, 
                        INSTALLMENTSPLITID as ID 
                    from @SPLITS 
                    for xml raw('ITEM'),type,elements,root('AMOUNTSTOPRORATE'),BINARY BASE64
                );

                declare @PRORATED table(
                    ID uniqueidentifier, 
                    AMOUNT money
                );

                insert into @PRORATED(
                    ID, 
                    AMOUNT
                )
                select 
                    ID, 
                    AMOUNT 
                from dbo.UFN_SPLITS_PRORATEAMOUNTS(@installmentBalance, @WRITEOFFAMOUNT, @TRANSACTIONCURRENCYDECIMALDIGITS, @SPLITSXML);

                update @SPLITS
                set 
                    AMOUNTWRITEOFFTX = PROR.AMOUNT
                from @PRORATED PROR
                    inner join @SPLITS on PROR.ID = INSTALLMENTSPLITID
            end

            -- perform currency conversion for writeoff split records

            declare @currencySplits xml = (
                select 
                    INSTALLMENTSPLITID ID, 
                    @INSTALLMENTID as INSTALLMENTID, 
                    DESIGNATIONID, 
                    AMOUNTWRITEOFFTX as AMOUNT
                from @SPLITS
                for xml raw('ITEM'),type,elements,root('INSTALLMENTSPLITS'),BINARY BASE64
            );
            -- please note that UFN_INSTALLMENTSPLIT_CONVERTAMOUNTSINXML is evil insofar as the "AMOUNT" on the way in becomes "TRANSACTIONAMOUNT" on the way out, 

            -- and the calculated "BASEAMOUNT" is returned as the new "AMOUNT."  

            set @currencySplits = dbo.UFN_INSTALLMENTSPLIT_CONVERTAMOUNTSINXML(@currencySplits, @BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID,@TRANSACTIONCURRENCYID, @BASEEXCHANGERATEID)  

            update 
                @SPLITS
            set 
                AMOUNTWRITEOFFBASE = INSTALLMENTSPLITSITEM.ELEMENT.value('AMOUNT[1]', 'money'), 
                AMOUNTWRITEOFFORG = INSTALLMENTSPLITSITEM.ELEMENT.value('ORGANIZATIONAMOUNT[1]', 'money')
            from 
                @currencySplits.nodes('/INSTALLMENTSPLITS/ITEM') INSTALLMENTSPLITSITEM(ELEMENT)
                inner join @SPLITS SP on INSTALLMENTSPLITSITEM.ELEMENT.value('(ID)[1]', 'uniqueidentifier') = SP.INSTALLMENTSPLITID 

            --AdamBu 10/19/10 - In the event that we are editing an existing writeoff, update the existing

            --    installment split writeoffs whose new amount is not 0.

            update dbo.INSTALLMENTSPLITWRITEOFF
            set
                AMOUNT = SPLITS.AMOUNTWRITEOFFBASE, 
                CHANGEDBYID = @CHANGEAGENTID
                DATECHANGED = @CHANGEDATE
                TRANSACTIONAMOUNT = SPLITS.AMOUNTWRITEOFFTX, 
                ORGANIZATIONAMOUNT = SPLITS.AMOUNTWRITEOFFORG,
                BASEEXCHANGERATEID = @BASEEXCHANGERATEID,
                ORGANIZATIONEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID
            from @SPLITS SPLITS
            where INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = SPLITS.INSTALLMENTSPLITID
                and INSTALLMENTSPLITWRITEOFF.WRITEOFFID = @WRITEOFFID
                and SPLITS.AMOUNTWRITEOFFTX > 0

            --AdamBu 10/19/10 - In the event that we are editing an existing writeoff, delete existing

            --    installment split writeoffs whose new amount is 0.

            delete dbo.INSTALLMENTSPLITWRITEOFF
            from @SPLITS SPLITS
            where INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = SPLITS.INSTALLMENTSPLITID
                and INSTALLMENTSPLITWRITEOFF.WRITEOFFID = @WRITEOFFID
                and SPLITS.AMOUNTWRITEOFFTX = 0

            -- insert new INSTALLMENTSPLITWRITEOFF records

            --AdamBu 10/19/10 - Don't create 0 amount installment split writeoffs.

            insert into dbo.INSTALLMENTSPLITWRITEOFF(
                ID, 
                WRITEOFFID, 
                INSTALLMENTSPLITID, 
                AMOUNT, 
                ADDEDBYID, 
                CHANGEDBYID, 
                DATEADDED, 
                DATECHANGED, 
                BASECURRENCYID, 
                TRANSACTIONAMOUNT, 
                TRANSACTIONCURRENCYID, 
                ORGANIZATIONAMOUNT, 
                BASEEXCHANGERATEID, 
                ORGANIZATIONEXCHANGERATEID
            )
            select 
                newid(), 
                @WRITEOFFID
                SPLITS.INSTALLMENTSPLITID, 
                SPLITS.AMOUNTWRITEOFFBASE, 
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CHANGEDATE
                @CHANGEDATE
                @BASECURRENCYID
                SPLITS.AMOUNTWRITEOFFTX, 
                @TRANSACTIONCURRENCYID
                SPLITS.AMOUNTWRITEOFFORG, 
                @BASEEXCHANGERATEID
                @ORGANIZATIONEXCHANGERATEID
            from @SPLITS SPLITS
                left join dbo.INSTALLMENTSPLITWRITEOFF 
                    on INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = SPLITS.INSTALLMENTSPLITID
                        and INSTALLMENTSPLITWRITEOFF.WRITEOFFID = @WRITEOFFID
            where INSTALLMENTSPLITWRITEOFF.ID is null
                and SPLITS.AMOUNTWRITEOFFTX > 0

            return 0;