USP_REPORT_DESIGNATIONHIERARCHYSUMMARY

Returns the data necessary for the Designation Hierarchy Summary report.

Parameters

Parameter Parameter Type Mode Description
@DESIGNATIONLEVELID uniqueidentifier IN
@GOALID uniqueidentifier IN
@GROUPBY tinyint IN
@CURRENCYCODE tinyint IN

Definition

Copy


            CREATE procedure dbo.USP_REPORT_DESIGNATIONHIERARCHYSUMMARY
                (
                    @DESIGNATIONLEVELID uniqueidentifier = null,
                    @GOALID uniqueidentifier = null,
                    @GROUPBY tinyint = 0, -- 2 by year, else by quarter

                    @CURRENCYCODE tinyint = 0 -- 0 base, else organization

                )
            as
                declare @SQLTOEXEC nvarchar(max);

                declare
                    @STARTDATE datetime,
                    @ENDDATE datetime;

                select
                    @STARTDATE = dbo.UFN_DATE_GETEARLIESTTIME(coalesce(STARTDATE,convert(datetime, '17530101'))),
                    @ENDDATE = dbo.UFN_DATE_GETLATESTTIME(coalesce(ENDDATE,convert(datetime, '99991230')))
                from dbo.DESIGNATIONLEVELGOAL
                where ID = @GOALID;

                declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

                set @SQLTOEXEC =
                    N'
                        with DESIGNATION_CTE as (
                        -- Find the designations we are interested in

                        select
                            DESIGNATION.ID,
                            DESIGNATION.DESIGNATIONLEVEL1ID,
                            DESIGNATION.DESIGNATIONLEVEL2ID,
                            DESIGNATIONLEVELTYPE.DESCRIPTION LEVEL1TYPE,
                            DESIGNATIONLEVELGOAL.GOAL as DESIGNATIONLEVELGOALGOAL,
                            CURRENCY.ID as CURRENCYID,
                            CURRENCY.ISO4217 as CURRENCYISO,
                            CURRENCY.DECIMALDIGITS as CURRENCYDECIMALDIGITS,
                            CURRENCY.CURRENCYSYMBOL as CURRENCYSYMBOL,
                            CURRENCY.SYMBOLDISPLAYSETTINGCODE as CURRENCYSYMBOLDISPLAYSETTINGCODE,
                            CURRENCY.ROUNDINGTYPECODE as CURRENCYROUNDINGTYPECODE
                        from 
                            dbo.DESIGNATION 
                            inner join dbo.DESIGNATIONLEVEL on DESIGNATION.DESIGNATIONLEVEL1ID = DESIGNATIONLEVEL.ID
                            inner join dbo.DESIGNATIONLEVELTYPE on DESIGNATIONLEVEL.DESIGNATIONLEVELTYPEID = DESIGNATIONLEVELTYPE.ID
                            inner join dbo.DESIGNATIONLEVELGOAL on DESIGNATIONLEVEL.ID = DESIGNATIONLEVELGOAL.DESIGNATIONLEVELID
                        ' + case when @CURRENCYCODE = 0
                            then N' outer apply dbo.UFN_CURRENCY_GETPROPERTIES(DESIGNATION.BASECURRENCYID) CURRENCY '
                            else N' cross join dbo.CURRENCY '
                        end + N'
                        where DESIGNATIONLEVELGOAL.ID = @GOALID
                            and DESIGNATION.DESIGNATIONLEVEL1ID = @DESIGNATIONLEVELID
                            and DESIGNATION.DESIGNATIONLEVEL3ID is null
                            ' + case when @CURRENCYCODE = 0
                                then N' '
                                else N' and CURRENCY.ID = @ORGANIZATIONCURRENCYID '
                            end + N'
                    )
                    , REVENUESPLIT_CTE as (
                        -- Populate a zerod record for each designation in each time period, to allow the sums later to return some value over all time periods of interest

                        select
                            DESIGNATIONLEVELQUARTERLYGOAL.YEARNAME as YEAR,
                            ' + case when @GROUPBY = 2
                                then N' 0 as QUARTER, '
                                else N' DESIGNATIONLEVELQUARTERLYGOAL.QUARTER as QUARTER, '
                            end + N'
                            DESIGNATION_CTE.ID as DESIGNATIONID,
                            0 as AMOUNTINCURRENCY,
                            0 as CATAGORY
                        from
                            DESIGNATION_CTE
                            inner join dbo.UFN_DESIGNATIONLEVELGOAL_GETQUARTERLYGOALS(@GOALID) as DESIGNATIONLEVELQUARTERLYGOAL on DESIGNATION_CTE.DESIGNATIONLEVEL1ID = DESIGNATIONLEVELQUARTERLYGOAL.DESIGNATIONLEVELID

                        union all
                        -- Find all revenue for child designations of each designation in the specified time period

                        select
                            datepart(year,
                            ' + case when @CURRENCYCODE = 0
                                then N'REVENUESPLIT'
                                else N'REVENUE'
                            end + N'
                                .DATE) as YEAR,
                            ' + case when @GROUPBY = 2
                                then N' 0 as QUARTER, '
                                else N' datepart(qq,
                                ' + case when @CURRENCYCODE = 0
                                    then N'REVENUESPLIT'
                                    else N'REVENUE'
                                end + N'
                                    .DATE) as QUARTER, '
                            end + N'
                            DESIGNATION_CTE.ID as DESIGNATIONID,
                            ' + case when @CURRENCYCODE = 0
                                then N' REVENUESPLIT.AMOUNTINCURRENCY - isnull(REFUNDSPLIT.REFUNDTOTAL, 0), '
                                else N' LI.ORGAMOUNT - isnull(REFUNDSPLIT.REFUNDTOTAL, 0) as ORGANIZATIONAMOUNT, '
                            end + N'
                            case
                                when
                                    ' + case when @CURRENCYCODE = 0
                                        then N' REVENUESPLIT.TRANSACTIONTYPECODE'
                                        else N' REVENUE.TYPECODE'
                                        /*    
                                            In the case of a sales order, use the order split applied to the gift to aid incorporating refunds.
                                            Filter out any payments with application type 'Order' so as not to double count sales order splits. 
                                        */    
                                    end + N' in (0,5) and
                                    REVENUESPLIT.APPLICATIONCODE in (0,1,3,6,7,13)
                                    then 1
                                when
                                    ' + case when @CURRENCYCODE = 0
                                        then N' REVENUESPLIT.TRANSACTIONTYPECODE'
                                        else N' REVENUE.TYPECODE'
                                    end + N' = 4
                                    then 2
                                when
                                    ' + case when @CURRENCYCODE = 0
                                        then N' REVENUESPLIT.TRANSACTIONTYPECODE'
                                        else N' REVENUE.TYPECODE'
                                    end + N' in (1,6)
                                    then 3
                            else null end as CATAGORY
                        from DESIGNATION_CTE
                    '
                --exceeded 4000 chars, restarting char concatenation to continue

                set @SQLTOEXEC = @SQLTOEXEC + N'
                        inner join
                            (
                                select
                                    D.ID as DESIGNATIONID,
                                    D2.ID as CHILDDESIGNATIONID
                                from DESIGNATION D
                                inner join dbo.DESIGNATION D2 on (D.DESIGNATIONLEVEL1ID = D2.DESIGNATIONLEVEL1ID
                                    and (D.DESIGNATIONLEVEL2ID = D2.DESIGNATIONLEVEL2ID or D.DESIGNATIONLEVEL2ID is null)
                                    and (D.DESIGNATIONLEVEL3ID = D2.DESIGNATIONLEVEL3ID or D.DESIGNATIONLEVEL3ID is null)
                                    and (D.DESIGNATIONLEVEL4ID = D2.DESIGNATIONLEVEL4ID or D.DESIGNATIONLEVEL4ID is null)
                                    and (D.DESIGNATIONLEVEL5ID = D2.DESIGNATIONLEVEL5ID or D.DESIGNATIONLEVEL5ID is null))
                            ) as DESIGNATION on DESIGNATION.DESIGNATIONID = DESIGNATION_CTE.ID
                    ' + case when @CURRENCYCODE = 0
                        then N'
                        cross apply dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(
                            DESIGNATION_CTE.CURRENCYID
                            ,@ORGANIZATIONCURRENCYID
                            ,DESIGNATION_CTE.CURRENCYDECIMALDIGITS
                            ,DESIGNATION_CTE.CURRENCYROUNDINGTYPECODE
                            ) as REVENUESPLIT
                            left outer join dbo.UFN_CREDIT_GETSPLITREFUNDAMOUNT_BULK() REFUNDSPLIT on REFUNDSPLIT.SOURCELINEITEMID = REVENUESPLIT.ID '
                        else N'
                        inner join dbo.REVENUESPLIT_EXT REVENUESPLIT on REVENUESPLIT.DESIGNATIONID = DESIGNATION.CHILDDESIGNATIONID
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = REVENUESPLIT.ID
                        inner join dbo.FINANCIALTRANSACTION REVENUE on REVENUE.ID = LI.FINANCIALTRANSACTIONID
                        left outer join dbo.UFN_CREDIT_GETSPLITREFUNDAMOUNT_BULK() REFUNDSPLIT on REFUNDSPLIT.SOURCELINEITEMID = REVENUESPLIT.ID '
                    end + N'
                        where
                            ' + case when @CURRENCYCODE = 0
                                then N' REVENUESPLIT.DATE'
                                else N' cast(REVENUE.DATE as datetime)'
                            end + N' between @STARTDATE and @ENDDATE
                            and
                            (
                                (
                                    ' + case when @CURRENCYCODE = 0
                                        then N' REVENUESPLIT.TRANSACTIONTYPECODE'
                                        else N' REVENUE.TYPECODE'
                                        /*    
                                            In the case of a sales order, use the order split applied to the gift to aid incorporating refunds.
                                            Filter out any payments with application type 'Order' so as not to double count sales order splits. 
                                        */    
                                    end + N' in (0,5) and
                                    REVENUESPLIT.APPLICATIONCODE in (0,1,3,6,7,13)
                                )
                                or(' + case when @CURRENCYCODE = 0
                                        then N' REVENUESPLIT.TRANSACTIONTYPECODE'
                                        else N' REVENUE.TYPECODE'
                                    end + N' in (1,4,6))
                            )
                            ' + case when @CURRENCYCODE = 0
                                then N' and REVENUESPLIT.DESIGNATIONID = DESIGNATION.CHILDDESIGNATIONID and REVENUESPLIT.SPLITDELETEDON is NULL'
                                else N' and LI.DELETEDON is NULL'
                            end + N'
                        union all
                        -- Find all writeoff for child designations of each designation in the specified time period

                        select
                            datepart(year,REVENUE.DATE) as YEAR,
                            ' + case when @GROUPBY = 2
                                then N' 0 as QUARTER, '
                                else N' datepart(qq,REVENUE.DATE) as QUARTER, '
                            end + N'
                            DESIGNATION_CTE.ID as DESIGNATIONID,
                            ' + case when @CURRENCYCODE = 0
                                then N' WRITEOFFSPLIT.AMOUNTINCURRENCY, '
                                else N' LI.ORGAMOUNT as ORGANIZATIONAMOUNT, '
                            end + N'
                            4 as CATAGORY
                        from DESIGNATION_CTE
                        inner join
                            (
                                select
                                    D.ID as DESIGNATIONID,
                                    D2.ID as CHILDDESIGNATIONID
                                from DESIGNATION D
                                inner join dbo.DESIGNATION D2 on (D.DESIGNATIONLEVEL1ID = D2.DESIGNATIONLEVEL1ID
                                    and (D.DESIGNATIONLEVEL2ID = D2.DESIGNATIONLEVEL2ID or D.DESIGNATIONLEVEL2ID is null)
                                    and (D.DESIGNATIONLEVEL3ID = D2.DESIGNATIONLEVEL3ID or D.DESIGNATIONLEVEL3ID is null)
                                    and (D.DESIGNATIONLEVEL4ID = D2.DESIGNATIONLEVEL4ID or D.DESIGNATIONLEVEL4ID is null)
                                    and (D.DESIGNATIONLEVEL5ID = D2.DESIGNATIONLEVEL5ID or D.DESIGNATIONLEVEL5ID is null))
                            ) as DESIGNATION on DESIGNATION.DESIGNATIONID = DESIGNATION_CTE.ID
                        ' + case when @CURRENCYCODE = 0
                            then N' cross apply dbo.UFN_WRITEOFFSPLIT_GETAMOUNTINCURRENCY_BULK(
                                        DESIGNATION_CTE.CURRENCYID
                                        ,@ORGANIZATIONCURRENCYID
                                        ,DESIGNATION_CTE.CURRENCYDECIMALDIGITS
                                        ,DESIGNATION_CTE.CURRENCYROUNDINGTYPECODE
                                        ) as WRITEOFFSPLIT
                                    inner join dbo.FINANCIALTRANSACTION REVENUE on REVENUE.ID = WRITEOFFSPLIT.REVENUEID '
                            else N' inner join dbo.REVENUESPLIT_EXT WRITEOFFSPLIT on WRITEOFFSPLIT.DESIGNATIONID = DESIGNATION.CHILDDESIGNATIONID
                                    inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on WRITEOFFSPLIT.ID = LI.ID
                                    inner join dbo.FINANCIALTRANSACTION WRITEOFF on WRITEOFF.ID = LI.FINANCIALTRANSACTIONID and WRITEOFF.TYPECODE = 20 and WRITEOFF.DELETEDON is null
                                    inner join dbo.FINANCIALTRANSACTION REVENUE on REVENUE.ID = WRITEOFF.PARENTID '
                        end + N'

                        where
                            cast(REVENUE.DATE as datetime) between @STARTDATE and @ENDDATE
                            and REVENUE.TYPECODE in (1,6)
                        ' + case when @CURRENCYCODE = 0
                                then N' and WRITEOFFSPLIT.DESIGNATIONID = DESIGNATION.CHILDDESIGNATIONID '
                                else N' '
                            end + N'
                    )
                    , TOTALS_CTE as (
                        select distinct
                            REVENUESPLIT_CTE.DESIGNATIONID,
                            REVENUESPLIT_CTE.YEAR,
                            REVENUESPLIT_CTE.QUARTER,
                            -- Find the sum of specific types of revenue in each time period

                            sum(case when REVENUESPLIT_CTE.CATAGORY = 1 then REVENUESPLIT_CTE.AMOUNTINCURRENCY else 0 end) over(partition by DESIGNATIONID,YEAR,QUARTER) as TOTALRECEIVED,
                            sum((case when REVENUESPLIT_CTE.CATAGORY = 3 then REVENUESPLIT_CTE.AMOUNTINCURRENCY else 0 end) - (case when REVENUESPLIT_CTE.CATAGORY = 4 then REVENUESPLIT_CTE.AMOUNTINCURRENCY else 0 end)) over(partition by DESIGNATIONID,YEAR,QUARTER) as TOTALEXPECTED,
                            sum(case when REVENUESPLIT_CTE.CATAGORY = 2 then REVENUESPLIT_CTE.AMOUNTINCURRENCY else 0 end) over(partition by DESIGNATIONID,YEAR,QUARTER) as TOTALPLANNEDGIFT,
                            -- Find the sum of specific types of revenue overall

                            sum(case when REVENUESPLIT_CTE.CATAGORY = 1 then REVENUESPLIT_CTE.AMOUNTINCURRENCY else 0 end) over(partition by DESIGNATIONID) OVERALLTOTALRECEIVED,
                            sum((case when REVENUESPLIT_CTE.CATAGORY = 3 then REVENUESPLIT_CTE.AMOUNTINCURRENCY else 0 end) - (case when REVENUESPLIT_CTE.CATAGORY = 4 then REVENUESPLIT_CTE.AMOUNTINCURRENCY else 0 end)) over(partition by DESIGNATIONID) as OVERALLTOTALEXPECTED,
                            sum(case when REVENUESPLIT_CTE.CATAGORY = 2 then REVENUESPLIT_CTE.AMOUNTINCURRENCY else 0 end) over(partition by DESIGNATIONID) OVERALLTOTALPLANNEDGIFT
                        from
                            REVENUESPLIT_CTE
                    )
                    select
                        dbo.UFN_DESIGNATIONLEVEL_GETNAME(DESIGNATION_CTE.DESIGNATIONLEVEL1ID) LEVEL1NAME,
                        dbo.UFN_DESIGNATIONLEVEL_GETNAME(DESIGNATION_CTE.DESIGNATIONLEVEL2ID) LEVEL2NAME,
                        DESIGNATION_CTE.LEVEL1TYPE,
                        DESIGNATION_CTE.DESIGNATIONLEVEL1ID,
                        DESIGNATION_CTE.DESIGNATIONLEVEL2ID,
                        DESIGNATIONGOAL.GOAL DESIGNATIONGOAL,
                        DESIGNATION_CTE.DESIGNATIONLEVELGOALGOAL OVERALLGOAL,
                        TOTALS_CTE.YEAR as DATEYEAR,
                        TOTALS_CTE.QUARTER as DATEQUARTER,
                        TOTALS_CTE.TOTALRECEIVED as TOTALRECEIVED,
                        TOTALS_CTE.TOTALEXPECTED as TOTALEXPECTED, 
                        TOTALS_CTE.TOTALPLANNEDGIFT as TOTALPLANNEDGIFT,
                        TOTALS_CTE.OVERALLTOTALRECEIVED as OVERALLTOTALRECEIVED,
                        TOTALS_CTE.OVERALLTOTALEXPECTED as OVERALLTOTALEXPECTED,
                        TOTALS_CTE.OVERALLTOTALPLANNEDGIFT as OVERALLTOTALPLANNEDGIFT,
                        DESIGNATION_CTE.CURRENCYID,
                        DESIGNATION_CTE.CURRENCYISO,
                        DESIGNATION_CTE.CURRENCYDECIMALDIGITS,
                        DESIGNATION_CTE.CURRENCYSYMBOL,
                        DESIGNATION_CTE.CURRENCYSYMBOLDISPLAYSETTINGCODE,
                        DESIGNATION_CTE.ID
                    from 
                        DESIGNATION_CTE
                        cross join TOTALS_CTE
                        left join dbo.DESIGNATIONGOAL on DESIGNATION_CTE.ID = DESIGNATIONGOAL.DESIGNATIONID and DESIGNATIONGOAL.DESIGNATIONLEVELGOALID = @GOALID
                    where DESIGNATION_CTE.ID = TOTALS_CTE.DESIGNATIONID
                    order by
                        DESIGNATION_CTE.DESIGNATIONLEVEL1ID,
                        DESIGNATION_CTE.DESIGNATIONLEVEL2ID,
                        TOTALS_CTE.YEAR,
                        TOTALS_CTE.QUARTER
                    '

                exec sp_executesql @SQLTOEXEC
                    N'@STARTDATE datetime,
                    @ENDDATE datetime,
                    @DESIGNATIONLEVELID uniqueidentifier,
                    @GOALID uniqueidentifier,
                    @ORGANIZATIONCURRENCYID uniqueidentifier',
                    @STARTDATE=@STARTDATE,
                    @ENDDATE=@ENDDATE,
                    @DESIGNATIONLEVELID=@DESIGNATIONLEVELID,
                    @GOALID=@GOALID,
                    @ORGANIZATIONCURRENCYID=@ORGANIZATIONCURRENCYID