USP_REVENUEBATCH_APPLYBUSINESSUNITS

Applies business units logic from a batch on to revenue items in the database.

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@APPLICATIONBUSINESSUNITS xml IN
@TYPECODE tinyint IN
@CHANGEAGENTID uniqueidentifier IN
@REVENUESPLITSPONSORSHIPID xml IN
@REVENUESTREAMS xml IN
@ADDITIONALAPPLICATIONSSTREAM xml IN

Definition

Copy


CREATE procedure dbo.USP_REVENUEBATCH_APPLYBUSINESSUNITS
(
    @REVENUEID uniqueidentifier,
    @APPLICATIONBUSINESSUNITS xml,
    @TYPECODE tinyint,
    @CHANGEAGENTID uniqueidentifier= null,
    @REVENUESPLITSPONSORSHIPID xml = null,
    @REVENUESTREAMS xml = null,
    @ADDITIONALAPPLICATIONSSTREAM xml = null

)
as
begin

    declare @APPLICATIONID uniqueidentifier;
    declare @BUSINESSUNITS xml;
    declare @REASON uniqueidentifier;
    declare @REVENUESPLITID uniqueidentifier;
    declare @OVERRIDEBUSINESSUNITS bit;
    declare @APPLIEDAMOUNT money;
    declare @BUSINESSUNITITEMAMOUNT money;
    declare @REVENUESPLITIDFETCH uniqueidentifier;

    if @CHANGEAGENTID is null
    begin
        exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
    end
   --WI 194341/208872 Need to be able to discriminate between more than one additional sponsorship donation.

     declare @REVENUESPLITSPONSORSHIPTABLE table
     (
          REVENUESPLITID uniqueidentifier,
          SPONSORSHIPID uniqueidentifier
     )  
    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)  

    if @TYPECODE = 0
    begin
        declare @ADDITIONALAPPLICATIONDECLINESGIFTAID bit;
      declare @ADDITIONALAPPLICATIONSPONSORSHIPID uniqueidentifier;


        if @APPLICATIONBUSINESSUNITS is not null
        begin
            declare APPLICATIONS_PAYMENT cursor local fast_forward for 
            select 
                T.c.value('(APPLICATIONID)[1]','uniqueidentifier') as APPLICATIONID,
                case when T.c.exist('./BUSINESSUNITS/ITEM') = 1 then cast(T.c.query('BUSINESSUNITS') as xml) else null end as BUSINESSUNITS,
                T.c.value('(REASON)[1]','uniqueidentifier') as REASON,
                T.c.value('(OVERRIDEBUSINESSUNITS)[1]','bit') as OVERRIDEBUSINESSUNITS,
                T.c.value('(ADDITIONALAPPLICATIONDECLINESGIFTAID)[1]','bit') as ADDITIONALAPPLICATIONDECLINESGIFTAID,
                T.c.value('(ADDITIONALAPPLICATIONSPONSORSHIPID)[1]','uniqueidentifier') as ADDITIONALAPPLICATIONSPONSORSHIPID,
                T.c.value('(REVENUESPLITID)[1]','uniqueidentifier') as REVENUESPLITIDFETCH
            from @APPLICATIONBUSINESSUNITS.nodes('/APPLICATIONBUSINESSUNITS/ITEM') T(c)

            open APPLICATIONS_PAYMENT
            fetch next from APPLICATIONS_PAYMENT into @APPLICATIONID, @BUSINESSUNITS, @REASON, @OVERRIDEBUSINESSUNITS, @ADDITIONALAPPLICATIONDECLINESGIFTAID, @ADDITIONALAPPLICATIONSPONSORSHIPID, @REVENUESPLITIDFETCH

            while @@FETCH_STATUS = 0
            begin
                -- Validate only if we have values in the fields to validate

                if(@BUSINESSUNITS is not null and (@REVENUESTREAMS is not null or @ADDITIONALAPPLICATIONSSTREAM is not null))
                begin
                    set @BUSINESSUNITITEMAMOUNT = 0
                    set @APPLIEDAMOUNT = 0

                    select @BUSINESSUNITITEMAMOUNT = T.c.value('(AMOUNT)[1]','money'
                    from @BUSINESSUNITS.nodes('/BUSINESSUNITS/ITEM') T(c);

                    -- Get applied amount from REVENUESTREAMS

                    if(@REVENUESTREAMS is not null)
                        select @APPLIEDAMOUNT = APPLIED 
                        from dbo.UFN_REVENUEBATCH_GETAPPLICATIONS_FROMITEMLISTXML(@REVENUESTREAMS
                        where 
                            (REVENUESPLITID is not null and REVENUESPLITID = @REVENUESPLITIDFETCH) --In case of RUB, @APPLICATIONBUSINESSUNITS have REVENUESPLITID.

                            or
                            (APPLICATIONID is not null and APPLICATIONID = @APPLICATIONID) --In case of ERB, @APPLICATIONBUSINESSUNITS have APPLICATIONID and not REVENUESPLITID.


                    -- Try get applied amount from ADDITIONALAPPLICATIONSSTREAM, if not found in REVENUESTREAMS

                    if(@APPLIEDAMOUNT = 0 and @ADDITIONALAPPLICATIONSSTREAM is not null)
                        select @APPLIEDAMOUNT = APPLIED 
                        from dbo.UFN_REVENUEBATCH_GETADDITIONALAPPLICATIONS_FROMITEMLISTXML(@ADDITIONALAPPLICATIONSSTREAM
                        where ID = @APPLICATIONID

                    -- Check if BUSINESSUNITITEMAMOUNT is greater than APPLIEDAMOUNT    

                    if(@BUSINESSUNITITEMAMOUNT > @APPLIEDAMOUNT)
                    begin
                        raiserror('BBERR_APPLICATIONBUSINESSUNITS_INCORRECTAMOUNT', 13, 1);
                        return
                    end
                end

                    --For each revenue split in the application id apply the same business units

                    declare @REVENUESPLITS table(REVENUESPLIT uniqueidentifier);
                    declare @VALID bit=0;

                    if exists(select ID from dbo.RECURRINGGIFTACTIVITY where SOURCEREVENUEID = @APPLICATIONID)
                    begin
                        --Payment to recurring gift

                        insert into @REVENUESPLITS
                        select
                            REVENUESPLIT.ID
                        from dbo.RECURRINGGIFTACTIVITY
                            inner join dbo.REVENUESPLIT on REVENUESPLIT.ID = RECURRINGGIFTACTIVITY.PAYMENTREVENUEID
                        where SOURCEREVENUEID= @APPLICATIONID 
                            and REVENUESPLIT.REVENUEID = @REVENUEID   

                        set @VALID = 1;
                    end

                    if exists(select ID from dbo.INSTALLMENTSPLITPAYMENT where PLEDGEID = @APPLICATIONID)
                    begin
                        --Payment to pledge

                        insert into @REVENUESPLITS
                        select
                            REVENUESPLIT.ID
                        from dbo.INSTALLMENTSPLITPAYMENT
                            inner join dbo.REVENUESPLIT on REVENUESPLIT.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
                        where PLEDGEID = @APPLICATIONID 
                            and REVENUESPLIT.REVENUEID = @REVENUEID
                            and 
                            (
                                (@REVENUESPLITIDFETCH is not null and @REVENUESPLITIDFETCH = REVENUESPLIT.ID) --In case of RUB, @APPLICATIONBUSINESSUNITS have REVENUESPLITID.

                                or 
                                (@REVENUESPLITIDFETCH is null) --In case of ERB, @APPLICATIONBUSINESSUNITS do not have REVENUESPLITID.

                            )

                        set @VALID = 1;
                    end

                    if @VALID=0
                    begin
                        --Donation

                        if exists(    
                            select REVENUESPLIT.ID 
                            from dbo.REVENUESPLIT
                                inner join dbo.REVENUESPLITGIFTAID on REVENUESPLIT.ID = REVENUESPLITGIFTAID.ID
                            where REVENUESPLIT.DESIGNATIONID = @APPLICATIONID 
                                and REVENUESPLIT.REVENUEID = @REVENUEID 
                                and REVENUESPLIT.APPLICATIONCODE = 0 
                                and REVENUESPLITGIFTAID.DECLINESGIFTAID = @ADDITIONALAPPLICATIONDECLINESGIFTAID
                        )
                        begin
                            insert into @REVENUESPLITS
                            select REVENUESPLIT.ID 
                            from dbo.REVENUESPLIT
                                inner join dbo.REVENUESPLITGIFTAID on REVENUESPLIT.ID = REVENUESPLITGIFTAID.ID
                            where REVENUESPLIT.DESIGNATIONID = @APPLICATIONID 
                                and REVENUESPLIT.REVENUEID = @REVENUEID 
                                and REVENUESPLIT.APPLICATIONCODE = 0 
                                and REVENUESPLITGIFTAID.DECLINESGIFTAID = @ADDITIONALAPPLICATIONDECLINESGIFTAID
                        end
                        else
                        begin
                            --Bug 246052 - AnkushGu - Handle the cases for transaction different from Donation

                            if exists(select 1 from dbo.REVENUESPLIT
                                    where REVENUESPLIT.REVENUEID = @REVENUEID
                                    and (REVENUESPLIT.APPLICATIONCODE = 0 or REVENUESPLIT.APPLICATIONCODE = 4 or REVENUESPLIT.APPLICATIONCODE = 7))
                            begin
                                --Bug 178636 - AdamBu - 2/24/12 - Join to the batch table to make sure we narrow the

                                --    splits down by designation.

                                insert into @REVENUESPLITS
                                select
                                    REVENUESPLIT.ID
                                from dbo.REVENUESPLIT 
                                    inner join dbo.BATCHREVENUEADDITIONALAPPLICATIONS on BATCHREVENUEADDITIONALAPPLICATIONS.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID
                                    left join @REVENUESPLITSPONSORSHIPTABLE RST on RST.REVENUESPLITID = REVENUESPLIT.ID
                                where REVENUESPLIT.REVENUEID = @REVENUEID 
                                    and BATCHREVENUEADDITIONALAPPLICATIONS.ID = @APPLICATIONID
                                    and (REVENUESPLIT.APPLICATIONCODE = 0 or REVENUESPLIT.APPLICATIONCODE = 4 or REVENUESPLIT.APPLICATIONCODE = 7)
                                    and coalesce(RST.SPONSORSHIPID,'00000000-0000-0000-0000-000000000000') = coalesce(@ADDITIONALAPPLICATIONSPONSORSHIPID,'00000000-0000-0000-0000-000000000000');
                            end

                            if exists(select 1 from dbo.REVENUESPLIT
                                    inner join dbo.BATCHREVENUEAPPLICATION on BATCHREVENUEAPPLICATION.REVENUESPLITID = REVENUESPLIT.ID
                                    where REVENUESPLIT.REVENUEID = @REVENUEID
                                    and REVENUESPLIT.APPLICATIONCODE = 1)
                            begin
                                insert into @REVENUESPLITS
                                select
                                    REVENUESPLIT.ID
                                from dbo.REVENUESPLIT 
                                    inner join dbo.BATCHREVENUEAPPLICATION on BATCHREVENUEAPPLICATION.REVENUESPLITID = REVENUESPLIT.ID
                                where REVENUESPLIT.REVENUEID = @REVENUEID 
                                    and BATCHREVENUEAPPLICATION.REGISTRANTID = @APPLICATIONID
                                    and REVENUESPLIT.APPLICATIONCODE = 1
                            end
                        end
                    end

                    declare @RSID uniqueidentifier;
                    declare @OVERRIDE bit;

                    --Removing @OVERRIDE check. Due to this check business unit was updated only first time.

                    declare REVENUE_SPLITS cursor local fast_forward for
                    select distinct 
                        REVENUESPLIT,
                        REVENUESPLIT.OVERRIDEBUSINESSUNITS                        
                    from @REVENUESPLITS RS
                        inner join dbo.REVENUESPLIT on REVENUESPLIT.ID = RS.REVENUESPLIT
                    where  REVENUESPLIT.REVENUEID = @REVENUEID

                    open REVENUE_SPLITS
                    fetch next from REVENUE_SPLITS into @RSID, @OVERRIDE

                    while @@FETCH_STATUS = 0
                    begin
                            --Update BU if updated from UI.

                    if (@OVERRIDE = 1 or @OVERRIDEBUSINESSUNITS = 1)
                    begin
                            update dbo.REVENUESPLIT
                            set 
                                OVERRIDEBUSINESSUNITS=1
                                REVENUESPLITBUSINESSUNITOVERRIDECODEID=@REASON
                            where REVENUESPLIT.ID = @RSID

                            delete from dbo.REVENUESPLITBUSINESSUNIT where REVENUESPLITID = @RSID

                            insert into dbo.REVENUESPLITBUSINESSUNIT(
                                ID,
                                REVENUESPLITID,
                                BUSINESSUNITCODEID,
                                AMOUNT,
                                ADDEDBYID,
                                CHANGEDBYID)
                            select
                                newid(),
                                @RSID,
                                T.c.value('(BUSINESSUNITCODEID)[1]','uniqueidentifier') as BUSINESSUNITCODEID,
                                case RS.OVERRIDEBUSINESSUNITS 
                                    when 0 
                                        then T.c.value('(AMOUNT)[1]','money') * (RS.AMOUNT/R.AMOUNT)
                                    else T.c.value('(AMOUNT)[1]','money'
                                end,
                                @CHANGEAGENTID,
                                @CHANGEAGENTID
                            from @BUSINESSUNITS.nodes('/BUSINESSUNITS/ITEM') T(c)
                                inner join dbo.REVENUESPLIT RS on RS.ID = @RSID
                                inner join dbo.REVENUE R on R.ID = RS.REVENUEID
              end
                        fetch next from REVENUE_SPLITS into @RSID,@OVERRIDE
                    end
                    close REVENUE_SPLITS
                    deallocate REVENUE_SPLITS

        --Bug 178636 - AdamBu - 2/24/12 - Clear the splits table before processing the next application

                delete @REVENUESPLITS

                fetch next from APPLICATIONS_PAYMENT into @APPLICATIONID, @BUSINESSUNITS, @REASON, @OVERRIDEBUSINESSUNITS, @ADDITIONALAPPLICATIONDECLINESGIFTAID, @ADDITIONALAPPLICATIONSPONSORSHIPID, @REVENUESPLITIDFETCH
            end
            close APPLICATIONS_PAYMENT
            deallocate APPLICATIONS_PAYMENT
        end
    end
    else
    begin
        -- Commitment splits

        if @APPLICATIONBUSINESSUNITS is not null
        begin
            declare APPLICATIONS_COMMITMENT cursor local fast_forward for 
            select 
                T.c.value('(APPLICATIONID)[1]','uniqueidentifier') as APPLICATIONID,
                case when T.c.exist('./BUSINESSUNITS/ITEM') = 1 then cast(T.c.query('BUSINESSUNITS') as xml) else null end as BUSINESSUNITS,
                T.c.value('(REASON)[1]','uniqueidentifier') as REASON,
                T.c.value('(OVERRIDEBUSINESSUNITS)[1]','bit') as OVERRIDEBUSINESSUNITS
            from @APPLICATIONBUSINESSUNITS.nodes('/APPLICATIONBUSINESSUNITS/ITEM') T(c)

            open APPLICATIONS_COMMITMENT
            fetch next from APPLICATIONS_COMMITMENT into @APPLICATIONID, @BUSINESSUNITS, @REASON, @OVERRIDEBUSINESSUNITS

            while @@FETCH_STATUS = 0
            begin
                    select
                        @REVENUESPLITID = ID,
                        @OVERRIDE = OVERRIDEBUSINESSUNITS
                    from dbo.REVENUESPLIT 
                    where REVENUESPLIT.REVENUEID = @REVENUEID 
                        and REVENUESPLIT.DESIGNATIONID= @APPLICATIONID

            if (@OVERRIDE = 1 or @OVERRIDEBUSINESSUNITS = 1)
                  begin
                    --In case of ERB validate, @REVENUESPLITID remains null.

                  if @REVENUESPLITID is not null 
                  begin
                      update dbo.REVENUESPLIT
                      set 
                          OVERRIDEBUSINESSUNITS=@OVERRIDEBUSINESSUNITS
                          REVENUESPLITBUSINESSUNITOVERRIDECODEID=@REASON
                      where REVENUESPLIT.ID = @REVENUESPLITID

                      exec dbo.USP_REVENUESPLIT_GETBUSINESSSUNIT_UPDATEFROMXML @REVENUESPLITID, @BUSINESSUNITS, @CHANGEAGENTID;  
                    end
          end
                  fetch next from APPLICATIONS_COMMITMENT into @APPLICATIONID, @BUSINESSUNITS, @REASON, @OVERRIDEBUSINESSUNITS
            end
            close APPLICATIONS_COMMITMENT
            deallocate APPLICATIONS_COMMITMENT
        end
    end

    exec dbo.USP_REVENUESPLIT_APPLYBUSINESSUNITS @REVENUEID, @CHANGEAGENTID;
end