USP_CONSTITUENCYDATERANGE_REFRESHDONORCONSTITUENCY

Parameters

Parameter Parameter Type Mode Description
@CONSTITUENTID uniqueidentifier IN
@CONSTITUENCYREFRESHPROCESSID uniqueidentifier IN
@RECORDCOUNT int INOUT

Definition

Copy


CREATE procedure dbo.USP_CONSTITUENCYDATERANGE_REFRESHDONORCONSTITUENCY
(
    @CONSTITUENTID uniqueidentifier = null,
    @CONSTITUENCYREFRESHPROCESSID uniqueidentifier = null,
    @RECORDCOUNT int = 0 output
)
as
begin
    set nocount on;

    set @RECORDCOUNT = 0;

    declare @CURRENTDATE datetime = getdate();
    declare @DONORCONSTITUENCYDEFINITIONID uniqueidentifier = '70165682-4324-46EC-9439-83FC0CC67E7F';

    declare @CONSIDERRECOGNITION bit;
    declare @DONORCONSTITUENCYLOWERDATEBOUND datetime;
    declare @DONORCONSTITUENCYDEFTYPECODE int;
    declare @DONORCONSTITUENCYDEFLASTYEARS int;
    declare @DONORCONSTITUENCYDEFSTARTDATE datetime;

    select
        @DONORCONSTITUENCYDEFTYPECODE = DONORCONSTITUENCYDEFTYPECODE,
        @DONORCONSTITUENCYDEFLASTYEARS = DONORCONSTITUENCYDEFLASTYEARS,
        @DONORCONSTITUENCYDEFSTARTDATE = DONORCONSTITUENCYDEFSTARTDATE
    from
        dbo.INSTALLATIONINFO;

    if @DONORCONSTITUENCYDEFTYPECODE = 0
    begin
        declare @SQLMINDATE datetime = '17530101';

        if datediff(year, @SQLMINDATE, dbo.UFN_DATE_GETLATESTTIME(getdate())) >= @DONORCONSTITUENCYDEFLASTYEARS
            set @DONORCONSTITUENCYLOWERDATEBOUND = dateadd(year, 0 - @DONORCONSTITUENCYDEFLASTYEARS, dbo.UFN_DATE_GETLATESTTIME(@CURRENTDATE));
        else
            set @DONORCONSTITUENCYLOWERDATEBOUND = @SQLMINDATE;
    end
    else
        set @DONORCONSTITUENCYLOWERDATEBOUND = dbo.UFN_DATE_GETEARLIESTTIME(@DONORCONSTITUENCYDEFSTARTDATE);

    select top 1 
        @CONSIDERRECOGNITION = MAJORDONORCONSTITUENCYDEFCONSIDERRECOGNITION
    from 
        dbo.CONSTITUENCYCRITERIASPOUSE;

    begin try
        if @CONSTITUENTID is not null and @CONSTITUENCYREFRESHPROCESSID is not null
        begin
            raiserror('ERR_REFRESH_CONSTITUENTANDSELECTION : A constituency refresh cannot be run with both a specific constituent and a selection.', 13, 1);
        end

        if object_id('tempdb..#DONORCONSTITUENTS') is not null
        begin
            drop table #DONORCONSTITUENTS;
        end

        create table #DONORCONSTITUENTS
        (
            CONSTITUENTID uniqueidentifier,
            DATEFROM datetime,
            DATETO datetime
        );

        if @CONSTITUENCYREFRESHPROCESSID is null and @CONSTITUENTID is null
        begin
            insert into #DONORCONSTITUENTS
            (
                CONSTITUENTID,
                DATEFROM,
                DATETO
            )
            select
                DATA.CONSTITUENTID,
                min(DATA.REVENUEDATE) as DATEFROM,
                case 
                    when max(DATA.REVENUEDATE) < @DONORCONSTITUENCYLOWERDATEBOUND
                        then case 
                                when @DONORCONSTITUENCYDEFTYPECODE = 0
                                    then dateadd(year, @DONORCONSTITUENCYDEFLASTYEARS, max(DATA.REVENUEDATE))
                                else max(DATA.REVENUEDATE)
                                end
                    else null
                end as DATETO
            from (
                select
                    [FT].[DATE] as REVENUEDATE,
                    FT.CONSTITUENTID
                from
                    /* JamesWill WI122678 Make the donor constituency match up with UFN_CONSTITUENT_ISDONOR by using UFN_REVENUELIFECYCLE_GETVALIDREVENUE*/
                    dbo.FINANCIALTRANSACTION as FT with (nolock)
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM as FTLI with (nolock)
                        on FT.ID = FTLI.FINANCIALTRANSACTIONID
                where
                    FTLI.ID in (
                        select ID
                        from dbo.UFN_REVENUEFILTER_DEFAULT() as REVENUEFILTER
                    )

                union all

                select
                    [FT].[DATE] as REVENUEDATE,
                    REVENUERECOGNITION.CONSTITUENTID
                from
                    /* JamesWill WI122678 Make the donor constituency match up with UFN_CONSTITUENT_ISDONOR by using UFN_REVENUELIFECYCLE_GETVALIDREVENUE*/
                    dbo.REVENUERECOGNITION
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM as FTLI with (nolock)
                        on FTLI.ID = REVENUERECOGNITION.REVENUESPLITID
                    inner join dbo.FINANCIALTRANSACTION as FT with (nolock)
                        on FT.ID = FTLI.FINANCIALTRANSACTIONID
                where
                    FTLI.ID in (
                        select ID
                        from dbo.UFN_REVENUEFILTER_DEFAULT() as REVENUEFILTER
                        )
                    and @CONSIDERRECOGNITION = 1
                ) DATA
            where
                DATA.CONSTITUENTID is not null
            group by DATA.CONSTITUENTID
            having min(DATA.REVENUEDATE) is not null;

            delete dbo.CONSTITUENCYDATERANGE
            from
                dbo.CONSTITUENCYDATERANGE
                left join #DONORCONSTITUENTS as DONORCONSTITUENTS
                    on DONORCONSTITUENTS.CONSTITUENTID = CONSTITUENCYDATERANGE.CONSTITUENTID
            where
                DONORCONSTITUENTS.CONSTITUENTID is null
                and CONSTITUENCYDATERANGE.CONSTITUENCYDEFINITIONID = @DONORCONSTITUENCYDEFINITIONID;
            set @RECORDCOUNT = @RECORDCOUNT + @@ROWCOUNT;
        end
        else if @CONSTITUENCYREFRESHPROCESSID is null
        begin
            insert into #DONORCONSTITUENTS
            (
                CONSTITUENTID,
                DATEFROM,
                DATETO
            )
            select
                DATA.CONSTITUENTID,
                min(DATA.REVENUEDATE) as DATEFROM,
                case 
                    when max(DATA.REVENUEDATE) < @DONORCONSTITUENCYLOWERDATEBOUND
                        then case 
                                when @DONORCONSTITUENCYDEFTYPECODE = 0
                                    then dateadd(year, @DONORCONSTITUENCYDEFLASTYEARS, max(DATA.REVENUEDATE))
                                else max(DATA.REVENUEDATE)
                                end
                    else null
                end as DATETO
            from (
                select
                    [FT].[DATE] as REVENUEDATE,
                    FT.CONSTITUENTID
                from
                    /* JamesWill WI122678 Make the donor constituency match up with UFN_CONSTITUENT_ISDONOR by using UFN_REVENUELIFECYCLE_GETVALIDREVENUE*/
                    dbo.FINANCIALTRANSACTION as FT with (nolock)
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM as FTLI with (nolock)
                        on FT.ID = FTLI.FINANCIALTRANSACTIONID
                where
                    FT.CONSTITUENTID = @CONSTITUENTID
                    and FTLI.ID in (
                        select ID
                        from dbo.UFN_REVENUEFILTER_DEFAULT() as REVENUEFILTER
                    )

                union all

                select
                    [FT].[DATE] as REVENUEDATE,
                    REVENUERECOGNITION.CONSTITUENTID
                from
                    /* JamesWill WI122678 Make the donor constituency match up with UFN_CONSTITUENT_ISDONOR by using UFN_REVENUELIFECYCLE_GETVALIDREVENUE*/
                    dbo.REVENUERECOGNITION
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM as FTLI with (nolock)
                        on FTLI.ID = REVENUERECOGNITION.REVENUESPLITID
                    inner join dbo.FINANCIALTRANSACTION as FT with (nolock)
                        on FT.ID = FTLI.FINANCIALTRANSACTIONID
                where
                    FT.CONSTITUENTID = @CONSTITUENTID
                    and FTLI.ID in (
                        select ID
                        from dbo.UFN_REVENUEFILTER_DEFAULT() as REVENUEFILTER
                        )
                    and @CONSIDERRECOGNITION = 1
                ) DATA
            group by DATA.CONSTITUENTID
            having min(DATA.REVENUEDATE) is not null;

            delete dbo.CONSTITUENCYDATERANGE
            from
                dbo.CONSTITUENCYDATERANGE
                left join #DONORCONSTITUENTS as DONORCONSTITUENTS
                    on DONORCONSTITUENTS.CONSTITUENTID = CONSTITUENCYDATERANGE.CONSTITUENTID
            where
                CONSTITUENCYDATERANGE.CONSTITUENTID = @CONSTITUENTID
                and DONORCONSTITUENTS.CONSTITUENTID is null
                and CONSTITUENCYDATERANGE.CONSTITUENCYDEFINITIONID = @DONORCONSTITUENCYDEFINITIONID;
            set @RECORDCOUNT = @RECORDCOUNT + @@ROWCOUNT;
        end
        else
        begin
            insert into #DONORCONSTITUENTS
            (
                CONSTITUENTID,
                DATEFROM,
                DATETO
            )
            select
                DATA.CONSTITUENTID,
                min(DATA.REVENUEDATE) as DATEFROM,
                case 
                    when max(DATA.REVENUEDATE) < @DONORCONSTITUENCYLOWERDATEBOUND
                        then case 
                                when @DONORCONSTITUENCYDEFTYPECODE = 0
                                    then dateadd(year, @DONORCONSTITUENCYDEFLASTYEARS, max(DATA.REVENUEDATE))
                                else max(DATA.REVENUEDATE)
                                end
                    else null
                end as DATETO
            from (
                select
                    [FT].[DATE] as REVENUEDATE,
                    FT.CONSTITUENTID
                from
                    /* JamesWill WI122678 Make the donor constituency match up with UFN_CONSTITUENT_ISDONOR by using UFN_REVENUELIFECYCLE_GETVALIDREVENUE*/
                    dbo.FINANCIALTRANSACTION as FT with (nolock)
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM as FTLI with (nolock)
                        on FT.ID = FTLI.FINANCIALTRANSACTIONID
                where
                    FTLI.ID in (
                        select ID
                        from dbo.UFN_REVENUEFILTER_DEFAULT() as REVENUEFILTER
                    )

                union all

                select
                    [FT].[DATE] as REVENUEDATE,
                    REVENUERECOGNITION.CONSTITUENTID
                from
                    /* JamesWill WI122678 Make the donor constituency match up with UFN_CONSTITUENT_ISDONOR by using UFN_REVENUELIFECYCLE_GETVALIDREVENUE*/
                    dbo.REVENUERECOGNITION
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM as FTLI with (nolock)
                        on FTLI.ID = REVENUERECOGNITION.REVENUESPLITID
                    inner join dbo.FINANCIALTRANSACTION as FT with (nolock)
                        on FT.ID = FTLI.FINANCIALTRANSACTIONID
                where
                    FTLI.ID in (
                        select ID
                        from dbo.UFN_REVENUEFILTER_DEFAULT() as REVENUEFILTER
                        )
                    and @CONSIDERRECOGNITION = 1
                ) DATA
                inner join dbo.CONSTITUENCYREFRESHPROCESSSELECTIONRESULT CONSTITUENTS
                    on CONSTITUENTS.CONSTITUENTID = DATA.CONSTITUENTID
                    and CONSTITUENTS.CONSTITUENCYREFRESHPROCESSID = @CONSTITUENCYREFRESHPROCESSID
            group by DATA.CONSTITUENTID
            having min(DATA.REVENUEDATE) is not null;

            delete dbo.CONSTITUENCYDATERANGE
            from
                dbo.CONSTITUENCYDATERANGE
                left join #DONORCONSTITUENTS as DONORCONSTITUENTS
                    on DONORCONSTITUENTS.CONSTITUENTID = CONSTITUENCYDATERANGE.CONSTITUENTID
                inner join dbo.CONSTITUENCYREFRESHPROCESSSELECTIONRESULT CONSTITUENTS
                    on CONSTITUENTS.CONSTITUENTID = CONSTITUENCYDATERANGE.CONSTITUENTID
                    and CONSTITUENTS.CONSTITUENCYREFRESHPROCESSID = @CONSTITUENCYREFRESHPROCESSID
            where
                DONORCONSTITUENTS.CONSTITUENTID is null
                and CONSTITUENCYDATERANGE.CONSTITUENCYDEFINITIONID = @DONORCONSTITUENCYDEFINITIONID;
            set @RECORDCOUNT = @RECORDCOUNT + @@ROWCOUNT;
        end

        insert into dbo.CONSTITUENCYDATERANGE
        (
            ID,
            CONSTITUENTID,
            CONSTITUENCYDEFINITIONID,
            DATEFROM,
            DATETO,
            CONSTITUENCYRECORDIDENTIFIER,
            REFRESHDATE
        )
        select
            newid(),
            DONORCONSTITUENTS.CONSTITUENTID,
            @DONORCONSTITUENCYDEFINITIONID,
            DONORCONSTITUENTS.DATEFROM,
            DONORCONSTITUENTS.DATETO,
            null,
            @CURRENTDATE
        from
            #DONORCONSTITUENTS as DONORCONSTITUENTS
            left join dbo.CONSTITUENCYDATERANGE
                on CONSTITUENCYDATERANGE.CONSTITUENTID = DONORCONSTITUENTS.CONSTITUENTID
                and CONSTITUENCYDATERANGE.CONSTITUENCYDEFINITIONID = @DONORCONSTITUENCYDEFINITIONID
        where
            CONSTITUENCYDATERANGE.ID is null;
        set @RECORDCOUNT = @RECORDCOUNT + @@ROWCOUNT;

        update dbo.CONSTITUENCYDATERANGE
        set
            CONSTITUENCYDATERANGE.DATEFROM = DONORCONSTITUENTS.DATEFROM,
            CONSTITUENCYDATERANGE.DATETO = DONORCONSTITUENTS.DATETO,
            CONSTITUENCYDATERANGE.REFRESHDATE = @CURRENTDATE
        from
            dbo.CONSTITUENCYDATERANGE
            inner join #DONORCONSTITUENTS as DONORCONSTITUENTS
                on DONORCONSTITUENTS.CONSTITUENTID = CONSTITUENCYDATERANGE.CONSTITUENTID
        where
            CONSTITUENCYDATERANGE.CONSTITUENCYDEFINITIONID = @DONORCONSTITUENCYDEFINITIONID;
        set @RECORDCOUNT = @RECORDCOUNT + @@ROWCOUNT;

        drop table #DONORCONSTITUENTS;
    end try
    begin catch
        exec dbo.USP_RAISE_ERROR;
        return 1;
    end catch

    return 0;
end