USP_REVENUEBATCH_ADDAPPLICATIONRECOGNITIONS

Add recognitions linked to applications to the system from a revenue batch.

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@APPLICATIONRECOGNITIONS xml IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN
@REVENUESPLITSPONSORSHIPID xml IN
@NEWAPPLICATIONPLEDGEID uniqueidentifier IN

Definition

Copy


            CREATE procedure dbo.USP_REVENUEBATCH_ADDAPPLICATIONRECOGNITIONS
            (
                @REVENUEID uniqueidentifier,
                @APPLICATIONRECOGNITIONS xml,
                @CHANGEAGENTID uniqueidentifier,
                @CHANGEDATE datetime,
                @REVENUESPLITSPONSORSHIPID xml = null,
                @NEWAPPLICATIONPLEDGEID uniqueidentifier = null
            )
            as
            set nocount on;

            declare @BASECURRENCYID uniqueidentifier;
            declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;

            select
                @BASECURRENCYID = BASECURRENCYID,
                @ORGANIZATIONEXCHANGERATEID = ORGANIZATIONEXCHANGERATEID
            from dbo.REVENUE where ID = @REVENUEID;

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

            if @CHANGEDATE is null
                set @CHANGEDATE = getdate();

            begin try
                declare @REVENUESPLITID uniqueidentifier
                declare @RECOGNITIONS xml
                declare @ID uniqueidentifier;
                declare @CONSTITUENTID uniqueidentifier;
                declare @AMOUNT money;
                declare @EFFECTIVEDATE datetime;
                declare @REVENUERECOGNITIONTYPECODEID uniqueidentifier;
                declare @BATCHCONSTITUENTID uniqueidentifier
                declare @RECOGNITIONSTABLE table
                (
                    APPLICATIONID uniqueidentifier,
                    AMOUNT money,
                    APPLICATIONCODE tinyint,
                    DESIGNATIONID uniqueidentifier,
                    RECOGNITIONS xml,
                DECLINESGIFTAID bit,
                    SPONSORSHIPID uniqueidentifier
                )
                declare @RECOGNITION table
                (
                    ID uniqueidentifier,
                    CONSTITUENTID uniqueidentifier,
                    AMOUNT money,
                    EFFECTIVEDATE datetime,
                    REVENUERECOGNITIONTYPECODEID uniqueidentifier
                )
                declare @REVENUESPLITSPONSORSHIPTABLE table
                (
                     REVENUESPLITID uniqueidentifier,
                     SPONSORSHIPID uniqueidentifier
                )

                --Table to keep track of constituents which are added.

                declare @CONSTITUENTMAPPINGTABLE table
                (
                     OLDCONSTITUENTID uniqueidentifier,
                     NEWCONSTITUENTID uniqueidentifier
                )

                 --Table to keep track of recognition IDs which are added.

                declare @REVENUERECOGNITIONMAPPINGTABLE table
                (
                     OLDRECOGNITIONID uniqueidentifier
                )

                insert into @RECOGNITIONSTABLE(APPLICATIONID, AMOUNT, APPLICATIONCODE, DESIGNATIONID, RECOGNITIONS, DECLINESGIFTAID, SPONSORSHIPID)
                select T.c.value('(APPLICATIONID)[1]','uniqueidentifier') as APPLICATIONID,
                T.c.value('(APPLICATIONAMOUNT)[1]','money') as AMOUNT,
                    case T.c.value('(ADDITIONALAPPLICATIONTYPECODE)[1]','tinyint') when 0 then 0 when 1 then 4 when 2 then 7 when 3 then 0 end as APPLICATIONCODE,
                    T.c.value('(ADDITIONALAPPLICATIONDESIGNATIONID)[1]','uniqueidentifier') as DESIGNATIONID,
                    case when T.c.exist('./RECOGNITIONS/ITEM') = 1 then T.c.query('(RECOGNITIONS)[1]') else null end as RECOGNITIONS,
            T.c.value('(ADDITIONALAPPLICATIONDECLINESGIFTAID)[1]','bit') as DECLINESGIFTAID,
                T.c.value('(ADDITIONALAPPLICATIONSPONSORSHIPID)[1]','uniqueidentifier') as SPONSORSHIPID
                from @APPLICATIONRECOGNITIONS.nodes('/APPLICATIONRECOGNITIONS/ITEM') T(c);

                insert into @REVENUESPLITSPONSORSHIPTABLE(REVENUESPLITID,SPONSORSHIPID)
                select T.c.value('(REVENUESPLITID)[1]','uniqueidentifier') as REVENUESPLITID,
            T.c.value('(SPONSORSHIPID)[1]','uniqueidentifier') as SPONSORSHIPID
                from @REVENUESPLITSPONSORSHIPID.nodes('REVENUESPLITSPONSORSHIPID/ITEM') T(c)       


                declare RECOGNITIONSCURSOR cursor local fast_forward for
                select REVENUESPLIT.ID, RECOGNITIONS
                from @RECOGNITIONSTABLE RT
                inner join dbo.REVENUESPLIT on 
                RT.APPLICATIONCODE = REVENUESPLIT.APPLICATIONCODE and
                RT.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID
                left join dbo.REVENUESPLITGIFTAID on 
                    REVENUESPLIT.ID = REVENUESPLITGIFTAID.ID and 
                    RT.DECLINESGIFTAID = REVENUESPLITGIFTAID.DECLINESGIFTAID
                left join @REVENUESPLITSPONSORSHIPTABLE REVSPONSOR on
                        REVSPONSOR.REVENUESPLITID = REVENUESPLIT.ID
                left join (select distinct PLEDGEID,PAYMENTID from INSTALLMENTSPLITPAYMENT) ISP  on
                        REVENUESPLIT.ID = ISP.PAYMENTID
                where REVENUEID = @REVENUEID
                        --WI 194341 when sponsorship additional donation, limit records to below criteria

                and coalesce(RT.SPONSORSHIPID,'00000000-0000-0000-0000-000000000000') = coalesce(REVSPONSOR.SPONSORSHIPID,'00000000-0000-0000-0000-000000000000')
                and (REVSPONSOR.REVENUESPLITID is null or REVSPONSOR.REVENUESPLITID = REVENUESPLIT.ID)
                and ISP.PAYMENTID is null -- Remove any splits that are for commitments since we only want to add additional application recognitions


                union all

                select REVENUESPLIT.ID, RT.RECOGNITIONS
                from @RECOGNITIONSTABLE RT
                inner join (select distinct PLEDGEID,PAYMENTID from INSTALLMENTSPLITPAYMENT) ISP
                        on RT.APPLICATIONID = ISP.PLEDGEID
                inner join REVENUESPLIT 
                        on REVENUESPLIT.ID = ISP.PAYMENTID
                where REVENUESPLIT.REVENUEID = @REVENUEID

                union all

                select REVENUESPLIT.ID, RT.RECOGNITIONS
                from @RECOGNITIONSTABLE RT 
                inner join dbo.RECURRINGGIFTACTIVITY RGA 
                        on RGA.SOURCEREVENUEID = RT.APPLICATIONID
                inner join dbo.REVENUESPLIT 
                        on REVENUESPLIT.ID = RGA.PAYMENTREVENUEID 
                where REVENUESPLIT.REVENUEID = @REVENUEID

                union all

                select REVENUESPLIT.ID, RT.RECOGNITIONS
                from @RECOGNITIONSTABLE RT
                inner join dbo.EVENTREGISTRANTPAYMENT ERP 
                        on ERP.REGISTRANTID = RT.APPLICATIONID
                inner join dbo.REVENUESPLIT 
                        on REVENUESPLIT.ID = ERP.PAYMENTID 
                where REVENUESPLIT.REVENUEID = @REVENUEID

                union all

                select
                    REVENUESPLIT.ID,
                    RT.RECOGNITIONS
                from
                    dbo.REVENUESPLIT
                inner join
                 (select distinct PLEDGEID,PAYMENTID from INSTALLMENTSPLITPAYMENT) ISP on ISP.PAYMENTID = REVENUESPLIT.ID
                cross apply
                    @RECOGNITIONSTABLE as RT
                where
                    RT.APPLICATIONID = '9B9C1DC8-7960-4D31-A0BC-8199AB7F94DA' and
                    REVENUESPLIT.REVENUEID = @REVENUEID and
                    ISP.PLEDGEID = @NEWAPPLICATIONPLEDGEID;

                open RECOGNITIONSCURSOR

                fetch next from RECOGNITIONSCURSOR into @REVENUESPLITID, @RECOGNITIONS
                while @@FETCH_STATUS = 0
                begin
                    insert into @RECOGNITION(ID, CONSTITUENTID, AMOUNT, EFFECTIVEDATE, REVENUERECOGNITIONTYPECODEID)
                    select T.c.value('(ID)[1]','uniqueidentifier') as 'ID'
                        T.c.value('(CONSTITUENTID)[1]','uniqueidentifier') as 'CONSTITUENTID',
                        T.c.value('(AMOUNT)[1]','money') as 'AMOUNT',
                        T.c.value('(EFFECTIVEDATE)[1]','datetime') as 'EFFECTIVEDATE',
                        T.c.value('(REVENUERECOGNITIONTYPECODEID)[1]','uniqueidentifier') as 'REVENUERECOGNITIONTYPECODEID'
                    from @RECOGNITIONS.nodes('/RECOGNITIONS/ITEM') T(c);

                    declare RECCURSOR cursor local dynamic for
                    select ID,CONSTITUENTID, AMOUNT, EFFECTIVEDATE, REVENUERECOGNITIONTYPECODEID
                    from @RECOGNITION   

                    open RECCURSOR

                    fetch next from RECCURSOR into @ID,@CONSTITUENTID, @AMOUNT, @EFFECTIVEDATE, @REVENUERECOGNITIONTYPECODEID;
                    while @@FETCH_STATUS = 0
                    begin
                    --Update constituents

                        if not exists(select ID from dbo.CONSTITUENT where ID = @CONSTITUENTID)
                        begin
                        --Constituent is not added already.

                        if(not exists(select OLDCONSTITUENTID from @CONSTITUENTMAPPINGTABLE where OLDCONSTITUENTID = @CONSTITUENTID))
                         begin
                            set @BATCHCONSTITUENTID = @CONSTITUENTID;
                            set @CONSTITUENTID = newid();
                            exec USP_REVENUEBATCH_CONSTITUENT_ADD @CONSTITUENTID OUTPUT, @CHANGEAGENTID, @BATCHCONSTITUENTID;
                            update @RECOGNITION set CONSTITUENTID = @CONSTITUENTID where CONSTITUENTID = @BATCHCONSTITUENTID;
                            exec dbo.USP_REVENUEBATCH_CONSTITUENT_DELETE @BATCHREVENUECONSTITUENTID = @BATCHCONSTITUENTID, @CHANGEAGENTID = @CHANGEAGENTID

                            --Insert a record to suggest that constituent is added.

                            insert into @CONSTITUENTMAPPINGTABLE(OLDCONSTITUENTID,NEWCONSTITUENTID) values(@BATCHCONSTITUENTID,@CONSTITUENTID)
                         end
                        else
                         begin
                            declare @NEWCONSTITUENTID uniqueidentifier
                            select @NEWCONSTITUENTID = NEWCONSTITUENTID from @CONSTITUENTMAPPINGTABLE where OLDCONSTITUENTID = @CONSTITUENTID
                            update @RECOGNITION set CONSTITUENTID = @NEWCONSTITUENTID where CONSTITUENTID = @CONSTITUENTID;
                         end
                        end

                         --Update recognition IDs

                         if exists(select OLDRECOGNITIONID from @REVENUERECOGNITIONMAPPINGTABLE where OLDRECOGNITIONID = @ID)
                         begin
                                update @RECOGNITION set ID = NEWID() where ID = @ID;
                         end
                         else
                         begin
                            --Insert a record to suggest that recognition ID is added.

                                insert into @REVENUERECOGNITIONMAPPINGTABLE(OLDRECOGNITIONID) values(@ID)
                         end
                        fetch next from RECCURSOR into @ID,@CONSTITUENTID, @AMOUNT, @EFFECTIVEDATE, @REVENUERECOGNITIONTYPECODEID;
                    end

                    close RECCURSOR;
                    deallocate RECCURSOR;

                    set @RECOGNITIONS =
                    (
                        select ID, CONSTITUENTID, AMOUNT, EFFECTIVEDATE, REVENUERECOGNITIONTYPECODEID
                        from @RECOGNITION
                        order by EFFECTIVEDATE desc
                        for xml raw('ITEM'),type,elements,root('RECOGNITIONS'),binary base64
                    );

                    declare @TOTALSPLITAMOUNT money, @SPLITAMOUNT money, @SPLITRECOGNITIONS xml;

                    -- FULLAMOUNT should only include the splits that will have recognition credits created in this procedure

                    -- since it is being used to calculate prorated amounts

                    declare @REVENUEAPPLICATIONID uniqueidentifier = (select FTLI.FINANCIALTRANSACTIONID from FINANCIALTRANSACTIONLINEITEM SPLIT 
                    inner join FINANCIALTRANSACTIONLINEITEM FTLI with (nolock) on SPLIT.SOURCELINEITEMID = FTLI.ID
                    where SPLIT.ID = @REVENUESPLITID);

                    set @TOTALSPLITAMOUNT = (select AMOUNT from @RECOGNITIONSTABLE where APPLICATIONID = @REVENUEAPPLICATIONID);

                    set @SPLITAMOUNT = (select AMOUNT from dbo.REVENUESPLIT where ID = @REVENUESPLITID);

                    --If there are no splits. We do not need to split amount and use default @RECOGNITION.

                    if @TOTALSPLITAMOUNT is null
                    begin
                        --deleting the previous recognition.

                        delete REVENUERECOGNITION from dbo.REVENUERECOGNITION where REVENUERECOGNITION.REVENUESPLITID = @REVENUESPLITID;

                        -- Process the recognitions xml to calculate organization amounts.

                        set @RECOGNITIONS = dbo.UFN_REVENUERECOGNITION_CONVERTAMOUNTSINXML(@RECOGNITIONS,@BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID);

                        exec dbo.USP_REVENUE_GETRECOGNITIONS_2_ADDFROMXML @REVENUESPLITID, @RECOGNITIONS, @CHANGEAGENTID, @CHANGEDATE;
                    end
                    else
                    begin

                        -- Calculate the prorated amount per split

                        set @SPLITRECOGNITIONS = (select
                                                                            ID, 
                                                                            AMOUNT 
                                                                        from dbo.UFN_REVENUE_GETRECOGNITIONS_FROMITEMLISTXML(@RECOGNITIONS)
                                                                        for xml raw('ITEM'),type,elements,root('AMOUNTSTOPRORATE'),binary base64);

                        declare @BASEDECIMALDIGITS tinyint;
                        select @BASEDECIMALDIGITS = DECIMALDIGITS from dbo.CURRENCY where CURRENCY.ID = @BASECURRENCYID;

                        set @SPLITRECOGNITIONS = (select
                                                                            newid() as ID,
                                                                            R.REVENUERECOGNITIONTYPECODEID, 
                                                                            R.CONSTITUENTID, 
                                                                            R.EFFECTIVEDATE, 
                                                                            PRS.AMOUNT
                                                                        from dbo.UFN_SPLITS_PRORATEAMOUNTS(@TOTALSPLITAMOUNT, @SPLITAMOUNT, @BASEDECIMALDIGITS, @SPLITRECOGNITIONS) PRS
                                                                            cross apply dbo.UFN_REVENUE_GETRECOGNITIONS_FROMITEMLISTXML(@RECOGNITIONS) R
                                                                        where PRS.ID = R.ID
                                                                        for xml raw('ITEM'),type,elements,root('RECOGNITIONS'),binary base64);

                        --deleting the previous recognition.

                        delete REVENUERECOGNITION from dbo.REVENUERECOGNITION where REVENUERECOGNITION.REVENUESPLITID = @REVENUESPLITID;

                        -- Process the recognitions xml to calculate organization amounts.

                        set @SPLITRECOGNITIONS = dbo.UFN_REVENUERECOGNITION_CONVERTAMOUNTSINXML(@SPLITRECOGNITIONS,@BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID);

                        exec dbo.USP_REVENUE_GETRECOGNITIONS_2_ADDFROMXML @REVENUESPLITID, @SPLITRECOGNITIONS, @CHANGEAGENTID, @CHANGEDATE;
                    end;
                    delete from @RECOGNITION

                    fetch next from RECOGNITIONSCURSOR into @REVENUESPLITID, @RECOGNITIONS
                end

                close RECOGNITIONSCURSOR    
                deallocate RECOGNITIONSCURSOR
            end try
            begin catch
                exec dbo.USP_RAISE_ERROR;
                return 1;
            end catch

            return 0;