USP_REPORT_VOLUNTEERPERFORMANCESUMMARY

Returns the data for the Volunteer Performance report

Parameters

Parameter Parameter Type Mode Description
@VOLUNTEERQUERY uniqueidentifier IN
@VOLUNTEERID uniqueidentifier IN
@STARTDATE datetime IN
@ENDDATE datetime IN
@SITEID uniqueidentifier IN
@REPORTUSERID nvarchar(128) IN
@ALTREPORTUSERID nvarchar(128) IN
@CURRENCYCODE tinyint IN

Definition

Copy


            CREATE procedure dbo.USP_REPORT_VOLUNTEERPERFORMANCESUMMARY
            (    
                @VOLUNTEERQUERY uniqueidentifier = null,
                @VOLUNTEERID uniqueidentifier = null,
                @STARTDATE datetime = null,
                @ENDDATE datetime = null,
                @SITEID uniqueidentifier = null,
                @REPORTUSERID nvarchar(128) = null,
                @ALTREPORTUSERID nvarchar(128) = null,
                @CURRENCYCODE tinyint = null
            )
            with execute as caller
            as

                declare @CURRENTAPPUSERID uniqueidentifier = dbo.UFN_APPUSER_GETREPORTAPPUSERID(@REPORTUSERID, @ALTREPORTUSERID);

                declare @ISADMIN bit;
                declare @APPUSER_IN_NONRACROLE bit;
                declare @APPUSER_IN_NOSECGROUPROLE bit;

                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 @CURRENCYID uniqueidentifier;
                if @CURRENCYCODE = 0 begin
                    select @CURRENCYID=ID from CURRENCY where ID=(select dbo.UFN_APPUSER_GETBASECURRENCY(@CURRENTAPPUSERID));
                end
                else if @CURRENCYCODE is null or @CURRENCYCODE = 1 begin
                    set @CURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
                end

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

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

                declare @LIFETIMETABLE table
                (
                    VOLUNTEERID uniqueidentifier,
                    HOURS decimal(20,2),
                    VALUE money
                )

                declare @PERIODTABLE table
                (
                    VOLUNTEERID uniqueidentifier,
                    HOURS decimal(20,2),
                    VALUE money
                )

                set @SQLTOEXEC = '
                    select 
                        TIMESHEET.VOLUNTEERID as VOLUNTEERID,
                        TIMESHEET.HOURSWORKED as HOURSWORKED,
                        case 
                            when JOBOCCURRENCE.BASECURRENCYID = @CURRENCYID
                                then TIMESHEET.HOURSWORKED * JOBOCCURRENCE.ESTIMATEDVALUE
                            else
                                dbo.UFN_CURRENCY_CONVERT(TIMESHEET.HOURSWORKED * JOBOCCURRENCE.ESTIMATEDVALUE, 
                                    dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(JOBOCCURRENCE.BASECURRENCYID, @CURRENCYID, getdate(), 1, null))
                            end    as VALUE
                    from dbo.TIMESHEET '

                if @VOLUNTEERQUERY is not null
                    set @SQLTOEXEC = @SQLTOEXEC + 'inner join dbo.' + @DBOBJECTNAME + ' as SELECTION on TIMESHEET.VOLUNTEERID = SELECTION.ID ';

                set @SQLTOEXEC = @SQLTOEXEC + '
                    inner join dbo.JOBOCCURRENCE on TIMESHEET.JOBOCCURRENCEID = JOBOCCURRENCE.ID
                    inner join JOB on JOBOCCURRENCE.JOBID = JOB.ID
                    where (@VOLUNTEERID is null or TIMESHEET.VOLUNTEERID = @VOLUNTEERID)
                    and (@SITEID is null or @SITEID = dbo.UFN_SITEID_MAPFROM_JOBOCCURRENCEID(TIMESHEET.JOBOCCURRENCEID))
                    and (@SITEID is null or @SITEID = dbo.UFN_SITEID_MAPFROM_JOBID(JOBOCCURRENCE.JOBID))
                    and (@ISADMIN = 1 or 
                         @APPUSER_IN_NONRACROLE = 1 or
                         dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, TIMESHEET.VOLUNTEERID, @APPUSER_IN_NOSECGROUPROLE) = 1)'

                insert into @LIFETIMETABLE (VOLUNTEERID, HOURS, VALUE)
                    exec sp_executesql @SQLTOEXEC,
                        N'@VOLUNTEERID uniqueidentifier, @SITEID uniqueidentifier, @CURRENCYID uniqueidentifier, 
                            @ISADMIN bit, @APPUSER_IN_NONRACROLE bit, @APPUSER_IN_NOSECGROUPROLE bit, @CURRENTAPPUSERID uniqueidentifier',
                        @VOLUNTEERID=@VOLUNTEERID, @SITEID=@SITEID, @CURRENCYID=@CURRENCYID, @ISADMIN=@ISADMIN, @APPUSER_IN_NONRACROLE=@APPUSER_IN_NONRACROLE
                            @APPUSER_IN_NOSECGROUPROLE=@APPUSER_IN_NOSECGROUPROLE, @CURRENTAPPUSERID=@CURRENTAPPUSERID;

                set @SQLTOEXEC = '
                    select 
                        TIMESHEET.VOLUNTEERID as VOLUNTEERID,
                        TIMESHEET.HOURSWORKED as HOURSWORKED,
                        case 
                            when JOBOCCURRENCE.BASECURRENCYID = @CURRENCYID
                                then TIMESHEET.HOURSWORKED * JOBOCCURRENCE.ESTIMATEDVALUE
                            else
                                dbo.UFN_CURRENCY_CONVERT(TIMESHEET.HOURSWORKED * JOBOCCURRENCE.ESTIMATEDVALUE, 
                                    dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(JOBOCCURRENCE.BASECURRENCYID, @CURRENCYID, getdate(), 1, null))
                            end    as VALUE
                    from dbo.TIMESHEET '

                if @VOLUNTEERQUERY is not null
                    set @SQLTOEXEC = @SQLTOEXEC + 'inner join dbo.' + @DBOBJECTNAME + ' as SELECTION on TIMESHEET.VOLUNTEERID = SELECTION.ID ';

                set @SQLTOEXEC = @SQLTOEXEC + '
                    inner join dbo.JOBOCCURRENCE on TIMESHEET.JOBOCCURRENCEID = JOBOCCURRENCE.ID
                    inner join JOB on JOBOCCURRENCE.JOBID = JOB.ID
                    where (@VOLUNTEERID is null or TIMESHEET.VOLUNTEERID = @VOLUNTEERID)
                    and (@SITEID is null or @SITEID = dbo.UFN_SITEID_MAPFROM_JOBOCCURRENCEID(TIMESHEET.JOBOCCURRENCEID))
                    and (@SITEID is null or @SITEID = dbo.UFN_SITEID_MAPFROM_JOBID(JOBOCCURRENCE.JOBID))
                    and (@STARTDATE is null or TIMESHEET.STARTDATE >= dbo.UFN_DATE_GETEARLIESTTIME(@STARTDATE))
                    and (@ENDDATE is null or TIMESHEET.STARTDATE <= dbo.UFN_DATE_GETEARLIESTTIME(@ENDDATE))
                    and (@ISADMIN = 1 or 
                         @APPUSER_IN_NONRACROLE = 1 or
                         dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, TIMESHEET.VOLUNTEERID, @APPUSER_IN_NOSECGROUPROLE) = 1)'

                insert into @PERIODTABLE (VOLUNTEERID, HOURS, VALUE)
                    exec sp_executesql @SQLTOEXEC,
                        N'@VOLUNTEERID uniqueidentifier, @SITEID uniqueidentifier, @CURRENCYID uniqueidentifier, @STARTDATE datetime, @ENDDATE datetime,
                            @ISADMIN bit, @APPUSER_IN_NONRACROLE bit, @APPUSER_IN_NOSECGROUPROLE bit, @CURRENTAPPUSERID uniqueidentifier',
                        @VOLUNTEERID=@VOLUNTEERID, @SITEID=@SITEID, @CURRENCYID=@CURRENCYID, @STARTDATE=@STARTDATE, @ENDDATE=@ENDDATE, @ISADMIN=@ISADMIN
                            @APPUSER_IN_NONRACROLE=@APPUSER_IN_NONRACROLE, @APPUSER_IN_NOSECGROUPROLE=@APPUSER_IN_NOSECGROUPROLE
                            @CURRENTAPPUSERID=@CURRENTAPPUSERID;

                declare @AGGREGATEPERIOD table
                (
                    VOLUNTEERID uniqueidentifier,
                    PERIODHOURS decimal(20,2),
                    PERIODVALUE money
                )

                insert into @AGGREGATEPERIOD (VOLUNTEERID, PERIODHOURS, PERIODVALUE)
                select 
                    PERIOD.VOLUNTEERID,
                    sum(PERIOD.HOURS) as PERIODHOURS,
                    sum(PERIOD.VALUE) as PERIODVALUE
                from @PERIODTABLE PERIOD
                group by PERIOD.VOLUNTEERID;

                declare @AGGREGATELIFETIME table
                (
                    VOLUNTEERID uniqueidentifier,
                    LIFETIMEHOURS decimal(20,2),
                    LIFETIMEVALUE money
                )

                insert into @AGGREGATELIFETIME (VOLUNTEERID, LIFETIMEHOURS, LIFETIMEVALUE)
                select 
                    LIFETIME.VOLUNTEERID,
                    sum(LIFETIME.HOURS) as LIFETIMEHOURS,
                    sum(LIFETIME.VALUE) as LIFETIMEVALUE
                from @LIFETIMETABLE LIFETIME
                group by LIFETIME.VOLUNTEERID;

                select
                    PERIOD.VOLUNTEERID,
                    'http://www.blackbaud.com/VOLUNTEERID?VOLUNTEERID=' + CONVERT(nvarchar(36),PERIOD.VOLUNTEERID) as VOLUNTEERLINK,
                    NF.NAME as VOLUNTEERNAME,
                    coalesce(PERIOD.PERIODHOURS, 0) as PERIODHOURS,
                    coalesce(PERIOD.PERIODVALUE, 0) as PERIODVALUE,
                    coalesce(LIFETIME.LIFETIMEHOURS, 0) as LIFETIMEHOURS,
                    coalesce(LIFETIME.LIFETIMEVALUE, 0) as LIFETIMEVALUE,
                    CURRENCYPROPERTIES.ISO4217 [ISOCURRENCYCODE],
                    CURRENCYPROPERTIES.CURRENCYSYMBOL,
                    CURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE [CURRENCYSYMBOLDISPLAYSETTINGCODE],
                    CURRENCYPROPERTIES.DECIMALDIGITS
                from @AGGREGATEPERIOD PERIOD
                inner join @AGGREGATELIFETIME LIFETIME on PERIOD.VOLUNTEERID = LIFETIME.VOLUNTEERID
                outer apply
                    dbo.UFN_CURRENCY_GETPROPERTIES(@CURRENCYID) CURRENCYPROPERTIES
                outer apply
                    dbo.UFN_CONSTITUENT_DISPLAYNAME(PERIOD.VOLUNTEERID) NF
                order by VOLUNTEERNAME;