USP_REPORT_PLANNEDGIFTDETAIL

Returns planned gifts for the planned gift detail report.

Parameters

Parameter Parameter Type Mode Description
@SELECTIONID uniqueidentifier IN
@FROMDATE datetime IN
@TODATE datetime IN
@VEHICLECODE tinyint IN
@STATUSCODE tinyint IN
@GROUPBY tinyint IN
@SHOWMEMBERDATAFORGROUPS bit IN
@SHOWGROUPDATAFORMEMBERS bit IN
@REPORTUSERID nvarchar(128) IN
@CURRENCYCODE tinyint IN
@ALTREPORTUSERID nvarchar(128) IN

Definition

Copy


CREATE procedure dbo.USP_REPORT_PLANNEDGIFTDETAIL
(
  @SELECTIONID uniqueidentifier,
  @FROMDATE datetime = null,
  @TODATE datetime = null,
  @VEHICLECODE tinyint = null,
  @STATUSCODE tinyint = null,
  @GROUPBY tinyint = null,
  @SHOWMEMBERDATAFORGROUPS bit = null,
  @SHOWGROUPDATAFORMEMBERS bit = null,
  @REPORTUSERID nvarchar(128) = null,
  @CURRENCYCODE tinyint = 1,
  @ALTREPORTUSERID nvarchar(128) = null
)
with execute as owner as
  set nocount on;

  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;

  set @CURRENTAPPUSERID = dbo.UFN_APPUSER_GETREPORTAPPUSERID(@REPORTUSERID, @ALTREPORTUSERID);
  set @ISADMIN = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);

  if @ISADMIN = 0
  begin
    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);
  end

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

  declare @SQLTOEXEC nvarchar(max);

  set @SQLTOEXEC = '
