USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLIT

Adds or updates a revenue split record.

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@TRANSACTIONTYPECODE tinyint IN
@CONSTITUENTID uniqueidentifier IN
@DATE datetime IN
@SPLITID uniqueidentifier IN
@DESIGNATIONID uniqueidentifier IN
@AMOUNT money IN
@DECLINESGIFTAID bit IN
@APPLICATIONCODE tinyint IN
@TYPECODE tinyint IN
@DISQUALIFIEDBYATTRIBUTES bit IN
@CHANGEAGENTID uniqueidentifier IN
@ISCOVENANT bit IN
@ISSPONSORSHIP bit IN
@TRANSACTIONAMOUNT money IN
@BASECURRENCYID uniqueidentifier INOUT
@TRANSACTIONCURRENCYID uniqueidentifier INOUT
@BASEEXCHANGERATEID uniqueidentifier INOUT
@ORGANIZATIONEXCHANGERATEID uniqueidentifier INOUT
@TAXCLAIMNUMBER nvarchar(10) IN
@CHARITYCLAIMREFERENCENUMBER nvarchar(20) IN
@BASERATE numeric(30, 6) IN
@TRANSITIONALRATE numeric(30, 6) IN

Definition

Copy


            CREATE procedure dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLIT
            (
                @REVENUEID uniqueidentifier,
                @TRANSACTIONTYPECODE tinyint,
                @CONSTITUENTID uniqueidentifier,
                @DATE datetime,
                @SPLITID uniqueidentifier,
                @DESIGNATIONID uniqueidentifier,
                @AMOUNT money,
                @DECLINESGIFTAID bit,
                @APPLICATIONCODE tinyint,
                @TYPECODE tinyint,
                @DISQUALIFIEDBYATTRIBUTES bit,
                @CHANGEAGENTID uniqueidentifier,
                @ISCOVENANT bit = null,
                @ISSPONSORSHIP bit = null,
                @TRANSACTIONAMOUNT money = 0
                @BASECURRENCYID uniqueidentifier = null output,
                @TRANSACTIONCURRENCYID uniqueidentifier = null output,
                @BASEEXCHANGERATEID uniqueidentifier = null output,
                @ORGANIZATIONEXCHANGERATEID uniqueidentifier = null output,
                @TAXCLAIMNUMBER nvarchar(10) = null,
                @CHARITYCLAIMREFERENCENUMBER nvarchar(20) = null,
                @BASERATE numeric(30,6) = null,
                @TRANSITIONALRATE numeric(30,6) = null
            )
            as
                set nocount on

                -- Don't recalculate the values if the split has already been submitted

                --If @TAXCLAIMNUMBER is set that means its a split that has changed but the total amount going towards a CCRN is the same

                --so in this case we want to update the values

                if exists (select 1 from dbo.REVENUESPLITGIFTAID where ID = @SPLITID and TAXCLAIMNUMBER <> '') and @TAXCLAIMNUMBER is null and @DECLINESGIFTAID=0
                    return

                declare @DATECHANGED datetime = getdate();
                declare @DISQVAR bit;

                set @DISQVAR = dbo.UFN_GIFTAIDSTATUS_GETBASEDONRULES(@SPLITID);

                declare @REGISTRANTID uniqueidentifier
                select 
                    @REGISTRANTID = REGISTRANTID 
                from dbo.EVENTREGISTRANTPAYMENT 
                where PAYMENTID = @SPLITID;

                declare @MEMBERSHIPID uniqueidentifier
                select 
                    @MEMBERSHIPID = MEMBERSHIPPROGRAMID 
                from dbo.MEMBERSHIP 
                where ID = (
                    select MEMBERSHIPID 
                    from dbo.MEMBERSHIPTRANSACTION 
                    where REVENUESPLITID = @SPLITID);

                declare @PDACCOUNTSYSTEMID uniqueidentifier;

                select 
                    @PDACCOUNTSYSTEMID = FINANCIALTRANSACTION.PDACCOUNTSYSTEMID
                from dbo.FINANCIALTRANSACTIONLINEITEM  
                inner join dbo.FINANCIALTRANSACTION  on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
                where FINANCIALTRANSACTIONLINEITEM.ID = @SPLITID;

                --get eligibility

                declare @ELIGIBILITY tinyint;

                --sponsorship is always eligible

                if @ISSPONSORSHIP = 1
                begin
                  set @ELIGIBILITY = 2;
                end
                else
                begin
                    set @ELIGIBILITY = dbo.UFN_VALIDDECLARATION(@DATE, @CONSTITUENTID, @DESIGNATIONID, @REGISTRANTID, @MEMBERSHIPID);
                end

                declare @DECIMALDIGITS tinyint;
                declare @ROUNDINGTYPECODE tinyint;

                set @DECIMALDIGITS = 2;
                set @ROUNDINGTYPECODE = 0;

                select
                    @DECIMALDIGITS = DECIMALDIGITS, 
                    @ROUNDINGTYPECODE = ROUNDINGTYPECODE
                from dbo.UFN_CURRENCY_GETPROPERTIES(@TRANSACTIONCURRENCYID);

                declare @BASETAXCLAIMAMOUNT money = 0;
                declare @TRANSITIONALTAXCLAIMAMOUNT money = 0;
                declare @TRANSACTIONBASETAXCLAIMAMOUNT money = 0;
                declare @TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT money = 0;
                declare @ORGANIZATIONBASETAXCLAIMAMOUNT money = 0;
                declare @ORGANIZATIONTRANSITIONALTAXCLAIMAMOUNT money = 0;

                --if qualified and not 'Not eligible' or a covenant gift or a gift aid sponsorship, calculate tax claim amount

                if @DISQVAR = 1 and @DECLINESGIFTAID = 0 and @ELIGIBILITY != 1 or @ISCOVENANT = 1 or @ISSPONSORSHIP = 1
                    begin
                        if @TRANSACTIONTYPECODE = 0 or @TRANSACTIONTYPECODE = 2
                            begin
                                declare @RATE numeric(30,6);

                                if @BASERATE is null
                                    set @BASERATE = dbo.UFN_GETGIFTAIDBASETAXRATE(@DATE);

                                if @TRANSITIONALRATE is null
                                    set @TRANSITIONALRATE = dbo.UFN_GETGIFTAIDTRANSITIONALTAXRATE(@DATE);

                                set @RATE = @BASERATE + @TRANSITIONALRATE;

                                declare @TRANSACTIONTAXCLAIMAMOUNT money;
                                set @TRANSACTIONTAXCLAIMAMOUNT = round(coalesce(@TRANSACTIONAMOUNT * (@RATE / (100 - @RATE)), 0), @DECIMALDIGITS);
                                set @TRANSACTIONBASETAXCLAIMAMOUNT = round(coalesce(@TRANSACTIONAMOUNT * (@BASERATE / (100 - @BASERATE)), 0), @DECIMALDIGITS);
                                set @TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT = @TRANSACTIONTAXCLAIMAMOUNT - @TRANSACTIONBASETAXCLAIMAMOUNT;
                            end
                    end

                --pledge has its own gross amount calculation, so it has to be a special case

                if @TRANSACTIONTYPECODE = 1 and (@DECLINESGIFTAID = 0 and @DISQVAR = 1 or @ISCOVENANT = 1)
                    begin
                        select
                            @TRANSACTIONBASETAXCLAIMAMOUNT = round(coalesce(sum(TRANSACTIONAMOUNT * (BASERATE / (100 - BASERATE))), 0), @DECIMALDIGITS),
                            @TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT = round(coalesce(sum(TRANSACTIONAMOUNT * ((BASERATE + TRANSITIONALRATE) / (100 - (BASERATE + TRANSITIONALRATE)))) - sum(TRANSACTIONAMOUNT * (BASERATE / (100 - BASERATE))), 0), @DECIMALDIGITS)
                        from 
                        (
                            select 
                                INSTALLMENTSPLIT.TRANSACTIONAMOUNT,
                                dbo.UFN_GETGIFTAIDBASETAXRATE(INSTALLMENT.[DATE]) as BASERATE, 
                                dbo.UFN_GETGIFTAIDTRANSITIONALTAXRATE(INSTALLMENT.[DATE]) as TRANSITIONALRATE, 
                                case when @ISCOVENANT = 1 then 2 else dbo.UFN_VALIDDECLARATION(INSTALLMENT.[DATE], @CONSTITUENTID, @DESIGNATIONID, @REGISTRANTID, @MEMBERSHIPID) end as ELIGIBILITYCODE
                            from dbo.INSTALLMENTSPLIT
                            inner join dbo.INSTALLMENT on INSTALLMENTSPLIT.INSTALLMENTID = INSTALLMENT.ID
                            where
                                INSTALLMENTSPLIT.REVENUESPLITID = @SPLITID
                        ) as INSTALLMENTSPLITS
                        where ELIGIBILITYCODE = 2
                    end

                --Moved rounding into the calculation to avoid rounding errors

                --Round transaction tax claim amounts

                --set @TRANSACTIONBASETAXCLAIMAMOUNT = round(coalesce(@TRANSACTIONBASETAXCLAIMAMOUNT, 0), @DECIMALDIGITS);                                                            

                --set @TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT = round(coalesce(@TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT, 0), @DECIMALDIGITS);                 



                declare @ORGANIZATIONCURRENCYID uniqueidentifier;
                set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

                if @BASECURRENCYID is null
                    set @BASECURRENCYID = @ORGANIZATIONCURRENCYID;

                --Calculate transaction tax claim amounts

                exec dbo.USP_CURRENCY_GETCURRENCYVALUES @TRANSACTIONBASETAXCLAIMAMOUNT,
                                                        @DATE,
                                                        @BASECURRENCYID,
                                                        @BASEEXCHANGERATEID,
                                                        @TRANSACTIONCURRENCYID,
                                                        @BASETAXCLAIMAMOUNT output,
                                                        @ORGANIZATIONCURRENCYID,
                                                        @ORGANIZATIONBASETAXCLAIMAMOUNT output
                                                        @ORGANIZATIONEXCHANGERATEID
                                                        0;

                exec dbo.USP_CURRENCY_GETCURRENCYVALUES @TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT,
                                                        @DATE,
                                                        @BASECURRENCYID,
                                                        @BASEEXCHANGERATEID,
                                                        @TRANSACTIONCURRENCYID,
                                                        @TRANSITIONALTAXCLAIMAMOUNT output,
                                                        @ORGANIZATIONCURRENCYID,
                                                        @ORGANIZATIONTRANSITIONALTAXCLAIMAMOUNT output
                                                        @ORGANIZATIONEXCHANGERATEID
                                                        0;                                    


                    declare @SHOULDUPDATESPLIT bit = 0;
                    declare @DIDADDSPLIT bit = 0;
                --if the split already exists, then do an update instead of an add

                if @SPLITID in (select ID from dbo.REVENUESPLITGIFTAID)
                begin

                    declare @OLDBASETAXCLAIMAMOUNT money;
                    declare @OLDTRANSACTIONBASETAXCLAIMAMOUNT money;

                    select @OLDBASETAXCLAIMAMOUNT = BASETAXCLAIMAMOUNT,
                                 @OLDTRANSACTIONBASETAXCLAIMAMOUNT = TRANSACTIONBASETAXCLAIMAMOUNT
                    from dbo.REVENUESPLITGIFTAID
                    where ID = @SPLITID;

                    if @BASETAXCLAIMAMOUNT <> @OLDBASETAXCLAIMAMOUNT OR @TRANSACTIONBASETAXCLAIMAMOUNT <> @OLDTRANSACTIONBASETAXCLAIMAMOUNT
                        set @SHOULDUPDATESPLIT = 1;

                        update dbo.REVENUESPLITGIFTAID
                        set BASETAXCLAIMAMOUNT = @BASETAXCLAIMAMOUNT,
                            TRANSITIONALTAXCLAIMAMOUNT = @TRANSITIONALTAXCLAIMAMOUNT,
                            TRANSACTIONBASETAXCLAIMAMOUNT = @TRANSACTIONBASETAXCLAIMAMOUNT,
                            TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT = @TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT,
                            ORGANIZATIONBASETAXCLAIMAMOUNT = @ORGANIZATIONBASETAXCLAIMAMOUNT,
                            ORGANIZATIONTRANSITIONALTAXCLAIMAMOUNT = @ORGANIZATIONTRANSITIONALTAXCLAIMAMOUNT,
                            RULES_STATUS = @DISQVAR,
                            DECLINESGIFTAID = @DECLINESGIFTAID,
                            CHANGEDBYID = @CHANGEAGENTID,
                            -- If @ISCOVENANT isn't set, default to its current value

                            ISCOVENANT = case when @ISCOVENANT is null then ISCOVENANT else @ISCOVENANT end,
                            ISSPONSORSHIP = @ISSPONSORSHIP,
                            BASECURRENCYID = @BASECURRENCYID
                            TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID
                            BASEEXCHANGERATEID = @BASEEXCHANGERATEID
                            ORGANIZATIONEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID
                            BASERATE = @BASERATE,
                            TRANSITIONALRATE = @TRANSITIONALRATE,
                            DATECHANGED = @DATECHANGED
                        where ID = @SPLITID;
                end
                else
                begin
                    if @TAXCLAIMNUMBER is null
                    begin
                        insert into dbo.REVENUESPLITGIFTAID(ID, BASETAXCLAIMAMOUNT, TRANSITIONALTAXCLAIMAMOUNT, TRANSACTIONBASETAXCLAIMAMOUNT, TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT, ORGANIZATIONBASETAXCLAIMAMOUNT, ORGANIZATIONTRANSITIONALTAXCLAIMAMOUNT, RULES_STATUS, ATTRIBUTES_STATUS, DECLINESGIFTAID, ISCOVENANT, ISSPONSORSHIP, BASECURRENCYID, TRANSACTIONCURRENCYID, BASEEXCHANGERATEID, ORGANIZATIONEXCHANGERATEID, BASERATE, TRANSITIONALRATE,ADDEDBYID, CHANGEDBYID)
                        values(@SPLITID, @BASETAXCLAIMAMOUNT, @TRANSITIONALTAXCLAIMAMOUNT, @TRANSACTIONBASETAXCLAIMAMOUNT, @TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT, @ORGANIZATIONBASETAXCLAIMAMOUNT, @ORGANIZATIONTRANSITIONALTAXCLAIMAMOUNT, @DISQVAR, @DISQUALIFIEDBYATTRIBUTES, @DECLINESGIFTAID, coalesce(@ISCOVENANT, 0), @ISSPONSORSHIP, @BASECURRENCYID, @TRANSACTIONCURRENCYID, @BASEEXCHANGERATEID, @ORGANIZATIONEXCHANGERATEID, @BASERATE, @TRANSITIONALRATE, @CHANGEAGENTID, @CHANGEAGENTID);
                    end
                    else
                    begin
                        insert into dbo.REVENUESPLITGIFTAID(ID, BASETAXCLAIMAMOUNT, TRANSITIONALTAXCLAIMAMOUNT, TRANSACTIONBASETAXCLAIMAMOUNT, TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT, ORGANIZATIONBASETAXCLAIMAMOUNT, ORGANIZATIONTRANSITIONALTAXCLAIMAMOUNT, RULES_STATUS, ATTRIBUTES_STATUS, DECLINESGIFTAID, ISCOVENANT, ISSPONSORSHIP, BASECURRENCYID, TRANSACTIONCURRENCYID, BASEEXCHANGERATEID, ORGANIZATIONEXCHANGERATEID, BASERATE, TRANSITIONALRATE,TAXCLAIMNUMBER,CHARITYCLAIMREFERENCENUMBER, ADDEDBYID, CHANGEDBYID)
                        values(@SPLITID, @BASETAXCLAIMAMOUNT, @TRANSITIONALTAXCLAIMAMOUNT, @TRANSACTIONBASETAXCLAIMAMOUNT, @TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT, @ORGANIZATIONBASETAXCLAIMAMOUNT, @ORGANIZATIONTRANSITIONALTAXCLAIMAMOUNT, @DISQVAR, @DISQUALIFIEDBYATTRIBUTES, @DECLINESGIFTAID, coalesce(@ISCOVENANT, 0), @ISSPONSORSHIP, @BASECURRENCYID, @TRANSACTIONCURRENCYID, @BASEEXCHANGERATEID, @ORGANIZATIONEXCHANGERATEID, @BASERATE, @TRANSITIONALRATE,@TAXCLAIMNUMBER,@CHARITYCLAIMREFERENCENUMBER, @CHANGEAGENTID, @CHANGEAGENTID);
                    end
                    set @DIDADDSPLIT = 1
                end

                    --If a TAXCLAIMNUMBER exists, we are either modifying existing splits with claimed gift aid that need to be modified

          --GL code was taken from USP_R68_SAVEGIFTAIDGLDISTRIBUTIONS, if USP_R68_SAVEGIFTAIDGLDISTRIBUTIONS changes this should be updated.

                    if @TAXCLAIMNUMBER is not null and @SHOULDUPDATESPLIT = 1
                    begin

                        if exists(
                            select
                                1
                            from
                                dbo.FINANCIALTRANSACTIONLINEITEM GA
                                inner join dbo.FINANCIALTRANSACTIONLINEITEM SOURCE on SOURCE.ID = GA.SOURCELINEITEMID
                                left join dbo.FINANCIALTRANSACTIONLINEITEM NEWSOURCE on NEWSOURCE.ID = SOURCE.REVERSEDLINEITEMID
                            where
                                @SPLITID = isnull(NEWSOURCE.ID, SOURCE.ID)
                                and GA.TYPECODE = 8
                                and GA.POSTSTATUSCODE = 2
                        )
                        begin
                            declare @PAYMENTADJUSTMENTID uniqueidentifier;
                            declare @ADJUSTMENTPOSTDATE date;
                            declare @ADJUSTMENTPOSTSTATUS tinyint = 1;

                            select top 1
                                @PAYMENTADJUSTMENTID = LIA.ID,
                                @ADJUSTMENTPOSTDATE = coalesce(A.POSTDATE, LIA.DATE, LI.POSTDATE),
                                @ADJUSTMENTPOSTSTATUS = case when A.POSTSTATUSCODE = 2 then 3 else 1 end
                            from
                                dbo.FINANCIALTRANSACTIONLINEITEM LI
                                left join dbo.FINANCIALTRANSACTIONLINEITEMADJUSTMENT LIA on LIA.ID = LI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
                                left join dbo.ADJUSTMENT A on A.REVENUEID = LI.FINANCIALTRANSACTIONID
                            where
                                LI.ID = @SPLITID
                                and LIA.ADJUSTMENTREASONCODEID is not null
                                and not exists (select 1 from dbo.FINANCIALTRANSACTIONLINEITEM GA where GA.SOURCELINEITEMID = LI.ID 
                                    and GA.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = LIA.ID
                                    and GA.TYPECODE = 8)
                        order by A.DATEADDED DESC;

                            if dbo.UFN_PDACCOUNTSYSTEM_ALLOWGLDISTRIBUTIONS(@PDACCOUNTSYSTEMID) = 1
                                exec dbo.USP_SAVE_GIFTAID_ADJUSTMENT @SPLITID, @ADJUSTMENTPOSTSTATUS, @ADJUSTMENTPOSTDATE, null, @PAYMENTADJUSTMENTID, @CHANGEAGENTID, null;
                         end
                        else
                        begin
                            delete from
                                dbo.FINANCIALTRANSACTIONLINEITEM
                            where
                                ID in (
                                    select
                                        GA.ID
                                    from
                                        dbo.FINANCIALTRANSACTIONLINEITEM GA
                                        inner join dbo.FINANCIALTRANSACTIONLINEITEM SOURCE on SOURCE.ID = GA.SOURCELINEITEMID
                                        left join dbo.FINANCIALTRANSACTIONLINEITEM NEWSOURCE on NEWSOURCE.ID = SOURCE.REVERSEDLINEITEMID
                                    where
                                        @SPLITID = isnull(NEWSOURCE.ID, SOURCE.ID)
                                        and GA.TYPECODE = 8
                                        and GA.POSTSTATUSCODE = 1
                                        and GA.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID is null
                                        and (GA.ID <> SOURCE.REVERSEDLINEITEMID  or SOURCE.REVERSEDLINEITEMID is null)
                                        and (GA.ID <> NEWSOURCE.REVERSEDLINEITEMID or  NEWSOURCE.REVERSEDLINEITEMID is null)
                                        and GA.DELETEDON is null)
                        end
                end

                if @TAXCLAIMNUMBER is not null and ( (@SHOULDUPDATESPLIT = 1 ) or (@DIDADDSPLIT = 1) )
                    if dbo.UFN_PDACCOUNTSYSTEM_ALLOWGLDISTRIBUTIONS(@PDACCOUNTSYSTEMID) = 1 
                        exec dbo.USP_SAVE_GIFTAIDGLDISTRIBUTION @SPLITID, @CHANGEAGENTID;