USP_DATALIST_CONSTITUENTUNREALIZEDREVENUE

Displays a list of unrealized revenue items for a constituent.

Parameters

Parameter Parameter Type Mode Description
@CONSTITUENTID uniqueidentifier IN Input parameter indicating the context ID for the data list.
@LOADALL bit IN
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@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.
@PDACCOUNTSYSTEMID uniqueidentifier IN

Definition

Copy


        CREATE procedure dbo.USP_DATALIST_CONSTITUENTUNREALIZEDREVENUE  
        (  
         @CONSTITUENTID uniqueidentifier = null,  
         @LOADALL bit = 0,  
         @CURRENTAPPUSERID uniqueidentifier = null,  
         @SECURITYFEATUREID uniqueidentifier = null,  
         @SECURITYFEATURETYPE tinyint = null,
         @PDACCOUNTSYSTEMID uniqueidentifier = null
        )  
        as  

    set nocount on;

    declare @CURRENTDATE datetime = dbo.UFN_DATE_GETEARLIESTTIME(getdate());     

    declare @APPUSERISSYSADMIN bit = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);

    declare @HOUSEHOLDSCANBEDONORS bit = dbo.UFN_INSTALLATIONINFO_GETHOUSEHOLDSCANBEDONORS();  

    declare @HOUSEHOLDID uniqueidentifier;  
    select top(1) @HOUSEHOLDID = GROUPMEMBER.GROUPID  
    from dbo.GROUPMEMBER  
        left outer join dbo.GROUPDATA on GROUPDATA.ID = GROUPMEMBER.GROUPID  
    where GROUPMEMBER.MEMBERID = @CONSTITUENTID  
        and GROUPDATA.GROUPTYPECODE = 0  
        and dbo.UFN_GROUPMEMBER_ISCURRENTMEMBER(GROUPMEMBER.ID) = 1  
        and @HOUSEHOLDSCANBEDONORS = 1

    /* 
    * The site security check was removed from the initial select because it 
    * considerably slowed down the query for databases with large numbers of  
    * revenue records. Given that only a small number of records should be 
    * returned for a given constituent/household's unrealized revenue, it was 
    * quicker to insert all the records into a table variable, then remove any 
    * ones the user did not have site access to.
    */ 
    if object_id('tempdb..#CONSTITUENTUNREALIZEDREVENUE_COMMITMENTS') is not null
        drop table #CONSTITUENTUNREALIZEDREVENUE_COMMITMENTS;

    create table #CONSTITUENTUNREALIZEDREVENUE_COMMITMENTS 
    (
        REVENUEID uniqueidentifier,
        CONSTITUENTID uniqueidentifier,
        CONSTITUENTNAME nvarchar(255) collate database_default,
        APPLIED money,
        BALANCE money,
        AMOUNTDUE money,
        DATEDUE datetime,
        REVENUETYPECODE tinyint,
        DESCRIPTION nvarchar(255) collate database_default,
        SORTORDER int,
        DESIGNATIONLIST nvarchar(500) collate database_default,
        SPONSORSHIPOPPORTUNITY nvarchar(255) collate database_default,
        APPLICATIONCURRENCYID uniqueidentifier,
        PDACCOUNTSYSTEMID uniqueidentifier,
        SPONSORSHIPRGADDITIONALGIFT bit,
        MEMBERSHIPPROGRAMNAME nvarchar(255) collate database_default,
        MEMBERSHIPLEVELNAME nvarchar(255) collate database_default
    );

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

    create table #CONSTITUENTUNREALIZEDREVENUE_CONSTITUENTS
    (
        ID uniqueidentifier
    );

    insert into #CONSTITUENTUNREALIZEDREVENUE_CONSTITUENTS(ID)  
    (  
        select   
            @HOUSEHOLDID as ID  

        union  

        select   
            case when dbo.UFN_CONSTITUENT_ISHOUSEHOLD(@CONSTITUENTID) = 1 and @LOADALL = 0 then   
                (case when @HOUSEHOLDSCANBEDONORS = 1 then @CONSTITUENTID else null end)  
            else   
                @CONSTITUENTID  
            end  

        union  

        select   
            GROUPMEMBER.MEMBERID  
        from   
            dbo.GROUPMEMBER  
            left outer join dbo.GROUPMEMBERDATERANGE on GROUPMEMBER.ID = GROUPMEMBERDATERANGE.GROUPMEMBERID  
        where   
        (   
            GROUPMEMBER.GROUPID = @HOUSEHOLDID  
            or GROUPMEMBER.GROUPID = @CONSTITUENTID  
        )  
        and (  
            (GROUPMEMBERDATERANGE.DATEFROM is null and (GROUPMEMBERDATERANGE.DATETO is null or GROUPMEMBERDATERANGE.DATETO > @CURRENTDATE))  
            or (GROUPMEMBERDATERANGE.DATETO is null and (GROUPMEMBERDATERANGE.DATEFROM is null or GROUPMEMBERDATERANGE.DATEFROM <= @CURRENTDATE))   
            or (GROUPMEMBERDATERANGE.DATEFROM <= @CURRENTDATE and GROUPMEMBERDATERANGE.DATETO > @CURRENTDATE)  
        )  
    )

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

    create table #CONSTITUENTUNREALIZEDREVENUE_POTENTIALCOMMITMENTS
    (
        ID uniqueidentifier,
        TYPECODE tinyint,
        TRANSACTIONCURRENCYID uniqueidentifier,
        CONSTITUENTID uniqueidentifier,
        PDACCOUNTSYSTEMID uniqueidentifier,
        PLEDGEBALANCE money,
        INSTALLMENTBALANCE money,
        INSTALLMENTDATE datetime,
        INSTALLMENTID uniqueidentifier
    );

    --For performance reasons, use a temp table for all potential constituent revenue.


    insert into #CONSTITUENTUNREALIZEDREVENUE_POTENTIALCOMMITMENTS (ID, TYPECODE, TRANSACTIONCURRENCYID, CONSTITUENTID, PDACCOUNTSYSTEMID, PLEDGEBALANCE, INSTALLMENTBALANCE, INSTALLMENTDATE, INSTALLMENTID)
    select
        RES.ID, RES.TYPECODE, RES.TRANSACTIONCURRENCYID, RES.CONSTITUENTID, RES.PDACCOUNTSYSTEMID, RES.BALANCE, NEXTINSTALLMENT.BALANCE, NEXTINSTALLMENT.DATE, NEXTINSTALLMENT.ID
    from
    (
        select
            FT.ID,
            C.ID CONSTITUENTID,
            FT.TYPECODE,
            FT.TRANSACTIONCURRENCYID,
            FT.PDACCOUNTSYSTEMID,
            FT.TRANSACTIONAMOUNT - isnull(sum(SPLITS.AMOUNT),0) BALANCE
        from
            #CONSTITUENTUNREALIZEDREVENUE_CONSTITUENTS C
        inner join 
            dbo.FINANCIALTRANSACTION FT  on C.ID = FT.CONSTITUENTID
        left join 
            dbo.INSTALLMENT INSTALLMENTS on INSTALLMENTS.REVENUEID = FT.ID
        left join (
            select 
                isnull(sum(ISP.AMOUNT),0) AMOUNT,
                ISPLIT.INSTALLMENTID
            from 
                dbo.INSTALLMENTSPLIT ISPLIT 
            inner join 
                dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.INSTALLMENTSPLITID = ISPLIT.ID
            group by
                ISPLIT.INSTALLMENTID
            union all
            select 
                isnull(sum(ISW.AMOUNT),0) AMOUNT,
                ISPLIT.INSTALLMENTID
            from 
                dbo.INSTALLMENTSPLIT ISPLIT 
            inner join 
                dbo.INSTALLMENTSPLITWRITEOFF ISW on ISW.INSTALLMENTSPLITID = ISPLIT.ID
            group by
                ISPLIT.INSTALLMENTID) as SPLITS on SPLITS.INSTALLMENTID = INSTALLMENTS.ID
        where 
            FT.DELETEDON is null
        group by FT.ID, C.ID, TYPECODE, FT.TRANSACTIONCURRENCYID, FT.PDACCOUNTSYSTEMID, FT.TRANSACTIONAMOUNT

    ) RES

    outer apply (
        select
            top 1 INSTALLMENTS.ID,
            INSTALLMENTS.[DATE],
            sum(INSTALLMENTS.TRANSACTIONAMOUNT) - isnull(sum(SUMMEDSPLITS.AMOUNT),0) BALANCE
        from
            dbo.INSTALLMENT INSTALLMENTS
        left join (
            select
                sum(SPLITS.AMOUNT) as AMOUNT,
                SPLITS.ID 
            from 
            (
                select 
                    isnull(sum(ISP.AMOUNT),0) as AMOUNT,
                    ISPLIT.INSTALLMENTID as ID
                from 
                    dbo.INSTALLMENTSPLIT ISPLIT 
                inner join 
                    dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.INSTALLMENTSPLITID = ISPLIT.ID
                group by
                    ISPLIT.INSTALLMENTID
                union all
                select 
                    isnull(sum(ISW.AMOUNT),0) as AMOUNT,
                    ISPLIT.INSTALLMENTID as ID
                from 
                    dbo.INSTALLMENTSPLIT ISPLIT 
                inner join 
                    dbo.INSTALLMENTSPLITWRITEOFF ISW on ISW.INSTALLMENTSPLITID = ISPLIT.ID
                group by
                    ISPLIT.INSTALLMENTID
            ) SPLITS
            inner join 
                INSTALLMENT on SPLITS.ID = INSTALLMENT.ID
            group by 
                SPLITS.ID 
        ) as SUMMEDSPLITS on SUMMEDSPLITS.ID = INSTALLMENTS.ID
        where 
            INSTALLMENTS.REVENUEID = RES.ID
        group by 
            INSTALLMENTS.ID, INSTALLMENTS.[DATE]
        having 
            (sum(INSTALLMENTS.TRANSACTIONAMOUNT) - isnull(sum(SUMMEDSPLITS.AMOUNT),0)) > 0
        order by 
            INSTALLMENTS.[DATE] asc
    ) as NEXTINSTALLMENT

    where RES.BALANCE > 0;

    insert into #CONSTITUENTUNREALIZEDREVENUE_COMMITMENTS
    select
        REVENUE.ID,
        CONSTITUENT.ID,
        case
            when MGREVENUE.ID is not null then
                case REVENUE.TYPECODE
                    when 3 then
                        CONSTITUENT.NAME + ' - ' + MGCONSTIT.NAME + ' (' + MGCONSTIT.LOOKUPID + ')'
                    else
                        CONSTITUENT.NAME + ' - ' + MGCONSTIT.NAME
                    end
            else
                CONSTITUENT.NAME
        end as CONSTITUENTNAME,
        0,
        REVENUE.PLEDGEBALANCE,
        REVENUE.INSTALLMENTBALANCE,
        REVENUE.INSTALLMENTDATE,
        case REVENUE.TYPECODE 
            when 6 then 9 
            when 8 then 10 
            else REVENUE.TYPECODE 
        end,  -- handle grant awards differently to avoid type collision with event registrations

        '',
        case 
            when CONSTITUENT.ID = @CONSTITUENTID 
                then 1 
            else 0 
        end as SORTORDER,
        null as DESIGNATIONLIST,
        null as SPONSORSHIPOPPORTUNITY,
        REVENUE.TRANSACTIONCURRENCYID,
        REVENUE.PDACCOUNTSYSTEMID,
        0,
        null as MEMBERSHIPPROGRAMNAME,
        null as MEMBERSHIPLEVELNAME
    from 
        #CONSTITUENTUNREALIZEDREVENUE_POTENTIALCOMMITMENTS REVENUE
        inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUE.CONSTITUENTID
        inner join dbo.REVENUESCHEDULE on REVENUESCHEDULE.ID = REVENUE.ID
        left join dbo.REVENUEMATCHINGGIFT on REVENUE.ID = REVENUEMATCHINGGIFT.ID
        left join dbo.FINANCIALTRANSACTION MGREVENUE on MGREVENUE.ID = REVENUEMATCHINGGIFT.MGSOURCEREVENUEID
        left join dbo.CONSTITUENT MGCONSTIT on MGCONSTIT.ID = MGREVENUE.CONSTITUENTID
    where
        REVENUESCHEDULE.ISPENDING = 0 --Isn't Pending

        and( REVENUEMATCHINGGIFT.ISACTIVE = 1 
            or REVENUE.TYPECODE <> 3
        )
        and REVENUE.TYPECODE in (0,1,2,3,4,5,6,7,8,9
        and REVENUE.INSTALLMENTID is not null
        and 
        (
            REVENUE.TYPECODE in (2,3,8) --account system not valid for RG, MGC, and donor challenge claim.

            or REVENUE.PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID or @PDACCOUNTSYSTEMID is null
        );

    insert into #CONSTITUENTUNREALIZEDREVENUE_COMMITMENTS
    select
        REVENUE.ID,
        CONSTITUENT.ID,
        CONSTITUENT.NAME,
        0,
        REVENUE.TRANSACTIONAMOUNT, -- TRANSACTIONAMOUNT

        (select BALANCE from dbo.UFN_RECURRINGGIFT_GETNEXTINSTALLMENTINFO(REVENUE.ID,null)),
        REVENUESCHEDULE.NEXTTRANSACTIONDATE,
        REVENUE.TYPECODE,
        '',
        case 
            when CONSTITUENT.ID = @CONSTITUENTID 
                then 1 
            else 0 
        end,
        null,  
        SPONSORSHIPINFO.SPONSORSHIPOPPORTUNITY as SPONSORSHIPOPPORTUNITY,
        REVENUE.TRANSACTIONCURRENCYID,
        null as PDACCOUNTSYSTEMID,
        case 
            when exists(
                    select 1
                    from dbo.FINANCIALTRANSACTIONLINEITEM 
                        inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
                    where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = REVENUE.ID
                        and REVENUESPLIT_EXT.TYPECODE = 17
                ) 
                then 1 
            else 0 
        end,
        MEMBERSHIPINFO.PROGRAMNAME as MEMBERSHIPPROGRAMNAME,
        MEMBERSHIPINFO.LEVELNAME as MEMBERSHIPLEVELNAME
    from 
        dbo.FINANCIALTRANSACTION REVENUE
        inner join #CONSTITUENTUNREALIZEDREVENUE_CONSTITUENTS VALIDCONSTITUENT on VALIDCONSTITUENT.ID = REVENUE.CONSTITUENTID
        inner join dbo.REVENUESCHEDULE on REVENUE.ID = REVENUESCHEDULE.ID
        inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUE.CONSTITUENTID
        left outer join(
            select
                SP.REVENUEID,
                coalesce(
                    (
                        select NAME 
                        from SPONSORSHIPOPPORTUNITYCHILD 
                        where ID=S.SPONSORSHIPOPPORTUNITYID
                    ),  
                    (
                        select NAME 
                        from SPONSORSHIPOPPORTUNITYPROJECT 
                        where ID = S.SPONSORSHIPOPPORTUNITYID
                    )
                ) SPONSORSHIPOPPORTUNITY  
            from dbo.REVENUESPLIT SP
                inner join SPONSORSHIP S on S.REVENUESPLITID = SP.ID  
                inner join SPONSORSHIPOPPORTUNITY SO on SO.ID = S.SPONSORSHIPOPPORTUNITYID  
            where S.ISMOSTRECENTFORCOMMITMENT = 1  
        ) SPONSORSHIPINFO on SPONSORSHIPINFO.REVENUEID = REVENUE.ID
        left outer join(
            select
                MS.REVENUEID,
                MP.NAME as [PROGRAMNAME],
                ML.NAME as [LEVELNAME]
            from
                dbo.REVENUESPLIT MS
                inner join MEMBERSHIPTRANSACTION MT on MT.REVENUESPLITID = MS.ID
                inner join MEMBERSHIP M on M.ID = MT.MEMBERSHIPID
                inner join MEMBERSHIPPROGRAM MP on MP.ID = M.MEMBERSHIPPROGRAMID
                inner join MEMBERSHIPLEVEL ML on ML.ID = M.MEMBERSHIPLEVELID
        ) MEMBERSHIPINFO on MEMBERSHIPINFO.REVENUEID = REVENUE.ID
    where 
        REVENUE.TYPECODE = 2    --Recurring Gift  

        and REVENUESCHEDULE.STATUSCODE in (0,5)  --Active & Lapsed

        and REVENUESCHEDULE.ISPENDING = 0  --Isn't pending  

        and REVENUE.BASEAMOUNT > 0     --Has Base Value

        and REVENUE.DELETEDON is null;


    if @APPUSERISSYSADMIN = 0
    begin
    -- Remove records that the user does not have site access to.

        delete from #CONSTITUENTUNREALIZEDREVENUE_COMMITMENTS
        where not exists (
                select 1 
                from dbo.UFN_SITEID_MAPFROM_REVENUEID(REVENUEID) as SITE  
                where exists (
                    select 1 
                    from dbo.UFN_SITESFORUSERONFEATURE(@CURRENTAPPUSERID,@SECURITYFEATUREID,@SECURITYFEATURETYPE
                    where SITEID=[SITE].[SITEID] 
                        or (SITEID is null 
                            and [SITE].[SITEID] is null
                        )
                )
            )option(recompile);
    end

    -- Gather all the designation names for each row in results table 

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

    create table #REVENUEBATCH_CONSTITUENTCOMMITMENT_DESIGNATIONS
    (
        ID uniqueidentifier,
        DESIGNATION varchar(max) collate database_default
    )

    insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_DESIGNATIONS (ID, DESIGNATION)
    select
        REVENUECOMMITMENTS.REVENUEID,
        dbo.UDA_BUILDLIST(DESIGNATION.USERID)
    from 
        #CONSTITUENTUNREALIZEDREVENUE_COMMITMENTS REVENUECOMMITMENTS
    inner join 
        FINANCIALTRANSACTIONLINEITEM FTLI on FTLI.FINANCIALTRANSACTIONID  = REVENUECOMMITMENTS.REVENUEID
    inner join 
        dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FTLI.ID
    inner join 
        dbo.DESIGNATION on REVENUESPLIT_EXT.DESIGNATIONID = DESIGNATION.ID
    where
        FTLI.DELETEDON is null
    group by 
        REVENUECOMMITMENTS.REVENUEID;

    -- Set DESIGNATIONLIST separately from the insert to get a better query plan.

    update REVENUECOMMITMENTS
    set
        DESIGNATIONLIST = coalesce(
        (
            select
                left(D.DESIGNATION, 500)
            from 
                #REVENUEBATCH_CONSTITUENTCOMMITMENT_DESIGNATIONS D
            where 
                D.ID = REVENUECOMMITMENTS.REVENUEID
        ), '')    
    from 
        #CONSTITUENTUNREALIZEDREVENUE_COMMITMENTS REVENUECOMMITMENTS;

    insert into #CONSTITUENTUNREALIZEDREVENUE_COMMITMENTS
    select  
        REGISTRANT.ID,  
        CONSTITUENT.ID,  
        CONSTITUENT.NAME,  
        0,  
        REGISTRANTBALANCE.BALANCE,  
        REGISTRANTBALANCE.BALANCE,  
        [EVENT].STARTDATE, --JamesWill CR260844-113006 2007/03/15 Use the event start date as the due date  

        6, --Event Registration  

        [EVENT].NAME,  
        case 
            when CONSTITUENT.ID = @CONSTITUENTID 
                then 1 
            else 0 
        end,  
        '' as DESIGNATIONLIST,  
        null as SPONSORSHIPOPPORTUNITY,
        EVENT.BASECURRENCYID,
        null  as PDACCOUNTSYSTEMID,
        0,
        null as MEMBERSHIPPROGRAMNAME,
        null as MEMBERSHIPLEVELNAME
    from 
        dbo.REGISTRANT  
        inner join #CONSTITUENTUNREALIZEDREVENUE_CONSTITUENTS VALIDCONSTITUENT on VALIDCONSTITUENT.ID = REGISTRANT.CONSTITUENTID  
        inner join dbo.CONSTITUENT on CONSTITUENT.ID = REGISTRANT.CONSTITUENTID  
        inner join dbo.[EVENT] on [EVENT].ID = REGISTRANT.EVENTID  
        left join V_QUERY_EVENTREGISTRANT_BALANCE REGISTRANTBALANCE on REGISTRANTBALANCE.REGISTRANTID = REGISTRANT.ID
    where 
        REGISTRANTBALANCE.BALANCE > 0  
        and (--Check site security  

            @APPUSERISSYSADMIN = 1
            or exists (
                select 1  
                from dbo.UFN_SITEID_MAPFROM_EVENTID([EVENT].ID) as SITE  
                where exists (
                    select 1 
                    from dbo.UFN_SITESFORUSERONFEATURE(@CURRENTAPPUSERID,@SECURITYFEATUREID,@SECURITYFEATURETYPE
                    where SITEID=[SITE].[SITEID] 
                        or (SITEID is null 
                            and [SITE].[SITEID] is null
                        )
                )
            )
        )option(recompile);

    -- THIS SECTION MAY NOT BE USED, PLEASE CONSIDER FOR REMOVAL - DavidHe  

    insert into #CONSTITUENTUNREALIZEDREVENUE_COMMITMENTS
    select  
        OPPORTUNITY.ID,  
        CONSTITUENT.ID,  
        CONSTITUENT.NAME,  
        0,  
        OPPORTUNITY.AMOUNT - dbo.UFN_OPPORTUNITY_GETAMOUNTPAID(OPPORTUNITY.ID),  
        null, -- amount due  

        null, -- date due  

        100, -- arbitrary application type code for opportunities, resolved in USP_REVENUE_APPLYTOREVENUESTREAMS  

        dbo.UFN_OPPORTUNITY_GETDESCRIPTION(OPPORTUNITY.ID),  
        case 
            when CONSTITUENT.ID = @CONSTITUENTID 
                then 1 
            else 0 
        end,  
        (  
            select top 1 left(dbo.UDA_BUILDLIST(DESIGNATION.USERID), 500) as DESIGNATIONLIST   
            from dbo.DESIGNATION  
                inner join dbo.OPPORTUNITYDESIGNATION on DESIGNATION.ID = OPPORTUNITYDESIGNATION.DESIGNATIONID  
            where OPPORTUNITYDESIGNATION.OPPORTUNITYID = OPPORTUNITY.ID  
        ) as DESIGNATIONLIST,  
        null as SPONSORSHIPOPPORTUNITY,  
        null as APPLCATIONCURRENCYID ,
        null as PDACCOUNTSYSTEMID,
        0,
        null as MEMBERSHIPPROGRAMNAME,
        null as MEMBERSHIPLEVELNAME
    from 
        dbo.OPPORTUNITY  
        inner join dbo.PROSPECTPLAN on PROSPECTPLAN.ID = OPPORTUNITY.PROSPECTPLANID  
        inner join #CONSTITUENTUNREALIZEDREVENUE_CONSTITUENTS VALIDCONSTITUENT on VALIDCONSTITUENT.ID = PROSPECTPLAN.PROSPECTID  
        -- CR298118-041508 Only include opportunities which have designations associated with them so that  

        -- when we go to fill in a payment for them we have something to apply them to.  

        -- DavidHe (removed inner join and made a where exists clause to prevent multiple rows from pulling where only one should).  

        left outer join dbo.CONSTITUENT on CONSTITUENT.ID = PROSPECTPLAN.PROSPECTID  
    where 
        exists (
            select ID 
            from dbo.OPPORTUNITYDESIGNATION 
            where OPPORTUNITYDESIGNATION.OPPORTUNITYID = OPPORTUNITY.ID
        )   

    select
        REVENUEID,
        CONSTITUENTID,
        CONSTITUENTNAME,
        APPLIED,
        BALANCE,
        AMOUNTDUE,
        DATEDUE,
        REVENUETYPECODE,
        DESCRIPTION,
        SORTORDER,
        DESIGNATIONLIST,
        SPONSORSHIPOPPORTUNITY,
        APPLICATIONCURRENCYID,
        PDACCOUNTSYSTEMID,
        SPONSORSHIPRGADDITIONALGIFT,
        MEMBERSHIPPROGRAMNAME,
        MEMBERSHIPLEVELNAME
    from
        #CONSTITUENTUNREALIZEDREVENUE_COMMITMENTS
    order by SORTORDER desc;