USP_GLOBALCHANGE_UPDATEGIFTAIDSTATUS

Parameters

Parameter Parameter Type Mode Description
@IDSETREGISTERID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@ASOF datetime IN
@NUMBERADDED int INOUT
@NUMBEREDITED int INOUT
@NUMBERDELETED int INOUT
@CURRENTAPPUSERID uniqueidentifier IN
@STARTDATE datetime IN
@ENDDATE datetime IN

Definition

Copy


CREATE procedure dbo.USP_GLOBALCHANGE_UPDATEGIFTAIDSTATUS
(
    @IDSETREGISTERID uniqueidentifier = null
    @CHANGEAGENTID uniqueidentifier = null,
    @ASOF as datetime = null,
    @NUMBERADDED int = 0 output,
    @NUMBEREDITED int = 0 output,
    @NUMBERDELETED int = 0 output,
    @CURRENTAPPUSERID uniqueidentifier = null,
    @STARTDATE datetime = null,
    @ENDDATE datetime = null
)
with execute as owner as     
    set nocount off;

    set @NUMBERADDED = 0;
    set @NUMBEREDITED = 0;
    set @NUMBERDELETED = 0

    declare @CURRENTDATE datetime
    declare @BPID uniqueidentifier = '3269A1D1-31CB-4D28-945C-B7623A3EFCCA';

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

    set @CURRENTDATE = GetDate()      

    begin try

        set nocount on;

        -- Using temp table instead of table variable since it needs to be accessed by the dynamic sql

        create table #GIFTAIDRECORDS  
        (
            ID uniqueidentifier,
            RULES_STATUS bit,
            ATTRIBUTES_STATUS bit
        );

        declare @SQLTOEXEC nvarchar(max);
        set @SQLTOEXEC = '    insert into #GIFTAIDRECORDS (ID, RULES_STATUS, ATTRIBUTES_STATUS) 
                            select
                                REVENUESPLITGIFTAID.ID,
                                REVENUESPLITGIFTAID.RULES_STATUS,
                                REVENUESPLITGIFTAID.ATTRIBUTES_STATUS
                            from dbo.REVENUESPLITGIFTAID '

        if @IDSETREGISTERID is not null
            set @SQLTOEXEC = @SQLTOEXEC + ' inner join dbo.UFN_IDSETREADER_GETRESULTS_GUID(@IDSETREGISTERID) as SELECTION on REVENUESPLITGIFTAID.ID = SELECTION.ID '

        if @STARTDATE is not null or @ENDDATE is not null
            set @SQLTOEXEC = @SQLTOEXEC + ' inner join dbo.REVENUESPLIT on REVENUESPLITGIFTAID.ID = REVENUESPLIT.ID 
                                            inner join dbo.REVENUE on REVENUESPLIT.REVENUEID = REVENUE.ID '

        set @SQLTOEXEC = @SQLTOEXEC + '    where 
                                        (
                                            dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) = 1
                                            or exists
                                            (
                                                select 1 
                                                from dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(REVENUESPLITGIFTAID.ID) REVSITES
                                                where dbo.UFN_SECURITY_APPUSER_GRANTED_BUSINESSPROCESS_FORSITE(@CURRENTAPPUSERID, @BPID, REVSITES.SITEID) = 1
                                            )
                                        ) '

        if @STARTDATE is not null
            set @SQLTOEXEC = @SQLTOEXEC + ' and REVENUE.[DATE] >= @STARTDATE '

        if @ENDDATE is not null
            set @SQLTOEXEC = @SQLTOEXEC + ' and REVENUE.[DATE] <= @ENDDATE '

        set @STARTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@STARTDATE);
        set @ENDDATE = dbo.UFN_DATE_GETLATESTTIME(@ENDDATE);

        exec sp_executesql @SQLTOEXEC, N'@IDSETREGISTERID uniqueidentifier,@STARTDATE datetime,@ENDDATE datetime,@CURRENTAPPUSERID uniqueidentifier,@BPID uniqueidentifier',
            @IDSETREGISTERID=@IDSETREGISTERID,@STARTDATE=@STARTDATE,@ENDDATE=@ENDDATE,@CURRENTAPPUSERID=@CURRENTAPPUSERID,@BPID=@BPID;

        -- Update all disqualified by rules and mark all as qualified based on Attributes...

        update rsga set
            RULES_STATUS = dbo.UFN_GIFTAIDSTATUS_GETBASEDONRULES(rsga.ID),
            ATTRIBUTES_STATUS = 1,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE                    
        from 
            dbo.REVENUESPLITGIFTAID rsga
            inner join #GIFTAIDRECORDS GIFTAID on rsga.ID = GIFTAID.ID
        where 
            rsga.TAXCLAIMNUMBER = '' and
            rsga.PENDINGR68STATUSID is null;

        -- Iterate through Attributes which disqualify revenue and mark those affected as disqualified

        declare GIFTAIDATTRIB_CURSOR cursor LOCAL FAST_FORWARD READ_ONLY for 
            select 
                GIFTAIDDISQUALIFIEDBYATTRIBUTE.ATTRIBUTECATEGORYID,
                ATTRIBUTECATEGORY.ONLYALLOWONEPERRECORD,         
                ATTRIBUTECATEGORY.VALUECOLUMNNAME,
                case GIFTAIDDISQUALIFIEDBYATTRIBUTE.DATATYPE 
                      when 0 then TEXTVALUE when 1 then convert(nvarchar(100),GIFTAIDDISQUALIFIEDBYATTRIBUTE.NUMBERVALUE) 
                      when 2 then convert(nvarchar(100),GIFTAIDDISQUALIFIEDBYATTRIBUTE.DATEVALUE, 121
                      when 3 then Convert(nvarchar(100),GIFTAIDDISQUALIFIEDBYATTRIBUTE.CURRENCYVALUE) 
                      when 4 then convert(nvarchar(100),GIFTAIDDISQUALIFIEDBYATTRIBUTE.BOOLEANVALUE) 
                      when 5 then convert(nvarchar(100),GIFTAIDDISQUALIFIEDBYATTRIBUTE.CODETABLEVALUE) 
                      when 6 then Convert(nvarchar(36),GIFTAIDDISQUALIFIEDBYATTRIBUTE.CONSTITUENTID) 
                      when 7 then GIFTAIDDISQUALIFIEDBYATTRIBUTE.FUZZYDATEVALUE 
                      when 8 then GIFTAIDDISQUALIFIEDBYATTRIBUTE.HOURMINUTEVALUE 
                      when 9 then GIFTAIDDISQUALIFIEDBYATTRIBUTE.MEMOVALUE 
                end as GIFTAIDVALUE 
            from dbo.GIFTAIDDISQUALIFIEDBYATTRIBUTE 
            inner join dbo.ATTRIBUTECATEGORY
                on GIFTAIDDISQUALIFIEDBYATTRIBUTE.ATTRIBUTECATEGORYID = ATTRIBUTECATEGORY.ID

        declare @ATTRIBUTECATEGORYID uniqueidentifier;
        declare @ONLYALLOWONEPERRECORD bit;
        declare @DISQVALUE nvarchar(max);
        declare @COLUMNNAME nvarchar(128);

        declare @sql nvarchar(max);

        open GIFTAIDATTRIB_CURSOR;
        fetch next from GIFTAIDATTRIB_CURSOR into @ATTRIBUTECATEGORYID, @ONLYALLOWONEPERRECORD, @COLUMNNAME, @DISQVALUE;

        while @@FETCH_STATUS = 0
            begin 
                declare @ATTRIBUTETABLENAME nvarchar(128) = 'ATTRIBUTE' + REPLACE(cast(@ATTRIBUTECATEGORYID as nvarchar(36)), '-', '');

                set @sql = 
                    'update rsga set rsga.ATTRIBUTES_STATUS = 0, rsga.CHANGEDBYID = ''' + cast(@CHANGEAGENTID as nvarchar(36)) + ''', rsga.DATECHANGED = ''' + cast(@CURRENTDATE as nvarchar(100)) + ''' '  +
                    'from dbo.REVENUESPLITGIFTAID rsga '

                if @IDSETREGISTERID is not null
                    set @sql = @sql + 'inner join dbo.UFN_IDSETREADER_GETRESULTS_GUID(''' + cast(@IDSETREGISTERID as nvarchar(36)) + ''') as SELECTION on rsga.ID = SELECTION.ID ';

                set @sql = @sql + 'inner join dbo.REVENUESPLIT on rsga.ID = REVENUESPLIT.ID '

                set @sql = @sql + 'inner join dbo.' + @ATTRIBUTETABLENAME + ' '

                if @ONLYALLOWONEPERRECORD = 0
                    set @sql = @sql + 'on ' + @ATTRIBUTETABLENAME + '.REVENUEID = REVENUESPLIT.REVENUEID ';     
                else
                    set @sql = @sql + 'on ' + @ATTRIBUTETABLENAME + '.ID = REVENUESPLIT.REVENUEID ';

                -- Disqualify non-claimed applications that have not been disqualified by another attribute value

                set @sql = @sql + 'where rsga.TAXCLAIMNUMBER = '''' and rsga.PENDINGR68STATUSID is null and rsga.ATTRIBUTES_STATUS = 1 and ' + @ATTRIBUTETABLENAME + '.' + @COLUMNNAME + ' = ''' + @DISQVALUE + '''';     

                set @sql = @sql + ' and (
                            dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERIDPARAMETER) = 1
                            or exists
                            (
                                select 1 
                                from dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(rsga.ID) REVSITES
                                where dbo.UFN_SECURITY_APPUSER_GRANTED_BUSINESSPROCESS_FORSITE(@CURRENTAPPUSERIDPARAMETER, @BPIDPARAMETER, REVSITES.SITEID) = 1
                            )
                        )';

                declare @IDSETPARAMETERDEFINITION nvarchar(100) = '@CURRENTAPPUSERIDPARAMETER uniqueidentifier, @BPIDPARAMETER uniqueidentifier';
                exec sp_executesql @sql, @IDSETPARAMETERDEFINITION, @CURRENTAPPUSERIDPARAMETER = @CURRENTAPPUSERID, @BPIDPARAMETER = @BPID;

                fetch next from GIFTAIDATTRIB_CURSOR into @ATTRIBUTECATEGORYID, @ONLYALLOWONEPERRECORD, @COLUMNNAME, @DISQVALUE;
            end 

        close GIFTAIDATTRIB_CURSOR;
        deallocate GIFTAIDATTRIB_CURSOR;

        -- Set tax claim amount to zero, for splits that were qualified and are no longer qualified

        update rsga 
        set rsga.BASETAXCLAIMAMOUNT = convert(money, 0),
            rsga.TRANSITIONALTAXCLAIMAMOUNT = convert(money, 0),
            rsga.TRANSACTIONBASETAXCLAIMAMOUNT = convert(money, 0),
            rsga.TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT = convert(money, 0),
            rsga.ORGANIZATIONBASETAXCLAIMAMOUNT = convert(money, 0),
            rsga.ORGANIZATIONTRANSITIONALTAXCLAIMAMOUNT = convert(money, 0),
            rsga.CHANGEDBYID = @CHANGEAGENTID,
            rsga.DATECHANGED = @CURRENTDATE
        from dbo.REVENUESPLITGIFTAID rsga 
            inner join #GIFTAIDRECORDS GIFTAID on rsga.ID = GIFTAID.ID 
        where (GIFTAID.RULES_STATUS = 1 and rsga.RULES_STATUS = 0) or 
            (GIFTAID.ATTRIBUTES_STATUS = 1 and rsga.ATTRIBUTES_STATUS = 0);

        -- Calculate the tax claim amount, for splits that were not qualified and are now qualified

        update rsga 
        set rsga.BASETAXCLAIMAMOUNT = NEWTAXCLAIMAMOUNTS.BASETAXCLAIMAMOUNT, 
            rsga.TRANSITIONALTAXCLAIMAMOUNT = NEWTAXCLAIMAMOUNTS.TRANSITIONALTAXCLAIMAMOUNT, 
            rsga.TRANSACTIONBASETAXCLAIMAMOUNT = NEWTAXCLAIMAMOUNTS.TRANSACTIONBASETAXCLAIMAMOUNT, 
            rsga.TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT = NEWTAXCLAIMAMOUNTS.TRANSACTIONTRANSITIONALTAXCLAIMAMOUNT,
            rsga.ORGANIZATIONBASETAXCLAIMAMOUNT = NEWTAXCLAIMAMOUNTS.ORGANIZATIONBASETAXCLAIMAMOUNT, 
            rsga.ORGANIZATIONTRANSITIONALTAXCLAIMAMOUNT = NEWTAXCLAIMAMOUNTS.ORGANIZATIONTRANSITIONALTAXCLAIMAMOUNT,
            rsga.CHANGEDBYID = @CHANGEAGENTID
            rsga.DATECHANGED = @CURRENTDATE
        from dbo.REVENUESPLITGIFTAID rsga 
            inner join #GIFTAIDRECORDS GIFTAID on rsga.ID = GIFTAID.ID 
            cross apply dbo.UFN_GIFTAID_CALCULATETAXCLAIMAMOUNT(rsga.ID) NEWTAXCLAIMAMOUNTS 
        where (GIFTAID.RULES_STATUS = 0 and rsga.RULES_STATUS = 1) or 
            (GIFTAID.ATTRIBUTES_STATUS = 0 and rsga.ATTRIBUTES_STATUS = 1) and
            rsga.DECLINESGIFTAID = 0;

        -- Count the number of Revenue Application records updated

        select 
            @NUMBEREDITED = count(*)
        from dbo.REVENUESPLITGIFTAID rsga
        inner join #GIFTAIDRECORDS GIFTAID 
            on rsga.ID = GIFTAID.ID 
        where rsga.RULES_STATUS <> GIFTAID.RULES_STATUS or
            rsga.ATTRIBUTES_STATUS <> GIFTAID.ATTRIBUTES_STATUS;

        drop table #GIFTAIDRECORDS
    end try

    begin catch
        exec dbo.USP_RAISE_ERROR;
        return 1;
    end catch