USP_MATCHINGGIFTPLEDGE_AUTOADDFROMSPOUSE

Stored procedure to add matching gifts from spouse relationship 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_AUTOADDFROMSPOUSE
            (
                @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 @SPOUSEID 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

                    select @SPOUSEID = RECIPROCALCONSTITUENTID from dbo.RELATIONSHIP where RELATIONSHIPCONSTITUENTID = @CONSTITUENTID and ISSPOUSE = 'TRUE';

                    if not @SPOUSEID is null
                    begin
                        -- loop through spouse matching gift org relationships

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

                        open CUR_SPOUSEMATCHINGGIFTRELATIONSHIPS

                        fetch next from CUR_SPOUSEMATCHINGGIFTRELATIONSHIPS 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                                

                                        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 (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 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 FINANCIALTRANSACTION.DELETEDON is null
                                                        and CURRENCYEXCHANGERATE.TYPECODE <> 2;
                                                end

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

                                            -- add matching gift

                                            --if @ID is null

                                            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_SPOUSEMATCHINGGIFTRELATIONSHIPS into @RELATIONSHIPID
                        end
                    close CUR_SPOUSEMATCHINGGIFTRELATIONSHIPS;
                    deallocate CUR_SPOUSEMATCHINGGIFTRELATIONSHIPS;
                end
            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