USP_REPORT_PLEDGESTATUSANDANALYSIS

Parameters

Parameter Parameter Type Mode Description
@DISPLAYFILTER tinyint IN
@MONEYFILTER tinyint IN
@FILTERAMOUNT money IN
@HIGHFILTERAMOUNT money IN
@STARTDATE date IN
@ENDDATE date IN
@CURRENTAPPUSERID uniqueidentifier IN
@SITEFILTERMODE tinyint IN
@SITESSELECTED xml IN
@CURRENCYCODE tinyint IN
@DESIGNATIONID uniqueidentifier IN

Definition

Copy

create procedure dbo.USP_REPORT_PLEDGESTATUSANDANALYSIS
(
    @DISPLAYFILTER tinyint = 0,
    @MONEYFILTER tinyint = 0,
    @FILTERAMOUNT money = 0.0,
    @HIGHFILTERAMOUNT money = 0.0,
    @STARTDATE date = null,
    @ENDDATE date = null,
    @CURRENTAPPUSERID uniqueidentifier = null,
    @SITEFILTERMODE tinyint = 0,
    @SITESSELECTED xml = null,
    @CURRENCYCODE tinyint = null,
    @DESIGNATIONID uniqueidentifier = null
)
as
  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 @SELECTEDCURRENCYID uniqueidentifier;
  if coalesce(@CURRENCYCODE, 1) = 1
    set @SELECTEDCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
  else if @CURRENCYCODE = 3
    set @SELECTEDCURRENCYID = dbo.UFN_APPUSER_GETBASECURRENCY(@CURRENTAPPUSERID);

  declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
  declare @DECIMALDIGITS tinyint;
  declare @ROUNDINGTYPECODE tinyint;
  declare @ISOCODE nvarchar(3);
  declare @SYMBOLDISPLAYSETTINGCODE tinyint;
  declare @CURRENCYSYMBOL nvarchar(5);

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

  declare @USERGRANTEDTRANSACTIONPAGE bit = 0;
  declare @USERGRANTEDDESIGNATIONPAGE bit = 0;

  declare @ENDDATETIME datetime = dateadd(ms, 86399996, cast(@ENDDATE as datetime))

  if @ISADMIN = 1
  begin
    set @USERGRANTEDTRANSACTIONPAGE = 1;
    set @USERGRANTEDDESIGNATIONPAGE = 1;
  end
  else
  begin
    select
      @USERGRANTEDTRANSACTIONPAGE = [dbo].[UFN_SECURITY_APPUSER_GRANTED_FORM_IN_SYSTEMROLE](@CURRENTAPPUSERID, 'd00e6c42-2434-4d85-8a04-2323ca6bb2e7'),
      @USERGRANTEDDESIGNATIONPAGE = [dbo].[UFN_SECURITY_APPUSER_GRANTED_FORM_IN_SYSTEMROLE](@CURRENTAPPUSERID, '4EADC264-0A44-4DF5-8C8C-D89A1C48746C');
  end

  -- #774147 - Performance/Filter Changes

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

  create table #TMP_PLEDGES_SEMIFILTERED (
    ID uniqueidentifier not null,
    DATE datetime not null,
    CONSTITUENTID uniqueidentifier null,
    TRANSACTIONTYPECODE tinyint not null,
    TRANSACTIONCURRENCYID uniqueidentifier null,
    DELETEDON datetime null,
    GIVENANONYMOUSLY bit null,
    BASECURRENCYID uniqueidentifier null,
    TRANSACTIONAMOUNT money not null
  );

  insert into #TMP_PLEDGES_SEMIFILTERED
  select
    PLEDGE.ID,
    cast(PLEDGE.DATE as datetime),
    PLEDGE.CONSTITUENTID,
    PLEDGE.TYPECODE,
    case when PLEDGE.DELETEDON is null then PLEDGE.TRANSACTIONCURRENCYID else null end,
    PLEDGE.DELETEDON,
    null,
    null,
    PLEDGE.TRANSACTIONAMOUNT
  from dbo.FINANCIALTRANSACTION PLEDGE
  where
    (PLEDGE.TYPECODE = 1) and
    (@SITEFILTERMODE = 0
      or exists
      (
        select 1
        from dbo.UFN_SITEID_MAPFROM_REVENUEID_2(PLEDGE.ID) REVENUESITE
        inner join dbo.UFN_SITE_BUILDDATALISTSITEFILTER (@CURRENTAPPUSERID, @SITEFILTERMODE, @SITESSELECTED) SITEFILTER on REVENUESITE.SITEID = SITEFILTER.SITEID
      )
    ) and exists ( -- Site security filter

            select HASPERMISSION
            from dbo.UFN_SITEID_MAPFROM_REVENUEID_2(PLEDGE.ID) REVSITES
            cross apply dbo.UFN_REPORT_HASUSERSITEPERMISSION(@CURRENTAPPUSERID, 'cb0297d3-c8cf-4f43-b308-166d339e2f84', REVSITES.SITEID)
    );

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

  create table #TMP_PLEDGES_FILTERED (
    ID uniqueidentifier not null,
    DATE datetime not null,
    CONSTITUENTID uniqueidentifier null,
    TRANSACTIONTYPECODE tinyint not null,
    TRANSACTIONCURRENCYID uniqueidentifier null,
    DELETEDON datetime null,
    GIVENANONYMOUSLY bit null,
    BASECURRENCYID uniqueidentifier null
  );

  --Only pledges with a balance

  if @DISPLAYFILTER = 0
  begin
    insert into #TMP_PLEDGES_FILTERED
    select *
    from (
      select
          ID,
          DATE,
        CONSTITUENTID,
        TRANSACTIONTYPECODE,
        TRANSACTIONCURRENCYID,
        DELETEDON,
        GIVENANONYMOUSLY,
        BASECURRENCYID
      from #TMP_PLEDGES_SEMIFILTERED PLEDGE
      where (PLEDGE.DATE between @STARTDATE and @ENDDATETIME)
    ) PLEDGE
    where
      (
       ((@MONEYFILTER = 0) and (dbo.UFN_PLEDGE_GETBALANCEASOFINCURRENCY_2(PLEDGE.ID, @ENDDATETIME, @SELECTEDCURRENCYID) > @FILTERAMOUNT)) or
       ((@MONEYFILTER = 1) and (dbo.UFN_PLEDGE_GETBALANCEASOFINCURRENCY_2(PLEDGE.ID, @ENDDATETIME, @SELECTEDCURRENCYID) < @FILTERAMOUNT)) or
       ((@MONEYFILTER = 2) and (dbo.UFN_PLEDGE_GETBALANCEASOFINCURRENCY_2(PLEDGE.ID, @ENDDATETIME, @SELECTEDCURRENCYID) = @FILTERAMOUNT)) or
       ((@MONEYFILTER = 3) and (dbo.UFN_PLEDGE_GETBALANCEASOFINCURRENCY_2(PLEDGE.ID, @ENDDATETIME, @SELECTEDCURRENCYID) between @FILTERAMOUNT and @HIGHFILTERAMOUNT))
      );
  end
  --Only pledges that have been paid in full

  else if @DISPLAYFILTER = 1
  begin

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

    create table #TMP_PLEDGES_BALANCEASOF (
      PLEDGEID uniqueidentifier not null,
      ASOFBALANCE_ENDDATE money not null,
      ASOFBALANCE_STARTDATE money not null
    );

    insert into #TMP_PLEDGES_BALANCEASOF
    select
      PSF.ID,
      coalesce(ASOFAMOUNT_ENDDATE.AMOUNT, 0),
      coalesce(ASOFAMOUNT_STARTDATE.AMOUNT, 0)
    from #TMP_PLEDGES_SEMIFILTERED PSF
    left join ( --ASOFBALANCE - END DATE

      select
        PLEDGE.ID as PLEDGEID,
        PLEDGE.TRANSACTIONAMOUNT - (coalesce(ISPA.AMOUNT, 0) + coalesce(WOA.AMOUNT, 0)) as AMOUNT
      from #TMP_PLEDGES_SEMIFILTERED PLEDGE
        left join ( --INSTALLMENTSPLITPAYMENT AMOUNT - END DATE

          select
            #TMP_PLEDGES_SEMIFILTERED.ID as PLEDGEID,
            coalesce(sum(ISP.AMOUNT), 0) as AMOUNT
          from #TMP_PLEDGES_SEMIFILTERED
            left join dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.PLEDGEID = #TMP_PLEDGES_SEMIFILTERED.ID
            left join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on FTLI.ID = ISP.PAYMENTID
            left join dbo.FINANCIALTRANSACTION FT on FT.ID = FTLI.FINANCIALTRANSACTIONID
          where cast(FT.DATE as date) <= @ENDDATETIME
            and FTLI.TYPECODE <> 1
            and FTLI.DELETEDON is null
          group by #TMP_PLEDGES_SEMIFILTERED.ID
        ) ISPA on ISPA.PLEDGEID = PLEDGE.ID
        left join ( --WRITEOFF AMOUNT - END DATE

          select
            #TMP_PLEDGES_SEMIFILTERED.ID PLEDGEID,
            coalesce(sum(ISWO.TRANSACTIONAMOUNT), 0) AMOUNT
          from #TMP_PLEDGES_SEMIFILTERED
            left join dbo.INSTALLMENTSPLIT ISPLT on ISPLT.PLEDGEID = #TMP_PLEDGES_SEMIFILTERED.ID
            left join dbo.INSTALLMENTSPLITWRITEOFF ISWO on ISWO.INSTALLMENTSPLITID = ISPLT.ID
            left join dbo.WRITEOFF WO on WO.ID = ISWO.WRITEOFFID
          where WO.DATE <= @ENDDATETIME
          group by #TMP_PLEDGES_SEMIFILTERED.ID
        ) WOA on WOA.PLEDGEID = PLEDGE.ID
    ) ASOFAMOUNT_ENDDATE on ASOFAMOUNT_ENDDATE.PLEDGEID = PSF.ID
    left join ( --ASOFBALANCE - START DATE

      select
        PLEDGE.ID as PLEDGEID,
        PLEDGE.TRANSACTIONAMOUNT - (coalesce(ISPA.AMOUNT, 0) + coalesce(WOA.AMOUNT, 0)) as AMOUNT
      from #TMP_PLEDGES_SEMIFILTERED PLEDGE
        left join ( --INSTALLMENTSPLITPAYMENT AMOUNT - START DATE

          select
            #TMP_PLEDGES_SEMIFILTERED.ID PLEDGEID,
            coalesce(sum(ISP.AMOUNT), 0) AMOUNT
          from #TMP_PLEDGES_SEMIFILTERED
            left join dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.PLEDGEID = #TMP_PLEDGES_SEMIFILTERED.ID
            left join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on FTLI.ID = ISP.PAYMENTID
            left join dbo.FINANCIALTRANSACTION FT on FT.ID = FTLI.FINANCIALTRANSACTIONID
          where cast(FT.DATE as date) <= @STARTDATE
            and FTLI.TYPECODE <> 1
            and FTLI.DELETEDON is null
          group by #TMP_PLEDGES_SEMIFILTERED.ID
        ) ISPA on ISPA.PLEDGEID = PLEDGE.ID
        left join ( --WRITEOFF AMOUNT - END DATE

          select
            #TMP_PLEDGES_SEMIFILTERED.ID PLEDGEID,
            coalesce(sum(ISWO.TRANSACTIONAMOUNT), 0) AMOUNT
          from #TMP_PLEDGES_SEMIFILTERED
            left join dbo.INSTALLMENTSPLIT ISPLT on ISPLT.PLEDGEID = #TMP_PLEDGES_SEMIFILTERED.ID
            left join dbo.INSTALLMENTSPLITWRITEOFF ISWO on ISWO.INSTALLMENTSPLITID = ISPLT.ID
            left join dbo.WRITEOFF WO on WO.ID = ISWO.WRITEOFFID
          where WO.DATE <= @STARTDATE
          group by #TMP_PLEDGES_SEMIFILTERED.ID
        ) WOA on WOA.PLEDGEID = PLEDGE.ID
    ) ASOFAMOUNT_STARTDATE on ASOFAMOUNT_STARTDATE.PLEDGEID = PSF.ID;

    insert into #TMP_PLEDGES_FILTERED
    select
      PSF.ID,
      PSF.DATE,
      PSF.CONSTITUENTID,
      PSF.TRANSACTIONTYPECODE,
      PSF.TRANSACTIONCURRENCYID,
      PSF.DELETEDON,
      PSF.GIVENANONYMOUSLY,
      PSF.BASECURRENCYID
    from #TMP_PLEDGES_SEMIFILTERED PSF
      left join #TMP_PLEDGES_BALANCEASOF on #TMP_PLEDGES_BALANCEASOF.PLEDGEID = PSF.ID
    where
    --this will get pledges that had a balance as of the start date but have no balance at the end date

      (#TMP_PLEDGES_BALANCEASOF.ASOFBALANCE_ENDDATE = 0 and (#TMP_PLEDGES_BALANCEASOF.ASOFBALANCE_STARTDATE > 0 or (PSF.DATE between @STARTDATE and @ENDDATETIME and (#TMP_PLEDGES_BALANCEASOF.ASOFBALANCE_STARTDATE = 0))))
    and
    (
      ((@MONEYFILTER = 0) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PSF.ID, @SELECTEDCURRENCYID) > @FILTERAMOUNT)) or
      ((@MONEYFILTER = 1) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PSF.ID, @SELECTEDCURRENCYID) < @FILTERAMOUNT)) or
      ((@MONEYFILTER = 2) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PSF.ID, @SELECTEDCURRENCYID) = @FILTERAMOUNT)) or
      ((@MONEYFILTER = 3) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PSF.ID, @SELECTEDCURRENCYID) between @FILTERAMOUNT and @HIGHFILTERAMOUNT))
    );

    drop table #TMP_PLEDGES_BALANCEASOF;

  end
  --Only past due pledges

  else if @DISPLAYFILTER = 2
  begin
    insert into #TMP_PLEDGES_FILTERED
    select
      PSF.ID,
      PSF.DATE,
      PSF.CONSTITUENTID,
      PSF.TRANSACTIONTYPECODE,
      PSF.TRANSACTIONCURRENCYID,
      PSF.DELETEDON,
      PSF.GIVENANONYMOUSLY,
      PSF.BASECURRENCYID
    from #TMP_PLEDGES_SEMIFILTERED PSF
    --get past due amount by date - if it has a past due amount within the date-range, then include it in the set

    where (dbo.UFN_PLEDGE_GETPASTDUEAMOUNT_BYDATERANGE(PSF.ID, @STARTDATE, @ENDDATETIME) > 0)
      and (
        ((@MONEYFILTER = 0) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PSF.ID, @SELECTEDCURRENCYID) > @FILTERAMOUNT)) or
        ((@MONEYFILTER = 1) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PSF.ID, @SELECTEDCURRENCYID) < @FILTERAMOUNT)) or
        ((@MONEYFILTER = 2) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PSF.ID, @SELECTEDCURRENCYID) = @FILTERAMOUNT)) or
        ((@MONEYFILTER = 3) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PSF.ID, @SELECTEDCURRENCYID) between @FILTERAMOUNT and @HIGHFILTERAMOUNT))
      );
  end
  --Only pledges with write-offs @FILTERAMOUNT IS BASED ON THE WRITE OFF AMOUNT TOTAL

  else if @DISPLAYFILTER = 3
  begin
    if object_id('tempdb..#TMP_PLEDGES_WRITEOFF') is not null
      drop table #TMP_PLEDGES_WRITEOFF;

