USP_REVENUEBATCH_CONSTITUENTCOMMITMENT

Parameters

Parameter Parameter Type Mode Description
@CONSTITUENTID1 uniqueidentifier IN
@CONSTITUENTLOOKUPID uniqueidentifier IN
@CURRENTAPPUSERID uniqueidentifier IN
@SECURITYFEATUREID uniqueidentifier IN
@SECURITYFEATURETYPE tinyint IN
@PAYINGPENDINGREVENUEID uniqueidentifier IN
@COMMITMENTID nvarchar(60) IN
@PDACCOUNTSYSTEMID uniqueidentifier IN
@BATCHREVENUEROWID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_REVENUEBATCH_CONSTITUENTCOMMITMENT
(
  @CONSTITUENTID1 uniqueidentifier = null,
  @CONSTITUENTLOOKUPID uniqueidentifier = null,
  @CURRENTAPPUSERID uniqueidentifier = null,
  @SECURITYFEATUREID uniqueidentifier = null,
  @SECURITYFEATURETYPE tinyint = null,
  @PAYINGPENDINGREVENUEID uniqueidentifier = null,
  @COMMITMENTID nvarchar(60) = null,
  @PDACCOUNTSYSTEMID uniqueidentifier = null,
  @BATCHREVENUEROWID uniqueidentifier = null
)
as
  set nocount on;

  if @PDACCOUNTSYSTEMID is null
    set @PDACCOUNTSYSTEMID = dbo.UFN_PDACCOUNTSYSTEM_GETDEFAULTSYSTEMIDSFORUSER(@CURRENTAPPUSERID);

  -- Fall back to the system default if the above doesn't work

  if @PDACCOUNTSYSTEMID is null
    set @PDACCOUNTSYSTEMID = '4B121C2C-CCE6-440D-894C-EA0DEF80D50B';

  declare @APPUSERISSYSADMIN bit = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);

  --If the constituent pays on another constituents commitments we need to get the

  --ID of the other constituent so we can get their commitment information

  declare @CONSTITUENTID uniqueidentifier;
  declare @PAYERID uniqueidentifier;
  declare @SINGLEAPPLICATIONID uniqueidentifier = null;

  set @PAYERID = coalesce(@CONSTITUENTID1, @CONSTITUENTLOOKUPID);

  if len(@COMMITMENTID) >= 39
  begin
    set @CONSTITUENTID = dbo.UFN_REVENUEBATCH_GETCONSTITUENTFOROTHERCOMMITEMENT(@COMMITMENTID);

    if @CONSTITUENTID is null
      set @CONSTITUENTID = coalesce(@CONSTITUENTID1, @CONSTITUENTLOOKUPID);

    select
      @SINGLEAPPLICATIONID = SINGLEAPPLICATIONID
    from
      dbo.UFN_REVENUEBATCH_PARSEAPPLICATIONINFO(@COMMITMENTID);
  end
  else
  begin
    set @CONSTITUENTID = coalesce(@CONSTITUENTID1, @CONSTITUENTLOOKUPID);
  end

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

  create table #REVENUEBATCH_CONSTITUENTCOMMITMENT_CONSTITIDS 
  (
    ID uniqueidentifier
  );

  declare @SITES table (SITEID uniqueidentifier);

  if @APPUSERISSYSADMIN = 1 
    or exists(
      select SYSTEMROLEAPPUSER.ID 
      from dbo.SYSTEMROLEAPPUSER 
      where SYSTEMROLEAPPUSER.APPUSERID = @CURRENTAPPUSERID and SYSTEMROLEAPPUSER.SECURITYMODECODE = 0
    )
  begin
    insert into @SITES(SITEID)
    values(null);

    insert into @SITES(SITEID) 
    select SITE.ID from dbo.SITE;
  end
  else
  begin
    if exists(select 1 from dbo.SYSTEMROLEAPPUSER where APPUSERID = @CURRENTAPPUSERID and SECURITYMODECODE = 1)
    begin
      insert into @SITES(SITEID)
      values(null);
    end

    insert into @SITES(SITEID)
    select distinct SITEID 
    from dbo.SITEPERMISSION 
    where SITEPERMISSION.APPUSERID = @CURRENTAPPUSERID;
  end

    declare @CURRENTDATE datetime;
    set @CURRENTDATE = dbo.UFN_DATE_GETEARLIESTTIME(getdate());            

    declare @HOUSEHOLDSCANBEDONORS bit;
    set @HOUSEHOLDSCANBEDONORS = dbo.UFN_INSTALLATIONINFO_GETHOUSEHOLDSCANBEDONORS();

    declare @HOUSEHOLDID uniqueidentifier;
    select top(1
      @HOUSEHOLDID = GROUPMEMBER.GROUPID
    from dbo.GROUPMEMBER
    left join dbo.GROUPDATA on GROUPDATA.ID = GROUPMEMBER.GROUPID
    where GROUPMEMBER.MEMBERID = @CONSTITUENTID
    and GROUPDATA.GROUPTYPECODE = 0
    and dbo.UFN_GROUPMEMBER_ISCURRENTMEMBER(GROUPMEMBER.ID) = 1
    and @HOUSEHOLDSCANBEDONORS = 1;            

    declare @BASECONSTITUENTID uniqueidentifier;
    select
      @BASECONSTITUENTID =
      case
        when dbo.UFN_CONSTITUENT_ISHOUSEHOLD(@CONSTITUENTID) = 1 
          then
          case 
            when @HOUSEHOLDSCANBEDONORS = 1 
              then @CONSTITUENTID 
          else
            null
          end
        else
          @CONSTITUENTID
      end;

    -- include (1) the constituent, (2) the household a constituent is a member of, (3) members of that household, (4) members of the constituent if it is a household

    insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_CONSTITIDS(ID)
    (
      select @HOUSEHOLDID as ID
      where @HOUSEHOLDID is not null

      union all

      select @BASECONSTITUENTID as ID
      where @BASECONSTITUENTID is not null

      union all

      select 
        GROUPMEMBER.MEMBERID as ID
      from dbo.GROUPMEMBER
      left join dbo.GROUPMEMBERDATERANGE on GROUPMEMBER.ID = GROUPMEMBERDATERANGE.GROUPMEMBERID
      where
        (GROUPMEMBER.MEMBERID <> @CONSTITUENTID) and
        (
          GROUPMEMBER.GROUPID = @HOUSEHOLDID or
          GROUPMEMBER.GROUPID = @CONSTITUENTID
        )
        and
          (GROUPMEMBERDATERANGE.DATEFROM is null or GROUPMEMBERDATERANGE.DATEFROM <= @CURRENTDATE)
        and
          (GROUPMEMBERDATERANGE.DATETO is null or GROUPMEMBERDATERANGE.DATETO > @CURRENTDATE)
    );

  /*
      The VALUE column holds a string that contains a coded application type as an integer.
      Those application types are:
      0 - Not an application (Donation, Other, Unapplied matching gift payment, etc.)
      1 - Sponsorship
      2 - Membership
      3 - Order/Reservation
      4 - Recurring gift
      5 - Pledge
      6 - Planned gift
      7 - Event registration
      8 - Matching gift claim
      9 - Grant award
      10 - Donor challenge
      These are also defined by the ApplicationInfo class in RevenueBatchHelper.vb.
  */

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

  create table #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL
  (
    ID nvarchar(60) collate database_default,
    TYPECODE tinyint,
    CONSTITUENTID uniqueidentifier,
    CONSTITUENTNAME nvarchar(255) collate database_default,
    DATE date,
    AMOUNT money,
    CURRENCYID uniqueidentifier,
    DESIGNATIONLIST nvarchar(max) collate database_default,
    APPLICATIONCONSTITUENTID uniqueidentifier,
    APPLICATIONCONSTITUENTNAME nvarchar(255) collate database_default,
    MEMBERSHIPPROGRAMNAME nvarchar(255) collate database_default,
    MEMBERSHIPLEVELNAME nvarchar(255) collate database_default,
    EVENTNAME nvarchar(255) collate database_default,
    ISSPONSORSHIPRECURRINGGIFT bit,
    SEQUENCE tinyint
  );

  -- 1. Sponsorships

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

  create table #REVENUEBATCH_CONSTITUENTCOMMITMENT_POTENTIALSPONSORSHIPREVENUE
  (    
    ID uniqueidentifier, 
    TRANSACTIONAMOUNT money,
    CONSTITUENTID uniqueidentifier,
    TRANSACTIONCURRENCYID uniqueidentifier
  )

  insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_POTENTIALSPONSORSHIPREVENUE (ID, TRANSACTIONAMOUNT, CONSTITUENTID, TRANSACTIONCURRENCYID)
  select REVENUE.ID, TRANSACTIONAMOUNT, CONSTITUENTID, TRANSACTIONCURRENCYID
  from dbo.FINANCIALTRANSACTION as REVENUE
  inner join #REVENUEBATCH_CONSTITUENTCOMMITMENT_CONSTITIDS C on C.ID = REVENUE.CONSTITUENTID
  where 
    REVENUE.TYPECODE = 2 and
    REVENUE.DELETEDON is null and
    REVENUE.TRANSACTIONAMOUNT > 0 and
    exists(select 'x' from dbo.FINANCIALTRANSACTIONLINEITEM ftli inner join dbo.REVENUESPLIT_EXT rse on rse.ID = ftli.ID where ftli.FINANCIALTRANSACTIONID = REVENUE.ID and rse.TYPECODE = 9)

  insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL(ID, TYPECODE, CONSTITUENTID, DATE, AMOUNT, CURRENCYID, APPLICATIONCONSTITUENTNAME)
  select
    REVENUE.ID,
    1,
    REVENUE.CONSTITUENTID,
    REVENUESCHEDULE.NEXTTRANSACTIONDATE,
    REVENUE.TRANSACTIONAMOUNT,
    REVENUE.TRANSACTIONCURRENCYID,
    (
      select top 1 
        coalesce(
          (select NAME from dbo.SPONSORSHIPOPPORTUNITYCHILD where ID=S.SPONSORSHIPOPPORTUNITYID),
          (select NAME from dbo.SPONSORSHIPOPPORTUNITYPROJECT where ID = S.SPONSORSHIPOPPORTUNITYID)
        ) SPONSORSHIPOPPORTUNITY
      from dbo.FINANCIALTRANSACTIONLINEITEM SP
      inner join dbo.SPONSORSHIP S on S.REVENUESPLITID = SP.ID
      inner join dbo.SPONSORSHIPOPPORTUNITY SO on SO.ID = S.SPONSORSHIPOPPORTUNITYID
      where SP.FINANCIALTRANSACTIONID = REVENUE.ID
      and S.STATUSCODE = 1
    )
  from #REVENUEBATCH_CONSTITUENTCOMMITMENT_POTENTIALSPONSORSHIPREVENUE as REVENUE
  inner join
    dbo.REVENUESCHEDULE on REVENUE.ID = REVENUESCHEDULE.ID
  where
    REVENUESCHEDULE.STATUSCODE in (0,5) and
    REVENUESCHEDULE.ISPENDING = 0 and
    (
      @APPUSERISSYSADMIN = 1 or
      exists
      (
        select 1 from @SITES S
        left outer join dbo.UFN_SITEID_MAPFROM_REVENUEID(REVENUE.ID) SITE on SITE.SITEID = S.SITEID 
        where S.SITEID=SITE.SITEID or (S.SITEID is null and SITE.SITEID is null)
      )
    );

  -- 3. Order/Reservation, 5. Pledge, 6. Planned gift, 8. Matching gift claim, 9. Grant award, 10 Donor challenge

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

  create table #REVENUEBATCH_CONSTITUENTCOMMITMENT_POTENTIALPLEDGEREVENUE
  (
    ID uniqueidentifier,
    TYPECODE tinyint,
    TRANSACTIONCURRENCYID uniqueidentifier,
    CONSTITUENTID uniqueidentifier,
    PDACCOUNTSYSTEMID uniqueidentifier,
    BALANCE money,
    DATE datetime,
    INSTALLMENTID uniqueidentifier
  )

    --For performance reasons, use a temp table for all potential constituent revenue.


    insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_POTENTIALPLEDGEREVENUE (ID, TYPECODE, TRANSACTIONCURRENCYID, CONSTITUENTID, PDACCOUNTSYSTEMID, BALANCE, DATE, INSTALLMENTID)
    select
        RES.ID, RES.TYPECODE, RES.TRANSACTIONCURRENCYID, RES.CONSTITUENTID, RES.PDACCOUNTSYSTEMID, NEXTINSTALLMENT.BALANCE, NEXTINSTALLMENT.DATE, NEXTINSTALLMENT.ID
    from
    (
        select
            FT.ID,
            C.ID CONSTITUENTID,
            FT.TYPECODE,
            FT.TRANSACTIONCURRENCYID,
            FT.PDACCOUNTSYSTEMID,
            FT.TRANSACTIONAMOUNT - isnull(sum(SPLITS.AMOUNT),0) BALANCE
        from
            #REVENUEBATCH_CONSTITUENTCOMMITMENT_CONSTITIDS C
        inner join 
            dbo.FINANCIALTRANSACTION FT    on C.ID = FT.CONSTITUENTID
        left join 
            dbo.INSTALLMENT INSTALLMENTS on INSTALLMENTS.REVENUEID = FT.ID
        left join (
            select 
                isnull(sum(ISP.AMOUNT),0) AMOUNT,
                ISPLIT.INSTALLMENTID
            from 
                dbo.INSTALLMENTSPLIT ISPLIT 
            inner join 
                dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.INSTALLMENTSPLITID = ISPLIT.ID
            group by
                ISPLIT.INSTALLMENTID
            union all
            select 
                isnull(sum(ISW.AMOUNT),0) AMOUNT,
                ISPLIT.INSTALLMENTID
            from 
                dbo.INSTALLMENTSPLIT ISPLIT 
            inner join 
                dbo.INSTALLMENTSPLITWRITEOFF ISW on ISW.INSTALLMENTSPLITID = ISPLIT.ID
            group by
                ISPLIT.INSTALLMENTID) as SPLITS on SPLITS.INSTALLMENTID = INSTALLMENTS.ID
        where 
        FT.DELETEDON is null
        group by FT.ID, C.ID, TYPECODE, FT.TRANSACTIONCURRENCYID, FT.PDACCOUNTSYSTEMID, FT.TRANSACTIONAMOUNT 

    ) RES

    outer apply (
        select
            top 1 INSTALLMENTS.ID,
            INSTALLMENTS.[DATE],
            sum(INSTALLMENTS.TRANSACTIONAMOUNT) - isnull(sum(SUMMEDSPLITS.AMOUNT),0) BALANCE
        from
            dbo.INSTALLMENT INSTALLMENTS
        left join (
            select
                sum(SPLITS.AMOUNT) as AMOUNT,
                SPLITS.ID 
                from 
                (
                    select 
                        isnull(sum(ISP.AMOUNT),0) as AMOUNT,
                        ISPLIT.INSTALLMENTID as ID
                    from 
                        dbo.INSTALLMENTSPLIT ISPLIT 
                    inner join 
                        dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.INSTALLMENTSPLITID = ISPLIT.ID
                    group by
                        ISPLIT.INSTALLMENTID
                    union all
                    select 
                        isnull(sum(ISW.AMOUNT),0) as AMOUNT,
                        ISPLIT.INSTALLMENTID as ID
                    from 
                        dbo.INSTALLMENTSPLIT ISPLIT 
                    inner join 
                        dbo.INSTALLMENTSPLITWRITEOFF ISW on ISW.INSTALLMENTSPLITID = ISPLIT.ID
                    group by
                        ISPLIT.INSTALLMENTID
                ) SPLITS
                inner join
                    dbo.INSTALLMENT on SPLITS.ID = INSTALLMENT.ID
                group by SPLITS.ID 
        ) as SUMMEDSPLITS on SUMMEDSPLITS.ID = INSTALLMENTS.ID
        where 
            INSTALLMENTS.REVENUEID = RES.ID
        group by 
            INSTALLMENTS.ID, INSTALLMENTS.[DATE]
        having 
            (sum(INSTALLMENTS.TRANSACTIONAMOUNT) - isnull(sum(SUMMEDSPLITS.AMOUNT),0)) > 0
        order by 
            INSTALLMENTS.[DATE] asc
    ) as NEXTINSTALLMENT

    where RES.BALANCE > 0 or RES.ID = @SINGLEAPPLICATIONID;


  insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL(ID, TYPECODE, CONSTITUENTID, DATE, AMOUNT, CURRENCYID, APPLICATIONCONSTITUENTID)
  select
    REVENUE.ID,
    case REVENUE.TYPECODE 
      when 5 then 3
      when 1 then 5
      when 4 then 6
      when 3 then 8
      when 6 then 9
      when 8 then 10
    end,
    REVENUE.CONSTITUENTID,
    REVENUE.DATE,
    REVENUE.BALANCE,
    REVENUE.TRANSACTIONCURRENCYID,
    FT.CONSTITUENTID
  from
    #REVENUEBATCH_CONSTITUENTCOMMITMENT_POTENTIALPLEDGEREVENUE as REVENUE
  left join
    dbo.REVENUESCHEDULE on REVENUESCHEDULE.ID = REVENUE.ID
  left join
    dbo.REVENUEMATCHINGGIFT  on REVENUE.ID = REVENUEMATCHINGGIFT.ID        
  left join 
    dbo.FINANCIALTRANSACTION FT on FT.ID = REVENUEMATCHINGGIFT.MGSOURCEREVENUEID 
  where
    (
      REVENUE.TYPECODE = 5 or
      (
        REVENUE.INSTALLMENTID is not null and 
        REVENUESCHEDULE.ISPENDING = 0
      ) 
    ) and
    (REVENUEMATCHINGGIFT.ISACTIVE = 1 or REVENUE.TYPECODE <> 3) and
    REVENUE.TYPECODE in (1,3,4,5,6,8) and -- Pledge, Matching gift claim, Planned gift, Order, Grant award, Donor challenge claim

    ((REVENUE.PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID) or (dbo.UFN_VALID_BASICGL_INSTALLED() = 0) or REVENUE.TYPECODE in (3,8)) and -- MGC and Donor Challenge

    (
      @APPUSERISSYSADMIN = 1 or
      exists
      (
        select 1 from @SITES S
        left outer join dbo.UFN_SITEID_MAPFROM_REVENUEID(REVENUE.ID) SITE on SITE.SITEID = S.SITEID 
        where S.SITEID=SITE.SITEID or (S.SITEID is null and SITE.SITEID is null)
      )
    );

  -- 8 (again). Subsidiary matching gift claims (JamesWill WI76028 2011-02-01)

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

  create table #REVENUEBATCH_CONSTITUENTCOMMITMENT_POTENTIALSUBSIDIARYMGCLAIMREVENUE
  (
    ID uniqueidentifier,
    TYPECODE tinyint,
    TRANSACTIONCURRENCYID uniqueidentifier,
    CONSTITUENTID uniqueidentifier,
    PDACCOUNTSYSTEMID uniqueidentifier,
    BALANCE money,
    DATE datetime
  )

    --For performance reasons, use a temp table for all potential constituent revenue.


    insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_POTENTIALSUBSIDIARYMGCLAIMREVENUE (ID, TYPECODE, TRANSACTIONCURRENCYID, CONSTITUENTID, PDACCOUNTSYSTEMID, BALANCE, DATE)
    select
        RES.ID, RES.TYPECODE, RES.TRANSACTIONCURRENCYID, RES.CONSTITUENTID, RES.PDACCOUNTSYSTEMID, NEXTINSTALLMENT.BALANCE, NEXTINSTALLMENT.DATE
    from
    (
        select
            FT.ID,
            C.ID CONSTITUENTID,
            FT.TYPECODE,
            FT.TRANSACTIONCURRENCYID,
            FT.PDACCOUNTSYSTEMID,
            FT.TRANSACTIONAMOUNT - isnull(sum(SPLITS.AMOUNT),0) BALANCE
        from
            #REVENUEBATCH_CONSTITUENTCOMMITMENT_CONSTITIDS C
        inner join 
            dbo.ORGANIZATIONDATA on C.ID = ORGANIZATIONDATA.PARENTCORPID
        inner join 
            dbo.FINANCIALTRANSACTION FT on ORGANIZATIONDATA.ID = FT.CONSTITUENTID
        left join 
            dbo.INSTALLMENT INSTALLMENTS on INSTALLMENTS.REVENUEID = FT.ID
        left join (
            select 
                isnull(sum(ISP.AMOUNT),0) AMOUNT,
                ISPLIT.INSTALLMENTID
            from 
                dbo.INSTALLMENTSPLIT ISPLIT 
            inner join 
                dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.INSTALLMENTSPLITID = ISPLIT.ID
            group by
                ISPLIT.INSTALLMENTID
            union all
            select 
                isnull(sum(ISW.AMOUNT),0) AMOUNT,
                ISPLIT.INSTALLMENTID
            from 
                dbo.INSTALLMENTSPLIT ISPLIT 
            inner join 
                dbo.INSTALLMENTSPLITWRITEOFF ISW on ISW.INSTALLMENTSPLITID = ISPLIT.ID
            group by
                ISPLIT.INSTALLMENTID) as SPLITS on SPLITS.INSTALLMENTID = INSTALLMENTS.ID
        where 
            FT.DELETEDON is null
        group by 
            FT.ID, C.ID, TYPECODE, FT.TRANSACTIONCURRENCYID, FT.PDACCOUNTSYSTEMID, FT.TRANSACTIONAMOUNT 

    ) RES
    outer apply (
        select
            top 1 INSTALLMENTS.ID,
            INSTALLMENTS.[DATE],
            sum(INSTALLMENTS.TRANSACTIONAMOUNT) - isnull(sum(SUMMEDSPLITS.AMOUNT),0) BALANCE
        from
            dbo.INSTALLMENT INSTALLMENTS
        left join (
            select
                sum(SPLITS.AMOUNT) as AMOUNT,
                SPLITS.ID 
            from 
            (
                select 
                    isnull(sum(ISP.AMOUNT),0) as AMOUNT,
                    ISPLIT.INSTALLMENTID as ID
                from
                    dbo.INSTALLMENTSPLIT ISPLIT 
                inner join
                    dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.INSTALLMENTSPLITID = ISPLIT.ID
                group by 
                    ISPLIT.INSTALLMENTID
                union all
                select 
                    isnull(sum(ISW.AMOUNT),0) as AMOUNT,
                    ISPLIT.INSTALLMENTID as ID
                from 
                    dbo.INSTALLMENTSPLIT ISPLIT 
                inner join
                    dbo.INSTALLMENTSPLITWRITEOFF ISW on ISW.INSTALLMENTSPLITID = ISPLIT.ID
                group by
                    ISPLIT.INSTALLMENTID
            ) SPLITS
            inner join 
                INSTALLMENT on SPLITS.ID = INSTALLMENT.ID
            group by SPLITS.ID 
        ) as SUMMEDSPLITS on SUMMEDSPLITS.ID = INSTALLMENTS.ID
        where 
            INSTALLMENTS.REVENUEID = RES.ID
        group by 
            INSTALLMENTS.ID, INSTALLMENTS.[DATE]
        having 
            (sum(INSTALLMENTS.TRANSACTIONAMOUNT) - isnull(sum(SUMMEDSPLITS.AMOUNT),0)) > 0
        order by 
            INSTALLMENTS.[DATE] asc
    ) as NEXTINSTALLMENT

    where RES.BALANCE > 0 or RES.ID = @SINGLEAPPLICATIONID


  insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL(ID, TYPECODE, CONSTITUENTID, DATE, AMOUNT, CURRENCYID, APPLICATIONCONSTITUENTID)
  select
    REVENUE.ID,
    8,
    REVENUE.CONSTITUENTID,
    REVENUE.DATE,
    REVENUE.BALANCE,
    REVENUE.TRANSACTIONCURRENCYID,
    FT.CONSTITUENTID
  from #REVENUEBATCH_CONSTITUENTCOMMITMENT_POTENTIALSUBSIDIARYMGCLAIMREVENUE as REVENUE
  inner join
    dbo.REVENUESCHEDULE on REVENUESCHEDULE.ID = REVENUE.ID
  left join
    dbo.REVENUEMATCHINGGIFT on REVENUE.ID = REVENUEMATCHINGGIFT.ID
  left join 
    dbo.FINANCIALTRANSACTION FT on FT.ID = REVENUEMATCHINGGIFT.MGSOURCEREVENUEID 
  left join
    dbo.PDACCOUNTSYSTEMFORREVENUE PDAS on REVENUE.ID = PDAS.ID
  where
    REVENUESCHEDULE.ISPENDING = 0 and
    (REVENUEMATCHINGGIFT.ISACTIVE = 1 or REVENUE.TYPECODE <> 3) and
    REVENUE.TYPECODE = 3 and -- Matching gift claim

    (
      @APPUSERISSYSADMIN = 1 or
      exists
      (
        select 1 from @SITES S
        left outer join dbo.UFN_SITEID_MAPFROM_REVENUEID(REVENUE.ID) SITE on SITE.SITEID = S.SITEID 
        where S.SITEID=SITE.SITEID or (S.SITEID is null and SITE.SITEID is null)
      )
    );

  -- 4. Recurring gift

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

  create table #REVENUEBATCH_CONSTITUENTCOMMITMENT_POTENTIALRECURRINGGIFTREVENUE
  (
    ID uniqueidentifier, 
    TRANSACTIONAMOUNT money, 
    TRANSACTIONCURRENCYID uniqueidentifier, 
    CONSTITUENTID uniqueidentifier
  )

  insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_POTENTIALRECURRINGGIFTREVENUE (ID, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, CONSTITUENTID)
  select REVENUE.ID, REVENUE.TRANSACTIONAMOUNT, REVENUE.TRANSACTIONCURRENCYID, CONSTITUENTID
  from dbo.FINANCIALTRANSACTION REVENUE      
  inner join #REVENUEBATCH_CONSTITUENTCOMMITMENT_CONSTITIDS C on C.ID = REVENUE.CONSTITUENTID  
  where 
    REVENUE.TYPECODE = 2 and 
    REVENUE.TRANSACTIONAMOUNT > 0 and
    not exists(select 'x' from dbo.FINANCIALTRANSACTIONLINEITEM ftli inner join dbo.REVENUESPLIT_EXT rse on rse.ID = ftli.ID where ftli.FINANCIALTRANSACTIONID = REVENUE.ID and rse.TYPECODE = 9)

  insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL(ID, TYPECODE, CONSTITUENTID, DATE, AMOUNT, CURRENCYID, ISSPONSORSHIPRECURRINGGIFT)
  select
    REVENUE.ID,
    4,
    REVENUE.CONSTITUENTID,
    REVENUESCHEDULE.NEXTTRANSACTIONDATE,
    REVENUE.TRANSACTIONAMOUNT,
    REVENUE.TRANSACTIONCURRENCYID,
    case
      when exists(select 'x' from dbo.FINANCIALTRANSACTIONLINEITEM ftli inner join dbo.REVENUESPLIT_EXT rse on rse.ID = ftli.ID where ftli.FINANCIALTRANSACTIONID = REVENUE.ID and rse.TYPECODE = 17)
        then 1
      else
        0
    end
  from
    #REVENUEBATCH_CONSTITUENTCOMMITMENT_POTENTIALRECURRINGGIFTREVENUE as REVENUE
  inner join
    dbo.REVENUESCHEDULE on REVENUE.ID = REVENUESCHEDULE.ID
  where
    REVENUESCHEDULE.STATUSCODE in (0,5) and
    REVENUESCHEDULE.ISPENDING = 0 and
    (
      @APPUSERISSYSADMIN = 1 or
      exists
      (
        select 1 from @SITES S
        left outer join dbo.UFN_SITEID_MAPFROM_REVENUEID(REVENUE.ID) SITE on SITE.SITEID = S.SITEID
        where S.SITEID=SITE.SITEID or (S.SITEID is null and SITE.SITEID is null)
      )
    );


  -- 7. Event registration

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

  create table #POTENTIALEVENTREGISTRATIONREVENUE
  (
    REGISTRANTID uniqueidentifier,
    CONSTITUENTID uniqueidentifier,
    EVENTSTARTDATE date,
    EVENTNAME nvarchar(100) collate database_default,
    EVENTBASECURRENCYID uniqueidentifier
  );

  insert into #POTENTIALEVENTREGISTRATIONREVENUE
  (
    REGISTRANTID,
    CONSTITUENTID,
    EVENTSTARTDATE,
    EVENTNAME,
    EVENTBASECURRENCYID
  )
  select
    REGISTRANT.ID,
    REGISTRANT.CONSTITUENTID,
    [EVENT].STARTDATE,
    [EVENT].NAME,
    [EVENT].BASECURRENCYID
  from
    dbo.REGISTRANT
  inner join
    #REVENUEBATCH_CONSTITUENTCOMMITMENT_CONSTITIDS C on C.ID = REGISTRANT.CONSTITUENTID
  inner join
    dbo.[EVENT] on [EVENT].ID = REGISTRANT.EVENTID;

  insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL
  (
    ID,
    TYPECODE,
    CONSTITUENTID,
    [DATE],
    AMOUNT,
    CURRENCYID,
    EVENTNAME
  )
  select
    EVENTREVENUE.REGISTRANTID,
    7,
    EVENTREVENUE.CONSTITUENTID,
    EVENTREVENUE.EVENTSTARTDATE,
    BALANCE.AMOUNT,
    EVENTREVENUE.EVENTBASECURRENCYID,
    EVENTREVENUE.EVENTNAME
  from
    #POTENTIALEVENTREGISTRATIONREVENUE EVENTREVENUE
  inner join
    (
      select
        REGISTRANTID,
        sum(AMOUNT) as AMOUNT
      from
        (
          --baseline

          select
            ID as REGISTRANTID,
            0 as AMOUNT
          from
            dbo.REGISTRANT

          union all

          --outstanding registrations

          select
            REGISTRANTID,
            AMOUNT
          from
            dbo.REGISTRANTREGISTRATION

          union all

          --payments on registrations

          select
            REGISTRANTID,
            -AMOUNT
          from
            dbo.EVENTREGISTRANTPAYMENT

          union all

          --credits toward registrations

          select
            CREDITITEMEVENTREGISTRATION.REGISTRANTID,
            CREDITITEM.TOTAL
          from
            dbo.CREDITITEM
          inner join
            dbo.CREDITITEMEVENTREGISTRATION on CREDITITEMEVENTREGISTRATION.ID = CREDITITEM.ID
        ) as BALANCEITEMS
      group by
        REGISTRANTID
    ) as BALANCE on BALANCE.REGISTRANTID = EVENTREVENUE.REGISTRANTID
  where 
  (
    BALANCE.AMOUNT > 0 or
    --Bug 133370 - AdamBu - 1/10/11 - Include paid off commitment if it is what this revenue was applied to.

    EVENTREVENUE.REGISTRANTID = @SINGLEAPPLICATIONID
  )
  and
  (
    @APPUSERISSYSADMIN = 1 or
    exists
    (
      select 1 from @SITES S
      left outer join dbo.UFN_SITEID_MAPFROM_REGISTRANTID(EVENTREVENUE.REGISTRANTID) SITE on SITE.SITEID = S.SITEID
      where S.SITEID=SITE.SITEID or (S.SITEID is null and SITE.SITEID is null)
    )
  );

  --If this batch row is paying a pending transaction, insert it into the list

  if @PAYINGPENDINGREVENUEID is not null and not exists (select ID from #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL where ID = @PAYINGPENDINGREVENUEID)
  begin
    insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL(ID, TYPECODE, CONSTITUENTID, DATE, AMOUNT, CURRENCYID)
    select
      REVENUE.ID,
      case REVENUE.TYPECODE
        when 2
          then 4
        when 1
          then 5
        else
          99
      end,
      REVENUE.CONSTITUENTID,
      case REVENUE.TYPECODE
        when 2
          then REVENUESCHEDULE.NEXTTRANSACTIONDATE
        when 1
          then INSTALLMENT.DATE
        else
          ''
      end,
      case REVENUE.TYPECODE
        when 2
          then REVENUE.TRANSACTIONAMOUNT
        when 1
          then dbo.UFN_INSTALLMENT_GETINSTALLMENTBALANCE(INSTALLMENT.ID)
        else
          ''
      end,
      REVENUE.TRANSACTIONCURRENCYID
    from
      dbo.FINANCIALTRANSACTION as REVENUE
    inner join
      dbo.REVENUESCHEDULE on REVENUE.ID = REVENUESCHEDULE.ID
    left join
      dbo.INSTALLMENT on REVENUE.TYPECODE = 1 and INSTALLMENT.ID = dbo.UFN_REVENUE_GETNEXTINSTALLMENT(REVENUE.ID)
    where
      REVENUE.ID = @PAYINGPENDINGREVENUEID;
  end

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

  -- Gather all the designation names for each row in results table

  create table #REVENUEBATCH_CONSTITUENTCOMMITMENT_DESIGNATIONS
  (
    ID uniqueidentifier,
    DESIGNATION varchar(max) collate database_default
  )

  insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_DESIGNATIONS (ID, DESIGNATION)
    select
      REVENUECOMMITMENTS.ID,
      dbo.UDA_BUILDLIST(DESIGNATION.USERID)
    from 
      #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL REVENUECOMMITMENTS
    inner join 
      FINANCIALTRANSACTIONLINEITEM FTLI on FTLI.FINANCIALTRANSACTIONID  = REVENUECOMMITMENTS.ID
    inner join 
      dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FTLI.ID
    inner join 
      dbo.DESIGNATION on REVENUESPLIT_EXT.DESIGNATIONID = DESIGNATION.ID
    where
      FTLI.DELETEDON is null
    group by 
      REVENUECOMMITMENTS.ID;

  -- Update all derived names at once, rather than each insert for performance reasons

  update REVENUECOMMITMENTS
  set
  DESIGNATIONLIST = (
    select
      D.DESIGNATION
    from 
      #REVENUEBATCH_CONSTITUENTCOMMITMENT_DESIGNATIONS D
    where 
      D.ID = REVENUECOMMITMENTS.ID
  )
  from 
    #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL REVENUECOMMITMENTS;

  update REVENUECOMMITMENTS
  set
  CONSTITUENTNAME = 
  (
    select NAME from dbo.UFN_CONSTITUENT_DISPLAYNAME(REVENUECOMMITMENTS.CONSTITUENTID) 
  )
  from 
    #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL REVENUECOMMITMENTS
  where
    REVENUECOMMITMENTS.CONSTITUENTNAME is null;

  update REVENUECOMMITMENTS
  set
  APPLICATIONCONSTITUENTNAME = 
  (
    select NAME from dbo.UFN_CONSTITUENT_DISPLAYNAME(REVENUECOMMITMENTS.APPLICATIONCONSTITUENTID) 
  )
  from 
    #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL REVENUECOMMITMENTS
  where
    REVENUECOMMITMENTS.APPLICATIONCONSTITUENTNAME is null;

  insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL(ID, TYPECODE)
  values(0, 20)

  insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL(ID, TYPECODE)
  values(0, 21)

  insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL(ID, TYPECODE)
  values(0, 22)

  --if the payer is an active sponsor, add 'Sponsorship additional donation'

  if exists
  (
    select 1 from dbo.CONSTITUENT where CONSTITUENT.ID = @PAYERID and exists
    (
      select 1 from dbo.FINANCIALTRANSACTIONLINEITEM
      inner join dbo.SPONSORSHIP on SPONSORSHIP.REVENUESPLITID = FINANCIALTRANSACTIONLINEITEM.ID
      inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
      where FINANCIALTRANSACTION.CONSTITUENTID = CONSTITUENT.ID
      and SPONSORSHIP.STATUSCODE in (0,1)
    )
  )
    insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL(ID, TYPECODE)
    values(0, 23);

  if @BATCHREVENUEROWID is not null
  begin
    declare @APPLICATIONINFO nvarchar(60);
    select top 1 @APPLICATIONINFO = APPLICATIONINFO from dbo.BATCHREVENUE where ID = @BATCHREVENUEROWID;
    if @APPLICATIONINFO is not null and len(@APPLICATIONINFO) > 0
    begin
      declare @SPLITINDEX int = charindex(':', @APPLICATIONINFO);
      declare @APPLICATIONID nvarchar(36) = substring(@APPLICATIONINFO, 1, @SPLITINDEX - 1);

      if not exists (select ID from #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL where ID = @APPLICATIONID)
        insert into #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL(ID, TYPECODE)
        values(@APPLICATIONINFO, 0);
    end
  end

  select
    ID,
    TYPECODE,
    CONSTITUENTNAME,
    DATE,
    AMOUNT,
    CURRENCYID,
    DESIGNATIONLIST,
    APPLICATIONCONSTITUENTNAME,
    MEMBERSHIPPROGRAMNAME,
    MEMBERSHIPLEVELNAME,
    EVENTNAME,
    ISSPONSORSHIPRECURRINGGIFT
  from
    #REVENUEBATCH_CONSTITUENTCOMMITMENT_RETVAL
  order by
    TYPECODE;