with PLANNEDGIFTS_CTE as
(
  select
    PG.ID as PLANNEDGIFTID,
    PG.GIFTDATE,
    PG.VEHICLE,
    PG.VEHICLECODE,
    PG.EXPECTEDMATURITY,
    case
      when PG.EXPECTEDMATURITY = 0 then null
      else PG.EXPECTEDMATURITY
    end as EXPECTEDMATURITYYEAR,
    PG.STATUS,
    PG.STATUSCODE,
    PG.SUBTYPE,
    PG.BASECURRENCYID,
    PG.TRANSACTIONCURRENCYID,
    case @CURRENCYCODE
      when 0 then PG.GIFTAMOUNT
      when 1 then PG.ORGANIZATIONGIFTAMOUNT
      when 2 then PG.TRANSACTIONGIFTAMOUNT
    end as PLANNEDGIFTAMOUNT,
    case @CURRENCYCODE
      when 0 then PG.REMAINDERVALUE
      when 1 then PG.ORGANIZATIONREMAINDERVALUE
      when 2 then PG.TRANSACTIONREMAINDERVALUE
    end as TOTALREMAINDERVALUE,
    case @CURRENCYCODE
      when 0 then PG.EXPECTEDGIFTAMOUNT
      when 2 then PG.TRANSACTIONEXPECTEDGIFTAMOUNT
      else PG.ORGANIZATIONEXPECTEDGIFTAMOUNT
    end as EXPECTEDGIFTAMOUNT,
    case @CURRENCYCODE
      when 0 then PG.BASECURRENCYID
      when 2 then PG.TRANSACTIONCURRENCYID
      else dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()
    end as PGCURRENCYID,
    C.ID as CONSTITUENTID,
    C.KEYNAME as KEYNAME,
    C.FIRSTNAME as FIRSTNAME,
    C.MIDDLENAME as MIDDLENAME,
    NF.NAME,
    C.ISGROUP,
    CINFO.CURRENCYSYMBOL,
    CINFO.ISO4217,
    CINFO.DECIMALDIGITS,
    CINFO.SYMBOLDISPLAYSETTINGCODE,
    dbo.UFN_PROSPECTPLANTYPECODE_GETDESCRIPTION(PP.PROSPECTPLANTYPECODEID) as PLANTYPE
  from
    dbo.PLANNEDGIFT PG
  inner join
    dbo.CONSTITUENT C with (nolock) on C.ID = PG.CONSTITUENTID
  left join
    dbo.PROSPECTPLAN PP on PP.ID = PG.PROSPECTPLANID
  outer apply
    dbo.UFN_CURRENCY_GETPROPERTIES(case @CURRENCYCODE when 0 then PG.BASECURRENCYID when 1 then dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY() when 2 then PG.TRANSACTIONCURRENCYID end) as CINFO
  outer apply
    dbo.UFN_CONSTITUENT_DISPLAYNAME(C.ID) NF'

  if @SELECTIONID is not null
    set @SQLTOEXEC = @SQLTOEXEC + '
  inner join
    dbo.UFN_IDSETREADER_GETRESULTS_GUID(@SELECTIONID) SELECTION on PG.ID = SELECTION.ID'


  declare @WHERECLAUSESQL nvarchar(1000) = ''

  if @FROMDATE is not null and @TODATE is not null
    set @WHERECLAUSESQL = '
    (PG.GIFTDATE between @FROMDATE and @TODATE or @FROMDATE is null or @TODATE is null)'

  if @VEHICLECODE is not null
  begin
    if Len(@WHERECLAUSESQL) > 0
      set @WHERECLAUSESQL = @WHERECLAUSESQL + ' and'

    set @WHERECLAUSESQL = @WHERECLAUSESQL + '
    (PG.VEHICLECODE = @VEHICLECODE)'
  end

  if @STATUSCODE is not null
  begin
    if Len(@WHERECLAUSESQL) > 0
      set @WHERECLAUSESQL = @WHERECLAUSESQL + ' and'

    set @WHERECLAUSESQL = @WHERECLAUSESQL + '
    (PG.STATUSCODE = @STATUSCODE)'
  end

  if @ISADMIN = 0
  begin
    if len(@WHERECLAUSESQL) > 0
      set @WHERECLAUSESQL = @WHERECLAUSESQL + ' and'

    set @WHERECLAUSESQL = @WHERECLAUSESQL + '
    (dbo.UFN_PLANNEDGIFT_USERHASSITEACCESS(@CURRENTAPPUSERID, PG.ID) = 1)'

    if @APPUSER_IN_NONRACROLE = 0
    begin
      if Len(@WHERECLAUSESQL) > 0
        set @WHERECLAUSESQL = @WHERECLAUSESQL + ' and'

      set @WHERECLAUSESQL = @WHERECLAUSESQL + '
    (dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, C.ID, @APPUSER_IN_NOSECGROUPROLE) = 1)'
    end    

    if @APPUSER_IN_NONSITEROLE = 0
    begin
    if Len(@WHERECLAUSESQL) > 0
      set @WHERECLAUSESQL = @WHERECLAUSESQL + ' and'

    set @WHERECLAUSESQL = @WHERECLAUSESQL + '
    (dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT_BYSITE(@CURRENTAPPUSERID, C.ID, @APPUSER_IN_NOSITEROLE) = 1)'
    end
  end

  if len(@WHERECLAUSESQL) > 0
    set @SQLTOEXEC = @SQLTOEXEC + '
  where
    ' + @WHERECLAUSESQL


  set @SQLTOEXEC = @SQLTOEXEC + '
), DESIGNATIONS_CTE as
(
  select
    PLANNEDGIFTID,
    DESIGNATIONID,
    sum(DESIGNATIONAMOUNT) PLANNEDGIFTDESIGNATIONAMOUNT,
    DESIGNATION.NAME,
    DESIGNATION.VANITYNAME
  from
  (
    select
      PGA.PLANNEDGIFTID,
      PGAD.DESIGNATIONID,
      case @CURRENCYCODE
        when 0 then coalesce(PGAD.AMOUNT, PGA.GIFTAMOUNT)
        when 1 then coalesce(PGAD.ORGANIZATIONAMOUNT, PGA.ORGANIZATIONGIFTAMOUNT)
        when 2 then coalesce(PGAD.TRANSACTIONAMOUNT, PGA.TRANSACTIONGIFTAMOUNT)
      end as DESIGNATIONAMOUNT
    from
      dbo.PLANNEDGIFTADDITION PGA
    inner join
      PLANNEDGIFTS_CTE PG on PG.PLANNEDGIFTID = PGA.PLANNEDGIFTID
    left join
      PLANNEDGIFTADDITIONDESIGNATION PGAD on PGAD.PLANNEDGIFTADDITIONID = PGA.ID

    union all

    select
      PG.PLANNEDGIFTID,
      PGD.DESIGNATIONID,
      coalesce(case @CURRENCYCODE
        when 0 then PGD.AMOUNT
        when 1 then PGD.ORGANIZATIONAMOUNT
        when 2 then PGD.TRANSACTIONAMOUNT
      end, PG.PLANNEDGIFTAMOUNT) as DESIGNATIONAMOUNT
    from
      PLANNEDGIFTS_CTE PG
    left join
      dbo.PLANNEDGIFTDESIGNATION PGD on PGD.PLANNEDGIFTID = PG.PLANNEDGIFTID
  ) DESIGNATIONS
  left join
    dbo.DESIGNATION on DESIGNATION.ID = DESIGNATIONS.DESIGNATIONID
  group by
    PLANNEDGIFTID, DESIGNATIONID, NAME, VANITYNAME
)
, PLANNEDGIFTDESIGNATION_CTE as
(
  select
    PG.*,
    D.PLANNEDGIFTDESIGNATIONAMOUNT,
    D.DESIGNATIONID,
    D.NAME as DESIGNATIONNAME,
    D.VANITYNAME as DESIGNATIONVANITYNAME,
    coalesce(case
      when PLANNEDGIFTAMOUNT = 0 then 0
      else (cast(TOTALREMAINDERVALUE as decimal(30, 10)) *
        (cast(PLANNEDGIFTDESIGNATIONAMOUNT as decimal(30, 10)) /
        cast((select sum(PLANNEDGIFTDESIGNATIONAMOUNT) from DESIGNATIONS_CTE where PLANNEDGIFTID = PG.PLANNEDGIFTID) as decimal(30, 10))))
      end, TOTALREMAINDERVALUE)
    as DESIGNATIONREMAINDERVALUE,
    row_number() over (partition by PG.PLANNEDGIFTID order by PLANNEDGIFTDESIGNATIONAMOUNT) as DESIGNATIONNUMBER
  from
    PLANNEDGIFTS_CTE PG
  left join
    DESIGNATIONS_CTE D on PG.PLANNEDGIFTID = D.PLANNEDGIFTID
)'


  declare @GROUPFIELDCLAUSESQL nvarchar(max)
  declare @GROUPMEMBERJOIN nvarchar(1000)
  declare @GROUPJOIN nvarchar(1000)
  declare @GROUPBYCLAUSE nvarchar(150) = ''

  if @GROUPBY is not null and (@SHOWMEMBERDATAFORGROUPS = 1 or @SHOWGROUPDATAFORMEMBERS = 1)
  begin
    set @GROUPBYCLAUSE = 
      case @GROUPBY
        when 2 then
          '(PGD.EXPECTEDMATURITY = GPGD.EXPECTEDMATURITY) and'
        when 3 then
          '(PGD.VEHICLECODE = GPGD.VEHICLECODE) and'
        when 4 then
          '(PGD.STATUSCODE = GPGD.STATUSCODE) and'
        when 5 then
          '(PGD.DESIGNATIONID = GPGD.DESIGNATIONID) and'
        else
          ''
      end
  end

  if @SHOWMEMBERDATAFORGROUPS = 1
  begin
    set @GROUPMEMBERJOIN = '
  from
    dbo.GROUPMEMBER GM
  inner join
    dbo.GROUPMEMBERDATERANGE GMDR on GM.ID = GMDR.GROUPMEMBERID
  inner join
    PLANNEDGIFTDESIGNATION_CTE GPGD on GPGD.CONSTITUENTID = GM.MEMBERID
  where
    ' + @GROUPBYCLAUSE + '
    GM.GROUPID = PGD.CONSTITUENTID and
    ((GMDR.DATEFROM is null and (GMDR.DATETO is null or GMDR.DATETO > @CURRENTDATEEARLIESTTIME))
      or (GMDR.DATETO is null and (GMDR.DATEFROM is null or GMDR.DATEFROM <= @CURRENTDATEEARLIESTTIME))
      or (GMDR.DATEFROM <= @CURRENTDATEEARLIESTTIME and GMDR.DATETO > @CURRENTDATEEARLIESTTIME))'

    set @GROUPJOIN = '
  from
    PLANNEDGIFTDESIGNATION_CTE GPGD
  where
    ' + @GROUPBYCLAUSE + '
    GPGD.CONSTITUENTID = PGD.CONSTITUENTID'


    set @GROUPFIELDCLAUSESQL = '
  case
    when PGD.ISGROUP = 1 then
      (
        select
          sum(coalesce(PLANNEDGIFTDESIGNATIONAMOUNT, EXPECTEDGIFTAMOUNT))
        ' + @GROUPMEMBERJOIN + '
        ) + (
        select
          sum(coalesce(PLANNEDGIFTDESIGNATIONAMOUNT, EXPECTEDGIFTAMOUNT))
        ' + @GROUPJOIN + '
      )
    else null
  end as CONSTITUENTANDMEMBERSGIFTAMOUNT,

  case
    when PGD.ISGROUP = 1 then
      (
        select
          case @CURRENCYCODE
            when 0 then max(cast(GPGD.BASECURRENCYID as nvarchar(36)))
            when 1 then max(cast(dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY() as nvarchar(36)))
            when 2 then max(cast(GPGD.TRANSACTIONCURRENCYID as nvarchar(36)))
          end as CONSTITUENTCURRENCYID
        ' + @GROUPMEMBERJOIN + '
        having
          case @CURRENCYCODE
            when 0 then count(distinct(GPGD.BASECURRENCYID))
            when 2 then count(distinct(GPGD.TRANSACTIONCURRENCYID))
            else 1
          end = 1
      )
    else null
  end as CONSTITUENTCURRENCYID,

  case
    when PGD.ISGROUP = 1 then
      (
        select
          sum(GPGD.DESIGNATIONREMAINDERVALUE)
        ' + @GROUPMEMBERJOIN + '
        ) + (
        select
          sum(GPGD.DESIGNATIONREMAINDERVALUE)
        ' + @GROUPJOIN + '
      )
    else null
  end as CONSTITUENTANDMEMBERSREMAINDER,'

  end
  else
    set @GROUPFIELDCLAUSESQL = '
  null as CONSTITUENTANDMEMBERSGIFTAMOUNT,
  null as CONSTITUENTCURRENCYID,
  null as CONSTITUENTANDMEMBERSREMAINDER,'


  if @SHOWGROUPDATAFORMEMBERS = 1
  begin
    set @GROUPMEMBERJOIN = '
  from
    dbo.GROUPMEMBER GM
  inner join
    dbo.GROUPMEMBERDATERANGE GMDR on GM.ID = GMDR.GROUPMEMBERID
  inner join
    PLANNEDGIFTDESIGNATION_CTE GPGD on GPGD.CONSTITUENTID = GM.GROUPID
  where
    ' + @GROUPBYCLAUSE + '
    GM.MEMBERID = PGD.CONSTITUENTID and
    ((GMDR.DATEFROM is null and (GMDR.DATETO is null or GMDR.DATETO > @CURRENTDATEEARLIESTTIME))
      or (GMDR.DATETO is null and (GMDR.DATEFROM is null or GMDR.DATEFROM <= @CURRENTDATEEARLIESTTIME))
      or (GMDR.DATEFROM <= @CURRENTDATEEARLIESTTIME and GMDR.DATETO > @CURRENTDATEEARLIESTTIME))'

    set @GROUPJOIN = '
  from
    PLANNEDGIFTDESIGNATION_CTE GPGD
  where
    ' + @GROUPBYCLAUSE + '
    GPGD.CONSTITUENTID = PGD.CONSTITUENTID'

    set @GROUPFIELDCLAUSESQL = @GROUPFIELDCLAUSESQL + '
  case
    when PGD.ISGROUP = 0 then
      (
        select
          sum(coalesce(GPGD.PLANNEDGIFTDESIGNATIONAMOUNT, EXPECTEDGIFTAMOUNT))
        ' + @GROUPMEMBERJOIN + '
        ) + (
        select
          sum(coalesce(GPGD.PLANNEDGIFTDESIGNATIONAMOUNT, EXPECTEDGIFTAMOUNT))
        ' + @GROUPJOIN + '
      )
    else null
  end as CONSTITUENTANDGROUPSGIFTAMOUNT,

  case
    when PGD.ISGROUP = 0 then
      (
        select
          case @CURRENCYCODE
            when 0 then max(cast(GPGD.BASECURRENCYID as nvarchar(36)))
            when 1 then max(cast(dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY() as nvarchar(36)))
            when 2 then max(cast(GPGD.TRANSACTIONCURRENCYID as nvarchar(36)))
          end as CONSTITUENTCURRENCYID
        ' + @GROUPMEMBERJOIN + '
        having
          case @CURRENCYCODE
            when 0 then count(distinct(GPGD.BASECURRENCYID))
            when 2 then count(distinct(GPGD.TRANSACTIONCURRENCYID))
            else 1
          end = 1
      )
    else null
  end as CONSTITUENTGROUPCURRENCYID,

  case
    when PGD.ISGROUP = 0 then
      (
        select
          sum(GPGD.DESIGNATIONREMAINDERVALUE)
        ' + @GROUPMEMBERJOIN + '
        ) + (
        select
          sum(GPGD.DESIGNATIONREMAINDERVALUE)
        ' + @GROUPJOIN + '
      )
    else null
  end as CONSTITUENTANDGROUPSREMAINDER,'

  end
  else
    set @GROUPFIELDCLAUSESQL = @GROUPFIELDCLAUSESQL + '
  null as CONSTITUENTANDGROUPSGIFTAMOUNT,
  null as CONSTITUENTGROUPCURRENCYID,
  null as CONSTITUENTANDGROUPSREMAINDER,'

  set @SQLTOEXEC = @SQLTOEXEC + '

