USP_REPORT_EVENTDONORS

Donors data source for the event revenue report.

Parameters

Parameter Parameter Type Mode Description
@EVENTID uniqueidentifier IN
@STARTDATE datetime IN
@ENDDATE datetime IN
@INCLUDESUBEVENTS bit IN
@CURRENCYCODE tinyint IN

Definition

Copy


      CREATE procedure dbo.USP_REPORT_EVENTDONORS
      (
        @EVENTID uniqueidentifier = null,
        @STARTDATE datetime = null,
        @ENDDATE datetime = null,
        @INCLUDESUBEVENTS bit = 0,
        @CURRENCYCODE tinyint = 0
      )
      as
      begin
        begin try
          declare @TOTALDONORS int = 0;
          declare @NEWDONORS int = 0;
          declare @RECURRINGDONORS int = 0;

          declare @TOTALAMOUNT money = 0;
          declare @NEWAMOUNT money = 0;
          declare @RECURRINGAMOUNT money = 0;

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

          declare @EVENTS table
          (
            ID uniqueidentifier
          );

          if @CURRENCYCODE = 0
            select @SELECTEDCURRENCYID = EVENT.BASECURRENCYID
            from dbo.EVENT
            where EVENT.ID = @EVENTID;
          else
            set @SELECTEDCURRENCYID = @ORGANIZATIONCURRENCYID;

          select
            @DECIMALDIGITS = CURRENCY.DECIMALDIGITS,
            @ROUNDINGTYPECODE = CURRENCY.ROUNDINGTYPECODE,
            @ISO4217 = CURRENCY.ISO4217,
            @CURRENCYSYMBOL = CURRENCY.CURRENCYSYMBOL,
            @SYMBOLDISPLAYSETTINGCODE = CURRENCY.SYMBOLDISPLAYSETTINGCODE
          from dbo.CURRENCY
          where CURRENCY.ID = @SELECTEDCURRENCYID;

          if @INCLUDESUBEVENTS = 0
          begin
            insert into @EVENTS
            select @EVENTID;
          end
          else begin
            insert into @EVENTS
            select RELATEDEVENT.ID
            from dbo.EVENTHIERARCHY as RELATEDEVENT
              inner join dbo.EVENTHIERARCHY as SOURCEEVENT on SOURCEEVENT.ID = @EVENTID
            where RELATEDEVENT.HIERARCHYPATH.IsDescendantOf(SOURCEEVENT.HIERARCHYPATH) = 1;
          end

          declare @EARLIESTEVENTTIME datetime;
          select @EARLIESTEVENTTIME = MIN(EVENT.STARTDATE)
          from @EVENTS EVENTS
            inner join dbo.EVENT on EVENTS.ID = EVENT.ID;

          -- Drop temp table if needed

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

          create table #REPORT_EVENTDONORS_REVENUE
          (
            ID uniqueidentifier,
            AMOUNT money
          );

          --Get all event registration amounts paid

          insert into #REPORT_EVENTDONORS_REVENUE
          select
            REGISTRANT.CONSTITUENTID,
            coalesce(RS.AMOUNTINCURRENCY, 0)
          from @EVENTS EVENTS
            inner join dbo.REGISTRANT on EVENTS.ID = REGISTRANT.EVENTID
            inner join dbo.EVENTREGISTRANTPAYMENT on REGISTRANT.ID = EVENTREGISTRANTPAYMENT.REGISTRANTID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on REVENUESPLIT.ID = EVENTREGISTRANTPAYMENT.PAYMENTID
            left join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID,@ORGANIZATIONCURRENCYID,@DECIMALDIGITS,@ROUNDINGTYPECODE) as RS on RS.ID = REVENUESPLIT.ID
          where 
            REVENUESPLIT.DELETEDON is null and
            REGISTRANT.EVENTID in (select ID from @EVENTS) and
            REGISTRANT.CONSTITUENTID is not null;

          --Get all event appeal donations from registrants

          insert into #REPORT_EVENTDONORS_REVENUE
          select
            REVENUE.CONSTITUENTID,
            coalesce(R.AMOUNTINCURRENCY, 0)
          from @EVENTS EVENTS
            inner join dbo.EVENTAPPEAL on EVENTS.ID = EVENTAPPEAL.EVENTID
            inner join dbo.REVENUE_EXT on EVENTAPPEAL.APPEALID = REVENUE_EXT.APPEALID
            inner join dbo.FINANCIALTRANSACTION REVENUE on REVENUE_EXT.ID = REVENUE.ID
            inner join dbo.REGISTRANT on REVENUE.CONSTITUENTID = REGISTRANT.CONSTITUENTID and EVENTAPPEAL.EVENTID = REGISTRANT.EVENTID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM on REVENUE.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
            inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
            left join dbo.UFN_REVENUE_GETAMOUNTSINCURRENCY_BULK(@SELECTEDCURRENCYID,@ORGANIZATIONCURRENCYID,@DECIMALDIGITS,@ROUNDINGTYPECODE) as R on R.ID = REVENUE.ID
          where
            REVENUE.DELETEDON is null and
            FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and
            EVENTAPPEAL.EVENTID in (select ID from @EVENTS) and
            --Event registration donation doesn't need to be added because it's already counted in payment

            (
              REVENUE.TYPECODE in (0,1,3) and
              REVENUESPLIT_EXT.APPLICATIONCODE in (0,4)
            );

          --Get all event appeal donations from non-registrants

          insert into #REPORT_EVENTDONORS_REVENUE
          select
            REVENUE.CONSTITUENTID,
            coalesce(R.AMOUNTINCURRENCY, 0)
          from @EVENTS EVENTS
            inner join dbo.EVENTAPPEAL on EVENTS.ID = EVENTAPPEAL.EVENTID
            inner join dbo.REVENUE_EXT on EVENTAPPEAL.APPEALID = REVENUE_EXT.APPEALID
            inner join dbo.FINANCIALTRANSACTION REVENUE on REVENUE_EXT.ID = REVENUE.ID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM on REVENUE.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
            inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
            left join dbo.UFN_REVENUE_GETAMOUNTSINCURRENCY_BULK(@SELECTEDCURRENCYID,@ORGANIZATIONCURRENCYID,@DECIMALDIGITS,@ROUNDINGTYPECODE) as R on R.ID = REVENUE.ID
          where
            REVENUE.DELETEDON is null and
            FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and
            EVENTAPPEAL.EVENTID in (select ID from @EVENTS) and
            REVENUE.CONSTITUENTID not in 
            (
              select CONSTITUENTID
              from @EVENTS EVENTS
                inner join dbo.REGISTRANT on EVENTS.ID = REGISTRANT.EVENTID
              where
                EVENTID in (select ID from @EVENTS) and
                CONSTITUENTID is not null
            ) and
            --Event registration donation doesn't need to be added because it's already counted in payment

            (
              REVENUE.TYPECODE in (0,1,3) and
              REVENUESPLIT_EXT.APPLICATIONCODE  in (0,4)
            );

          -- Drop temp table if needed

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

          create table #REPORT_EVENTDONORS_RECURRINGIDS
          (
            ID uniqueidentifier
          );

          --Determine if any of the registrants who have paid their registration are a recurring donor

          insert into #REPORT_EVENTDONORS_RECURRINGIDS
          select distinct REGISTRANT.CONSTITUENTID
          from dbo.EVENTREGISTRANTPAYMENT
            inner join dbo.REGISTRANT on EVENTREGISTRANTPAYMENT.REGISTRANTID = REGISTRANT.ID
            inner join dbo.REGISTRANT CURRENTEVENT on 
              REGISTRANT.CONSTITUENTID = CURRENTEVENT.CONSTITUENTID and
              CURRENTEVENT.EVENTID in (select ID from @EVENTS) and
              CURRENTEVENT.CONSTITUENTID is not null
          where
            REGISTRANT.EVENTID not in (select ID from @EVENTS) and
            REGISTRANT.DATEADDED < CURRENTEVENT.DATEADDED;

          --Determine if any registrants who have donated to the event appeal are recurring donors

          insert into #REPORT_EVENTDONORS_RECURRINGIDS
          select distinct REVENUE.CONSTITUENTID
          from @EVENTS EVENTS
            inner join dbo.REGISTRANT on EVENTS.ID = REGISTRANT.EVENTID
            inner join dbo.FINANCIALTRANSACTION REVENUE on REGISTRANT.CONSTITUENTID = REVENUE.CONSTITUENTID
          where
            REVENUE.DELETEDON is null and
            REVENUE.ID not in
            (
              select FINANCIALTRANSACTION.ID
              from dbo.FINANCIALTRANSACTION
                inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
                inner join dbo.EVENTAPPEAL on REVENUE_EXT.APPEALID = EVENTAPPEAL.APPEALID
                inner join dbo.REGISTRANT on  REVENUE.CONSTITUENTID = REGISTRANT.CONSTITUENTID and EVENTAPPEAL.EVENTID = REGISTRANT.EVENTID
                inner join dbo.EVENT on REGISTRANT.EVENTID = EVENT.ID
            ) and
            REGISTRANT.EVENTID in (select ID from @EVENTS) and
            REVENUE.DATE < @EARLIESTEVENTTIME and
            REVENUE.CONSTITUENTID not in (select ID from #REPORT_EVENTDONORS_RECURRINGIDS);

          --Determine if any non-registrant who has donated to the event appeal is a recurring donor

          insert into #REPORT_EVENTDONORS_RECURRINGIDS
          select distinct REVENUE.CONSTITUENTID
          from #REPORT_EVENTDONORS_REVENUE CONSTITUENTS
            inner join dbo.FINANCIALTRANSACTION REVENUE on CONSTITUENTS.ID = REVENUE.CONSTITUENTID
          where
            REVENUE.ID not in
            (
              select CURRENTREVENUE.ID
              from @EVENTS EVENTS
                inner join dbo.EVENTAPPEAL on EVENTS.ID = EVENTAPPEAL.EVENTID
                inner join dbo.REVENUE_EXT on EVENTAPPEAL.APPEALID = REVENUE_EXT.APPEALID
                inner join dbo.FINANCIALTRANSACTION CURRENTREVENUE on REVENUE_EXT.ID = CURRENTREVENUE.ID
              where
                EVENTAPPEAL.EVENTID in (select ID from @EVENTS) and
                CURRENTREVENUE.CONSTITUENTID not in
                (
                  select REGISTRANT.CONSTITUENTID
                  from @EVENTS EVENTS
                    inner join dbo.REGISTRANT on EVENTS.ID = REGISTRANT.EVENTID
                  where
                    REGISTRANT.EVENTID in (select ID from @EVENTS) and
                    REGISTRANT.CONSTITUENTID is not null
                )
            ) and
            REVENUE.DATE < @EARLIESTEVENTTIME and
            REVENUE.CONSTITUENTID not in (select ID from #REPORT_EVENTDONORS_RECURRINGIDS) and
            REVENUE.CONSTITUENTID in (select ID from #REPORT_EVENTDONORS_REVENUE);

          -- Drop temp table if needed

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

          create  table #REPORT_EVENTDONORS_RECURRINGREVENUE
          (
            ID uniqueidentifier,
            AMOUNT money
          );

          insert into #REPORT_EVENTDONORS_RECURRINGREVENUE
          select
            REGISTRANT.CONSTITUENTID,
            coalesce(RS.AMOUNTINCURRENCY, 0.0)
          from dbo.EVENTREGISTRANTPAYMENT
            inner join dbo.REGISTRANT on EVENTREGISTRANTPAYMENT.REGISTRANTID = REGISTRANT.ID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on REVENUESPLIT.ID = EVENTREGISTRANTPAYMENT.PAYMENTID
            left join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID,@ORGANIZATIONCURRENCYID,@DECIMALDIGITS,@ROUNDINGTYPECODE) as RS on RS.ID = REVENUESPLIT.ID
          where
            REVENUESPLIT.DELETEDON is null and
            REGISTRANT.EVENTID in (select ID from @EVENTS) and
            REGISTRANT.CONSTITUENTID is not null and
            REGISTRANT.CONSTITUENTID in (select ID from #REPORT_EVENTDONORS_RECURRINGIDS);

          insert into #REPORT_EVENTDONORS_RECURRINGREVENUE
          select
            REGISTRANT.CONSTITUENTID,
            coalesce(R.AMOUNTINCURRENCY, 0.0)
          from @EVENTS EVENTS
            inner join dbo.EVENTAPPEAL on EVENTS.ID = EVENTAPPEAL.EVENTID
            inner join dbo.REGISTRANT on EVENTAPPEAL.EVENTID = REGISTRANT.EVENTID
            inner join #REPORT_EVENTDONORS_RECURRINGIDS CONSTITUENTS on REGISTRANT.CONSTITUENTID = CONSTITUENTS.ID
            inner join dbo.REVENUE_EXT on EVENTAPPEAL.APPEALID = REVENUE_EXT.APPEALID
            inner join dbo.FINANCIALTRANSACTION REVENUE on REVENUE_EXT.ID = REVENUE.ID and REGISTRANT.CONSTITUENTID = REVENUE.CONSTITUENTID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM on REVENUE.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
            inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
            left join dbo.UFN_REVENUE_GETAMOUNTSINCURRENCY_BULK(@SELECTEDCURRENCYID,@ORGANIZATIONCURRENCYID,@DECIMALDIGITS,@ROUNDINGTYPECODE) as R on R.ID = REVENUE.ID
          where
            REVENUE.DELETEDON is null and
            FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and
            REGISTRANT.EVENTID in (select ID from @EVENTS) and
            REGISTRANT.CONSTITUENTID is not null and
            --Event registration donation doesn't need to be added because it's already counted in payment

            (
              REVENUE.TYPECODE in (0,1,3) and
              REVENUESPLIT_EXT.APPLICATIONCODE  in (0,3,4)
            );

          insert into #REPORT_EVENTDONORS_RECURRINGREVENUE
          select
            REVENUE.CONSTITUENTID,
            coalesce(R.AMOUNTINCURRENCY, 0)
          from @EVENTS EVENTS
            inner join dbo.EVENTAPPEAL on EVENTS.ID = EVENTAPPEAL.EVENTID
            inner join dbo.REVENUE_EXT on EVENTAPPEAL.APPEALID = REVENUE_EXT.APPEALID
            inner join dbo.FINANCIALTRANSACTION REVENUE on REVENUE_EXT.ID = REVENUE.ID
            inner join #REPORT_EVENTDONORS_RECURRINGIDS CONSTITUENTS on REVENUE.CONSTITUENTID = CONSTITUENTS.ID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM on REVENUE.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
            inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
            left join dbo.UFN_REVENUE_GETAMOUNTSINCURRENCY_BULK(@SELECTEDCURRENCYID,@ORGANIZATIONCURRENCYID,@DECIMALDIGITS,@ROUNDINGTYPECODE) as R on R.ID = REVENUE.ID
          where
            REVENUE.DELETEDON is null and
            FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and
            EVENTAPPEAL.EVENTID in (select ID from @EVENTS) and
            REVENUE.CONSTITUENTID in (select ID from #REPORT_EVENTDONORS_RECURRINGIDS) and
            REVENUE.CONSTITUENTID not in
            (
              select CONSTITUENTID
              from @EVENTS EVENTS
                inner join dbo.REGISTRANT on EVENTS.ID = REGISTRANT.EVENTID
              where
                EVENTID in (select ID from @EVENTS) and
                CONSTITUENTID is not null
            ) and
            --Event registration donation doesn't need to be added because it's already counted in payment

            (
              REVENUE.TYPECODE in (0,1,3) and
              REVENUESPLIT_EXT.APPLICATIONCODE  in (0,3,4)
            );

          select
            @TOTALDONORS = coalesce(count(distinct ID), 0),
            @TOTALAMOUNT = coalesce(SUM(AMOUNT), 0)
          from #REPORT_EVENTDONORS_REVENUE;

          select 
            @RECURRINGDONORS = coalesce(COUNT(distinct ID), 0),
            @RECURRINGAMOUNT = coalesce(SUM(AMOUNT), 0)
          from #REPORT_EVENTDONORS_RECURRINGREVENUE;

          set @NEWDONORS = @TOTALDONORS - @RECURRINGDONORS;
          set @NEWAMOUNT = @TOTALAMOUNT - @RECURRINGAMOUNT;

          drop table #REPORT_EVENTDONORS_REVENUE;
          drop table #REPORT_EVENTDONORS_RECURRINGIDS;
          drop table #REPORT_EVENTDONORS_RECURRINGREVENUE;

          select
            @NEWDONORS as NEWDONORS,
            @NEWAMOUNT as NEWAMOUNT,
            case
              when @NEWDONORS = 0 then 0
              else @NEWAMOUNT / @NEWDONORS
            end as NEWAVG,
            @RECURRINGDONORS as RECURRINGDONORS,
            @RECURRINGAMOUNT as RECURRINGAMOUNT,
            case
              when @RECURRINGDONORS = 0 then 0
              else @RECURRINGAMOUNT / @RECURRINGDONORS
            end as RECURRINGAVG,
            @NEWDONORS + @RECURRINGDONORS as TOTALDONORS,
            @ISO4217 [ISOCURRENCYCODE],
            @CURRENCYSYMBOL [CURRENCYSYMBOL],
            @SYMBOLDISPLAYSETTINGCODE [CURRENCYSYMBOLDISPLAYSETTINGCODE],
            @DECIMALDIGITS [DECIMALDIGITS];
        end try
        begin catch
          exec dbo.USP_RAISE_ERROR;
          return 1;
        end catch

        return 0;
      end