USP_REPORT_INDIVIDUALINDUSTRYSEGMENTATIONREPORT

Returns the data necessary for the Individual Industry Segmentation Report.

Parameters

Parameter Parameter Type Mode Description
@REPORTUSERID nvarchar(128) IN
@CONSTITUENTQUERY uniqueidentifier IN
@CURRENCYCODE smallint IN
@ALTREPORTUSERID nvarchar(128) IN

Definition

Copy


CREATE procedure dbo.USP_REPORT_INDIVIDUALINDUSTRYSEGMENTATIONREPORT
(
  @REPORTUSERID nvarchar(128) = null,
  @CONSTITUENTQUERY uniqueidentifier = null,
  @CURRENCYCODE smallint = null, --3 = My base, (null, 1) = Organization

  @ALTREPORTUSERID nvarchar(128) = null
)
with execute as owner
as
  set nocount on;

  declare @SQLTOEXEC nvarchar(max);

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

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

  if @CONSTITUENTQUERY is not null begin
    if not exists(select ID from dbo.IDSETREGISTER where ID = @CONSTITUENTQUERY
      raiserror('ID set does not exist in the database.', 15, 1);

    select 
      @DBOBJECTNAME = DBOBJECTNAME, 
      @DBOBJECTTYPE = OBJECTTYPE
    from dbo.IDSETREGISTER 
    where ID = @CONSTITUENTQUERY;

    if @DBOBJECTTYPE = 1 
      set @DBOBJECTNAME = @DBOBJECTNAME + '()';
    else if @DBOBJECTTYPE = 2 
      set @DBOBJECTNAME = @DBOBJECTNAME + '(''' + convert(nvarchar(36), @CONSTITUENTQUERY) + ''')';
  end

  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);
  set @APPUSER_IN_NONSITEROLE = dbo.UFN_SECURITY_APPUSER_IN_NONSITEROLE(@CURRENTAPPUSERID);
  set @APPUSER_IN_NOSITEROLE = dbo.UFN_SECURITY_APPUSER_IN_NO_SITE_ROLE(@CURRENTAPPUSERID);

  declare @ASOFDATE datetime;
  set @ASOFDATE = getdate();

  declare @SELECTEDCURRENCYID uniqueidentifier;
  declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

  declare @ORIGINCODE tinyint;
  declare @DECIMALDIGITS tinyint;
  declare @ROUNDINGTYPECODE tinyint;
  declare @ISOCURRENCYCODE nvarchar(3);
  declare @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint;
  declare @CURRENCYSYMBOL nvarchar(5);

  if @CURRENCYCODE = 3
  begin
    if dbo.UFN_CURRENCYSET_GETAPPUSERCURRENCYSET(@CURRENTAPPUSERID) is not null
    begin                    
      select @SELECTEDCURRENCYID = CURRENCYSET.BASECURRENCYID
        from dbo.CURRENCYSET
        where
          CURRENCYSET.ID = dbo.UFN_CURRENCYSET_GETAPPUSERCURRENCYSET(@CURRENTAPPUSERID);
    end
    else
    begin
      select @SELECTEDCURRENCYID = CURRENCYSET.BASECURRENCYID
        from dbo.CURRENCYSET
        where
          CURRENCYSET.ID = dbo.UFN_CURRENCYSET_GETAPPUSERDEFAULTCURRENCYSET();
    end
  end
  else
    set @SELECTEDCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

  select
    @DECIMALDIGITS = DECIMALDIGITS,
    @ROUNDINGTYPECODE = ROUNDINGTYPECODE,
    @ISOCURRENCYCODE = ISO4217,
    @CURRENCYSYMBOLDISPLAYSETTINGCODE = SYMBOLDISPLAYSETTINGCODE,
    @CURRENCYSYMBOL = CURRENCYSYMBOL
  from
    dbo.UFN_CURRENCY_GETPROPERTIES(@SELECTEDCURRENCYID);    

  select @ORIGINCODE = coalesce(ORGANIZATIONAMOUNTORIGINCODE, 0) from dbo.MULTICURRENCYCONFIGURATION;

  set @SQLTOEXEC = '
  select 
    CONSTITUENT_NF.NAME,
    coalesce(CORPORATIONGIVINGTOTAL.AMOUNTINCURRENCY,0) as TOTALGIVING,
    coalesce(LATESTGIFT.AMOUNT, 0) as LATESTGIFTAMOUNT,
    LATESTGIFT.DATE as LATESTGIFTDATE,
    ORGANIZATION.NAME as ORGANIZATIONNAME,
    RELATIONSHIPJOBINFO.JOBTITLE,
    JOBCATEGORYCODE.DESCRIPTION as JOBCATEGORY,
    CAREERLEVELCODE.DESCRIPTION as CAREERLEVEL,
    INDUSTRYCODE.DESCRIPTION,
    ''http://www.blackbaud.com/CONSTITUENTID?CONSTITUENTID='' + convert(nvarchar(36),CONSTITUENT.ID) as CONSTITUENTID,
    @ISOCURRENCYCODE [ISOCURRENCYCODE],
    @CURRENCYSYMBOL [CURRENCYSYMBOL],
    @CURRENCYSYMBOLDISPLAYSETTINGCODE [CURRENCYSYMBOLDISPLAYSETTINGCODE],
    @DECIMALDIGITS [DECIMALDIGITS]
  from 
    dbo.CONSTITUENT
  inner join
    dbo.RELATIONSHIP on RELATIONSHIP.RELATIONSHIPCONSTITUENTID = CONSTITUENT.ID 
  left join
    dbo.RELATIONSHIPSET on RELATIONSHIPSET.ID = RELATIONSHIP.RELATIONSHIPSETID
  left join
    dbo.RELATIONSHIPJOBINFO on (RELATIONSHIPJOBINFO.RELATIONSHIPSETID = RELATIONSHIPSET.ID)
      --The "GETEARLIESTTIME" date function has been inlined here for performance (the part with "cast(@DATE as date)")...

      --The "GETLATESTTIME" date function has been inlined here for performance (the part with "dateadd(ms, -003...")...

      and (@ASOFDATE between isnull(cast(RELATIONSHIPJOBINFO.STARTDATE as date), @ASOFDATE) and isnull(dateadd(ms, -003, dateadd(d, 1, cast(cast(RELATIONSHIPJOBINFO.ENDDATE as date) as datetime))), @ASOFDATE))
  inner join
    dbo.CONSTITUENT as ORGANIZATION on ORGANIZATION.ID = RELATIONSHIP.RECIPROCALCONSTITUENTID
  inner join 
    dbo.ORGANIZATIONDATA on ORGANIZATIONDATA.ID = ORGANIZATION.ID
  inner join 
    dbo.INDUSTRYCODE on INDUSTRYCODE.ID = ORGANIZATIONDATA.INDUSTRYCODEID
  left join 
    dbo.JOBCATEGORYCODE on JOBCATEGORYCODE.ID = RELATIONSHIPJOBINFO.JOBCATEGORYCODEID
  left join 
    dbo.CAREERLEVELCODE on CAREERLEVELCODE.ID = RELATIONSHIPJOBINFO.CAREERLEVELCODEID
  left join
    dbo.UFN_CORPORATION_GETGIVINGTOTAL_INCURRENCY_BULK_2(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE, @ORIGINCODE, @CURRENCYCODE, @CURRENTAPPUSERID, ''EE399871-9447-435A-BD08-927D15D189DF'', 21) CORPORATIONGIVINGTOTAL on CORPORATIONGIVINGTOTAL.CONSTITUENTID = CONSTITUENT.ID';

  --This has to be split from above because the sql string is over the 4000 character limit...

  set @SQLTOEXEC += '
  outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(CONSTITUENT.ID) CONSTITUENT_NF
  outer apply
    (
      select top 1
        R.DATE,
        sum(coalesce(RS.AMOUNTINCURRENCY, 0)) - sum(coalesce(IWO.AMOUNT,0)) as AMOUNT
      from
        dbo.REVENUE R
      inner join
        dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) RS on RS.REVENUEID = R.ID
      left join (
        select
          INSTALLMENTSPLIT.PLEDGEID,
          INSTALLMENTSPLIT.DESIGNATIONID,
          sum(IWO.AMOUNTINCURRENCY) as AMOUNT
        from 
          dbo.INSTALLMENTSPLIT
        inner join 
          dbo.UFN_INSTALLMENTSPLITWRITEOFF_GETAMOUNTSINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE, @ORIGINCODE, @CURRENCYCODE) IWO on IWO.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
        group by 
          INSTALLMENTSPLIT.PLEDGEID, INSTALLMENTSPLIT.DESIGNATIONID
      ) IWO on IWO.PLEDGEID = RS.REVENUEID and IWO.DESIGNATIONID = RS.DESIGNATIONID
      left join 
        dbo.INSTALLMENTSPLITPAYMENT ISP on RS.ID = ISP.PAYMENTID
      where (
        R.TRANSACTIONTYPECODE in (1,3) --Pledge or MG claim

        or (
          R.TRANSACTIONTYPECODE = 0 
          and (
            RS.APPLICATIONCODE in (0,1,3,4,5,6) 
            or (RS.APPLICATIONCODE = 7 and ISP.ID is null) --Unapplied MG claim payments

          )
        )
      ) 
      and
        R.CONSTITUENTID = CONSTITUENT.ID 
      and
        (@ISADMIN = 1 or dbo.UFN_DESIGNATION_USERHASSITEACCESS(RS.DESIGNATIONID,@CURRENTAPPUSERID) = 1)
      group by
        R.ID, R.ID, R.TRANSACTIONTYPE, R.TRANSACTIONTYPECODE, R.DATE, R.DATEADDED, IWO.AMOUNT
      order by
        R.DATE desc, R.DATEADDED desc
    ) as LATESTGIFT
    outer apply dbo.UFN_CURRENCY_GETPROPERTIES(@SELECTEDCURRENCYID) CURRENCYPROPERTIES
  ' + nchar(13);

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

  set @SQLTOEXEC = @SQLTOEXEC + '
  where 
    CONSTITUENT.ISORGANIZATION = 0
    and CONSTITUENT.ISGROUP = 0
    and RELATIONSHIP.RELATIONSHIPCONSTITUENTID = CONSTITUENT.ID
    --The "GETEARLIESTTIME" date function has been inlined here for performance (the part with "cast(@DATE as date)")...

    --The "GETLATESTTIME" date function has been inlined here for performance (the part with "dateadd(ms, -003...")...

    and (@ASOFDATE between coalesce(cast(RELATIONSHIPJOBINFO.STARTDATE as date), cast(RELATIONSHIP.STARTDATE as date), @ASOFDATE) 
                       and coalesce(dateadd(ms, -003, dateadd(d, 1, cast(cast(RELATIONSHIPJOBINFO.ENDDATE as date) as datetime))), dateadd(ms, -003, dateadd(d, 1, cast(cast(RELATIONSHIP.ENDDATE as date) as datetime))), @ASOFDATE))
    and ORGANIZATION.ISORGANIZATION = 1
    and (@ISADMIN = 1 or 
      (
        (@APPUSER_IN_NONRACROLE = 1 or
        dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, CONSTITUENT.ID, @APPUSER_IN_NOSECGROUPROLE) = 1)
        and
        (@APPUSER_IN_NONSITEROLE = 1 or
        dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT_BYSITE(@CURRENTAPPUSERID, CONSTITUENT.ID, @APPUSER_IN_NOSITEROLE) = 1)
      ))
  order by INDUSTRYCODE.DESCRIPTION, CONSTITUENT.KEYNAME;
  '

  exec sp_executesql @SQLTOEXEC,
    N'@ASOFDATE datetime, @ISADMIN bit, @APPUSER_IN_NONRACROLE bit, @APPUSER_IN_NOSECGROUPROLE bit, @APPUSER_IN_NONSITEROLE bit, @APPUSER_IN_NOSITEROLE bit, @CURRENTAPPUSERID uniqueidentifier, @SELECTEDCURRENCYID uniqueidentifier, @ORGANIZATIONCURRENCYID uniqueidentifier, @DECIMALDIGITS tinyint, @ROUNDINGTYPECODE tinyint, @ISOCURRENCYCODE nvarchar(3), @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint, @CURRENCYSYMBOL nvarchar(5), @ORIGINCODE tinyint, @CURRENCYCODE smallint',
    @ASOFDATE=@ASOFDATE, @ISADMIN=@ISADMIN, @APPUSER_IN_NONRACROLE=@APPUSER_IN_NONRACROLE, @APPUSER_IN_NOSECGROUPROLE=@APPUSER_IN_NOSECGROUPROLE, @APPUSER_IN_NONSITEROLE=@APPUSER_IN_NONSITEROLE, @APPUSER_IN_NOSITEROLE=@APPUSER_IN_NOSITEROLE, @CURRENTAPPUSERID=@CURRENTAPPUSERID, @SELECTEDCURRENCYID=@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID=@ORGANIZATIONCURRENCYID, @DECIMALDIGITS=@DECIMALDIGITS, @ROUNDINGTYPECODE=@ROUNDINGTYPECODE, @ISOCURRENCYCODE=@ISOCURRENCYCODE, @CURRENCYSYMBOLDISPLAYSETTINGCODE=@CURRENCYSYMBOLDISPLAYSETTINGCODE, @CURRENCYSYMBOL=@CURRENCYSYMBOL, @ORIGINCODE=@ORIGINCODE, @CURRENCYCODE=@CURRENCYCODE;

  return 0;