USP_DATALIST_CONSTITUENTREVENUERECENT

Returns a list of recent revenue associated with a constituent.

Parameters

Parameter Parameter Type Mode Description
@CONSTITUENTID uniqueidentifier IN Input parameter indicating the context ID for the data list.
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@MAXROWS int IN Input parameter indicating the maximum number of rows to return.
@SECURITYFEATUREID uniqueidentifier IN Input parameter indicating the ID of the feature to use for site security checking.
@SECURITYFEATURETYPE tinyint IN Input parameter indicating the type of the feature to use for site security checking.

Definition

Copy


CREATE procedure dbo.USP_DATALIST_CONSTITUENTREVENUERECENT
(
    @CONSTITUENTID uniqueidentifier,
    @CURRENTAPPUSERID uniqueidentifier = null,
    @MAXROWS int,
    @SECURITYFEATUREID uniqueidentifier = null,
    @SECURITYFEATURETYPE tinyint = null
)
as
    set nocount on;

    declare @NAME nvarchar(1000);
    select @NAME = C.NAME
    from dbo.CONSTITUENT C
    where C.ID = @CONSTITUENTID

    if object_id('tempdb..#CONSTITUENTREVENUE') is not null
        drop table #CONSTITUENTREVENUE;

    create table #CONSTITUENTREVENUE
    (
        ID uniqueidentifier primary key,
        AMOUNT money,
        TRANSACTIONTYPE nvarchar(150) collate database_default,
        TRANSACTIONTYPECODE tinyint,
        [DATE] date,
        TRANSACTIONCURRENCYID uniqueidentifier,
        TRANSACTIONAMOUNT money,
        GIVENANONYMOUSLY bit
    );

    if dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) = 0 and exists(select top 1 1 from dbo.SITE)
    begin
        insert into #CONSTITUENTREVENUE
        (
            ID,
            AMOUNT,
            TRANSACTIONTYPE,
            TRANSACTIONTYPECODE,
            DATE,
            TRANSACTIONCURRENCYID,
            TRANSACTIONAMOUNT,
            GIVENANONYMOUSLY
        )
        select
            FINANCIALTRANSACTION.ID,
            TRANSACTIONAMOUNT,
            FINANCIALTRANSACTION.[TYPE],
            FINANCIALTRANSACTION.TYPECODE,
            DATE,
            TRANSACTIONCURRENCYID,
            FINANCIALTRANSACTION.TRANSACTIONAMOUNT,
            GIVENANONYMOUSLY
        from
            dbo.FINANCIALTRANSACTION
            inner join dbo.REVENUE_EXT
                on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
        where
            FINANCIALTRANSACTION.CONSTITUENTID = @CONSTITUENTID and
            FINANCIALTRANSACTION.DELETEDON is null and
            FINANCIALTRANSACTION.TYPECODE in (0,1,2,3,4,6,7,8,9,15) and --Showing order payment summary, so order revenue redundant

            exists
            (
                select top 1 REVSITES.SITEID from dbo.UFN_SITEID_MAPFROM_REVENUEID(FINANCIALTRANSACTION.ID) REVSITES
                -- Using a case statement since the standard site extension filters

                -- resulted in a poor plan

                where case
                        when dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) = 1 then 1
                        when exists (select 1 from dbo.UFN_SITESFORUSERONFEATURE(@CURRENTAPPUSERID,@SECURITYFEATUREID,@SECURITYFEATURETYPE) where SITEID=[REVSITES].[SITEID] or (SITEID is null and [REVSITES].[SITEID] is null)) then 1
                        else 0
                    end = 1
            );
    end
    else
    begin
        insert into #CONSTITUENTREVENUE
        (
            ID,
            AMOUNT,
            TRANSACTIONTYPE,
            TRANSACTIONTYPECODE,
            DATE,
            TRANSACTIONCURRENCYID,
            TRANSACTIONAMOUNT,
            GIVENANONYMOUSLY
        )
        select
            FINANCIALTRANSACTION.ID,
            TRANSACTIONAMOUNT,
            FINANCIALTRANSACTION.[TYPE],
            FINANCIALTRANSACTION.TYPECODE,
            DATE,
            TRANSACTIONCURRENCYID,
            FINANCIALTRANSACTION.TRANSACTIONAMOUNT,
            GIVENANONYMOUSLY
        from
            dbo.FINANCIALTRANSACTION
            inner join dbo.REVENUE_EXT
                on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
        where
            FINANCIALTRANSACTION.CONSTITUENTID = @CONSTITUENTID and
            FINANCIALTRANSACTION.DELETEDON is null and
            FINANCIALTRANSACTION.TYPECODE in (0,1,2,3,4,6,7,8,9,15)
    end

    if object_id('tempdb..#CONSTITUENTWRITEOFF') is not null
        drop table #CONSTITUENTWRITEOFF;

    create table #CONSTITUENTWRITEOFF
    (
        ID uniqueidentifier,
        TRANSACTIONTYPECODE tinyint,
        DATE datetime,
        AMOUNT money,
        TRANSACTIONCURRENCYID uniqueidentifier,
        GIVENANONYMOUSLY bit,
        COMMITMENTREVENUEID uniqueidentifier
    );

    insert into #CONSTITUENTWRITEOFF (ID, TRANSACTIONTYPECODE, DATE, AMOUNT, TRANSACTIONCURRENCYID, GIVENANONYMOUSLY, COMMITMENTREVENUEID)
    select
        MYSITESREV_CTE.ID,
        MYSITESREV_CTE.TRANSACTIONTYPECODE,
        WO.CALCULATEDDATE [DATE],
        sum(WOS.BASEAMOUNT),
        MYSITESREV_CTE.TRANSACTIONCURRENCYID,
        MYSITESREV_CTE.GIVENANONYMOUSLY,
        MYSITESREV_CTE.ID
    from #CONSTITUENTREVENUE as MYSITESREV_CTE
    inner join dbo.FINANCIALTRANSACTION WO on MYSITESREV_CTE.ID = WO.PARENTID
    inner join dbo.WRITEOFF_EXT on WO.ID = WRITEOFF_EXT.ID
    inner join dbo.FINANCIALTRANSACTIONLINEITEM WOS on WOS.FINANCIALTRANSACTIONID = WO.ID
    inner join dbo.REVENUESPLIT_EXT on WOS.ID = REVENUESPLIT_EXT.ID
    where
        WO.TYPECODE = 20
        and WOS.DELETEDON is null
    group by MYSITESREV_CTE.ID, WO.ID, MYSITESREV_CTE.TRANSACTIONTYPECODE, WO.CALCULATEDDATE, MYSITESREV_CTE.TRANSACTIONCURRENCYID, MYSITESREV_CTE.GIVENANONYMOUSLY;

    select top (@MAXROWS)
        [RECORDID],
        [DATE],
        [TYPE],
        [AMOUNT],
        [DISPLAYCURRENCY],
        [GIVENANONYMOUSLY]
    from
    (
        -- Donations, event registration payments, membership, membership add-on, and other payments

        select
            MYSITESREV_CTE.ID as RECORDID,
            case MYSITESREV_CTE.TRANSACTIONTYPECODE
                when 0 then
                    case
                        when REVENUESPLIT_EXT.APPLICATIONCODE in (0,1,4,5,12,18) then
                            case
                                when REVENUESPLIT_EXT.TYPECODE = 9 then  -- Sponsorship

                                    case
                                        when REVENUESPLIT_EXT.APPLICATIONCODE = 0 then
                                            'Sponsorship ' + lower(REVENUESPLIT_EXT.APPLICATION)
                                        else
                                            'Sponsorship ' + REVENUESPLIT_EXT.APPLICATION + ' payment'
                                    end
                                when RS.TYPECODE = 17 then
                                    'Sponsorship additional donation'
                                else
                                    case
                                        when REVENUESPLIT_EXT.APPLICATIONCODE = 0 then
                                            REVENUESPLIT_EXT.APPLICATION
                                        else
                                            REVENUESPLIT_EXT.APPLICATION + ' payment'
                                    end
                            end
                        when REVENUESPLIT_EXT.APPLICATIONCODE in (2,3,6,7,8,13,19) then
                            case
                                when REVENUESPLIT_EXT.TYPECODE = 9 then  -- Sponsorship

                                    'Sponsorship payment'
                                when REVENUESPLIT_EXT.TYPECODE = 17 then
                                    'Sponsorship recurring additional gift payment'
                                when REVENUESPLIT_EXT.TYPECODE = 2 and REVENUESPLIT_EXT.APPLICATIONCODE = 3 then
                                    'Recurring membership payment'
                                else
                                    REVENUESPLIT_EXT.APPLICATION + ' payment'
                            end
                    end
            end as TYPE,
            MYSITESREV_CTE.DATE,
            RS.TRANSACTIONAMOUNT as AMOUNT,
            MYSITESREV_CTE.TRANSACTIONCURRENCYID as DISPLAYCURRENCY,
            MYSITESREV_CTE.GIVENANONYMOUSLY
        from
            #CONSTITUENTREVENUE as MYSITESREV_CTE
            inner join dbo.FINANCIALTRANSACTIONLINEITEM RS on MYSITESREV_CTE.ID = RS.FINANCIALTRANSACTIONID
            inner join dbo.REVENUESPLIT_EXT on RS.ID = REVENUESPLIT_EXT.ID
        where
            MYSITESREV_CTE.TRANSACTIONTYPECODE = 0
            and REVENUESPLIT_EXT.APPLICATIONCODE <> 10  -- Order transactions are selected below; we don't want their payments separately.

            and RS.DELETEDON is null

        union all

        -- Pledges, Recurring gifts, Auction donations, Matching gift claims (by this constituent matching someone else's gift --> Orgs Only),

        -- Planned gifts, Grant awards, Membership installment plans

        select
            MYSITESREV_CTE.ID as RECORDID,
            case
                when REVENUESPLIT_EXT.TYPECODE = 9 then  -- Sponsorship

                    'Sponsorship ' + LOWER(MYSITESREV_CTE.TRANSACTIONTYPE)
                when REVENUESPLIT_EXT.TYPECODE = 17 then
                    'Sponsorship recurring additional gift'
                when REVENUESPLIT_EXT.APPLICATIONCODE = 5 and REVENUESPLIT_EXT.TYPECODE = 2 and MYSITESREV_CTE.TRANSACTIONTYPECODE = 2 then
                    'Membership'
                else
                    MYSITESREV_CTE.TRANSACTIONTYPE
            end as TYPE,
            MYSITESREV_CTE.DATE,
            MYSITESREV_CTE.TRANSACTIONAMOUNT as AMOUNT,
            MYSITESREV_CTE.TRANSACTIONCURRENCYID as DISPLAYCURRENCY,
            MYSITESREV_CTE.GIVENANONYMOUSLY
        from
            #CONSTITUENTREVENUE as MYSITESREV_CTE
            inner join dbo.FINANCIALTRANSACTIONLINEITEM RS on MYSITESREV_CTE.ID = RS.FINANCIALTRANSACTIONID
            inner join dbo.REVENUESPLIT_EXT on RS.ID = REVENUESPLIT_EXT.ID
        where
            ((MYSITESREV_CTE.TRANSACTIONTYPECODE not in (0,15)) or (MYSITESREV_CTE.TRANSACTIONTYPECODE = 15 AND REVENUESPLIT_EXT.TYPECODE <> 0 and REVENUESPLIT_EXT.TYPECODE <> 18)) and
            RS.DELETEDON is null
        group by
            MYSITESREV_CTE.ID,
            REVENUESPLIT_EXT.TYPECODE,
            REVENUESPLIT_EXT.APPLICATIONCODE,
            MYSITESREV_CTE.DATE,
            MYSITESREV_CTE.TRANSACTIONAMOUNT,
            MYSITESREV_CTE.TRANSACTIONCURRENCYID,
            MYSITESREV_CTE.TRANSACTIONTYPE,
            MYSITESREV_CTE.GIVENANONYMOUSLY,
            MYSITESREV_CTE.TRANSACTIONTYPECODE

        union all

        -- write-offs

        select
            CONSTITUENTWRITEOFF.ID as RECORDID,
            case CONSTITUENTWRITEOFF.TRANSACTIONTYPECODE
                when 1 then 'Pledge write-off'
                when 6 then 'Grant award write-off'
                when 15 then 'Membership write-off' 
            end as TYPE,
            CONSTITUENTWRITEOFF.DATE as DATE,
            CONSTITUENTWRITEOFF.AMOUNT,
            CONSTITUENTWRITEOFF.TRANSACTIONCURRENCYID as DISPLAYCURRENCY,
            CONSTITUENTWRITEOFF.GIVENANONYMOUSLY
        from
            #CONSTITUENTWRITEOFF CONSTITUENTWRITEOFF

        union all
                -- Matching gift claims, matching revenue from this constituent

        select distinct
            MYSITESREV_CTE.ID as RECORDID,
            MYSITESREV_CTE.TRANSACTIONTYPE + ' (' + @NAME + ')' as TYPE,
            MYSITESREV_CTE.DATE,
            RS.TRANSACTIONAMOUNT as AMOUNT,
            MYSITESREV_CTE.TRANSACTIONCURRENCYID as DISPLAYCURRENCY,
            MYSITESREV_CTE.GIVENANONYMOUSLY
        from
            #CONSTITUENTREVENUE as MYSITESREV_CTE
            inner join dbo.REVENUEMATCHINGGIFT RMG on RMG.ID = MYSITESREV_CTE.ID
            inner join dbo.FINANCIALTRANSACTION R2 on R2.ID = RMG.MGSOURCEREVENUEID
            inner join dbo.REVENUE_EXT RE2 on R2.ID = RE2.ID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM RS on RS.FINANCIALTRANSACTIONID = MYSITESREV_CTE.ID
            inner join dbo.REVENUESPLIT_EXT RSE on RS.ID = RSE.ID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM RS2 on RS2.FINANCIALTRANSACTIONID = R2.ID
            inner join dbo.REVENUESPLIT_EXT RSE2 on RS2.ID = RSE2.ID
        where
            MYSITESREV_CTE.TRANSACTIONTYPECODE = 3 and -- Matching gift claims

            R2.CONSTITUENTID = @CONSTITUENTID and
            RSE.DESIGNATIONID = RSE2.DESIGNATIONID and
            RS.DELETEDON is null and
            RS2.DELETEDON is null

        union all

        -- bwj 9/23/09 Get payments by this constituent on orders (the orders might have been made by a different

        --    constituent). This will likely need to be updated when work occurs to display sales orders on

        --    the constituent revenue history datalist selected out of above.

        select
            SALESORDER.REVENUEID,
            (select FINANCIALTRANSACTION.TYPE from dbo.FINANCIALTRANSACTION inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID where FINANCIALTRANSACTION.ID = SALESORDER.REVENUEID and FINANCIALTRANSACTION.DELETEDON is null) as TRANSACTIONTYPE,
            SALESORDER.TRANSACTIONDATE,
            SUM(SALESORDERPAYMENT.AMOUNT) as AMOUNT,
            null as DISPLAYCURRENCY,
            REVENUE_EXT.GIVENANONYMOUSLY
        from
            dbo.SALESORDERPAYMENT
        inner join
            dbo.FINANCIALTRANSACTION ON SALESORDERPAYMENT.PAYMENTID = FINANCIALTRANSACTION.ID
        inner join
            dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
        inner join
            dbo.SALESORDER on SALESORDER.ID = SALESORDERPAYMENT.SALESORDERID
        where
            FINANCIALTRANSACTION.CONSTITUENTID = @CONSTITUENTID
        and
            FINANCIALTRANSACTION.DELETEDON is null
        and
            SALESORDER.STATUSCODE not in (0, 5, 7) -- exclude pending, cancelled, unresolved orders

        and
            SALESORDER.REVENUEID is not null
        group by
            SALESORDERPAYMENT.SALESORDERID, SALESORDER.REVENUEID, SALESORDER.TRANSACTIONDATE, REVENUE_EXT.GIVENANONYMOUSLY

        union all

        -- fetches the 0 dollar payments having 100% adjustable discount

        select distinct
            SALESORDER.REVENUEID,
            'Order' as TRANSACTIONTYPE,
            SALESORDER.TRANSACTIONDATE,
            SALESORDER.AMOUNT,
            null as DISPLAYCURRENCY,
            0 as GIVENANONYMOUSLY
        from
            dbo.SALESORDER
        inner join
            dbo.SALESORDERITEM on SALESORDERITEM.SALESORDERID = SALESORDER.ID
        inner join
            dbo.SALESORDERITEMORDERDISCOUNT on SALESORDERITEMORDERDISCOUNT.ID = SALESORDERITEM.ID
        where
            SALESORDER.CONSTITUENTID = @CONSTITUENTID
        and
            SALESORDER.STATUSCODE not in (0, 5, 7) -- exclude pending, cancelled, unresolved orders

        and
            SALESORDER.REVENUEID is not null
        and
            SALESORDER.AMOUNT=0 and SALESORDERITEMORDERDISCOUNT.ISADJUSTABLEDISCOUNT=1
    ) as REVENUEHISTORY
    order by [DATE] desc;