USP_MATCHINGGIFTPLEDGE_AUTOADD

Stored procedure to add matching gifts based on matching gift preferences

Parameters

Parameter Parameter Type Mode Description
@CONSTITUENTID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@GIFTID uniqueidentifier IN
@DATE datetime IN
@AMOUNT money IN
@RECEIPTAMOUNT money IN
@SPLITS xml IN
@CURRENTAPPUSERID uniqueidentifier IN

Definition

Copy


            CREATE procedure dbo.USP_MATCHINGGIFTPLEDGE_AUTOADD
            (
                @CONSTITUENTID uniqueidentifier,
                @CHANGEAGENTID uniqueidentifier, 
                @GIFTID uniqueidentifier, 
                @DATE datetime
                @AMOUNT money,
                @RECEIPTAMOUNT money,
                @SPLITS xml,
                @CURRENTAPPUSERID uniqueidentifier = null
            )
            as begin
                set nocount on;

                declare @ID uniqueidentifier;
                declare @MGORGID uniqueidentifier;
                declare @REVENUEID uniqueidentifier;
                declare @RELATIONSHIPID uniqueidentifier;
                declare @RELATIONSHIPTYPECODEID uniqueidentifier;
                declare @JOBSCHEDULECODEID uniqueidentifier;
                declare @CAREERLEVELCODEID uniqueidentifier;
                declare @MATCHINGGIFTCONDITIONID uniqueidentifier;
                declare @MATCHINGGIFTCONDITIONTYPECODEID uniqueidentifier;
                declare @MATCHINGGIFTAMOUNT money;
                declare @MATCHINGGIFTMINAMOUNT money;
                declare @MATCHINGGIFTMAXAMOUNT money;
                declare @MATCHINGGIFTMAXMATCHANNUAL money;
                declare @MATCHINGGIFTMAXMATCHTOTAL money;
                declare @MATCHINGGIFTFACTOR decimal(30,2);
                declare @MGSPLITS xml;
                declare @MATCHTYPECODE tinyint;
                declare @REVENUETYPECODE tinyint;
                declare @CONDITIONCOUNT tinyint;
                declare @APPLICATIONCODE tinyint = 0;
                declare @TRANSACTIONCURRENCYID uniqueidentifier;
                declare @CURRENCYDECIAMLDIGITS tinyint;
                declare @CURRENCYROUNDINGTYPECODE tinyint;


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

                select
                    @TRANSACTIONCURRENCYID = REVENUE.TRANSACTIONCURRENCYID
                from dbo.REVENUE
                where ID = @GIFTID;

                select
                    @CURRENCYDECIAMLDIGITS = DECIMALDIGITS,
                    @CURRENCYROUNDINGTYPECODE = ROUNDINGTYPECODE
                from dbo.CURRENCY
                where ID = @TRANSACTIONCURRENCYID;

                if dbo.UFN_REVENUE_HASNEEDEDRATES(@GIFTID) = 1
                    and @TRANSACTIONCURRENCYID in (
                        select CURRENCYID
                        from dbo.UFN_CURRENCYSET_GETTRANSACTIONCURRENCIES(dbo.UFN_CURRENCYSET_GETAPPUSERCURRENCYSET(@CURRENTAPPUSERID))
                    )
                begin

                    -- loop through matching gift org relationships

                    declare CUR_MATCHINGGIFTRELATIONSHIPS cursor local fast_forward for
                        select ID from dbo.RELATIONSHIP
                        where RELATIONSHIPCONSTITUENTID = @CONSTITUENTID
                        and ISMATCHINGGIFTRELATIONSHIP = 1

                    open CUR_MATCHINGGIFTRELATIONSHIPS

                    fetch next from CUR_MATCHINGGIFTRELATIONSHIPS into @RELATIONSHIPID
                    while @@FETCH_STATUS = 0
                    begin

                        -- get relationship type and MG org id

                        select 
                            @RELATIONSHIPTYPECODEID = RELATIONSHIPTYPECODEID, 
                            @MGORGID = RECIPROCALCONSTITUENTID,
                            @JOBSCHEDULECODEID = JOBSCHEDULECODEID,
                            @CAREERLEVELCODEID = CAREERLEVELCODEID
                        from dbo.RELATIONSHIP 
                            left join dbo.RELATIONSHIPJOBINFO 
                                on RELATIONSHIPJOBINFO.RELATIONSHIPSETID = RELATIONSHIP.RELATIONSHIPSETID
                                    and (
                                        (RELATIONSHIPJOBINFO.STARTDATE is null or RELATIONSHIPJOBINFO.STARTDATE < getdate()) 
                                        and    (RELATIONSHIPJOBINFO.ENDDATE is null or RELATIONSHIPJOBINFO.ENDDATE > getdate())
                                    )
                        where 
                            RELATIONSHIP.ID = @RELATIONSHIPID
                            and ((RELATIONSHIP.STARTDATE is null or RELATIONSHIP.STARTDATE < getdate()) and
                                (RELATIONSHIP.ENDDATE is null or RELATIONSHIP.ENDDATE > getdate()));

                        -- get condition type code preference

                        select @MATCHINGGIFTCONDITIONTYPECODEID = MATCHINGGIFTCONDITIONTYPECODEID 
                        from dbo.MATCHINGGIFTPREFERENCEINFO;

                        -- check if there are any mg conditions for the current relationship

                        select 
                            @CONDITIONCOUNT = COUNT(*
                        from dbo.MATCHINGGIFTCONDITION 
                        inner join dbo.MATCHINGGIFTCONDITIONRELATIONSHIP 
                            on MATCHINGGIFTCONDITION.ID = MATCHINGGIFTCONDITIONRELATIONSHIP.MATCHINGGIFTCONDITIONID
                        where 
                            ORGANIZATIONID = @MGORGID 
                            and RELATIONSHIPTYPECODEID = @RELATIONSHIPTYPECODEID
                            and (JOBSCHEDULECODEID is null or JOBSCHEDULECODEID = @JOBSCHEDULECODEID)
                            and (CAREERLEVELCODEID is null or CAREERLEVELCODEID = @CAREERLEVELCODEID)
                            and MATCHINGGIFTCONDITION.BASECURRENCYID = @TRANSACTIONCURRENCYID;

                        if @CONDITIONCOUNT > 0    -- there matching gift conditions exist for the specific relationship type and          

                        begin

                            -- go through each condition and see if a matching gift claim can be created    

                            declare CUR_MATCHINGGIFTCONDITIONS cursor local fast_forward for
                                select  ID,
                                    MATCHINGFACTOR,
                                    MINMATCHPERGIFT,
                                    MAXMATCHPERGIFT,
                                    MAXMATCHANNUAL,
                                    MAXMATCHTOTAL,
                                    MATCHTYPECODE,
                                    REVENUETYPECODE
                                from (
                                    select
                                        MATCHINGGIFTCONDITION.ID, MATCHINGFACTOR, MINMATCHPERGIFT, MAXMATCHPERGIFT, MAXMATCHANNUAL,
                                        MAXMATCHTOTAL,MATCHTYPECODE,REVENUETYPECODE,
                                        row_number() over(partition by REVENUETYPE order by SEQUENCE) as ROWNUM
                                    from dbo.MATCHINGGIFTCONDITION
                                        inner join dbo.MATCHINGGIFTCONDITIONRELATIONSHIP on MATCHINGGIFTCONDITIONRELATIONSHIP.MATCHINGGIFTCONDITIONID = MATCHINGGIFTCONDITION.ID
                                    where ORGANIZATIONID = @MGORGID
                                        and RELATIONSHIPTYPECODEID = @RELATIONSHIPTYPECODEID
                                        and (JOBSCHEDULECODEID is null or JOBSCHEDULECODEID = @JOBSCHEDULECODEID)
                                        and (CAREERLEVELCODEID is null or CAREERLEVELCODEID = @CAREERLEVELCODEID)
                                        and MATCHINGGIFTCONDITION.BASECURRENCYID = @TRANSACTIONCURRENCYID
                                    ) as SUBQ
                                where
                                    ROWNUM = 1


                            open CUR_MATCHINGGIFTCONDITIONS

                            fetch next from CUR_MATCHINGGIFTCONDITIONS into @MATCHINGGIFTCONDITIONID,@MATCHINGGIFTFACTOR,
                            @MATCHINGGIFTMINAMOUNT,@MATCHINGGIFTMAXAMOUNT,@MATCHINGGIFTMAXMATCHANNUAL,@MATCHINGGIFTMAXMATCHTOTAL, @MATCHTYPECODE, @REVENUETYPECODE
                            while @@FETCH_STATUS = 0
                            begin                                                            
                                if not @MATCHINGGIFTCONDITIONID is null
                                begin                                
                                    --Bug 30719 - AdamBu 4/1/09 - Only generate matching gift claims based on RECEIPTAMOUNT 

                                    --    if all the splits in the revenue should be matched

                                    declare @GENERATECLAIMS bit = 1

                                    -- calculate matching gift amount                        

                                    -- recalculate matchgift amount based on the revenue type code and get application code

                                    -- 17 and 9 are both sponsorships (sponsorship additional gift and sponsorship)

                                    select @AMOUNT = sum(FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT)
                                    from dbo.FINANCIALTRANSACTIONLINEITEM
                                    inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
                                    where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @GIFTID and (case when REVENUESPLIT_EXT.TYPECODE = 17 then 9 else REVENUESPLIT_EXT.TYPECODE end) = @REVENUETYPECODE
                                        and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1;

                                    --AKG CR299627-050108 check if need to apply full amount or tax portion

                                    if @MATCHTYPECODE = 1 and exists(select FINANCIALTRANSACTIONLINEITEM.ID from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @GIFTID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1 and (case when REVENUESPLIT_EXT.TYPECODE = 17 then 9 else REVENUESPLIT_EXT.TYPECODE end) = @REVENUETYPECODE)
                                    begin
                                        if exists(
                                            select FINANCIALTRANSACTIONLINEITEM.ID
                                            from dbo.FINANCIALTRANSACTIONLINEITEM
                                            inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
                                            where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @GIFTID and (case when REVENUESPLIT_EXT.TYPECODE = 17 then 9 else REVENUESPLIT_EXT.TYPECODE end) <> @REVENUETYPECODE
                                                and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1
                                        )
                                        begin
                                            --If we only match tax deductible portions, but not all the splits on a revenue should

                                            --    be matched, then we don't know how much to match for, so don't auto-generate claims.

                                            set @GENERATECLAIMS = 0;
                                        end
                                        else
                                        begin
                                            set @MATCHINGGIFTAMOUNT = dbo.UFN_CURRENCY_ROUND(@RECEIPTAMOUNT * @MATCHINGGIFTFACTOR, @CURRENCYDECIAMLDIGITS, @CURRENCYROUNDINGTYPECODE);
                                        end
                                    end
                                    else
                                    begin                                                                        
                                        set @MATCHINGGIFTAMOUNT = dbo.UFN_CURRENCY_ROUND(@AMOUNT * @MATCHINGGIFTFACTOR, @CURRENCYDECIAMLDIGITS, @CURRENCYROUNDINGTYPECODE);
                                    end

                                    -- determine if the matching gift needs to be adjusted based on the conditions of the MG organization

                                    set @MATCHINGGIFTAMOUNT = dbo.UFN_MATCHINGGIFTPLEDGE_CALCULATEMGAMOUNTINCURRENCY(@CONSTITUENTID,@MGORGID,@MATCHINGGIFTAMOUNT,@DATE,@MATCHINGGIFTMAXAMOUNT,@MATCHINGGIFTMAXMATCHANNUAL,@MATCHINGGIFTMAXMATCHTOTAL,@TRANSACTIONCURRENCYID);

                                    if (@MATCHINGGIFTAMOUNT >= @MATCHINGGIFTMINAMOUNT) and @MATCHINGGIFTAMOUNT > 0 and @GENERATECLAIMS = 1
                                    begin
                                        -- Get new MG splits

                                        -- get the splits for the current type code                        

                                        select @SPLITS = (
                                            select sum(FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT) AMOUNT,
                                                REVENUESPLIT_EXT.DESIGNATIONID,
                                                (case when REVENUESPLIT_EXT.TYPECODE = 17 then 9 else REVENUESPLIT_EXT.TYPECODE end) TYPECODE,
                                                @TRANSACTIONCURRENCYID [TRANSACTIONCURRENCYID],
                                                0 APPLICATIONCODE
                                            from dbo.FINANCIALTRANSACTIONLINEITEM
                                                inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
                                            where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @GIFTID and (case when REVENUESPLIT_EXT.TYPECODE = 17 then 9 else REVENUESPLIT_EXT.TYPECODE end) = @REVENUETYPECODE
                                                and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1
                                            group by REVENUESPLIT_EXT.DESIGNATIONID, (case when REVENUESPLIT_EXT.TYPECODE = 17 then 9 else REVENUESPLIT_EXT.TYPECODE end), REVENUESPLIT_EXT.APPLICATIONCODE
                                            for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64
                                        );

                                        set @MGSPLITS = dbo.UFN_MATCHINGGIFT_GETAUTOADDSPLITS_3(@AMOUNT,@MATCHINGGIFTAMOUNT,@SPLITS,@REVENUETYPECODE)

                                        declare @MGBASECURRENCYID uniqueidentifier = dbo.UFN_APPUSER_GETBASECURRENCY(@CURRENTAPPUSERID);
                                        declare @MGBASEEXCHANGERATEID uniqueidentifier;

                                        if @MGBASECURRENCYID <> @TRANSACTIONCURRENCYID
                                        begin
                                            if @MGBASECURRENCYID = (
                                                select isnull(REVENUE_EXT.NONPOSTABLEBASECURRENCYID, CURRENCYSET.BASECURRENCYID) as BASECURRENCYID
                                                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 = @GIFTID
                                                    and FINANCIALTRANSACTION.DELETEDON is null
                                            )
                                            begin
                                                select @MGBASEEXCHANGERATEID = FINANCIALTRANSACTION.BASEEXCHANGERATEID
                                                from dbo.FINANCIALTRANSACTION
                                                    inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
                                                    inner join dbo.CURRENCYEXCHANGERATE on CURRENCYEXCHANGERATE.ID = FINANCIALTRANSACTION.BASEEXCHANGERATEID
                                                where FINANCIALTRANSACTION.ID = @GIFTID
                                                    and CURRENCYEXCHANGERATE.TYPECODE <> 2
                                                    and FINANCIALTRANSACTION.DELETEDON is null;
                                            end

                                            if @MGBASEEXCHANGERATEID is null
                                            begin
                                                set @MGBASEEXCHANGERATEID = dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(
                                                    @TRANSACTIONCURRENCYID,
                                                    @MGBASECURRENCYID,
                                                    @DATE,
                                                    1,
                                                    null
                                                );
                                            end
                                        end    

                                        -- add matching gift

                                        set @ID = newid();
                                        exec dbo.USP_MATCHINGGIFTPLEDGE_ADD @ID, @CHANGEAGENTID, @GIFTID, @MGORGID, @DATE, @MATCHINGGIFTAMOUNT, @MGSPLITS, @MATCHINGGIFTCONDITIONID, @RELATIONSHIPID, @TRANSACTIONCURRENCYID, @MGBASECURRENCYID, @MGBASEEXCHANGERATEID;
                                    end
                                    else
                                    begin
                                        if @GENERATECLAIMS = 0
                                        begin
                                            --For some reason, we've decided to not create claims.  Flag the record as eligible.

                                            update dbo.REVENUE_EXT
                                            set ELIGIBLEFORMATCHINGGIFTCLAIM = 1,
                                                CHANGEDBYID = @CHANGEAGENTID,
                                                DATECHANGED = getdate()
                                            where ID = @GIFTID
                                        end
                                    end
                                end
                                --clean up                            

                                set @MATCHINGGIFTCONDITIONID = null;
                                set @MATCHINGGIFTAMOUNT = 0;
                                set @APPLICATIONCODE = 0;
                                fetch next from CUR_MATCHINGGIFTCONDITIONS into @MATCHINGGIFTCONDITIONID,@MATCHINGGIFTFACTOR,
                                    @MATCHINGGIFTMINAMOUNT,@MATCHINGGIFTMAXAMOUNT,@MATCHINGGIFTMAXMATCHANNUAL,@MATCHINGGIFTMAXMATCHTOTAL, @MATCHTYPECODE, @REVENUETYPECODE
                            end
                            close CUR_MATCHINGGIFTCONDITIONS;
                            deallocate CUR_MATCHINGGIFTCONDITIONS;
                        end

                        -- clean up for next MG Org

                        set @ID = null;
                        set @MGORGID = null;
                        set @MATCHINGGIFTCONDITIONID = null;
                        set @MATCHINGGIFTAMOUNT = 0;
                        set @APPLICATIONCODE = 0;

                        fetch next from CUR_MATCHINGGIFTRELATIONSHIPS into @RELATIONSHIPID
                    end
                    close CUR_MATCHINGGIFTRELATIONSHIPS;
                    deallocate CUR_MATCHINGGIFTRELATIONSHIPS;
                end
                else
                begin
          --WI 169658 PatrickMcD Do not flag as eligible for matching gift if exchange rate is not set

          if dbo.UFN_REVENUE_HASNEEDEDRATES(@GIFTID) = 1
          begin
                      --For some reason, we've decided to not create claims.  Flag the record as eligible.

                      update dbo.REVENUE_EXT
                      set ELIGIBLEFORMATCHINGGIFTCLAIM = 1,
                          CHANGEDBYID = @CHANGEAGENTID,
                          DATECHANGED = getdate()
                      where ID = @GIFTID
          end
                end
                return 0;
            end