select
  PGD.PLANNEDGIFTID,
  PGD.CONSTITUENTID,
  PGD.NAME as CONSTITUENTNAME,
  PGD.GIFTDATE,
  PGD.VEHICLE as GIFTVEHICLE,
  PGD.VEHICLECODE as GIFTVEHICLECODE,
  PGD.DESIGNATIONNAME,
  PGD.DESIGNATIONVANITYNAME,
  PGD.DESIGNATIONID,
  coalesce(PGD.PLANNEDGIFTDESIGNATIONAMOUNT, PGD.PLANNEDGIFTAMOUNT) as GIFTAMOUNT,
  case DESIGNATIONNUMBER
    when 1 then
      round((round(PGD.DESIGNATIONREMAINDERVALUE, 2) + REMAINDERADJUST.REMAINDERVALUEADJUST), 2)
    else
      round(PGD.DESIGNATIONREMAINDERVALUE, 2)
  end as REMAINDERVALUE,
  PGD.EXPECTEDMATURITYYEAR,
  PGD.STATUS,
  PGD.STATUSCODE,
  PGD.SUBTYPE,
  PGD.PLANTYPE,
  null as PGDESIGNATIONID,
  PGD.PGCURRENCYID,
  PGD.CURRENCYSYMBOL,
  PGD.ISO4217 as CURRENCYISOCODE,
  PGD.DECIMALDIGITS as CURRENCYDECIMALCOUNT,
  PGD.SYMBOLDISPLAYSETTINGCODE as CURRENCYSYMBOLDISPLAY,
  ' + @GROUPFIELDCLAUSESQL + '
  ''http://www.blackbaud.com/PLANNEDGIFTLINK?PLANNEDGIFTLINK='' + CONVERT(nvarchar(36), PGD.PLANNEDGIFTID) as PLANNEDGIFTLINK,
  PGD.KEYNAME as KEYNAME,
  PGD.FIRSTNAME as FIRSTNAME,
  PGD.MIDDLENAME as MIDDLENAME