create table #TMP_PLEDGES_WRITEOFF (
      PLEDGEID uniqueidentifier not null,
      WRITEOFFAMOUNT money not null
    );

    insert into #TMP_PLEDGES_WRITEOFF
    select
      PLEDGE.ID,
      SUM(dbo.UFN_INSTALLMENTSPLITWRITEOFF_GETAMOUNTINCURRENCY(ISWO.ID, @SELECTEDCURRENCYID))
    from #TMP_PLEDGES_SEMIFILTERED PLEDGE
      inner join WRITEOFF WO on WO.REVENUEID = PLEDGE.ID
      inner join dbo.INSTALLMENTSPLITWRITEOFF ISWO on ISWO.WRITEOFFID = WO.ID
    where WO.DATE between @STARTDATE and @ENDDATETIME
    group by PLEDGE.ID;

    insert into #TMP_PLEDGES_FILTERED
    select
      PSF.ID,
      PSF.DATE,
      PSF.CONSTITUENTID,
      PSF.TRANSACTIONTYPECODE,
      PSF.TRANSACTIONCURRENCYID,
      PSF.DELETEDON,
      PSF.GIVENANONYMOUSLY,
      PSF.BASECURRENCYID
    from #TMP_PLEDGES_SEMIFILTERED PSF
    left join #TMP_PLEDGES_WRITEOFF PWO on PWO.PLEDGEID = PSF.ID
    where
      ((@MONEYFILTER = 0) and isnull(PWO.WRITEOFFAMOUNT, 0) > @FILTERAMOUNT) or
      ((@MONEYFILTER = 1) and isnull(PWO.WRITEOFFAMOUNT, 0) < @FILTERAMOUNT) or
      ((@MONEYFILTER = 2) and isnull(PWO.WRITEOFFAMOUNT, 0) = @FILTERAMOUNT) or
      ((@MONEYFILTER = 3) and isnull(PWO.WRITEOFFAMOUNT, 0) between @FILTERAMOUNT and @HIGHFILTERAMOUNT);

    drop table #TMP_PLEDGES_WRITEOFF;
  end
  --Only new pledges

  else if @DISPLAYFILTER = 4
  begin
    insert into #TMP_PLEDGES_FILTERED
    select
        PLEDGE.ID,
        PLEDGE.DATE,
      PLEDGE.CONSTITUENTID,
      PLEDGE.TRANSACTIONTYPECODE,
      PLEDGE.TRANSACTIONCURRENCYID,
      PLEDGE.DELETEDON,
      PLEDGE.GIVENANONYMOUSLY,
      PLEDGE.BASECURRENCYID
    from #TMP_PLEDGES_SEMIFILTERED PLEDGE
    where (PLEDGE.DATE between @STARTDATE and @ENDDATETIME)
      and (
          ((@MONEYFILTER = 0) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PLEDGE.ID, @SELECTEDCURRENCYID) > @FILTERAMOUNT)) or
        ((@MONEYFILTER = 1) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PLEDGE.ID, @SELECTEDCURRENCYID) < @FILTERAMOUNT)) or
        ((@MONEYFILTER = 2) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PLEDGE.ID, @SELECTEDCURRENCYID) = @FILTERAMOUNT)) or
        ((@MONEYFILTER = 3) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PLEDGE.ID, @SELECTEDCURRENCYID) between @FILTERAMOUNT and @HIGHFILTERAMOUNT))
      );
  end
  --All pledges (which ACTUALLY means new pledges in this time frame, any pledge with a write off during this time frame,

  --any pledge with payments in this time frame and any pledge with a balance in this time frame

  else if @DISPLAYFILTER = 5
  begin

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

    create table #TMP_PLEDGES_BALANCEASOF_D5 (
      PLEDGEID uniqueidentifier not null,
      ASOFBALANCE_STARTDATE money not null
    );

    insert into #TMP_PLEDGES_BALANCEASOF_D5
    select
      PSF.ID,
      coalesce(ASOFAMOUNT_STARTDATE.AMOUNT, 0)
    from #TMP_PLEDGES_SEMIFILTERED PSF
    left join ( --ASOFBALANCE - START DATE

      select
        PLEDGE.ID as PLEDGEID,
        PLEDGE.TRANSACTIONAMOUNT - (coalesce(ISPA.AMOUNT, 0) + coalesce(WOA.AMOUNT, 0)) as AMOUNT
      from #TMP_PLEDGES_SEMIFILTERED PLEDGE
        left join ( --INSTALLMENTSPLITPAYMENT AMOUNT - START DATE

          select
            #TMP_PLEDGES_SEMIFILTERED.ID PLEDGEID,
            coalesce(sum(ISP.AMOUNT), 0) AMOUNT
          from #TMP_PLEDGES_SEMIFILTERED
            left join dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.PLEDGEID = #TMP_PLEDGES_SEMIFILTERED.ID
            left join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on FTLI.ID = ISP.PAYMENTID
            left join dbo.FINANCIALTRANSACTION FT on FT.ID = FTLI.FINANCIALTRANSACTIONID
          where cast(FT.DATE as date) <= @STARTDATE
            and FTLI.TYPECODE <> 1
            and FTLI.DELETEDON is null
          group by #TMP_PLEDGES_SEMIFILTERED.ID
        ) ISPA on ISPA.PLEDGEID = PLEDGE.ID
        left join ( --WRITEOFF AMOUNT - END DATE

          select
            #TMP_PLEDGES_SEMIFILTERED.ID PLEDGEID,
            coalesce(sum(ISWO.TRANSACTIONAMOUNT), 0) AMOUNT
          from #TMP_PLEDGES_SEMIFILTERED
            left join dbo.INSTALLMENTSPLIT ISPLT on ISPLT.PLEDGEID = #TMP_PLEDGES_SEMIFILTERED.ID
            left join dbo.INSTALLMENTSPLITWRITEOFF ISWO on ISWO.INSTALLMENTSPLITID = ISPLT.ID
            left join dbo.WRITEOFF WO on WO.ID = ISWO.WRITEOFFID
          where WO.DATE <= @STARTDATE
          group by #TMP_PLEDGES_SEMIFILTERED.ID
        ) WOA on WOA.PLEDGEID = PLEDGE.ID
    ) ASOFAMOUNT_STARTDATE on ASOFAMOUNT_STARTDATE.PLEDGEID = PSF.ID;

    insert into #TMP_PLEDGES_FILTERED
    select
        ID,
        DATE,
      CONSTITUENTID,
      TRANSACTIONTYPECODE,
      TRANSACTIONCURRENCYID,
      DELETEDON,
      GIVENANONYMOUSLY,
      BASECURRENCYID
    from #TMP_PLEDGES_SEMIFILTERED PLEDGE
      left join #TMP_PLEDGES_BALANCEASOF_D5 on #TMP_PLEDGES_BALANCEASOF_D5.PLEDGEID = PLEDGE.ID
    where ((PLEDGE.DATE <= @ENDDATETIME) and ((#TMP_PLEDGES_BALANCEASOF_D5.ASOFBALANCE_STARTDATE > 0) or PLEDGE.DATE >= @STARTDATE))
      and (
          ((@MONEYFILTER = 0) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PLEDGE.ID, @SELECTEDCURRENCYID) > @FILTERAMOUNT)) or
        ((@MONEYFILTER = 1) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PLEDGE.ID, @SELECTEDCURRENCYID) < @FILTERAMOUNT)) or
        ((@MONEYFILTER = 2) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PLEDGE.ID, @SELECTEDCURRENCYID) = @FILTERAMOUNT)) or
        ((@MONEYFILTER = 3) and (dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(PLEDGE.ID, @SELECTEDCURRENCYID) between @FILTERAMOUNT and @HIGHFILTERAMOUNT))
      );

    drop table #TMP_PLEDGES_BALANCEASOF_D5;

  end

  drop table #TMP_PLEDGES_SEMIFILTERED;

  update #TMP_PLEDGES_FILTERED
  set
    #TMP_PLEDGES_FILTERED.BASECURRENCYID = case when #TMP_PLEDGES_FILTERED.DELETEDON is null then isnull(REVENUE_EXT.NONPOSTABLEBASECURRENCYID, V.BASECURRENCYID) else null end,
    #TMP_PLEDGES_FILTERED.GIVENANONYMOUSLY = REVENUE_EXT.GIVENANONYMOUSLY
  from
    #TMP_PLEDGES_FILTERED
    inner join dbo.REVENUE_EXT on #TMP_PLEDGES_FILTERED.ID = REVENUE_EXT.ID
    left outer join dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand) on #TMP_PLEDGES_FILTERED.ID = V.FINANCIALTRANSACTIONID;

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

  create table #TMP_PLEDGES_FILTERED_DATA (
    ID uniqueidentifier not null,
    DATE datetimeoffset not null,
    CONSTITUENTID uniqueidentifier null,
    TRANSACTIONTYPECODE tinyint not null,
    TRANSACTIONCURRENCYID uniqueidentifier null,
    GIVENANONYMOUSLY bit null,
    BASECURRENCYID uniqueidentifier null,
    INSTALLMENTID uniqueidentifier not null,
    INSTALLMENTDATE datetime not null,
    INSTALLMENTSPLITID uniqueidentifier not null,
    INSTALLMENTSPLITDESIGNATIONID uniqueidentifier not null,
    INSTALLMENTAMOUNT money not null
  );

  insert into #TMP_PLEDGES_FILTERED_DATA
  select
    PLEDGE.ID,
    PLEDGE.DATE,
    PLEDGE.CONSTITUENTID,
    PLEDGE.TRANSACTIONTYPECODE,
    PLEDGE.TRANSACTIONCURRENCYID,
    PLEDGE.GIVENANONYMOUSLY,
    PLEDGE.BASECURRENCYID,
    INSTALLMENT.ID,
    INSTALLMENT.DATE,
    INSTALLMENTSPLIT.ID,
    INSTALLMENTSPLIT.DESIGNATIONID,
    dbo.UFN_INSTALLMENTSPLIT_GETAMOUNTINCURRENCY(INSTALLMENTSPLIT.ID, @SELECTEDCURRENCYID)
  from #TMP_PLEDGES_FILTERED PLEDGE
    inner join dbo.INSTALLMENT on PLEDGE.ID = INSTALLMENT.REVENUEID
    inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLIT.INSTALLMENTID = INSTALLMENT.ID
  where (@DESIGNATIONID is null)
     or (@DESIGNATIONID is not null and INSTALLMENTSPLIT.DESIGNATIONID = @DESIGNATIONID);

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

  create table #TMP_PLEDGES_PAYMENTDATE (
    INSTALLMENTID uniqueidentifier not null,
    PAYMENTDATE datetime null
  );

  insert into #TMP_PLEDGES_PAYMENTDATE
  select 
    #TMP_PLEDGES_FILTERED_DATA.INSTALLMENTID,
    MAX(R.DATE)
  from #TMP_PLEDGES_FILTERED_DATA
    inner join dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.INSTALLMENTSPLITID = #TMP_PLEDGES_FILTERED_DATA.INSTALLMENTSPLITID
    inner join dbo.REVENUESPLIT RS on RS.ID = ISP.PAYMENTID
    inner join dbo.REVENUE R on R.ID = RS.REVENUEID
  where @ENDDATETIME >= R.DATE
  group by #TMP_PLEDGES_FILTERED_DATA.INSTALLMENTID;

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

  create table #TMP_PLEDGES_PAYMENTAMOUNT (
    INSTALLMENTSPLITID uniqueidentifier not null,
    PAYMENTAMOUNT money null
  );

  insert into #TMP_PLEDGES_PAYMENTAMOUNT
  select
    #TMP_PLEDGES_FILTERED_DATA.INSTALLMENTSPLITID,
    SUM(dbo.UFN_INSTALLMENTSPLITPAYMENT_GETAMOUNTINCURRENCY(ISP.ID, @SELECTEDCURRENCYID))
  from #TMP_PLEDGES_FILTERED_DATA
    inner join dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.INSTALLMENTSPLITID = #TMP_PLEDGES_FILTERED_DATA.INSTALLMENTSPLITID
    inner join dbo.REVENUESPLIT RS on RS.ID = ISP.PAYMENTID
    inner join dbo.REVENUE R on R.ID = RS.REVENUEID
  where @ENDDATETIME >= R.DATE
  group by #TMP_PLEDGES_FILTERED_DATA.INSTALLMENTSPLITID;

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

  create table #TMP_PLEDGES_WRITEOFFAMOUNT (
    INSTALLMENTSPLITID uniqueidentifier not null,
    WRITEOFFAMOUNT money null
  );

  insert into #TMP_PLEDGES_WRITEOFFAMOUNT
  select
    #TMP_PLEDGES_FILTERED_DATA.INSTALLMENTSPLITID,
    SUM(dbo.UFN_INSTALLMENTSPLITWRITEOFF_GETAMOUNTINCURRENCY(ISWO.ID, @SELECTEDCURRENCYID))
  from #TMP_PLEDGES_FILTERED_DATA
    inner join dbo.INSTALLMENTSPLITWRITEOFF ISWO on ISWO.INSTALLMENTSPLITID = #TMP_PLEDGES_FILTERED_DATA.INSTALLMENTSPLITID
    inner join dbo.WRITEOFF WO on WO.ID = ISWO.WRITEOFFID
  where @ENDDATETIME >= WO.DATE
  group by #TMP_PLEDGES_FILTERED_DATA.INSTALLMENTSPLITID;

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

  create table #TMP_PLEDGES_REMINDERSENTDATE (
    PLEDGEID uniqueidentifier not null,
    REMINDERSENTDATE datetime null
  );

  insert into #TMP_PLEDGES_REMINDERSENTDATE
  select
    #TMP_PLEDGES_FILTERED_DATA.ID,
    MAX(PLEDGEREMINDERSENT.SENTDATE) 
  from
    #TMP_PLEDGES_FILTERED_DATA
    inner join dbo.PLEDGEREMINDERSENT on PLEDGEREMINDERSENT.REVENUEID = #TMP_PLEDGES_FILTERED_DATA.ID
  group by #TMP_PLEDGES_FILTERED_DATA.ID;

  select
    PLEDGE.ID PLEDGEID,
    case when @USERGRANTEDTRANSACTIONPAGE = 1 then 'http://www.blackbaud.com/REVENUEID?REVENUEID=' + convert(nvarchar(36),PLEDGE.ID) else null end PLEDGELINK,
    CONSTITUENT.NAME CONSTITUENTNAME,
    CONSTITUENT.ID CONSTITUENTID,
    'http://www.blackbaud.com/CONSTITUENTID?CONSTITUENTID=' + convert(nvarchar(36),CONSTITUENT.ID) CONSTITUENTLINK,
    PHONE.NUMBER PHONENUMBER,
    ADDRESS.DESCRIPTION ADDRESSBLOCK,
    EMAILADDRESS.EMAILADDRESS EMAILADDRESS,
    DESIGNATION.NAME DESIGNATIONNAME,
    DESIGNATION.ID DESIGNATIONID,
    case when @USERGRANTEDDESIGNATIONPAGE = 1 then 'http://www.blackbaud.com/DESIGNATIONID?DESIGNATIONID=' + convert(nvarchar(36),DESIGNATION.ID) else null end DESIGNATIONLINK,
    PLEDGE.DATE DATEPLEDGED,
    PLEDGE.INSTALLMENTDATE INSTALLMENTDUEDATES,
    dbo.UFN_INSTALLMENTSPLIT_GETAMOUNTINCURRENCY(PLEDGE.INSTALLMENTSPLITID, @SELECTEDCURRENCYID) INSTALLMENTAMOUNT,
    PLEDGE.INSTALLMENTID INSTALLMENTID,
    #TMP_PLEDGES_PAYMENTDATE.PAYMENTDATE PAYMENTDATE,
    #TMP_PLEDGES_PAYMENTAMOUNT.PAYMENTAMOUNT PAYMENTAMOUNT,
    #TMP_PLEDGES_WRITEOFFAMOUNT.WRITEOFFAMOUNT WRITEOFFAMOUNT,
    #TMP_PLEDGES_REMINDERSENTDATE.REMINDERSENTDATE REMINDERSENTDATE,
    PLEDGE.BASECURRENCYID BASECURRENCYID,
    PLEDGE.TRANSACTIONCURRENCYID TRANSACTIONCURRENCYID,
    @ISOCODE PLEDGEISOCURRENCYCODE,
    @CURRENCYSYMBOL PLEDGECURRENCYSYMBOL,
    @SYMBOLDISPLAYSETTINGCODE PLEDGECURRENCYSYMBOLDISPLAYSETTINGCODE,
    @DECIMALDIGITS PLEDGEDECIMALDIGITS,
    case when RELATIONSHIP.ID is null then cast(0 as bit) else cast(1 as bit) end HASPRIMARYCONTACTINFO,      
    case when CONSTITUENT.ISORGANIZATION = 1 then PRIMARYCONTACTNAME.KEYNAME else null end PCLASTNAME,
    case when CONSTITUENT.ISORGANIZATION = 1 then PRIMARYCONTACTNAME.FIRSTNAME else null end PCFIRSTNAME,
    case when CONSTITUENT.ISORGANIZATION = 1 then PRIMARYCONTACTEMAIL.EMAILADDRESS else null end PCEMAIL,
    case when CONSTITUENT.ISORGANIZATION = 1 then PRIMARYCONTACTPHONE.NUMBER else null end PCPHONE,
    case when CONSTITUENT.ISORGANIZATION = 1 then PRIMARYCONTACTADDRESS.DESCRIPTION else null end PCADDRESSBLOCK,
    PLEDGE.GIVENANONYMOUSLY ANONYMOUS,
    CONSTITUENT.KEYNAME LASTNAME,
    CONSTITUENT.FIRSTNAME FIRSTNAME,
    CONSTITUENT.ISORGANIZATION ISORG
  from
    #TMP_PLEDGES_FILTERED_DATA PLEDGE
    inner join dbo.DESIGNATION on DESIGNATION.ID = PLEDGE.INSTALLMENTSPLITDESIGNATIONID
    inner join dbo.CONSTITUENT on CONSTITUENT.ID = PLEDGE.CONSTITUENTID

    left join dbo.ADDRESS on ADDRESS.CONSTITUENTID = CONSTITUENT.ID and ADDRESS.ISPRIMARY = 1
    left join dbo.PHONE on PHONE.CONSTITUENTID = CONSTITUENT.ID and PHONE.ISPRIMARY = 1
    left join dbo.EMAILADDRESS on EMAILADDRESS.CONSTITUENTID = CONSTITUENT.ID and EMAILADDRESS.ISPRIMARY = 1

    left join dbo.RELATIONSHIP on CONSTITUENT.ISORGANIZATION = 1 and RELATIONSHIP.RECIPROCALCONSTITUENTID = CONSTITUENT.ID and RELATIONSHIP.ISPRIMARYCONTACT = 1
    left join dbo.CONSTITUENT PRIMARYCONTACTNAME on CONSTITUENT.ISORGANIZATION = 1 and PRIMARYCONTACTNAME.ID = RELATIONSHIP.RELATIONSHIPCONSTITUENTID
    left join dbo.ADDRESS PRIMARYCONTACTADDRESS on CONSTITUENT.ISORGANIZATION = 1 and PRIMARYCONTACTADDRESS.CONSTITUENTID = RELATIONSHIP.RELATIONSHIPCONSTITUENTID and PRIMARYCONTACTADDRESS.ISPRIMARY = 1
    left join dbo.PHONE PRIMARYCONTACTPHONE on CONSTITUENT.ISORGANIZATION = 1 and RELATIONSHIP.RELATIONSHIPCONSTITUENTID = PRIMARYCONTACTPHONE.CONSTITUENTID and PRIMARYCONTACTPHONE.ISPRIMARY = 1
    left join dbo.EMAILADDRESS PRIMARYCONTACTEMAIL on CONSTITUENT.ISORGANIZATION = 1 and RELATIONSHIP.RELATIONSHIPCONSTITUENTID = PRIMARYCONTACTEMAIL.CONSTITUENTID and PRIMARYCONTACTEMAIL.ISPRIMARY = 1

    left join #TMP_PLEDGES_PAYMENTDATE on #TMP_PLEDGES_PAYMENTDATE.INSTALLMENTID = PLEDGE.INSTALLMENTID
    left join #TMP_PLEDGES_PAYMENTAMOUNT on #TMP_PLEDGES_PAYMENTAMOUNT.INSTALLMENTSPLITID = PLEDGE.INSTALLMENTSPLITID
    left join #TMP_PLEDGES_WRITEOFFAMOUNT on #TMP_PLEDGES_WRITEOFFAMOUNT.INSTALLMENTSPLITID = PLEDGE.INSTALLMENTSPLITID
    left join #TMP_PLEDGES_REMINDERSENTDATE on #TMP_PLEDGES_REMINDERSENTDATE.PLEDGEID = PLEDGE.ID
  where
    (   --constituent security  

      @ISADMIN = 1 or 
      @APPUSER_IN_NONRACROLE = 1 or
      dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, CONSTITUENT.ID, @APPUSER_IN_NOSECGROUPROLE) = 1
    );

  drop table #TMP_PLEDGES_FILTERED;
  drop table #TMP_PLEDGES_FILTERED_DATA;
  drop table #TMP_PLEDGES_PAYMENTDATE;
  drop table #TMP_PLEDGES_PAYMENTAMOUNT;
  drop table #TMP_PLEDGES_WRITEOFFAMOUNT;
  drop table #TMP_PLEDGES_REMINDERSENTDATE;