USP_REPORT_ACTIVITY

Parameters

Parameter Parameter Type Mode Description
@STARTDATE datetime IN
@ENDDATE datetime IN
@REVENUETRANSACTIONQUERY uniqueidentifier IN
@CONSTITUENTID uniqueidentifier IN
@REPORTUSERID nvarchar(128) IN
@CURRENCYCODE tinyint IN
@ALTREPORTUSERID nvarchar(128) IN

Definition

Copy

create procedure dbo.USP_REPORT_ACTIVITY
    (
        @STARTDATE datetime = null
        @ENDDATE datetime = null,
        @REVENUETRANSACTIONQUERY uniqueidentifier = null,
        @CONSTITUENTID uniqueidentifier = null,
        @REPORTUSERID nvarchar(128) = null,
        @CURRENCYCODE tinyint = null, -- (null, 1) = Organization, 0 = Base, 2 = Transaction

        @ALTREPORTUSERID nvarchar(128) = null
    )
    with execute as owner
    as
    set nocount on;
    set transaction isolation level read uncommitted;

    declare @STARTDATEEARLIEST datetime = dbo.UFN_DATE_GETEARLIESTTIME(@STARTDATE);
    declare @ENDDATELATEST datetime = dbo.UFN_DATE_GETLATESTTIME(@ENDDATE);

    declare @CURRENTAPPUSERID uniqueidentifier;
    declare @ISADMIN bit;
    declare @APPUSER_IN_NONRACROLE bit;
    declare @APPUSER_IN_NOSECGROUPROLE bit;

    set @CURRENTAPPUSERID = dbo.UFN_APPUSER_GETREPORTAPPUSERID(@REPORTUSERID, @ALTREPORTUSERID);
    set @ISADMIN = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);
    set @APPUSER_IN_NONRACROLE = dbo.UFN_SECURITY_APPUSER_IN_NONRACROLE(@CURRENTAPPUSERID);
    set @APPUSER_IN_NOSECGROUPROLE = dbo.UFN_SECURITY_APPUSER_IN_NO_SECURITY_GROUP_ROLE(@CURRENTAPPUSERID);


    declare @DBOBJECTNAME nvarchar(128);
    declare @DBOBJECTTYPE smallint;

    if @REVENUETRANSACTIONQUERY is not null begin
        if not exists(select ID from dbo.IDSETREGISTER where ID = @REVENUETRANSACTIONQUERY) raiserror('ID set does not exist in the database.', 15, 1);
        select @DBOBJECTNAME = DBOBJECTNAME, @DBOBJECTTYPE = OBJECTTYPE from dbo.IDSETREGISTER where ID = @REVENUETRANSACTIONQUERY;
        if @DBOBJECTTYPE = 1 set @DBOBJECTNAME = @DBOBJECTNAME + '()';
        else if @DBOBJECTTYPE = 2 set @DBOBJECTNAME = @DBOBJECTNAME + '(''' + convert(nvarchar(36), @REVENUETRANSACTIONQUERY) + ''')';
    end

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

    create table #POTENTIALREVENUE
    (
        REVPARENTID uniqueidentifier,
        PAYMENTDATE datetime,
        REVENUEID uniqueidentifier,
        REVENUEAMOUNT money,
        REVENUETRANSACTIONAMOUNT money,
        TOTALREVENUESPLITORGANIZATIONAMOUNT money,
        TOTALREVENUESPLITTRANSACTIONAMOUNT money,
        TOTALREVENUESPLITAMOUNT money,
    TRANSACTIONCURRENCYID uniqueidentifier,
    BASECURRENCYID uniqueidentifier
    )

    declare @POPULATENOPAYMENTSPOTENTIALREVENUETABLESQL as nvarchar(max) = '
        insert into #POTENTIALREVENUE
        (
            REVPARENTID,
            PAYMENTDATE,
            REVENUEID,
            REVENUEAMOUNT,
            REVENUETRANSACTIONAMOUNT,
            TOTALREVENUESPLITORGANIZATIONAMOUNT,
            TOTALREVENUESPLITTRANSACTIONAMOUNT,
            TOTALREVENUESPLITAMOUNT,
    TRANSACTIONCURRENCYID,
    BASECURRENCYID
        )
        select
            REVPARENT.ID as REVPARENTID,
            null PAYMENTDATE,
            null REVENUEID,
            null as REVENUEAMOUNT,
            null as REVENUETRANSACTIONAMOUNT,
            null as TOTALREVENUESPLITORGANIZATIONAMOUNT,
            null as TOTALREVENUESPLITTRANSACTIONAMOUNT,
            null as TOTALREVENUESPLITAMOUNT,
            null as TRANSACTIONCURRENCYID,
            null as BASECURRENCYID
        from dbo.FINANCIALTRANSACTION REVPARENT ' +
        case when @REVENUETRANSACTIONQUERY is not null then 'inner join dbo.' + @DBOBJECTNAME + ' as SELECTION on REVPARENT.[ID] = SELECTION.[ID]' else '' end + 
        '
        left outer join RECURRINGGIFTACTIVITY RGA on RGA.SOURCEREVENUEID = REVPARENT.ID  
        left outer join INSTALLMENTPAYMENT IP on IP.PLEDGEID = REVPARENT.ID  
        left outer join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on   
        (  
            REVENUESPLIT.ID = coalesce(RGA.PAYMENTREVENUEID,IP.PAYMENTID)  
            and  
            ( -- Only rev splits within date range  

            exists(select   
                R.ID   
            from   
                dbo.FINANCIALTRANSACTIONLINEITEM as RS  
            inner join   
                dbo.FINANCIALTRANSACTION AS R on R.ID = RS.FINANCIALTRANSACTIONID  
            where  
                R.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15) and RS.DELETEDON is null and RS.TYPECODE != 1 and RS.ID = REVENUESPLIT.ID 
                '  + 
                case when @STARTDATEEARLIEST is not null then ' and cast(R.DATE as datetime) >= @STARTDATEEARLIEST ' else '' end +
                case when @ENDDATELATEST is not null then ' and cast(R.DATE as datetime) <= @ENDDATELATEST ' else '' end + 
                '
            )  
            )  
        )  
        left outer join dbo.FINANCIALTRANSACTION REVENUE with (nolock) on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID
        where REVPARENT.TYPECODE in (1, 2, 3, 6, 8,15) and REVPARENT.DELETEDON is null and REVENUE.ID is null ' +
        case when @STARTDATEEARLIEST is not null then ' and (cast(REVPARENT.DATE as datetime) >= @STARTDATEEARLIEST) ' else '' end +
        case when @ENDDATELATEST is not null then ' and (cast(REVPARENT.DATE as datetime) <= @ENDDATELATEST) ' else '' end +
        case when @CONSTITUENTID is not null then ' and (REVPARENT.CONSTITUENTID = @CONSTITUENTID) ' else '' end;

    exec sp_executesql @POPULATENOPAYMENTSPOTENTIALREVENUETABLESQL, N'@STARTDATEEARLIEST datetime, @ENDDATELATEST datetime, @CONSTITUENTID uniqueidentifier',
        @STARTDATEEARLIEST=@STARTDATEEARLIEST,@ENDDATELATEST=@ENDDATELATEST,@CONSTITUENTID=@CONSTITUENTID;

    declare @POPULATERECURRINGGIFTPAYMENTSPOTENTIALREVENUETABLESQL as nvarchar(max) = '
        insert into #POTENTIALREVENUE
        (
            REVPARENTID,
            PAYMENTDATE,
            REVENUEID,
            REVENUEAMOUNT,
            REVENUETRANSACTIONAMOUNT,
            TOTALREVENUESPLITORGANIZATIONAMOUNT,
            TOTALREVENUESPLITTRANSACTIONAMOUNT,
            TOTALREVENUESPLITAMOUNT,
            TRANSACTIONCURRENCYID,
            BASECURRENCYID
        )
        select
            REVPARENT.ID as REVPARENTID,
            cast(REVENUE.DATE as datetime) PAYMENTDATE,
            REVENUE.ID as REVENUEID,
            REVENUE.BASEAMOUNT as REVENUEAMOUNT,
            REVENUE.TRANSACTIONAMOUNT as REVENUETRANSACTIONAMOUNT,
            Sum(REVENUESPLIT.ORGAMOUNT) as TOTALREVENUESPLITORGANIZATIONAMOUNT,
            Sum(REVENUESPLIT.TRANSACTIONAMOUNT) as TOTALREVENUESPLITTRANSACTIONAMOUNT,
            Sum(REVENUESPLIT.BASEAMOUNT) as TOTALREVENUESPLITAMOUNT,
            REVENUE.TRANSACTIONCURRENCYID,
            REVENUE_EXT.NONPOSTABLEBASECURRENCYID
        from dbo.FINANCIALTRANSACTION REVENUE
        inner join dbo.REVENUE_EXT on REVENUE.ID = REVENUE_EXT.ID
        inner join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID
        inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID
        inner join RECURRINGGIFTACTIVITY RGA on RGA.PAYMENTREVENUEID = REVENUESPLIT.ID
        inner join FINANCIALTRANSACTION as REVPARENT with (nolock) on REVPARENT.ID = RGA.SOURCEREVENUEID ' +
        case when @REVENUETRANSACTIONQUERY is not null then 'inner join dbo.' + @DBOBJECTNAME + ' as SELECTION on REVPARENT.[ID] = SELECTION.[ID]' else '' end + 
        '
        where REVPARENT.TYPECODE in (1, 2, 3, 6, 8, 15) and REVENUE.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15) and REVENUESPLIT.DELETEDON is null and REVPARENT.DELETEDON is null 
            and not (REVENUESPLIT_EXT.TYPECODE = 2 and REVENUESPLIT_EXT.APPLICATIONCODE = 3) ' +
        case when @STARTDATEEARLIEST is not null then ' and (cast(REVENUE.DATE as datetime) >= @STARTDATEEARLIEST) ' else '' end +
        case when @ENDDATELATEST is not null then ' and (cast(REVENUE.DATE as datetime) <= @ENDDATELATEST) ' else '' end +
        case when @CONSTITUENTID is not null then ' and (REVENUE.CONSTITUENTID = @CONSTITUENTID or REVPARENT.CONSTITUENTID = @CONSTITUENTID) ' else '' end + 
        'group by REVENUE.ID, REVPARENT.ID, REVENUE.BASEAMOUNT, REVENUE.TRANSACTIONAMOUNT, REVENUE.DATE, REVENUE.TRANSACTIONCURRENCYID, REVENUE_EXT.NONPOSTABLEBASECURRENCYID';

    exec sp_executesql @POPULATERECURRINGGIFTPAYMENTSPOTENTIALREVENUETABLESQL, N'@STARTDATEEARLIEST datetime, @ENDDATELATEST datetime, @CONSTITUENTID uniqueidentifier',
        @STARTDATEEARLIEST=@STARTDATEEARLIEST,@ENDDATELATEST=@ENDDATELATEST,@CONSTITUENTID=@CONSTITUENTID;

    declare @POPULATEPLEDGEPAYMENTSPOTENTIALREVENUETABLESQL as nvarchar(max) = '
        insert into #POTENTIALREVENUE
        (
            REVPARENTID,
            PAYMENTDATE,
            REVENUEID,
            REVENUEAMOUNT,
            REVENUETRANSACTIONAMOUNT,
            TOTALREVENUESPLITORGANIZATIONAMOUNT,
            TOTALREVENUESPLITTRANSACTIONAMOUNT,
            TOTALREVENUESPLITAMOUNT,
            TRANSACTIONCURRENCYID,
            BASECURRENCYID
        )
        select
            REVPARENT.ID as REVPARENTID,
            cast(REVENUE.DATE as datetime) PAYMENTDATE,
            REVENUE.ID as REVENUEID,
            REVENUE.BASEAMOUNT as REVENUEAMOUNT,
            REVENUE.TRANSACTIONAMOUNT as REVENUETRANSACTIONAMOUNT,
            Sum(REVENUESPLIT.ORGAMOUNT) as TOTALREVENUESPLITORGANIZATIONAMOUNT,
            Sum(REVENUESPLIT.TRANSACTIONAMOUNT) as TOTALREVENUESPLITTRANSACTIONAMOUNT,
            Sum(REVENUESPLIT.BASEAMOUNT) as TOTALREVENUESPLITAMOUNT,
            REVENUE.TRANSACTIONCURRENCYID,
            V.BASECURRENCYID
        from dbo.FINANCIALTRANSACTION REVENUE
        inner join dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand) on REVENUE.ID = V.FINANCIALTRANSACTIONID
        inner join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID
        inner join (select
            INSTALLMENTPAYMENT.PAYMENTID,
            INSTALLMENTPAYMENT.PLEDGEID,
            ROW_NUMBER() over (partition by INSTALLMENTPAYMENT.PAYMENTID order by INSTALLMENTPAYMENT.PAYMENTID) NUM
            from dbo.INSTALLMENTPAYMENT) IP on IP.PAYMENTID = REVENUESPLIT.ID AND IP.NUM = 1  
        inner join FINANCIALTRANSACTION as REVPARENT with (nolock) on REVPARENT.ID = IP.PLEDGEID ' +
        case when @REVENUETRANSACTIONQUERY is not null then 'inner join dbo.' + @DBOBJECTNAME + ' as SELECTION on REVPARENT.[ID] = SELECTION.[ID]' else '' end + 
        '
        where REVPARENT.TYPECODE in (1, 2, 3, 6, 8, 15) and REVENUE.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15) and REVENUESPLIT.DELETEDON is null and REVPARENT.DELETEDON is null ' +
        case when @STARTDATEEARLIEST is not null then ' and (cast(REVENUE.DATE as datetime) >= @STARTDATEEARLIEST) ' else '' end +
        case when @ENDDATELATEST is not null then ' and (cast(REVENUE.DATE as datetime) <= @ENDDATELATEST) ' else '' end +
        case when @CONSTITUENTID is not null then ' and (REVENUE.CONSTITUENTID = @CONSTITUENTID or REVPARENT.CONSTITUENTID = @CONSTITUENTID) ' else '' end + 
        'group by REVENUE.ID, REVPARENT.ID, REVENUE.BASEAMOUNT, REVENUE.TRANSACTIONAMOUNT, REVENUE.DATE, REVENUE.TRANSACTIONCURRENCYID, V.BASECURRENCYID';

    exec sp_executesql @POPULATEPLEDGEPAYMENTSPOTENTIALREVENUETABLESQL, N'@STARTDATEEARLIEST datetime, @ENDDATELATEST datetime, @CONSTITUENTID uniqueidentifier',
        @STARTDATEEARLIEST=@STARTDATEEARLIEST,@ENDDATELATEST=@ENDDATELATEST,@CONSTITUENTID=@CONSTITUENTID;


    declare @ORGANIZATIONCURRENCYID as uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
    declare @ORIGINCODE tinyint;
    select @ORIGINCODE = coalesce(ORGANIZATIONAMOUNTORIGINCODE, 0) from dbo.MULTICURRENCYCONFIGURATION;

    declare @CURRENCYID uniqueidentifier;
    declare @DECIMALDIGITS tinyint;
    declare @ROUNDINGTYPECODE tinyint;
    declare @CURRENCYPROPERTIESOUTERAPPLY nvarchar(255);
    declare @PARENTCURRENCYPROPERTIESOUTERAPPLY nvarchar(255);
    declare @PARENTCURRENCYPROPERTIESOUTERAPPLY1 nvarchar(255);
    if @CURRENCYCODE = 0 -- Base

        select 
            @CURRENCYPROPERTIESOUTERAPPLY = 'outer apply dbo.UFN_CURRENCY_GETPROPERTIES(POTENTIALREVENUE.BASECURRENCYID) CURRENCYPROPERTIES ',
            @PARENTCURRENCYPROPERTIESOUTERAPPLY = 'outer apply dbo.UFN_CURRENCY_GETPROPERTIES(coalesce(REVENUE_EXT.NONPOSTABLEBASECURRENCYID, REVPARENT.BASECURRENCYID)) PARENTCURRENCYPROPERTIES ',
            @PARENTCURRENCYPROPERTIESOUTERAPPLY1 = 'outer apply dbo.UFN_CURRENCY_GETPROPERTIES(coalesce(REVENUE_EXT.NONPOSTABLEBASECURRENCYID, V.BASECURRENCYID)) PARENTCURRENCYPROPERTIES ';
    else if @CURRENCYCODE = 2 -- Transaction

        select
            @CURRENCYPROPERTIESOUTERAPPLY = 'outer apply dbo.UFN_CURRENCY_GETPROPERTIES(coalesce(POTENTIALREVENUE.TRANSACTIONCURRENCYID, POTENTIALREVENUE.BASECURRENCYID)) CURRENCYPROPERTIES ',
            @PARENTCURRENCYPROPERTIESOUTERAPPLY = 'outer apply dbo.UFN_CURRENCY_GETPROPERTIES(coalesce(REVPARENT.TRANSACTIONCURRENCYID, REVPARENT.BASECURRENCYID)) PARENTCURRENCYPROPERTIES ',
            @PARENTCURRENCYPROPERTIESOUTERAPPLY1 = 'outer apply dbo.UFN_CURRENCY_GETPROPERTIES(coalesce(REVPARENT.TRANSACTIONCURRENCYID, V.BASECURRENCYID)) PARENTCURRENCYPROPERTIES ';
    else -- Organization

    begin
        select 
            @CURRENCYPROPERTIESOUTERAPPLY = 'outer apply dbo.UFN_CURRENCY_GETPROPERTIES(' + case when @ORGANIZATIONCURRENCYID is null then 'POTENTIALREVENUE.BASECURRENCYID' else '@ORGANIZATIONCURRENCYID' end  + ') CURRENCYPROPERTIES ',
            @PARENTCURRENCYPROPERTIESOUTERAPPLY = 'outer apply dbo.UFN_CURRENCY_GETPROPERTIES(' + case when @ORGANIZATIONCURRENCYID is null then 'REVPARENT.BASECURRENCYID' else '@ORGANIZATIONCURRENCYID' end  + ') PARENTCURRENCYPROPERTIES ',
            @PARENTCURRENCYPROPERTIESOUTERAPPLY1 = 'outer apply dbo.UFN_CURRENCY_GETPROPERTIES(' + case when @ORGANIZATIONCURRENCYID is null then 'V.BASECURRENCYID' else '@ORGANIZATIONCURRENCYID' end  + ') PARENTCURRENCYPROPERTIES ';
        select
            @CURRENCYID = CURRENCY.ID,
            @DECIMALDIGITS = CURRENCY.DECIMALDIGITS,
            @ROUNDINGTYPECODE = CURRENCY.ROUNDINGTYPECODE
        from dbo.CURRENCY where CURRENCY.ID = @ORGANIZATIONCURRENCYID;
    end

    --select 'USP_REPORT_ACTIVITY - #PotentialRevenue' as QUERYNAME, * from #PotentialRevenue


    -- KevinHi - WI209626: I am removing the use of start date from all calls to the TVF UFN_PLEDGE_GETREVALUEDBALANCEINCURRENCY_BULK3

    --  This is because having a date range on a Balance calculation is excluding transactions for this report whose creation date is outside

    --  of the date range


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

    create table #REVPARENT
    (
        ID uniqueidentifier,
        BALANCEINCURRENCY money,
        TRANSACTIONBALANCE money,
        CURRENCYID uniqueidentifier,
        TRANSACTIONCURRENCYID uniqueidentifier,
        BASECURRENCYID uniqueidentifier,
        DATE datetime,
        TRANSACTIONTYPECODE int,
        TRANSACTIONTYPE nvarchar(100) collate database_default,
        APPEALID uniqueidentifier,
        CONSTITUENTID uniqueidentifier,
        AMOUNT money,
        TRANSACTIONAMOUNT money,
        ORGANIZATIONAMOUNT money,
        AMOUNTINCURRENCY money,
        INTERMEDIATEBALANCE money
    );

    declare @POPULATEREVPARENTTABLESQL as nvarchar(max) = '
        insert into #REVPARENT
        (
            ID,
            BALANCEINCURRENCY,
            TRANSACTIONBALANCE,
            CURRENCYID,
            TRANSACTIONCURRENCYID,
            BASECURRENCYID,
            DATE,
            TRANSACTIONTYPECODE,
            TRANSACTIONTYPE,
            APPEALID,
            CONSTITUENTID,
            AMOUNT,
            TRANSACTIONAMOUNT,
            ORGANIZATIONAMOUNT,
            AMOUNTINCURRENCY,
            INTERMEDIATEBALANCE
        )
        select 
            REVPARENT.ID,
            REVPARENT.BALANCEINCURRENCY,
            REVPARENT.TRANSACTIONBALANCE,
            REVPARENT.CURRENCYID,
            REVPARENT.TRANSACTIONCURRENCYID,
            REVPARENT.BASECURRENCYID,
            REVPARENT.DATE,
            REVPARENT.TRANSACTIONTYPECODE,
            REVPARENT.TRANSACTIONTYPE,
            REVPARENT.APPEALID,
            REVPARENT.CONSTITUENTID,
            REVPARENT.AMOUNT,
            REVPARENT.TRANSACTIONAMOUNT,
            REVPARENT.ORGANIZATIONAMOUNT,
            REVPARENT.AMOUNTINCURRENCY,
            REVPARENT.INTERMEDIATEBALANCE
        from
        #PotentialRevenue POTENTIALREVENUE
        outer apply
        dbo.UFN_PLEDGE_GETREVALUEDBALANCEINCURRENCY_BULK3
        (
            @CURRENCYID,
            @ORGANIZATIONCURRENCYID,
            @DECIMALDIGITS,
            @ROUNDINGTYPECODE,
            null,
            @ENDDATE,
            @ORIGINCODE,
            @CURRENCYCODE,
            POTENTIALREVENUE.REVPARENTID
        ) as REVPARENT
        group by REVPARENT.ID,
            REVPARENT.BALANCEINCURRENCY,
            REVPARENT.TRANSACTIONBALANCE,
            REVPARENT.CURRENCYID,
            REVPARENT.TRANSACTIONCURRENCYID,
            REVPARENT.BASECURRENCYID,
            REVPARENT.DATE,
            REVPARENT.TRANSACTIONTYPECODE,
            REVPARENT.TRANSACTIONTYPE,
            REVPARENT.APPEALID,
            REVPARENT.CONSTITUENTID,
            REVPARENT.AMOUNT,
            REVPARENT.TRANSACTIONAMOUNT,
            REVPARENT.ORGANIZATIONAMOUNT,
            REVPARENT.AMOUNTINCURRENCY,
            REVPARENT.INTERMEDIATEBALANCE '

    exec sp_executesql @POPULATEREVPARENTTABLESQL, N'@CURRENCYID uniqueidentifier, @ORGANIZATIONCURRENCYID uniqueidentifier, @DECIMALDIGITS tinyint, @ROUNDINGTYPECODE tinyint, @ENDDATE datetime, @ORIGINCODE tinyint, @CURRENCYCODE tinyint',
        @CURRENCYID=@CURRENCYID, @ORGANIZATIONCURRENCYID=@ORGANIZATIONCURRENCYID, @DECIMALDIGITS=@DECIMALDIGITS, @ROUNDINGTYPECODE=@ROUNDINGTYPECODE, @ENDDATE=@ENDDATE, @ORIGINCODE=@ORIGINCODE, @CURRENCYCODE=@CURRENCYCODE;

    declare @SQLTOEXEC nvarchar(max);
    set @SQLTOEXEC = 
        'select     ''http://www.blackbaud.com/CONSTITUENTID?CONSTITUENTID='' + CONVERT(nvarchar(36),CONSTITUENT.ID) as CONSTITUENTID,
                     CONSTITUENT.KEYNAME,
                     CONSTITUENT_NF.NAME,
                    REVPARENT.ID PARENTID,
                    cast(REVPARENT.DATE as datetime) PARENTDATE,
                    REVPARENT.TRANSACTIONTYPE PARENTTRANSACTIONTYPE,
                    REVPARENT.TRANSACTIONTYPECODE PARENTTRANSACTIONTYPECODE,
                    REVPARENT.%CURRENCYAMOUNT% PARENTAMOUNT,
                    dbo.UDA_BUILDLIST(distinct DESIGNATION.NAME) DESIGNATIONLIST,
                    POTENTIALREVENUE.PAYMENTDATE,
                    POTENTIALREVENUE.TOTALREVENUESPLIT%CURRENCYAMOUNT% PAYMENTAMOUNT,
                    case when REVPARENT.TRANSACTIONTYPECODE in (1, 3, 6, 8, 15)
                        then REVPARENT.BALANCEINCURRENCY
                        else 0.00 end PLEDGEBALANCE,
                    case when REVPARENT.TRANSACTIONTYPECODE = 2
                        then dbo.UFN_RECURRINGGIFT_GETBALANCEASOFINCURRENCY(REVPARENT.ID, @ENDDATE, ' + case @CURRENCYCODE when 0 then 'REVPARENT.BASECURRENCYID' when 2 then 'REVPARENT.TRANSACTIONCURRENCYID' else '@ORGANIZATIONCURRENCYID' end + ')
                        else 0.00 end RECURRINGBALANCE,
                    cast(case when POTENTIALREVENUE.REVENUEID is not null then ''Payment'' else null end as nvarchar(10)) TRANSACTIONTYPE,
                    PARENTCURRENCYPROPERTIES.ISO4217 PARENTISOCURRENCYCODE, 
                    PARENTCURRENCYPROPERTIES.CURRENCYSYMBOL PARENTCURRENCYSYMBOL, 
                    PARENTCURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE PARENTSYMBOLDISPLAYSETTINGCODE, 
                    PARENTCURRENCYPROPERTIES.DECIMALDIGITS PARENTDECIMALDIGITS,
                    CURRENCYPROPERTIES.ISO4217 ISOCURRENCYCODE, 
                    CURRENCYPROPERTIES.CURRENCYSYMBOL, 
                    CURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE, 
                    CURRENCYPROPERTIES.DECIMALDIGITS 
            from #PotentialRevenue POTENTIALREVENUE
            inner join #REVPARENT REVPARENT on POTENTIALREVENUE.REVPARENTID = REVPARENT.ID 
            inner join CONSTITUENT with (nolock) on CONSTITUENT.ID = REVPARENT.CONSTITUENTID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.FINANCIALTRANSACTIONID = REVPARENT.ID and LI.DELETEDON is null and LI.TYPECODE != 1
            inner join REVENUESPLIT_EXT REVPARENTSPLIT on LI.ID = REVPARENTSPLIT.ID
            left join DESIGNATION on REVPARENTSPLIT.DESIGNATIONID = DESIGNATION.ID ' + nchar(13);

    if @CURRENCYCODE = 0 --base

    begin
        set @SQLTOEXEC = @SQLTOEXEC +
'            inner join REVENUE_EXT on REVENUE_EXT.ID = POTENTIALREVENUE.REVPARENTID ' + nchar(13);
    end

    set @SQLTOEXEC = @SQLTOEXEC + 
'            outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(CONSTITUENT.ID) CONSTITUENT_NF '
            + @CURRENCYPROPERTIESOUTERAPPLY + @PARENTCURRENCYPROPERTIESOUTERAPPLY + nchar(13);


    set @SQLTOEXEC = @SQLTOEXEC + 
        'where (@ISADMIN = 1 or (
                    (
                        @APPUSER_IN_NONRACROLE = 1 or
                        dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, CONSTITUENT.ID, @APPUSER_IN_NOSECGROUPROLE) = 1
                    )
                    and exists (
                        -- Check site security

                        select HASPERMISSION
                        from dbo.UFN_SITEID_MAPFROM_REVENUEID(REVPARENT.ID) REVSITES
                        cross apply dbo.UFN_REPORT_HASUSERSITEPERMISSION(@CURRENTAPPUSERID, ''C99B9784-809E-489E-B46D-715543ECA82F'', REVSITES.SITEID)
                    )
                )
            )
            and (not (REVPARENT.AMOUNT = 0 and REVPARENT.TRANSACTIONAMOUNT > 0))
            and (POTENTIALREVENUE.REVENUEID is null or (not (POTENTIALREVENUE.REVENUEAMOUNT = 0 and POTENTIALREVENUE.REVENUETRANSACTIONAMOUNT > 0)))
        group by CONSTITUENT.ID, POTENTIALREVENUE.REVENUEID, REVPARENT.ID, CONSTITUENT.KEYNAME,    CONSTITUENT_NF.NAME, cast(REVPARENT.DATE as datetime),
                REVPARENT.TRANSACTIONTYPE, REVPARENT.%CURRENCYAMOUNT%, POTENTIALREVENUE.PAYMENTDATE, POTENTIALREVENUE.TOTALREVENUESPLIT%CURRENCYAMOUNT%, REVPARENT.TRANSACTIONTYPECODE,
                REVPARENT.BASECURRENCYID, REVPARENT.TRANSACTIONCURRENCYID, 
                CURRENCYPROPERTIES.ISO4217, CURRENCYPROPERTIES.CURRENCYSYMBOL, CURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE, CURRENCYPROPERTIES.DECIMALDIGITS,
                PARENTCURRENCYPROPERTIES.ISO4217, PARENTCURRENCYPROPERTIES.CURRENCYSYMBOL, PARENTCURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE, PARENTCURRENCYPROPERTIES.DECIMALDIGITS, REVPARENT.BALANCEINCURRENCY' + nchar(13);

    /* union writeoffs */
    set @SQLTOEXEC = @SQLTOEXEC + 
        'union all 
        select     ''http://www.blackbaud.com/CONSTITUENTID?CONSTITUENTID='' + CONVERT(nvarchar(36),CONSTITUENT.ID) as CONSTITUENTID,
                     CONSTITUENT.KEYNAME,
                     CONSTITUENT_NF.NAME,
                    REVPARENT.ID PARENTID,
                    cast(REVPARENT.DATE as datetime) PARENTDATE,
                    REVPARENT.TYPE PARENTTRANSACTIONTYPE,
                    REVPARENT.TYPECODE PARENTTRANSACTIONTYPECODE,
                    REVPARENT.%CURRENCYAMOUNT1% PARENTAMOUNT,
                    dbo.UDA_BUILDLIST(distinct DESIGNATION.NAME) DESIGNATIONLIST,
                    cast(WRITEOFF.DATE as datetime) PAYMENTDATE,
                    (select sum(INSTALLMENTSPLITWRITEOFF.%CURRENCYAMOUNT%) from dbo.INSTALLMENTSPLITWRITEOFF 
                        inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID 
                        where INSTALLMENTSPLITWRITEOFF.WRITEOFFID = WRITEOFF.ID
                            and (not (INSTALLMENTSPLITWRITEOFF.AMOUNT = 0 and INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT > 0))
                    ) PAYMENTAMOUNT,
                    (
                        select BALANCEINCURRENCY
                        from
                        dbo.UFN_PLEDGE_GETREVALUEDBALANCEINCURRENCY_BULK3
                        (
                            @CURRENCYID,
                            @ORGANIZATIONCURRENCYID,
                            @DECIMALDIGITS,
                            @ROUNDINGTYPECODE,
                            null,
                            @ENDDATE,
                            @ORIGINCODE,
                            @CURRENCYCODE,
                            REVPARENT.ID
                        ) as REVENUEBALANCE
                    ) as PLEDGEBALANCE,
                    0.00 RECURRINGBALANCE,
                    ''Write-off'' TRANSACTIONTYPE,
                    PARENTCURRENCYPROPERTIES.ISO4217 PARENTISOCURRENCYCODE, 
                    PARENTCURRENCYPROPERTIES.CURRENCYSYMBOL PARENTCURRENCYSYMBOL, 
                    PARENTCURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE PARENTSYMBOLDISPLAYSETTINGCODE, 
                    PARENTCURRENCYPROPERTIES.DECIMALDIGITS PARENTDECIMALDIGITS,
                    PARENTCURRENCYPROPERTIES.ISO4217 ISOCURRENCYCODE, 
                    PARENTCURRENCYPROPERTIES.CURRENCYSYMBOL, 
                    PARENTCURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE, 
                    PARENTCURRENCYPROPERTIES.DECIMALDIGITS 
            from dbo.FINANCIALTRANSACTION as REVPARENT
            inner join dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand) on REVPARENT.ID = V.FINANCIALTRANSACTIONID
            inner join CONSTITUENT with (nolock) on CONSTITUENT.ID = REVPARENT.CONSTITUENTID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.FINANCIALTRANSACTIONID = REVPARENT.ID and LI.DELETEDON is null and LI.TYPECODE != 1
            inner join REVENUESPLIT_EXT REVPARENTSPLIT on LI.ID = REVPARENTSPLIT.ID
            inner join DESIGNATION on REVPARENTSPLIT.DESIGNATIONID = DESIGNATION.ID
            inner join INSTALLMENT on INSTALLMENT.REVENUEID = REVPARENT.ID
            inner join INSTALLMENTWRITEOFF on INSTALLMENTWRITEOFF.INSTALLMENTID = INSTALLMENT.ID
            inner join dbo.FINANCIALTRANSACTION WRITEOFF on INSTALLMENTWRITEOFF.WRITEOFFID = WRITEOFF.ID and WRITEOFF.TYPECODE = 20 and WRITEOFF.DELETEDON is null
            outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(CONSTITUENT.ID) CONSTITUENT_NF ' + nchar(13);

    if @CURRENCYCODE = 0 --base

    begin
        set @SQLTOEXEC = @SQLTOEXEC +
            'inner join REVENUE_EXT on REVENUE_EXT.ID = REVPARENT.ID ' + nchar(13);
    end

    set @SQLTOEXEC = @SQLTOEXEC + @PARENTCURRENCYPROPERTIESOUTERAPPLY1 + nchar(13);

    if @REVENUETRANSACTIONQUERY is not null
        set @SQLTOEXEC = @SQLTOEXEC + 'inner join dbo.' + @DBOBJECTNAME + ' as SELECTION on REVPARENT.[ID] = SELECTION.[ID]' + nchar(13);

    set @SQLTOEXEC = @SQLTOEXEC + 
        'where REVPARENT.TYPECODE in (1, 2, 3, 6, 8, 15) and LI.DELETEDON is null ' +
            case when @STARTDATEEARLIEST is not null then ' and (cast(WRITEOFF.DATE as datetime) >= @STARTDATEEARLIEST) ' else '' end +
            case when @ENDDATELATEST is not null then ' and (cast(WRITEOFF.DATE as datetime) <= @ENDDATELATEST) ' else '' end +
            case when @CONSTITUENTID is not null then ' and (CONSTITUENT.ID = @CONSTITUENTID) ' else '' end +
            '
            and (@ISADMIN = 1 or (
                    (
                        @APPUSER_IN_NONRACROLE = 1 or
                        dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, CONSTITUENT.ID, @APPUSER_IN_NOSECGROUPROLE) = 1
                    ) 
                    and exists (
                        select HASPERMISSION
                        from dbo.UFN_SITEID_MAPFROM_REVENUEID(REVPARENT.ID) REVSITES
                        cross apply dbo.UFN_REPORT_HASUSERSITEPERMISSION(@CURRENTAPPUSERID, ''C99B9784-809E-489E-B46D-715543ECA82F'', REVSITES.SITEID)
                    )
                )
            )
            and (not (REVPARENT.BASEAMOUNT = 0 and REVPARENT.TRANSACTIONAMOUNT > 0))
        group by CONSTITUENT.ID, REVPARENT.ID, CONSTITUENT.KEYNAME,    CONSTITUENT_NF.NAME, cast(REVPARENT.DATE as datetime),
                REVPARENT.TYPE, REVPARENT.%CURRENCYAMOUNT1%, cast(WRITEOFF.DATE as datetime), WRITEOFF.ID, REVPARENT.TYPECODE,
                V.BASECURRENCYID, REVPARENT.TRANSACTIONCURRENCYID, 
                PARENTCURRENCYPROPERTIES.ISO4217, PARENTCURRENCYPROPERTIES.CURRENCYSYMBOL, PARENTCURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE, PARENTCURRENCYPROPERTIES.DECIMALDIGITS' + nchar(13);

    if @CURRENCYCODE = 1
    begin
        set @SQLTOEXEC = replace(@SQLTOEXEC, '%CURRENCYAMOUNT%', 'ORGANIZATIONAMOUNT');
        set @SQLTOEXEC = replace(@SQLTOEXEC, '%CURRENCYAMOUNT1%', 'ORGAMOUNT');
    end
    else if @CURRENCYCODE = 2
    begin
        set @SQLTOEXEC = replace(@SQLTOEXEC, '%CURRENCYAMOUNT%', 'TRANSACTIONAMOUNT');
        set @SQLTOEXEC = replace(@SQLTOEXEC, '%CURRENCYAMOUNT1%', 'TRANSACTIONAMOUNT');
    end
    else
    begin
        set @SQLTOEXEC = replace(@SQLTOEXEC, '%CURRENCYAMOUNT%', 'AMOUNT');
        set @SQLTOEXEC = replace(@SQLTOEXEC, '%CURRENCYAMOUNT1%', 'BASEAMOUNT');
    end

    set @SQLTOEXEC = @SQLTOEXEC + 
        'order by 
            CONSTITUENT.KEYNAME, PAYMENTDATE'

    exec sp_executesql @SQLTOEXEC
        N'@STARTDATE datetime, @ENDDATE datetime, @CONSTITUENTID uniqueidentifier, @ISADMIN bit, @APPUSER_IN_NONRACROLE bit, @APPUSER_IN_NOSECGROUPROLE bit, @CURRENTAPPUSERID uniqueidentifier, @CURRENCYPROPERTIESOUTERAPPLY nvarchar(255), @ORGANIZATIONCURRENCYID as uniqueidentifier, @ORIGINCODE tinyint, @CURRENCYCODE tinyint, @CURRENCYID uniqueidentifier, @DECIMALDIGITS tinyint, @ROUNDINGTYPECODE tinyint, @STARTDATEEARLIEST datetime, @ENDDATELATEST datetime',
        @STARTDATE=@STARTDATE, @ENDDATE=@ENDDATE, @CONSTITUENTID=@CONSTITUENTID, @ISADMIN=@ISADMIN, @APPUSER_IN_NONRACROLE=@APPUSER_IN_NONRACROLE, @APPUSER_IN_NOSECGROUPROLE=@APPUSER_IN_NOSECGROUPROLE, @CURRENTAPPUSERID=@CURRENTAPPUSERID, @CURRENCYPROPERTIESOUTERAPPLY=@CURRENCYPROPERTIESOUTERAPPLY,
        @ORGANIZATIONCURRENCYID=@ORGANIZATIONCURRENCYID, @ORIGINCODE=@ORIGINCODE, @CURRENCYCODE=@CURRENCYCODE, @CURRENCYID=@CURRENCYID, @DECIMALDIGITS=@DECIMALDIGITS, @ROUNDINGTYPECODE=@ROUNDINGTYPECODE, @STARTDATEEARLIEST=@STARTDATEEARLIEST, @ENDDATELATEST=@ENDDATELATEST;