from
  PLANNEDGIFTDESIGNATION_CTE as PGD
inner join
(
  select
    TOTALREMAINDERVALUE - sum(round(DESIGNATIONREMAINDERVALUE, 2)) as REMAINDERVALUEADJUST,
    TOTALREMAINDERVALUE,
    PLANNEDGIFTID
  from
    PLANNEDGIFTDESIGNATION_CTE
  group by
    PLANNEDGIFTID, TOTALREMAINDERVALUE
) REMAINDERADJUST on REMAINDERADJUST.PLANNEDGIFTID = PGD.PLANNEDGIFTID
order by
  PGD.KEYNAME, PGD.FIRSTNAME'

  exec sp_executesql @SQLTOEXEC, N'@CURRENCYCODE tinyint, @CURRENTDATEEARLIESTTIME datetime, @SELECTIONID uniqueidentifier, @FROMDATE datetime, @TODATE datetime, @VEHICLECODE tinyint, @STATUSCODE tinyint, @CURRENTAPPUSERID uniqueidentifier, @APPUSER_IN_NOSECGROUPROLE bit, @APPUSER_IN_NOSITEROLE bit',
   @CURRENCYCODE, @CURRENTDATEEARLIESTTIME, @SELECTIONID, @FROMDATE, @TODATE, @VEHICLECODE, @STATUSCODE, @CURRENTAPPUSERID, @APPUSER_IN_NOSECGROUPROLE, @APPUSER_IN_NOSITEROLE;

  return 0;