USP_DATAFORMTEMPLATE_ADD_PLEDGEWRITEOFF_3

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT
@CHANGEAGENTID uniqueidentifier IN
@REVENUEID uniqueidentifier IN
@DATE datetime IN
@WRITEOFFTOTALAMOUNT money IN
@POSTSTATUSCODE tinyint IN
@POSTDATE datetime IN
@REASON nvarchar(300) IN
@INSTALLMENTS xml IN
@REASONCODEID uniqueidentifier IN
@RECOGNITIONCREDITS xml IN
@BATCHID uniqueidentifier IN

Definition

Copy


            create procedure dbo.USP_DATAFORMTEMPLATE_ADD_PLEDGEWRITEOFF_3
            (
                @ID uniqueidentifier = null output,
                @CHANGEAGENTID uniqueidentifier,
                @REVENUEID uniqueidentifier,
                @DATE datetime,
                @WRITEOFFTOTALAMOUNT money = 0,
                @POSTSTATUSCODE tinyint = 1,
                @POSTDATE datetime = null,
                @REASON nvarchar(300) = null,
                @INSTALLMENTS xml,
                @REASONCODEID uniqueidentifier = null,
                @RECOGNITIONCREDITS xml = null,
                @BATCHID uniqueidentifier = null
                )
            as
            begin

                -- This implementation is copied from USP_DATAFORMTEMPLATE_ADD_PLEDGEWRITEOFF2 with batch ID passed to it.


                set nocount on;

                declare @CURRENTDATE datetime;
                declare @PLEDGEID uniqueidentifier;
                declare @PLEDGEAMOUNT money;
                declare @TRANSACTIONTYPECODE tinyint;
                declare @BASECURRENCYID uniqueidentifier;
                declare @TRANSACTIONCURRENCYID uniqueidentifier;
                declare @BASEEXCHANGERATEID uniqueidentifier;
                declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
                declare @ORGANIZATIONCURRENCYID uniqueidentifier;
                declare @PDACCOUNTSYSTEMID uniqueidentifier;

                if @ID is null
                    set @ID = newid();

                set @CURRENTDATE = getdate();

                set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

                select 
                    @PLEDGEID = FINANCIALTRANSACTION.ID,
                    @TRANSACTIONTYPECODE = FINANCIALTRANSACTION.TYPECODE,
                    @PLEDGEAMOUNT = FINANCIALTRANSACTION.TRANSACTIONAMOUNT,
                    @BASECURRENCYID = CURRENCYSET.BASECURRENCYID,
                    @TRANSACTIONCURRENCYID = FINANCIALTRANSACTION.TRANSACTIONCURRENCYID,
                    @BASEEXCHANGERATEID = FINANCIALTRANSACTION.BASEEXCHANGERATEID,
                    @ORGANIZATIONEXCHANGERATEID = FINANCIALTRANSACTION.ORGEXCHANGERATEID,
                    @PDACCOUNTSYSTEMID = FINANCIALTRANSACTION.PDACCOUNTSYSTEMID
                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
                where
                    FINANCIALTRANSACTION.ID = @REVENUEID and FINANCIALTRANSACTION.DELETEDON is null;

                if @CHANGEAGENTID is null
                    exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

                -- Check GL business rule for this account system and set to 'Do not post' if needed.

                -- ****

                declare @ALLOWGLDISTRIBUTIONS bit;
                set @ALLOWGLDISTRIBUTIONS = dbo.UFN_PDACCOUNTSYSTEM_ALLOWGLDISTRIBUTIONS(@PDACCOUNTSYSTEMID);
                if @ALLOWGLDISTRIBUTIONS = 0 
                    begin
                        set @POSTSTATUSCODE = 2        -- Do not post

                        set @POSTDATE = null
                    end
                -- ****


                begin try
                    --Auction donations have more restrictions around write-offs

                    if @TRANSACTIONTYPECODE = 7
                    begin
                        declare @WRITEOFFCOUNT int = 0;
                        select @WRITEOFFCOUNT = count(*) from dbo.WRITEOFF 
                        where WRITEOFF.REVENUEID = @PLEDGEID;

                        if @WRITEOFFCOUNT > 0
                            raiserror('BBERR_AUCTIONDONATION_MULTIPLEWRITEOFFS', 13, 1);

                        if @PLEDGEAMOUNT <> @WRITEOFFTOTALAMOUNT
                            raiserror('BBERR_AUCTIONDONATION_WRITEOFFENTIREAMOUNT', 13, 1);
                    end

                    if @WRITEOFFTOTALAMOUNT < 0
                            raiserror('BBERR_WRITEOFF_VALIDAMOUNT', 13, 1);

                    insert into dbo.FINANCIALTRANSACTION (ID, DATE, PARENTID, POSTSTATUSCODE, POSTDATE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, TRANSACTIONCURRENCYID, PDACCOUNTSYSTEMID, TYPECODE,       TRANSACTIONAMOUNT,BASEEXCHANGERATEID,ORGEXCHANGERATEID)
                    values(@ID, @DATE, @PLEDGEID, case @POSTSTATUSCODE when 0 then 2 when 1 then 1 when 2 then 3 else 2 end, case @POSTSTATUSCODE when 2 then null else isnull(@POSTDATE,getdate()) end,              @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @TRANSACTIONCURRENCYID, @PDACCOUNTSYSTEMID, 20, @WRITEOFFTOTALAMOUNT,@BASEEXCHANGERATEID,@ORGANIZATIONEXCHANGERATEID)

                    insert into dbo.WRITEOFF_EXT (ID, REASON, REASONCODEID)
                    values (@ID, isnull(@REASON,''), @REASONCODEID)

                    if @TRANSACTIONTYPECODE <> 7
                        exec dbo.USP_INSTALLMENT_WRITEOFFINSTALLMENTS @ID,@WRITEOFFTOTALAMOUNT,@CHANGEAGENTID,@CURRENTDATE,0,@INSTALLMENTS;

                    declare @LineItems table (ID uniqueidentifier, DESIGNATIONID uniqueidentifier, APPLICATIONCODE tinyint default 0, TYPECODE tinyint default 0, BASEAMOUNT money, TRANSACTIONAMOUNT money,      ORGAMOUNT money, SOURCELINEITEMID uniqueidentifier)

                    if @TRANSACTIONTYPECODE <> 7
                        insert into @LineItems (ID, DESIGNATIONID, APPLICATIONCODE, TYPECODE, BASEAMOUNT, TRANSACTIONAMOUNT, ORGAMOUNT, SOURCELINEITEMID)
                        select 
                            newid(), 
                            INSTALLMENTSPLITWRITEOFFBYDESIGNATION.DESIGNATIONID, 
                            REVENUESPLIT_EXT.APPLICATIONCODE,
                            REVENUESPLIT_EXT.TYPECODE,
                            CURRENCYVALUES.BASEAMOUNT,
                            INSTALLMENTSPLITWRITEOFFBYDESIGNATION.TRANSACTIONAMOUNT, 
                            CURRENCYVALUES.ORGANIZATIONAMOUNT, 
                            REVENUESPLIT_EXT.ID
                        from
                            (
                                select
                                    INSTALLMENTSPLIT.REVENUESPLITID,
                                    INSTALLMENTSPLIT.DESIGNATIONID,
                                    sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT) TRANSACTIONAMOUNT,
                                    INSTALLMENTSPLIT.PLEDGEID
                                from
                                    dbo.INSTALLMENTSPLITWRITEOFF
                                    inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
                                where
                                    INSTALLMENTSPLITWRITEOFF.WRITEOFFID = @ID
                                    and INSTALLMENTSPLIT.PLEDGEID = @PLEDGEID
                                group by
                                    INSTALLMENTSPLIT.REVENUESPLITID, INSTALLMENTSPLIT.PLEDGEID,INSTALLMENTSPLIT.DESIGNATIONID
                            ) INSTALLMENTSPLITWRITEOFFBYDESIGNATION
                            inner join dbo.FINANCIALTRANSACTIONLINEITEM on INSTALLMENTSPLITWRITEOFFBYDESIGNATION.PLEDGEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
                            inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID and INSTALLMENTSPLITWRITEOFFBYDESIGNATION.REVENUESPLITID = REVENUESPLIT_EXT.ID
                            cross apply dbo.UFN_CURRENCY_GETCURRENCYVALUES_2
                                (
                                    INSTALLMENTSPLITWRITEOFFBYDESIGNATION.TRANSACTIONAMOUNT,
                                    null,
                                    @BASECURRENCYID,
                                    @BASEEXCHANGERATEID,
                                    @TRANSACTIONCURRENCYID,
                                    null,
                                    null,
                                    null,
                                    @ORGANIZATIONEXCHANGERATEID,
                                    0
                                ) CURRENCYVALUES
                        where FINANCIALTRANSACTIONLINEITEM.DELETEDON is null

                    else if @TRANSACTIONTYPECODE = 7 --Auction donations do not have installments

                        insert into @LineItems (ID, DESIGNATIONID, BASEAMOUNT, TRANSACTIONAMOUNT, ORGAMOUNT, SOURCELINEITEMID)
                        select top 1 newid(), REVENUESPLIT_EXT.DESIGNATIONID, FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT,
                        FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT, FINANCIALTRANSACTIONLINEITEM.ORGAMOUNT, FINANCIALTRANSACTIONLINEITEM.ID
                        from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
                        where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @PLEDGEID

                    insert into dbo.FINANCIALTRANSACTIONLINEITEM (ID, FINANCIALTRANSACTIONID, TRANSACTIONAMOUNT, VISIBLE, ADDEDBYID, CHANGEDBYID, 
                        DATEADDED, DATECHANGED,    DESCRIPTION, SEQUENCE, TYPECODE, POSTDATE, POSTSTATUSCODE,  SOURCELINEITEMID, BASEAMOUNT, ORGAMOUNT, BATCHID)
                    select ID, @ID, TRANSACTIONAMOUNT, 1, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, '', row_number() over (order by TRANSACTIONAMOUNT),
                        0, case @POSTSTATUSCODE when 2 then @DATE else @POSTDATE end, case @POSTSTATUSCODE when 0 then 1 when 2 then 3 else 1 end,
                        SOURCELINEITEMID, BASEAMOUNT, ORGAMOUNT, @BATCHID
                    from @LineItems

                    insert into dbo.REVENUESPLIT_EXT (ID, DESIGNATIONID, APPLICATIONCODE, TYPECODE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                    select ID, DESIGNATIONID, APPLICATIONCODE, TYPECODE, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                    from @LineItems


                    declare @WRITEOFFTRANSACTIONAMOUNT money;
                    declare @WRITEOFFBASEAMOUNT  money;
                    declare @WRITEOFFORGAMOUNT money;

                    select  
                        @WRITEOFFTRANSACTIONAMOUNT = sum(T2.TRANSACTIONAMOUNT),
                        @WRITEOFFBASEAMOUNT = sum(T2.BASEAMOUNT),
                        @WRITEOFFORGAMOUNT = sum(T2.ORGAMOUNT)
                    from dbo.FINANCIALTRANSACTION T1 
                        inner join  dbo.FINANCIALTRANSACTIONLINEITEM T2 on T1.ID = T2.FINANCIALTRANSACTIONID 
                        where T1.TYPECODE = 20 and T1.ID = @ID

                    update     dbo.FINANCIALTRANSACTION 
                        set TRANSACTIONAMOUNT = isnull(@WRITEOFFTRANSACTIONAMOUNT,0),    
                            BASEAMOUNT = isnull(@WRITEOFFBASEAMOUNT,0),        
                            ORGAMOUNT = isnull(@WRITEOFFORGAMOUNT,0)    
                        where ID = @ID

                    --Save the write-off GL distributions

                    if @POSTSTATUSCODE <> 2 and @TRANSACTIONTYPECODE in (1,15) and dbo.UFN_VALID_BASICGL_INSTALLED() = 1 
                    begin
                        -- Using a table to support redistributing across multiple write-offs, e.g. editing a pledge designation

                        declare @WRITEOFFIDTABLE UDT_GENERICID;
                        insert into @WRITEOFFIDTABLE values (@ID);
                        --Write-off for pledge 

                        exec dbo.USP_SAVE_PLEDGEWRITEOFFGLDISTRIBUTION @PLEDGEID, @WRITEOFFIDTABLE, @CHANGEAGENTID, @CURRENTDATE
                    end
                    else if @POSTSTATUSCODE <> 2
                        exec dbo.USP_SAVE_WRITEOFFGLDISTRIBUTION @PLEDGEID, @CHANGEAGENTID, @CURRENTDATE;


                    -- Update recognition credit amounts

                    update dbo.REVENUERECOGNITION set
                        AMOUNT = UPDATEDRECOGNITIONCREDITS.ADJUSTEDAMOUNT,
                        ORGANIZATIONAMOUNT =
                            case
                                when @BASECURRENCYID <> @ORGANIZATIONCURRENCYID
                                    then dbo.UFN_CURRENCY_CONVERT(UPDATEDRECOGNITIONCREDITS.ADJUSTEDAMOUNT, @ORGANIZATIONEXCHANGERATEID)
                                else
                                    UPDATEDRECOGNITIONCREDITS.ADJUSTEDAMOUNT
                            end,
                        DATECHANGED = @CURRENTDATE,
                        CHANGEDBYID = @CHANGEAGENTID
                    from
                        dbo.REVENUERECOGNITION
                        inner join
                            (
                                select
                                    T.c.value('(ID)[1]','uniqueidentifier') as ID,
                                    T.c.value('(ADJUSTEDAMOUNT)[1]','money') as ADJUSTEDAMOUNT
                                from @RECOGNITIONCREDITS.nodes('/RECOGNITIONCREDITS/ITEM') T(c)
                            ) UPDATEDRECOGNITIONCREDITS on REVENUERECOGNITION.ID = UPDATEDRECOGNITIONCREDITS.ID;

                        -- Redefault installment receipt amounts

                        exec dbo.USP_INSTALLMENTS_DEFAULTRECEIPTAMOUNTS @PLEDGEID, @CHANGEAGENTID;
                end try

                begin catch
                    exec dbo.USP_RAISE_ERROR;
                    return 1;
                end catch

                return 0;

            end