USP_MEMBERSHIPPROGRAMCONTRIBUTION_PROCESSPROGRAM

Parameters

Parameter Parameter Type Mode Description
@MEMBERSHIPPROGRAMID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@NUMPROCESSED int INOUT
@PROCESSDATE datetime IN
@OUTPUTTABLE nvarchar(128) IN

Definition

Copy


CREATE procedure dbo.USP_MEMBERSHIPPROGRAMCONTRIBUTION_PROCESSPROGRAM  
(  
  @MEMBERSHIPPROGRAMID uniqueidentifier,  
  @CHANGEAGENTID uniqueidentifier = null,  
  @NUMPROCESSED int = 0 output,  
  @PROCESSDATE datetime = null,  
  @OUTPUTTABLE nvarchar(128)  
)   
with execute as owner  
as   
begin  

  set nocount on;  

  begin try  
    --Criteria option setting  

    declare @CRITERIADEFINITIONTYPECODE tinyint = 0  

    --Other contribution settings  

    declare @ISMULTIPLEREVENUETRANSACTIONSCOUNTED bit = 0  
    declare @WHATDATETOCALCULATEEXPIRATIONDATECODE tinyint = 0  
    declare @WHATHAPPENSIFTHEYGIVEMORECODE tinyint = 0  

    --Program settings  

    declare @ALLOWMULTIPLEMEMBERSHIPS bit = 0;  
    declare @RENEWALWINDOWREVENUETYPECODE tinyint  
    declare @PROGRAMBASEDONCODE tinyint  
    declare @PROGRAMNAME nvarchar(100)  

    --Currency  

    declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()  
    declare @PROGRAMBASECURRENCYID uniqueidentifier  
    declare @PROGRAMBASECURRENCYDIGITS tinyint;  
    declare @PROGRAMBASECURRENCYROUNDINGTYPECODE tinyint;  

    --Process variables  

    set @NUMPROCESSED = 0  
    set @PROCESSDATE = getdate()  
    declare @CURRENTEARLIESTDATETIME datetime =  dbo.UFN_DATE_GETEARLIESTTIME(@PROCESSDATE)  
    declare @LASTRUNONDATE date  
    declare @OUTPUTSQL nvarchar(max)  

    if @CHANGEAGENTID is null  
      exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;  

    exec dbo.USP_MEMBERSHIPPROGRAMCONTRIBUTION_GETPROGRAMCRITERIA  
      @MEMBERSHIPPROGRAMID,  
      @CRITERIADEFINITIONTYPECODE = @CRITERIADEFINITIONTYPECODE output,  
      @ISMULTIPLEREVENUETRANSACTIONSCOUNTED = @ISMULTIPLEREVENUETRANSACTIONSCOUNTED output,  
      @WHATDATETOCALCULATEEXPIRATIONDATECODE = @WHATDATETOCALCULATEEXPIRATIONDATECODE output,  
      @WHATHAPPENSIFTHEYGIVEMORECODE = @WHATHAPPENSIFTHEYGIVEMORECODE output  

    -- Pull all useful information about the membership program  

    select   
      @ALLOWMULTIPLEMEMBERSHIPS = MEMBERSHIPPROGRAM.ALLOWMULTIPLEMEMBERSHIPS,  
      @RENEWALWINDOWREVENUETYPECODE = RENEWALWINDOWREVENUETYPECODE,  
      @PROGRAMNAME = NAME,  
      @PROGRAMBASEDONCODE = PROGRAMBASEDONCODE,  
      @LASTRUNONDATE = LASTPROCESSEDON  
    from dbo.MEMBERSHIPPROGRAM  
    where MEMBERSHIPPROGRAM.ID = @MEMBERSHIPPROGRAMID  

    select  
      @PROGRAMBASECURRENCYDIGITS = CURRENCY.DECIMALDIGITS,  
      @PROGRAMBASECURRENCYROUNDINGTYPECODE = CURRENCY.ROUNDINGTYPECODE  
    from dbo.CURRENCY   
    where ID = @PROGRAMBASECURRENCYID  

     declare @TERMSBYLEVEL table   
     (  
      LEVELID uniqueidentifier,  
      TERMID uniqueidentifier,  
      LOWAMOUNT money,  
      HIGHAMOUNT money,  
      AFTEREXPIRATION tinyint,  
      TERMTIMELENGTH int,  
      SEQUENCE tinyint  
    )  

    insert into @TERMSBYLEVEL (LEVELID,TERMID,LOWAMOUNT,HIGHAMOUNT,AFTEREXPIRATION,TERMTIMELENGTH,SEQUENCE)  
    select   
      MEMBERSHIPLEVELTERM.LEVELID,  
      MEMBERSHIPLEVELTERM.ID,  
      MEMBERSHIPLEVELTERM.LOWAMOUNT,  
      MEMBERSHIPLEVELTERM.AMOUNT,  
      MEMBERSHIPLEVEL.AFTEREXPIRATION,  
      case MEMBERSHIPLEVELTERM.TERMLENGTHCODE   
        when 0 then MEMBERSHIPLEVELTERM.TERMTIMELENGTH  
        when 1 then MEMBERSHIPLEVELTERM.TERMTIMELENGTH * 12  
      end,  
      MEMBERSHIPLEVEL.SEQUENCE  
    from dbo.MEMBERSHIPLEVEL   
    inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.LEVELID = MEMBERSHIPLEVEL.ID  
    where   
      MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID   
      and MEMBERSHIPLEVEL.OBTAINLEVELCODE = 1  

    declare @ORDEREDTERMS table  
    (  
      ID tinyint IDENTITY(1,1),  
      MINIMUMDATE date,  
      TERMTIMELENGTH int  
    )  
    insert into @ORDEREDTERMS(MINIMUMDATE,TERMTIMELENGTH)  
    select   
      dateadd(month,TERMSBYLEVEL.TERMTIMELENGTH*-1, @PROCESSDATE) as MINIMUMDATE,  
      TERMTIMELENGTH  
    from @TERMSBYLEVEL TERMSBYLEVEL  
    group by TERMSBYLEVEL.TERMTIMELENGTH  
    order by TERMTIMELENGTH asc  

    --Processing is essentially broken into two blocks: whether (2) or not (1) we're considering the sum of multiple revenue transaction to award memberships  

    --This first block handles awarding membership if we're not adding the splits from multiple revenue transaction together  

    if @ISMULTIPLEREVENUETRANSACTIONSCOUNTED = 0  
    begin  
      if object_id('tempdb..#CONTRIBUTIONPROCESS_REVENUETOCONSIDER') is not null  
        drop table #CONTRIBUTIONPROCESS_REVENUETOCONSIDER;  

      create table #CONTRIBUTIONPROCESS_REVENUETOCONSIDER  
      (  
        ID uniqueidentifier,  
        CONSTITUENTID uniqueidentifier,  
        FINANCIALTRANSACTIONID uniqueidentifier,  
        FINANCIALTRANSACTIONLINEITEMID uniqueidentifier,  
        AMOUNTINCURRENCY money,  
        TYPECODE tinyint,  
        EFFECTIVEDATE datetime,  
        DATECHANGED date,  
        APPLICATIONCODE tinyint,  
        DESIGNATIONID uniqueidentifier,  
        MEMBERSHIPTRANSACTIONID uniqueidentifier  
      )  

      --Populate #CONTRIBUTIONPROCESS_REVENUETOCONSIDER with qualifying revenue  

      if @CRITERIADEFINITIONTYPECODE = 0  
      begin  
        --Populate #CONTRIBUTIONPROCESS_REVENUETOCONSIDER with filter criteria  

        exec dbo.USP_MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE_TOCONSIDER_POPULATE_BYFILTERCRITERIA  
          @MEMBERSHIPPROGRAMID,  
          @PROCESSDATE,  
          @LASTRUNONDATE  
      end  
      else if @CRITERIADEFINITIONTYPECODE = 1  
      begin  
        --Populate #CONTRIBUTIONPROCESS_REVENUETOCONSIDER with application selection  

        exec dbo.USP_MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE_TOCONSIDER_POPULATE_BYAPPLICATIONSELECTION  
          @MEMBERSHIPPROGRAMID,  
          @PROCESSDATE,  
          @LASTRUNONDATE  
      end  

      --If this program is a 'both ways' program and doesn't allow multiple memberships,   

      --we need to not consider constituents who are already members of a dues-based level of this program.  

      if @PROGRAMBASEDONCODE = 2 and @ALLOWMULTIPLEMEMBERSHIPS = 0  
      begin  
        delete from #CONTRIBUTIONPROCESS_REVENUETOCONSIDER  
        where CONSTITUENTID in (  
          select REVENUETOCONSIDER.CONSTITUENTID   
          from #CONTRIBUTIONPROCESS_REVENUETOCONSIDER REVENUETOCONSIDER  
          inner join dbo.MEMBER on MEMBER.CONSTITUENTID = REVENUETOCONSIDER.CONSTITUENTID  
          inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MEMBER.MEMBERSHIPID  
          inner join dbo.MEMBERSHIPLEVEL on   
            MEMBERSHIPLEVEL.ID = MEMBERSHIP.MEMBERSHIPLEVELID  
            and MEMBERSHIP.STATUSCODE <> 1   
          where   
            MEMBERSHIPLEVEL.OBTAINLEVELCODE = 0  
            and MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
        )  
      end  

      --Sum(splits) based on Constituent/Revenue so we can get the new count of the single gift since some splits of a gift could have been excluded  

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

      create table #CONTRIBUTIONPROCESS_SUMMEDREVENUE  
      (  
        CONSTITUENTID uniqueidentifier,  
        FINANCIALTRANSACTIONID uniqueidentifier,  
        AMOUNTINCURRENCY money,  
        EFFECTIVEDATE datetime  
      )  

      insert into #CONTRIBUTIONPROCESS_SUMMEDREVENUE  
      (  
        CONSTITUENTID,  
        FINANCIALTRANSACTIONID,  
        AMOUNTINCURRENCY,  
        EFFECTIVEDATE  
      )  
      select   
        CONSTITUENTID,  
        FINANCIALTRANSACTIONID,  
        sum(AMOUNTINCURRENCY) as AMOUNTINCURRENCY,  
        EFFECTIVEDATE  
      from #CONTRIBUTIONPROCESS_REVENUETOCONSIDER  
      group by CONSTITUENTID,FINANCIALTRANSACTIONID,EFFECTIVEDATE;  

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

      -- Create and insert into LEVELSTOADD, this will contain all constituents and the revenue that qualifies them for the program/level/term that  

      -- they currently are not in.  

      create table #CONTRIBUTIONPROCESS_LEVELSTOADDFULLGIFT  
      (  
        CONSTITUENTID uniqueidentifier,  
        FINANCIALTRANSACTIONID uniqueidentifier,  
        AMOUNTINCURRENCY money,  
        EFFECTIVEDATE datetime,  
        LEVELID uniqueidentifier,  
        TERMID uniqueidentifier,  
        AFTEREXPIRATION tinyint,  
        TERMTIMELENGTH int,  
        MEMBERSHIPID uniqueidentifier,  
        MEMBERSHIPTRANSACTIONID uniqueidentifier,  
        MEMBERID uniqueidentifier,  
        EXPIRATIONDATE datetime,  
        EXISTINGMEMBERSHIPID uniqueidentifier  
      );  

      insert into #CONTRIBUTIONPROCESS_LEVELSTOADDFULLGIFT  
      select   
        CONSTITUENTID,  
        FINANCIALTRANSACTIONID,  
        AMOUNTINCURRENCY,  
        EFFECTIVEDATE,  
        LEVELID,  
        TERMID,  
        AFTEREXPIRATION,  
        TERMTIMELENGTH,  
        NEWID() as MEMBERSHIPID,  
        NEWID() as MEMBERSHIPTRANSACTIONID,  
        NEWID() as MEMBERID,  
        case @WHATDATETOCALCULATEEXPIRATIONDATECODE   
          when 0 then dbo.UFN_DATE_GETLATESTTIME(dateadd(month,TERMTIMELENGTH,EFFECTIVEDATE)) --the transaction date of the gift  

          when 1 then dbo.UFN_DATE_GETLATESTTIME(dateadd(month,TERMTIMELENGTH,dateadd(s,-1,dateadd(mm, DATEDIFF(m,0,EFFECTIVEDATE)+1,0)))) --the last day  of the month the gift was received  

        end as EXPIRATIONDATE,  
        (  
          select top 1 MEMBERSHIP.ID   
          from dbo.MEMBER  
          inner join dbo.MEMBERSHIP on MEMBER.MEMBERSHIPID = MEMBERSHIP.ID  
          inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIP.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID  
          where MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID   
            and MEMBERSHIPLEVEL.OBTAINLEVELCODE = 1  
            and ALLTERMREVENUE.CONSTITUENTID = MEMBER.CONSTITUENTID  
            and MEMBERSHIP.STATUSCODE <> 1   
            and  @PROCESSDATE > dateadd(month,ALLTERMREVENUE.AFTEREXPIRATION,MEMBERSHIP.EXPIRATIONDATE)  
        ) as EXISTINGMEMBERSHIPID  
      from (  
        select   
          CONSTITUENTID,  
          FINANCIALTRANSACTIONID,  
          AMOUNTINCURRENCY,  
          EFFECTIVEDATE,  
          TERMSBYLEVEL.LEVELID,  
          TERMSBYLEVEL.TERMID,  
          MEMBERSHIPLEVEL.AFTEREXPIRATION,  
          ORDEREDTERMS.TERMTIMELENGTH,  
          ROW_NUMBER() over (partition by CONSTITUENTID order by MEMBERSHIPLEVEL.SEQUENCE DESC,ORDEREDTERMS.TERMTIMELENGTH DESC, AMOUNTINCURRENCY desc) as ROWNUM  
        from #CONTRIBUTIONPROCESS_SUMMEDREVENUE as SUMMEDREVENUE  
        inner join @ORDEREDTERMS ORDEREDTERMS on EFFECTIVEDATE >= ORDEREDTERMS.MINIMUMDATE  
        inner join @TERMSBYLEVEL TERMSBYLEVEL on TERMSBYLEVEL.TERMTIMELENGTH = ORDEREDTERMS.TERMTIMELENGTH  
        inner join MEMBERSHIPLEVEL on   
          TERMSBYLEVEL.LEVELID = MEMBERSHIPLEVEL.ID  
          and SUMMEDREVENUE.AMOUNTINCURRENCY between TERMSBYLEVEL.LOWAMOUNT and TERMSBYLEVEL.HIGHAMOUNT  
      ) as ALLTERMREVENUE   
      where   
        ROWNUM=1  
        and not exists (  
          select MEMBERSHIP.ID   
          from dbo.MEMBER  
          inner join dbo.MEMBERSHIP on MEMBER.MEMBERSHIPID = MEMBERSHIP.ID  
          inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIP.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID  
          where   
            MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID   
            and ALLTERMREVENUE.CONSTITUENTID = MEMBER.CONSTITUENTID  
            and MEMBERSHIPLEVEL.OBTAINLEVELCODE = 1  
            and  @PROCESSDATE < dateadd(month,ALLTERMREVENUE.AFTEREXPIRATION,MEMBERSHIP.EXPIRATIONDATE)  
            and MEMBERSHIP.STATUSCODE <> 1  
        )  

      insert into dbo.MEMBERSHIP  
      (  
        ID,  
        MEMBERSHIPPROGRAMID,   
        MEMBERSHIPLEVELID,  
        MEMBERSHIPLEVELTERMID,  
        JOINDATE,  
        EXPIRATIONDATE,  
        ADDEDBYID,  
        CHANGEDBYID,  
        DATEADDED,  
        DATECHANGED  
      )  
      select  
        LEVELSTOADD.MEMBERSHIPID,  
        @MEMBERSHIPPROGRAMID,  
        LEVELSTOADD.LEVELID,  
        LEVELSTOADD.TERMID,  
        @CURRENTEARLIESTDATETIME,  
        dbo.UFN_DATE_GETLATESTTIME(EXPIRATIONDATE),  
        @CHANGEAGENTID,  
        @CHANGEAGENTID,  
        @PROCESSDATE,  
        @PROCESSDATE  
      from #CONTRIBUTIONPROCESS_LEVELSTOADDFULLGIFT as LEVELSTOADD  
      where   
        LEVELSTOADD.EXISTINGMEMBERSHIPID is null  
        and LEVELSTOADD.EXPIRATIONDATE is not null  

      update dbo.MEMBERSHIP   
      set   
        MEMBERSHIP.STATUSCODE = 0,  
        MEMBERSHIP.EXPIRATIONDATE = LEVELSTOADD.EXPIRATIONDATE,  
        MEMBERSHIP.MEMBERSHIPLEVELID = LEVELSTOADD.LEVELID,  
        MEMBERSHIP.MEMBERSHIPLEVELTERMID = LEVELSTOADD.TERMID  
      from dbo.MEMBERSHIP  
      inner join #CONTRIBUTIONPROCESS_LEVELSTOADDFULLGIFT as LEVELSTOADD on coalesce(LEVELSTOADD.EXISTINGMEMBERSHIPID,LEVELSTOADD.MEMBERSHIPID) = MEMBERSHIP.ID  
      where LEVELSTOADD.EXPIRATIONDATE is not null  

      insert into dbo.MEMBERSHIPTRANSACTION  
      (  
        ID,  
        MEMBERSHIPID,  
        MEMBERSHIPLEVELID,  
        MEMBERSHIPLEVELTERMID,  
        TRANSACTIONDATE,  
        EXPIRATIONDATE,  
        ACTIONCODE,  
        ADDEDBYID,  
        CHANGEDBYID,  
        DATEADDED,  
        DATECHANGED,  
        REVENUESPLITID
      )  
      select  
        LEVELSTOADD.MEMBERSHIPTRANSACTIONID,  
        case when LEVELSTOADD.EXISTINGMEMBERSHIPID is null then LEVELSTOADD.MEMBERSHIPID  
          else LEVELSTOADD.EXISTINGMEMBERSHIPID  
        end,  
        LEVELSTOADD.LEVELID,  
        LEVELSTOADD.TERMID,  
        @CURRENTEARLIESTDATETIME,  
        dbo.UFN_DATE_GETLATESTTIME(EXPIRATIONDATE),  
        case   
          when LEVELSTOADD.EXISTINGMEMBERSHIPID is null then 0  
          else case when @RENEWALWINDOWREVENUETYPECODE = 0 then 5  
            else 0  
          end  
        end,  
        @CHANGEAGENTID,  
        @CHANGEAGENTID,  
        @PROCESSDATE,  
        @PROCESSDATE,  
        (select top 1 REVENUETOCONSIDER.FINANCIALTRANSACTIONLINEITEMID from #CONTRIBUTIONPROCESS_REVENUETOCONSIDER REVENUETOCONSIDER where REVENUETOCONSIDER.FINANCIALTRANSACTIONID = LEVELSTOADD.FINANCIALTRANSACTIONID)
      from #CONTRIBUTIONPROCESS_LEVELSTOADDFULLGIFT as LEVELSTOADD  
      where LEVELSTOADD.EXPIRATIONDATE is not null  

      insert into dbo.MEMBER   
      (  
        ID,  
        CONSTITUENTID,  
        MEMBERSHIPID,  
        ISPRIMARY,  
        ADDEDBYID,  
        CHANGEDBYID,  
        DATEADDED,  
        DATECHANGED  
      )  
      select   
        LEVELSTOADD.MEMBERID,  
        LEVELSTOADD.CONSTITUENTID,  
        LEVELSTOADD.MEMBERSHIPID,  
        1,  
        @CHANGEAGENTID,  
        @CHANGEAGENTID,  
        @PROCESSDATE,  
        @PROCESSDATE  
      from #CONTRIBUTIONPROCESS_LEVELSTOADDFULLGIFT as LEVELSTOADD  
      where   
        LEVELSTOADD.EXISTINGMEMBERSHIPID is null  
        and LEVELSTOADD.EXPIRATIONDATE is not null  
        and LEVELSTOADD.CONSTITUENTID is not null  

      insert into dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
      (  
        FINANCIALTRANSACTIONLINEITEMID,  
        MEMBERSHIPID,  
        MEMBERSHIPPROGRAMID,  
        CONSTITUENTID,  
        ORIGINALMEMBERSHIPTRANSACTIONID,  
        CURRENTMEMBERSHIPTRANSACTIONID, 
        AMOUNT,  
        EFFECTIVEDATE,  
        ADDEDBYID,  
        CHANGEDBYID,  
        DATEADDED,  
        DATECHANGED  
      )  
      select   
        REVENUETOCONSIDER.FINANCIALTRANSACTIONLINEITEMID,  
        case   
          when LEVELSTOADD.EXISTINGMEMBERSHIPID is null then LEVELSTOADD.MEMBERSHIPID  
          else LEVELSTOADD.EXISTINGMEMBERSHIPID  
        end,  
        @MEMBERSHIPPROGRAMID,  
        LEVELSTOADD.CONSTITUENTID,  
        LEVELSTOADD.MEMBERSHIPTRANSACTIONID,  
        LEVELSTOADD.MEMBERSHIPTRANSACTIONID,  
        REVENUETOCONSIDER.AMOUNTINCURRENCY,  
        LEVELSTOADD.EFFECTIVEDATE,  
        @CHANGEAGENTID,  
        @CHANGEAGENTID,  
        @PROCESSDATE,  
        @PROCESSDATE  
      from #CONTRIBUTIONPROCESS_LEVELSTOADDFULLGIFT as LEVELSTOADD  
      inner join #CONTRIBUTIONPROCESS_REVENUETOCONSIDER as REVENUETOCONSIDER on LEVELSTOADD.FINANCIALTRANSACTIONID = REVENUETOCONSIDER.FINANCIALTRANSACTIONID  
      where LEVELSTOADD.EXPIRATIONDATE is not null  

      set @NUMPROCESSED += (select count(*) from #CONTRIBUTIONPROCESS_LEVELSTOADDFULLGIFT as LEVELSTOADD where LEVELSTOADD.EXPIRATIONDATE is not null)  

      --Renew memberships that are available for renewal based on the process date(current date) and the largest gift they have given is > the cost to renew  

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

      create table #CONTRIBUTIONPROCESS_LEVELSTORENEWFULLGIFT  
      (  
        CONSTITUENTID uniqueidentifier,  
        FINANCIALTRANSACTIONID uniqueidentifier,  
        AMOUNTINCURRENCY money,  
        EFFECTIVEDATE date,  
        LEVELID uniqueidentifier,  
        TERMID uniqueidentifier,  
        AFTEREXPIRATION tinyint,  
        TERMTIMELENGTH int,  
        TERMLENGTHCODE tinyint,  
        MEMBERSHIPID uniqueidentifier,  
        MEMBERSHIPTRANSACTIONID uniqueidentifier,  
        MEMBERID uniqueidentifier,  
        EXPIRATIONDATE date,  
        ACTIONCODE tinyint  
      )  
      insert into #CONTRIBUTIONPROCESS_LEVELSTORENEWFULLGIFT  
      (  
        CONSTITUENTID,  
        FINANCIALTRANSACTIONID,   
        AMOUNTINCURRENCY,   
        EFFECTIVEDATE,   
        LEVELID,   
        TERMID,  
        AFTEREXPIRATION,  
        TERMTIMELENGTH,  
        TERMLENGTHCODE,  
        MEMBERSHIPID,  
        MEMBERSHIPTRANSACTIONID,  
        EXPIRATIONDATE,  
        ACTIONCODE  
      )  
      select   
        MAXGIFTS.CONSTITUENTID,  
        MAXGIFTS.FINANCIALTRANSACTIONID,  
        MAXGIFTS.AMOUNTINCURRENCY,  
        MAXGIFTS.EFFECTIVEDATE,  
        QUALIFIEDLEVEL.LEVELID,  
        QUALIFIEDLEVEL.TERMID,  
        MAXGIFTS.AFTEREXPIRATION,  
        MAXGIFTS.TERMTIMELENGTH,  
        MAXGIFTS.TERMLENGTHCODE,  
        MAXGIFTS.MEMBERSHIPID,  
        NEWID(),  
        case when TERMLENGTHCODE = 0 then dbo.UFN_DATE_GETLATESTTIME(dateadd(month,MAXGIFTS.TERMTIMELENGTH,MAXGIFTS.EXPIRATIONDATE))   
           else dbo.UFN_DATE_GETLATESTTIME(dateadd(year,MAXGIFTS.TERMTIMELENGTH,MAXGIFTS.EXPIRATIONDATE))   
        end as EXPIRATIONDATE,  
        case when MAXGIFTS.LEVELID = QUALIFIEDLEVEL.LEVELID then 1 --Renew  

           else 2 -- Upgrade  

        end as ACTIONCODE  
      from (  
        select   
          SUMMEDGIFTS.CONSTITUENTID,  
          SUMMEDGIFTS.FINANCIALTRANSACTIONID,  
          SUMMEDGIFTS.AMOUNTINCURRENCY,  
          ROW_NUMBER() over (partition by SUMMEDGIFTS.CONSTITUENTID order by SUMMEDGIFTS.AMOUNTINCURRENCY desc) as ROWNUM,  
          SUMMEDGIFTS.EFFECTIVEDATE,  
          MEMBERSHIPLEVEL.ID as LEVELID,  
          MEMBERSHIPLEVELTERM.ID as TERMID,  
          MEMBERSHIPLEVEL.AFTEREXPIRATION,  
          MEMBERSHIPLEVELTERM.TERMTIMELENGTH,  
          MEMBERSHIPLEVELTERM.TERMLENGTHCODE,  
          MEMBERSHIP.ID AS MEMBERSHIPID,  
          MEMBERSHIP.EXPIRATIONDATE,  
          MEMBERSHIPLEVEL.SEQUENCE  
        from #CONTRIBUTIONPROCESS_SUMMEDREVENUE as SUMMEDGIFTS  
        inner join dbo.MEMBER on MEMBER.CONSTITUENTID = SUMMEDGIFTS.CONSTITUENTID  
        inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MEMBER.MEMBERSHIPID and MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
        inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = MEMBERSHIP.MEMBERSHIPLEVELID   
        inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.ID = MEMBERSHIP.MEMBERSHIPLEVELTERMID  
        left join #CONTRIBUTIONPROCESS_LEVELSTOADDFULLGIFT LEVELSTOADD on LEVELSTOADD.FINANCIALTRANSACTIONID = SUMMEDGIFTS.FINANCIALTRANSACTIONID  
        where   
          (  
            @PROCESSDATE < dateadd(month,MEMBERSHIPLEVEL.AFTEREXPIRATION,MEMBERSHIP.EXPIRATIONDATE)  
            and @PROCESSDATE >   
              case @WHATHAPPENSIFTHEYGIVEMORECODE   
                when 2 then coalesce(MEMBERSHIP.LASTRENEWEDON,MEMBERSHIP.JOINDATE)  
                else  
                  case MEMBERSHIPLEVEL.BEFOREEXPIRATION  
                    when 13 then -- Start of membership  

                      case MEMBERSHIPLEVELTERM.TERMLENGTHCODE  
                        when 0 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                        when 1 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(year,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                      end  
                    else dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,MEMBERSHIPLEVEL.BEFOREEXPIRATION*-1,MEMBERSHIP.EXPIRATIONDATE))  
                  end  
              end  
          )  
          and (  
            SUMMEDGIFTS.EFFECTIVEDATE < dateadd(month,MEMBERSHIPLEVEL.AFTEREXPIRATION,MEMBERSHIP.EXPIRATIONDATE)  
            and SUMMEDGIFTS.EFFECTIVEDATE >=   
              case @WHATHAPPENSIFTHEYGIVEMORECODE   
                when 2 then coalesce(MEMBERSHIP.LASTRENEWEDON,MEMBERSHIP.JOINDATE)  
                else  
                  case MEMBERSHIPLEVEL.BEFOREEXPIRATION  
                    when 13 then -- Start of membership  

                      case MEMBERSHIPLEVELTERM.TERMLENGTHCODE  
                        when 0 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                        when 1 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(year,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                      end  
                    else dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,MEMBERSHIPLEVEL.BEFOREEXPIRATION*-1,MEMBERSHIP.EXPIRATIONDATE))  
                  end  
              end  
          )  
          and SUMMEDGIFTS.AMOUNTINCURRENCY >= MEMBERSHIPLEVELTERM.LOWAMOUNT   
          and MEMBERSHIP.STATUSCODE <> 1   
          and MEMBERSHIPLEVEL.OBTAINLEVELCODE = 1  
          and LEVELSTOADD.FINANCIALTRANSACTIONID is null  
      ) as MAXGIFTS  
       cross apply   
          (  
            select top(1)   
              MEMBERSHIPLEVEL.ID as LEVELID,  
              MEMBERSHIPLEVELTERM.ID as TERMID  
            from dbo.MEMBERSHIPLEVEL  
            inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.LEVELID =  MEMBERSHIPLEVEL.ID  
            where   
              MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
              and MAXGIFTS.AMOUNTINCURRENCY >= (MEMBERSHIPLEVELTERM.LOWAMOUNT)  
              and MAXGIFTS.AMOUNTINCURRENCY <= (MEMBERSHIPLEVELTERM.AMOUNT)  
              and MEMBERSHIPLEVEL.SEQUENCE >= MAXGIFTS.SEQUENCE  
              and MEMBERSHIPLEVEL.OBTAINLEVELCODE = 1  
              and MEMBERSHIPLEVELTERM.TERMTIMELENGTH = MAXGIFTS.TERMTIMELENGTH  
              and MEMBERSHIPLEVELTERM.TERMLENGTHCODE = MAXGIFTS.TERMLENGTHCODE  
            order by MEMBERSHIPLEVEL.SEQUENCE desc  
          ) as QUALIFIEDLEVEL   
      where MAXGIFTS.ROWNUM = 1  

      update dbo.MEMBERSHIP   
      set   
        STATUSCODE = 0,  
        MEMBERSHIPLEVELID = LEVELSTORENEW.LEVELID,   
        MEMBERSHIPLEVELTERMID =  LEVELSTORENEW.TERMID,  
        LASTRENEWEDON = @CURRENTEARLIESTDATETIME,  
        EXPIRATIONDATE = LEVELSTORENEW.EXPIRATIONDATE,  
        CHANGEDBYID = @CHANGEAGENTID,   
        DATECHANGED = @PROCESSDATE  
      from dbo.MEMBERSHIP  
      inner join #CONTRIBUTIONPROCESS_LEVELSTORENEWFULLGIFT LEVELSTORENEW on LEVELSTORENEW.MEMBERSHIPID = MEMBERSHIP.ID  

      insert into dbo.MEMBERSHIPTRANSACTION  
      (  
        ID,  
        MEMBERSHIPID,  
        MEMBERSHIPLEVELID,  
        MEMBERSHIPLEVELTERMID, 
        TRANSACTIONDATE,  
        EXPIRATIONDATE,  
        ACTIONCODE,  
        ADDEDBYID,  
        CHANGEDBYID,  
        DATEADDED,  
        DATECHANGED,  
        REVENUESPLITID
      )  
      select   
        LEVELSTORENEW.MEMBERSHIPTRANSACTIONID,  
        LEVELSTORENEW.MEMBERSHIPID,  
        LEVELSTORENEW.LEVELID,  
        LEVELSTORENEW.TERMID,  
        @CURRENTEARLIESTDATETIME,  
        dbo.UFN_DATE_GETLATESTTIME(EXPIRATIONDATE),  
        LEVELSTORENEW.ACTIONCODE,  
        @CHANGEAGENTID,  
        @CHANGEAGENTID,  
        @PROCESSDATE,  
        @PROCESSDATE,  
        (select top 1 REVENUETOCONSIDER.FINANCIALTRANSACTIONLINEITEMID from #CONTRIBUTIONPROCESS_REVENUETOCONSIDER REVENUETOCONSIDER where REVENUETOCONSIDER.FINANCIALTRANSACTIONID = LEVELSTORENEW.FINANCIALTRANSACTIONID)
      from #CONTRIBUTIONPROCESS_LEVELSTORENEWFULLGIFT as LEVELSTORENEW  

      update dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE   
      set CURRENTMEMBERSHIPTRANSACTIONID = LEVELSTORENEW.MEMBERSHIPTRANSACTIONID  
      from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
      inner join #CONTRIBUTIONPROCESS_LEVELSTORENEWFULLGIFT as LEVELSTORENEW on LEVELSTORENEW.MEMBERSHIPID = MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPID  

      insert into dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
      (  
        FINANCIALTRANSACTIONLINEITEMID,  
        MEMBERSHIPID,  
        MEMBERSHIPPROGRAMID,  
        CONSTITUENTID,  
        ORIGINALMEMBERSHIPTRANSACTIONID,  
        CURRENTMEMBERSHIPTRANSACTIONID,  
        AMOUNT,  
        EFFECTIVEDATE,  
        ADDEDBYID,  
        CHANGEDBYID,  
        DATEADDED,  
        DATECHANGED  
      )  
      select   
        REVENUETOCONSIDER.FINANCIALTRANSACTIONLINEITEMID,  
        LEVELSTORENEW.MEMBERSHIPID,  
        @MEMBERSHIPPROGRAMID,  
        LEVELSTORENEW.CONSTITUENTID,  
        LEVELSTORENEW.MEMBERSHIPTRANSACTIONID,  
        LEVELSTORENEW.MEMBERSHIPTRANSACTIONID,  
        REVENUETOCONSIDER.AMOUNTINCURRENCY,  
        LEVELSTORENEW.EFFECTIVEDATE,  
        @CHANGEAGENTID,  
        @CHANGEAGENTID,  
        @PROCESSDATE,  
        @PROCESSDATE  
      from #CONTRIBUTIONPROCESS_LEVELSTORENEWFULLGIFT as LEVELSTORENEW  
      inner join #CONTRIBUTIONPROCESS_REVENUETOCONSIDER as REVENUETOCONSIDER on LEVELSTORENEW.FINANCIALTRANSACTIONID = REVENUETOCONSIDER.FINANCIALTRANSACTIONID  

      set @NUMPROCESSED += (select count(*) from #CONTRIBUTIONPROCESS_LEVELSTORENEWFULLGIFT)  
      --Deal with upgrading potential memberships if the option that revenue outside of the renewal window is counted toward and upgrade  


      if @WHATHAPPENSIFTHEYGIVEMORECODE = 1  
      begin  

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

        create table #CONTRIBUTIONPROCESS_LEVELSTOUPGRADEFULLGIFT  
        (  
          CONSTITUENTID uniqueidentifier,  
          FINANCIALTRANSACTIONID uniqueidentifier,  
          AMOUNTINCURRENCY money,  
          EFFECTIVEDATE date,  
          LEVELID uniqueidentifier,  
          TERMID uniqueidentifier,  
          AFTEREXPIRATION tinyint,  
          TERMTIMELENGTH int,  
          TERMLENGTHCODE tinyint,  
          MEMBERSHIPID uniqueidentifier,  
          MEMBERSHIPTRANSACTIONID uniqueidentifier,  
          MEMBERID uniqueidentifier,  
          EXPIRATIONDATE date  
        )  

        insert into #CONTRIBUTIONPROCESS_LEVELSTOUPGRADEFULLGIFT  
        (  
          CONSTITUENTID,  
          FINANCIALTRANSACTIONID,   
          AMOUNTINCURRENCY,   
          EFFECTIVEDATE,   
          LEVELID,   
          TERMID,  
          AFTEREXPIRATION,  
          TERMTIMELENGTH,  
          TERMLENGTHCODE,  
          MEMBERSHIPID,  
          MEMBERSHIPTRANSACTIONID,  
          EXPIRATIONDATE  
        )  
        select   
          TOPGIFT.CONSTITUENTID,  
          TOPGIFT.FINANCIALTRANSACTIONID,  
          TOPGIFT.AMOUNTINCURRENCY,  
          TOPGIFT.EFFECTIVEDATE,  
          TOPGIFT.LEVELID,  
          TOPGIFT.TERMID,  
          TOPGIFT.AFTEREXPIRATION,  
          TOPGIFT.TERMTIMELENGTH,  
          TOPGIFT.TERMLENGTHCODE,  
          TOPGIFT.MEMBERSHIPID,  
          TOPGIFT.MEMBERSHIPTRANSACTIONID,  
          TOPGIFT.EXPIRATIONDATE  
        from (  
          select   
            MAXGIFTS.CONSTITUENTID,  
            MAXGIFTS.FINANCIALTRANSACTIONID,  
            MAXGIFTS.AMOUNTINCURRENCY,  
            MAXGIFTS.EFFECTIVEDATE,  
            QUALIFIEDLEVEL.LEVELID,  
            QUALIFIEDLEVEL.TERMID,  
            MAXGIFTS.AFTEREXPIRATION,  
            MAXGIFTS.TERMTIMELENGTH,  
            MAXGIFTS.TERMLENGTHCODE,  
            MAXGIFTS.MEMBERSHIPID,  
            NEWID() as MEMBERSHIPTRANSACTIONID,  
            MAXGIFTS.EXPIRATIONDATE,  
            ROW_NUMBER() over (partition by MAXGIFTS.CONSTITUENTID order by MAXGIFTS.AMOUNTINCURRENCY desc) as ROWNUM  
          from (  
            select   
              SUMMEDGIFTS.CONSTITUENTID,  
              SUMMEDGIFTS.FINANCIALTRANSACTIONID,  
              SUMMEDGIFTS.AMOUNTINCURRENCY,  
              SUMMEDGIFTS.EFFECTIVEDATE,  
              MEMBERSHIPLEVEL.ID as LEVELID,  
              MEMBERSHIPLEVEL.AFTEREXPIRATION,  
              MEMBERSHIPLEVELTERM.TERMTIMELENGTH,  
              MEMBERSHIPLEVELTERM.TERMLENGTHCODE,  
              MEMBERSHIP.ID AS MEMBERSHIPID,  
              MEMBERSHIPLEVEL.SEQUENCE,  
              MEMBERSHIPLEVELTERM.AMOUNT as MEMBERSHIPLEVELTERMAMOUNT,  
              (  
                select SUM(AMOUNT)   
                from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
                where MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPID =  MEMBERSHIP.ID  
                  and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
                  and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.ORIGINALMEMBERSHIPTRANSACTIONID in (  
                    select MEMBERSHIPTRANSACTION.ID   
                    from dbo.MEMBERSHIPTRANSACTION  
                    where MEMBERSHIPTRANSACTION.MEMBERSHIPID = MEMBERSHIP.ID  
                    and MEMBERSHIPTRANSACTION.EXPIRATIONDATE = (  
                      select max(MT.EXPIRATIONDATE)  
                      from dbo.MEMBERSHIPTRANSACTION MT  
                      where MT.MEMBERSHIPID = MEMBERSHIP.ID  
                    )  
                  )   
              ) as AMOUNTGIVENTOPROGRAM,  
              MEMBERSHIP.EXPIRATIONDATE  
            from #CONTRIBUTIONPROCESS_SUMMEDREVENUE as SUMMEDGIFTS  
            inner join dbo.MEMBER on MEMBER.CONSTITUENTID = SUMMEDGIFTS.CONSTITUENTID  
            inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MEMBER.MEMBERSHIPID and MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
            inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = MEMBERSHIP.MEMBERSHIPLEVELID   
            inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.ID = MEMBERSHIP.MEMBERSHIPLEVELTERMID  
            left join #CONTRIBUTIONPROCESS_LEVELSTOADDFULLGIFT LEVELSTOADD on LEVELSTOADD.FINANCIALTRANSACTIONID = SUMMEDGIFTS.FINANCIALTRANSACTIONID  
            left join #CONTRIBUTIONPROCESS_LEVELSTORENEWFULLGIFT LEVELSTORENEW  on LEVELSTORENEW.FINANCIALTRANSACTIONID = SUMMEDGIFTS.FINANCIALTRANSACTIONID   
            where   
              (  
                @PROCESSDATE <  
                  case MEMBERSHIPLEVEL.BEFOREEXPIRATION  
                    when 13 then -- Start of membership  

                      case MEMBERSHIPLEVELTERM.TERMLENGTHCODE  
                        when 0 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                        when 1 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(year,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                      end  
                    else dateadd(month,MEMBERSHIPLEVEL.BEFOREEXPIRATION*-1,MEMBERSHIP.EXPIRATIONDATE)  
                  end  
              )  
              and (  
                SUMMEDGIFTS.EFFECTIVEDATE <  
                  case MEMBERSHIPLEVEL.BEFOREEXPIRATION  
                    when 13 then -- Start of membership  

                      case MEMBERSHIPLEVELTERM.TERMLENGTHCODE  
                        when 0 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                        when 1 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(year,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                      end  
                    else dateadd(month,MEMBERSHIPLEVEL.BEFOREEXPIRATION*-1,MEMBERSHIP.EXPIRATIONDATE)  
                  end  
              )  
              and LEVELSTOADD.FINANCIALTRANSACTIONID is null  
              and MEMBERSHIP.STATUSCODE <> 1   
              and MEMBERSHIPLEVEL.OBTAINLEVELCODE = 1  
              and LEVELSTORENEW.FINANCIALTRANSACTIONID is null  
          ) as MAXGIFTS  
          cross apply   
          (  
            select top(1)   
              MEMBERSHIPLEVEL.ID as LEVELID,  
              MEMBERSHIPLEVELTERM.ID as TERMID  
            from dbo.MEMBERSHIPLEVEL  
            inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.LEVELID =  MEMBERSHIPLEVEL.ID  
            where   
              MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
              and MAXGIFTS.AMOUNTINCURRENCY >= (MEMBERSHIPLEVELTERM.LOWAMOUNT-MAXGIFTS.AMOUNTGIVENTOPROGRAM)  
              and MAXGIFTS.AMOUNTINCURRENCY <= (MEMBERSHIPLEVELTERM.AMOUNT-MAXGIFTS.AMOUNTGIVENTOPROGRAM)  
              and MEMBERSHIPLEVEL.SEQUENCE > MAXGIFTS.SEQUENCE  
              and MEMBERSHIPLEVEL.OBTAINLEVELCODE = 1  
              and MEMBERSHIPLEVELTERM.TERMTIMELENGTH = MAXGIFTS.TERMTIMELENGTH  
              and MEMBERSHIPLEVELTERM.TERMLENGTHCODE = MAXGIFTS.TERMLENGTHCODE  
            order by MEMBERSHIPLEVEL.SEQUENCE desc  
          ) as QUALIFIEDLEVEL   
        ) as TOPGIFT  
        where TOPGIFT.ROWNUM = 1  

        update dbo.MEMBERSHIP   
        set   
          MEMBERSHIPLEVELID = LEVELSTOUPGRADE.LEVELID,   
          MEMBERSHIPLEVELTERMID =  LEVELSTOUPGRADE.TERMID,  
          CHANGEDBYID = @CHANGEAGENTID,   
          DATECHANGED = @PROCESSDATE  
        from dbo.MEMBERSHIP  
        inner join #CONTRIBUTIONPROCESS_LEVELSTOUPGRADEFULLGIFT as LEVELSTOUPGRADE on LEVELSTOUPGRADE.MEMBERSHIPID = MEMBERSHIP.ID  

        insert into dbo.MEMBERSHIPTRANSACTION  
        (  
          ID,  
          MEMBERSHIPID,  
          MEMBERSHIPLEVELID,  
          MEMBERSHIPLEVELTERMID,
          TRANSACTIONDATE,  
          EXPIRATIONDATE,  
          ACTIONCODE,  
          ADDEDBYID,  
          CHANGEDBYID,  
          DATEADDED,  
          DATECHANGED,  
          REVENUESPLITID
        )  
        select   
          LEVELSTOUPGRADE.MEMBERSHIPTRANSACTIONID,  
    LEVELSTOUPGRADE.MEMBERSHIPID,  
          LEVELSTOUPGRADE.LEVELID,  
          LEVELSTOUPGRADE.TERMID,  
          @CURRENTEARLIESTDATETIME,  
          dbo.UFN_DATE_GETLATESTTIME(EXPIRATIONDATE),  
          2, --Upgrade  

          @CHANGEAGENTID,  
          @CHANGEAGENTID,  
          @PROCESSDATE,  
          @PROCESSDATE
          (select top 1 REVENUETOCONSIDER.FINANCIALTRANSACTIONLINEITEMID from #CONTRIBUTIONPROCESS_REVENUETOCONSIDER REVENUETOCONSIDER where REVENUETOCONSIDER.FINANCIALTRANSACTIONID = LEVELSTOUPGRADE.FINANCIALTRANSACTIONID)
        from #CONTRIBUTIONPROCESS_LEVELSTOUPGRADEFULLGIFT as LEVELSTOUPGRADE  

        update dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE   
        set CURRENTMEMBERSHIPTRANSACTIONID = LEVELSTOUPGRADE.MEMBERSHIPTRANSACTIONID  
        from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
        inner join #CONTRIBUTIONPROCESS_LEVELSTOUPGRADEFULLGIFT as LEVELSTOUPGRADE on LEVELSTOUPGRADE.MEMBERSHIPID = MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPID  

        insert into dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
        (  
          FINANCIALTRANSACTIONLINEITEMID,  
          MEMBERSHIPID,  
          MEMBERSHIPPROGRAMID,  
          CONSTITUENTID,  
          ORIGINALMEMBERSHIPTRANSACTIONID,  
          CURRENTMEMBERSHIPTRANSACTIONID,  
          AMOUNT,  
          EFFECTIVEDATE,  
          ADDEDBYID,  
          CHANGEDBYID,  
          DATEADDED,  
          DATECHANGED  
        )  
        select   
          REVENUETOCONSIDER.FINANCIALTRANSACTIONLINEITEMID,  
          LEVELSTOUPGRADE.MEMBERSHIPID,  
          @MEMBERSHIPPROGRAMID,  
          LEVELSTOUPGRADE.CONSTITUENTID,  
          LEVELSTOUPGRADE.MEMBERSHIPTRANSACTIONID,  
          LEVELSTOUPGRADE.MEMBERSHIPTRANSACTIONID,  
          REVENUETOCONSIDER.AMOUNTINCURRENCY,  
          LEVELSTOUPGRADE.EFFECTIVEDATE,  
          @CHANGEAGENTID,  
          @CHANGEAGENTID,  
          @PROCESSDATE,  
          @PROCESSDATE  
        from #CONTRIBUTIONPROCESS_LEVELSTOUPGRADEFULLGIFT as LEVELSTOUPGRADE  
        inner join #CONTRIBUTIONPROCESS_REVENUETOCONSIDER as REVENUETOCONSIDER on LEVELSTOUPGRADE.FINANCIALTRANSACTIONID = REVENUETOCONSIDER.FINANCIALTRANSACTIONID  

        set @NUMPROCESSED += (select count(*) from #CONTRIBUTIONPROCESS_LEVELSTOUPGRADEFULLGIFT)  
      end  

      drop table #CONTRIBUTIONPROCESS_REVENUETOCONSIDER  


      set @OUTPUTSQL = N'insert into dbo.' + @OUTPUTTABLE + N' (MEMBERSHIPID, MEMBERSHIPPROGRAMNAME, MEMBERSHIPLEVELNAME, MEMBERSHIPTERMNAME, CONSTITUENTNAME)   
        select   
          LEVELSTORENEW.MEMBERSHIPID,   
          @PROGRAMNAME,   
          MEMBERSHIPLEVEL.NAME,   
          CAST(MEMBERSHIPLEVELTERM.TERMTIMELENGTH as nvarchar(3)) + MEMBERSHIPLEVELTERM.TERMLENGTH,   
          NF.NAME   
        from #CONTRIBUTIONPROCESS_LEVELSTORENEWFULLGIFT as LEVELSTORENEW   
        inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.ID = LEVELSTORENEW.TERMID    
        inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = LEVELSTORENEW.LEVELID    
        inner join dbo.CONSTITUENT on CONSTITUENT.ID = LEVELSTORENEW.CONSTITUENTID   
        outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(CONSTITUENT.ID) NF  

        union all  
        select  
          case when LEVELSTOADD.EXISTINGMEMBERSHIPID is null then LEVELSTOADD.MEMBERSHIPID   
            else LEVELSTOADD.EXISTINGMEMBERSHIPID   
          end as MEMBERSHIPID,   
          @PROGRAMNAME,   
          MEMBERSHIPLEVEL.NAME,   
          CAST(MEMBERSHIPLEVELTERM.TERMTIMELENGTH as nvarchar(3)) +  MEMBERSHIPLEVELTERM.TERMLENGTH,   
          NF.NAME   
        from #CONTRIBUTIONPROCESS_LEVELSTOADDFULLGIFT as LEVELSTOADD   
        inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.ID = LEVELSTOADD.TERMID   
        inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = LEVELSTOADD.LEVELID   
        inner join dbo.CONSTITUENT on CONSTITUENT.ID = LEVELSTOADD.CONSTITUENTID  
        outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(CONSTITUENT.ID) NF  
        where LEVELSTOADD.EXPIRATIONDATE is not null '  

      if @WHATHAPPENSIFTHEYGIVEMORECODE = 1  
      begin  
      set @OUTPUTSQL = @OUTPUTSQL + 'union all   
        select   
          LEVELSTOUPGRADE.MEMBERSHIPID,   
          @PROGRAMNAME,   
          MEMBERSHIPLEVEL.NAME,   
          CAST(MEMBERSHIPLEVELTERM.TERMTIMELENGTH as nvarchar(3)) + MEMBERSHIPLEVELTERM.TERMLENGTH,  
          NF.NAME  
        from #CONTRIBUTIONPROCESS_LEVELSTOUPGRADEFULLGIFT as LEVELSTOUPGRADE   
        inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.ID = LEVELSTOUPGRADE.TERMID   
        inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = LEVELSTOUPGRADE.LEVELID   
        inner join dbo.CONSTITUENT on CONSTITUENT.ID = LEVELSTOUPGRADE.CONSTITUENTID   
        outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(CONSTITUENT.ID) NF '  
      end  

      exec sp_executesql @OUTPUTSQL, N'@PROGRAMNAME nvarchar(100)',@PROGRAMNAME=@PROGRAMNAME  

      drop table #CONTRIBUTIONPROCESS_LEVELSTOADDFULLGIFT  
      drop table #CONTRIBUTIONPROCESS_LEVELSTORENEWFULLGIFT  

      if @WHATHAPPENSIFTHEYGIVEMORECODE = 1  
        drop table #CONTRIBUTIONPROCESS_LEVELSTOUPGRADEFULLGIFT  

    end --end if @ISMULTIPLEREVENUETRANSACTIONSCOUNTED = 1  


    /*** Block for when we're considering the sum of multiple revenue transactions to award memberships ***/  
    else if @ISMULTIPLEREVENUETRANSACTIONSCOUNTED = 1  
    begin  
      --Updating line items that have been previously considered by the process and since been updated.  

      update dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE   
      set   
        CONSTITUENTID = CHANGEDSPLITS.CONSTITUENTID,  
        AMOUNT = CHANGEDSPLITS.AMOUNTINCURRENCY,  
        EFFECTIVEDATE = CHANGEDSPLITS.EFFECTIVEDATE,  
        DATECHANGED = @PROCESSDATE,  
        CHANGEDBYID = @CHANGEAGENTID  
      from (  
        select   
          REVENUESPLIT_INCURRENCY.ID,  
          REVENUESPLIT_INCURRENCY.AMOUNTINCURRENCY,  
          REVENUESPLIT_INCURRENCY.DATE as EFFECTIVEDATE,  
          REVENUE_INCURRENCY.CONSTITUENTID  
        from dbo.UFN_REVENUE_GETAMOUNTSINCURRENCY_BULK(@PROGRAMBASECURRENCYID, @ORGANIZATIONCURRENCYID, @PROGRAMBASECURRENCYDIGITS, @PROGRAMBASECURRENCYROUNDINGTYPECODE) as REVENUE_INCURRENCY  
        inner join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@PROGRAMBASECURRENCYID, @ORGANIZATIONCURRENCYID, @PROGRAMBASECURRENCYDIGITS, @PROGRAMBASECURRENCYROUNDINGTYPECODE) as REVENUESPLIT_INCURRENCY on   
          REVENUESPLIT_INCURRENCY.REVENUEID = REVENUE_INCURRENCY.ID  
        where  
          (REVENUE_INCURRENCY.DATECHANGED > @LASTRUNONDATE or @LASTRUNONDATE is null) and   
          (REVENUESPLIT_INCURRENCY.DATE <= @PROCESSDATE or @PROCESSDATE is null)  
          --If the split has been deleted, should we remove this record?  

      ) CHANGEDSPLITS  
      where  
        MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.FINANCIALTRANSACTIONLINEITEMID =  CHANGEDSPLITS.ID and  
        MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID and  
        MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPID is null and  
        (  
          CHANGEDSPLITS.CONSTITUENTID <>  MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID or  
          CHANGEDSPLITS.AMOUNTINCURRENCY <>  MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.AMOUNT or  
          CHANGEDSPLITS.EFFECTIVEDATE <> MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.EFFECTIVEDATE  
        )  

      --Populate MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE with qualifying revenue  

      if @CRITERIADEFINITIONTYPECODE = 0  
      begin  
        --Populate MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE with filter criteria  

        exec dbo.USP_MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE_POPULATE_BYFILTERCRITERIA  
          @MEMBERSHIPPROGRAMID,  
          @CHANGEAGENTID,  
          @PROCESSDATE,  
          @LASTRUNONDATE  
      end  
      else if @CRITERIADEFINITIONTYPECODE = 1  
      begin  
        --Populate MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE with application selection  

        exec dbo.USP_MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE_POPULATE_BYAPPLICATIONSELECTION  
          @MEMBERSHIPPROGRAMID,  
          @CHANGEAGENTID,  
          @PROCESSDATE,  
          @LASTRUNONDATE  
      end  

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

      create table #CONTRIBUTIONPROCESS_CONSTITUENTSTOCHECK (  
        CONSTITUENTID uniqueidentifier primary key clustered(CONSTITUENTID)  
      )  
      insert into #CONTRIBUTIONPROCESS_CONSTITUENTSTOCHECK(CONSTITUENTID)  
      (  
        select distinct MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID  
        from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE   
        where   
          MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.DATECHANGED = @PROCESSDATE  
          and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
      )  

      --If this program is a 'both ways' program and doesn't allow multiple memberships,   

      --we need to not consider constituents who are already members of a dues-based level of this program.  

      if @PROGRAMBASEDONCODE = 2 and @ALLOWMULTIPLEMEMBERSHIPS = 0  
      begin  
        delete from #CONTRIBUTIONPROCESS_CONSTITUENTSTOCHECK  
        where CONSTITUENTID in (  
          select CONSTITUENTSTOCHECK.CONSTITUENTID   
          from #CONTRIBUTIONPROCESS_CONSTITUENTSTOCHECK CONSTITUENTSTOCHECK  
          inner join dbo.MEMBER on MEMBER.CONSTITUENTID = CONSTITUENTSTOCHECK.CONSTITUENTID  
          inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MEMBER.MEMBERSHIPID  
          inner join dbo.MEMBERSHIPLEVEL on   
            MEMBERSHIPLEVEL.ID = MEMBERSHIP.MEMBERSHIPLEVELID  
            and MEMBERSHIP.STATUSCODE <> 1   
          where   
            MEMBERSHIPLEVEL.OBTAINLEVELCODE = 0  
            and MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
        )  
      end  

      --Sum(splits) based on Constituent/Revenue so we can get the new count of the single gift since some splits of a gift could have been excluded  

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

      -- Create and insert into LEVELSTOADD, this will contain all constituents and the revenue that qualifies them for the program/level/term that  

      -- they currently are not in.  

      create table #CONTRIBUTIONPROCESS_LEVELSTOADD  
      (  
        CONSTITUENTID uniqueidentifier,  
        EFFECTIVEDATE datetime,  
        LEVELID uniqueidentifier,  
        TERMID uniqueidentifier,  
        AFTEREXPIRATION tinyint,  
        TERMTIMELENGTH int,  
        TERMLENGTHCODE tinyint,  
        MEMBERSHIPID uniqueidentifier,  
        MEMBERSHIPTRANSACTIONID uniqueidentifier,  
        MEMBERID uniqueidentifier,  
        EXPIRATIONDATE date,  
        EXISTINGMEMBERSHIPID uniqueidentifier  
      );  

      with MAXSUMMED_CTE as (  
        select CONSTITUENTID,  
          SUM(AMOUNT) as AMOUNT,  
          MAX(EFFECTIVEDATE) AS EFFECTIVEDATE,  
          TERMSBYLEVEL.LEVELID,  
          TERMSBYLEVEL.TERMID,  
          MEMBERSHIPLEVEL.AFTEREXPIRATION,  
          ORDEREDTERMS.TERMTIMELENGTH,  
          MEMBERSHIPLEVEL.SEQUENCE  
        from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
        inner join @ORDEREDTERMS ORDEREDTERMS on EFFECTIVEDATE >= ORDEREDTERMS.MINIMUMDATE  
        inner join @TERMSBYLEVEL TERMSBYLEVEL on TERMSBYLEVEL.TERMTIMELENGTH = ORDEREDTERMS.TERMTIMELENGTH  
        inner join MEMBERSHIPLEVEL on TERMSBYLEVEL.LEVELID = MEMBERSHIPLEVEL.ID  
        where   
          MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID in (select CONSTITUENTID from #CONTRIBUTIONPROCESS_CONSTITUENTSTOCHECK)  
          and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
          and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPID is null  
          and not exists (  
            select MEMBERSHIP.ID   
            from dbo.MEMBER  
            inner join dbo.MEMBERSHIP on MEMBER.MEMBERSHIPID = MEMBERSHIP.ID  
            inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIP.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID  
            where MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID   
              and  MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID = MEMBER.CONSTITUENTID  
              and MEMBERSHIPLEVEL.OBTAINLEVELCODE = 1  
              and  @PROCESSDATE < dateadd(month,MEMBERSHIPLEVEL.AFTEREXPIRATION,MEMBERSHIP.EXPIRATIONDATE)   
          )  
        group by CONSTITUENTID,TERMSBYLEVEL.LEVELID,TERMSBYLEVEL.TERMID,MEMBERSHIPLEVEL.AFTEREXPIRATION,ORDEREDTERMS.TERMTIMELENGTH,  
            MEMBERSHIPLEVEL.SEQUENCE,TERMSBYLEVEL.LOWAMOUNT,TERMSBYLEVEL.HIGHAMOUNT  
        having SUM(AMOUNT) between TERMSBYLEVEL.LOWAMOUNT and TERMSBYLEVEL.HIGHAMOUNT  
      )  

      insert into #CONTRIBUTIONPROCESS_LEVELSTOADD  
      (  
        CONSTITUENTID,  
        LEVELID,   
        TERMID,  
        AFTEREXPIRATION,  
        TERMTIMELENGTH,  
        MEMBERSHIPID,  
        MEMBERSHIPTRANSACTIONID,  
        MEMBERID,  
        EXPIRATIONDATE,  
        EXISTINGMEMBERSHIPID  
      )  
      select   
        MAXSUMMED_CTE.CONSTITUENTID,  
        LEVELID,  
        TERMID,  
        AFTEREXPIRATION,  
        TERMTIMELENGTH,  
        NEWID(),  
        NEWID(),  
        NEWID(),  
        case @WHATDATETOCALCULATEEXPIRATIONDATECODE   
          when 0 then dbo.UFN_DATE_GETLATESTTIME(dateadd(month,TERMTIMELENGTH,EFFECTIVEDATE))  
          when 1 then dbo.UFN_DATE_GETLATESTTIME(dateadd(month,TERMTIMELENGTH,dateadd(s,-1,dateadd(mm, DATEDIFF(m,0,EFFECTIVEDATE)+1,0))))  
        end as EXPIRATIONDATE,  
        (   
          select top 1 MEMBERSHIP.ID   
          from dbo.MEMBER  
          inner join dbo.MEMBERSHIP on MEMBER.MEMBERSHIPID = MEMBERSHIP.ID  
          inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIP.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID  
          where   
            MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID   
            and MAXSUMMED_CTE.CONSTITUENTID = MEMBER.CONSTITUENTID  
            and  MEMBERSHIPLEVEL.OBTAINLEVELCODE = 1  
            and MEMBERSHIP.STATUSCODE <> 1   
            and  @PROCESSDATE > dateadd(month,MAXSUMMED_CTE.AFTEREXPIRATION,MEMBERSHIP.EXPIRATIONDATE)  
        ) as EXISTINGMEMBERSHIPID  
      from (  
        select MAXSUMMED_CTE.CONSTITUENTID,MAXSUMMED_CTE.SEQUENCE,MAX(MAXSUMMED_CTE.TERMTIMELENGTH) as MAXTERM   
        from (  
          select CONSTITUENTID,MAX(sequence) as MXSEQUENCE  
          from MAXSUMMED_CTE   
          group by CONSTITUENTID  
        ) as TEMP  
        inner join MAXSUMMED_CTE on MAXSUMMED_CTE.CONSTITUENTID = TEMP.CONSTITUENTID and MAXSUMMED_CTE.SEQUENCE = TEMP.MXSEQUENCE                            
        group by MAXSUMMED_CTE.CONSTITUENTID,MAXSUMMED_CTE.SEQUENCE  
      ) as TEMP2  
      inner join MAXSUMMED_CTE on MAXSUMMED_CTE.CONSTITUENTID = TEMP2.CONSTITUENTID and MAXSUMMED_CTE.SEQUENCE = TEMP2.SEQUENCE and MAXSUMMED_CTE.TERMTIMELENGTH = TEMP2.MAXTERM  


      insert into dbo.MEMBERSHIP  
      (  
        ID,  
        MEMBERSHIPPROGRAMID,   
        MEMBERSHIPLEVELID,  
        MEMBERSHIPLEVELTERMID,  
        JOINDATE,  
        EXPIRATIONDATE,  
        ADDEDBYID,  
        CHANGEDBYID,  
        DATEADDED,  
        DATECHANGED  
      )  
      select  
        LEVELSTOADD.MEMBERSHIPID,  
        @MEMBERSHIPPROGRAMID,  
        LEVELSTOADD.LEVELID,  
        LEVELSTOADD.TERMID,  
        @CURRENTEARLIESTDATETIME,  
        EXPIRATIONDATE,  
        @CHANGEAGENTID,  
        @CHANGEAGENTID,  
        @PROCESSDATE,  
        @PROCESSDATE  
      from #CONTRIBUTIONPROCESS_LEVELSTOADD as LEVELSTOADD  
      where LEVELSTOADD.EXISTINGMEMBERSHIPID is null  
        and LEVELSTOADD.EXPIRATIONDATE is not null  

      update dbo.MEMBERSHIP   
      set   
        MEMBERSHIP.STATUSCODE = 0,  
        MEMBERSHIP.EXPIRATIONDATE = LEVELSTOADD.EXPIRATIONDATE,  
        MEMBERSHIP.MEMBERSHIPLEVELID = LEVELSTOADD.LEVELID,  
        MEMBERSHIP.MEMBERSHIPLEVELTERMID = LEVELSTOADD.TERMID  
      from dbo.MEMBERSHIP  
      inner join #CONTRIBUTIONPROCESS_LEVELSTOADD  as LEVELSTOADD on coalesce(LEVELSTOADD.EXISTINGMEMBERSHIPID,LEVELSTOADD.MEMBERSHIPID) = MEMBERSHIP.ID  
      where LEVELSTOADD.EXPIRATIONDATE is not null  

      insert into dbo.MEMBERSHIPTRANSACTION  
      (  
        ID,  
        MEMBERSHIPID,  
        MEMBERSHIPLEVELID,  
        MEMBERSHIPLEVELTERMID,  
        TRANSACTIONDATE,  
        EXPIRATIONDATE,  
        ACTIONCODE,  
        ADDEDBYID,  
        CHANGEDBYID,  
        DATEADDED,  
        DATECHANGED  
      )  
      select  
        LEVELSTOADD.MEMBERSHIPTRANSACTIONID,  
        case when LEVELSTOADD.EXISTINGMEMBERSHIPID is null then LEVELSTOADD.MEMBERSHIPID  
        else LEVELSTOADD.EXISTINGMEMBERSHIPID  
        end,  
        LEVELSTOADD.LEVELID,  
        LEVELSTOADD.TERMID,  
        @CURRENTEARLIESTDATETIME,  
        dbo.UFN_DATE_GETLATESTTIME(EXPIRATIONDATE),  
        case   
          when LEVELSTOADD.EXISTINGMEMBERSHIPID is null then 0  
          else   
            case when @RENEWALWINDOWREVENUETYPECODE = 0 then 5  
              else 0  
            end  
        end,  
        @CHANGEAGENTID,  
        @CHANGEAGENTID,  
        @PROCESSDATE,  
        @PROCESSDATE  
      from #CONTRIBUTIONPROCESS_LEVELSTOADD as LEVELSTOADD  
      where LEVELSTOADD.EXPIRATIONDATE is not null  

      insert into dbo.MEMBER   
      (  
        ID,  
        CONSTITUENTID,  
        MEMBERSHIPID,  
        ISPRIMARY,  
        ADDEDBYID,  
        CHANGEDBYID,  
        DATEADDED,  
        DATECHANGED  
      )  
      select   
        LEVELSTOADD.MEMBERID,  
        LEVELSTOADD.CONSTITUENTID,  
        LEVELSTOADD.MEMBERSHIPID,  
        1,  
        @CHANGEAGENTID,  
        @CHANGEAGENTID,  
        @PROCESSDATE,  
        @PROCESSDATE  
      from #CONTRIBUTIONPROCESS_LEVELSTOADD as LEVELSTOADD  
      where LEVELSTOADD.EXISTINGMEMBERSHIPID is null  
        and LEVELSTOADD.EXPIRATIONDATE is not null  
        and LEVELSTOADD.CONSTITUENTID is not null  

      update dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE   
      set   
        MEMBERSHIPID = case  
          when LEVELSTOADD.EXISTINGMEMBERSHIPID is null then LEVELSTOADD.MEMBERSHIPID  
          else LEVELSTOADD.EXISTINGMEMBERSHIPID  
        end,  
        ORIGINALMEMBERSHIPTRANSACTIONID = LEVELSTOADD.MEMBERSHIPTRANSACTIONID,  
        CURRENTMEMBERSHIPTRANSACTIONID = LEVELSTOADD.MEMBERSHIPTRANSACTIONID,  
        CHANGEDBYID = @CHANGEAGENTID,  
        DATECHANGED = @PROCESSDATE  
      from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE   
      inner join #CONTRIBUTIONPROCESS_LEVELSTOADD as LEVELSTOADD on LEVELSTOADD.CONSTITUENTID = MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID  
      inner join @ORDEREDTERMS ORDEREDTERMS on MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.EFFECTIVEDATE >= ORDEREDTERMS.MINIMUMDATE and LEVELSTOADD.TERMTIMELENGTH = ORDEREDTERMS.TERMTIMELENGTH  
      and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
      and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPID is null  
      and LEVELSTOADD.EXPIRATIONDATE is not null  

      delete from #CONTRIBUTIONPROCESS_CONSTITUENTSTOCHECK  
      where CONSTITUENTID in (select LEVELSTOADD.CONSTITUENTID from #CONTRIBUTIONPROCESS_LEVELSTOADD LEVELSTOADD)  

      set @NUMPROCESSED += (select count(*) from #CONTRIBUTIONPROCESS_LEVELSTOADD as LEVELSTOADD where LEVELSTOADD.EXPIRATIONDATE is not null)  

      --Renew memberships that are available for renewal based on the process date(current date) and the largest gift they have given is > the cost to renew  

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

      create table #CONTRIBUTIONPROCESS_LEVELSTORENEW  
      (  
        CONSTITUENTID uniqueidentifier,  
        MEMBERSHIPID uniqueidentifier,  
        MEMBERSHIPLEVELID uniqueidentifier,  
        MEMBERSHIPTERMID uniqueidentifier,  
        MEMBERSHIPTRANSACTIONID uniqueidentifier,  
        EXPIRATIONDATE date,  
        TERMTIMELENGTH int,  
        TERMLENGTHCODE tinyint,  
        ACTIONCODE tinyint  
      )  

      insert into #CONTRIBUTIONPROCESS_LEVELSTORENEW  
      (  
        CONSTITUENTID,  
        MEMBERSHIPID,  
        MEMBERSHIPLEVELID,  
        MEMBERSHIPTERMID,  
        MEMBERSHIPTRANSACTIONID,  
        EXPIRATIONDATE,  
        TERMTIMELENGTH,  
        TERMLENGTHCODE,  
        ACTIONCODE  
      )  
      select   
        SUMMEDGIFT.CONSTITUENTID,  
        SUMMEDGIFT.MEMBERSHIPID,  
        QUALIFIEDLEVEL.LEVELID,  
        QUALIFIEDLEVEL.TERMID,  
        NEWID(),  
        case when TERMLENGTHCODE = 0 then dbo.UFN_DATE_GETLATESTTIME(dateadd(month,SUMMEDGIFT.TERMTIMELENGTH,SUMMEDGIFT.EXPIRATIONDATE))   
        else dbo.UFN_DATE_GETLATESTTIME(dateadd(year,SUMMEDGIFT.TERMTIMELENGTH,SUMMEDGIFT.EXPIRATIONDATE))   
        end as EXPIRATIONDATE,  
        SUMMEDGIFT.TERMTIMELENGTH,  
        SUMMEDGIFT.TERMLENGTHCODE,  
        case when SUMMEDGIFT.MEMBERSHIPLEVELID = QUALIFIEDLEVEL.LEVELID then 1 --Renew  

          else 2 -- Upgrade  

        end as ACTIONCODE  
      from (  
        select   
          MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID,  
          sum(MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.AMOUNT) as AMOUNT,  
          max(EFFECTIVEDATE) as EFFECTIVEDATE,  
          MEMBERSHIPLEVELTERM.LOWAMOUNT,  
          MEMBERSHIPLEVELTERM.AMOUNT as HIGHAMOUNT,  
          MEMBERSHIPLEVELTERM.TERMTIMELENGTH,  
          MEMBERSHIPLEVELTERM.TERMLENGTHCODE,  
          MEMBERSHIP.ID as MEMBERSHIPID,  
          MEMBERSHIP.MEMBERSHIPLEVELID,  
          MEMBERSHIP.MEMBERSHIPLEVELTERMID,  
          MEMBERSHIP.EXPIRATIONDATE,  
          MEMBERSHIPLEVEL.SEQUENCE  
        from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
        inner join dbo.MEMBER on MEMBER.CONSTITUENTID = MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID  
        inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MEMBER.MEMBERSHIPID and MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
        inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = MEMBERSHIP.MEMBERSHIPLEVELID   
        inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.ID = MEMBERSHIP.MEMBERSHIPLEVELTERMID  
        where MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID in (select CONSTITUENTID from #CONTRIBUTIONPROCESS_CONSTITUENTSTOCHECK)   
          and MEMBERSHIP.STATUSCODE <> 1   
          and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.ORIGINALMEMBERSHIPTRANSACTIONID is null   
          and (  
            @PROCESSDATE < dateadd(month,MEMBERSHIPLEVEL.AFTEREXPIRATION,MEMBERSHIP.EXPIRATIONDATE)  
            and @PROCESSDATE >   
              case @WHATHAPPENSIFTHEYGIVEMORECODE   
                when 2 then coalesce(MEMBERSHIP.LASTRENEWEDON,MEMBERSHIP.JOINDATE)  
                else  
                  case MEMBERSHIPLEVEL.BEFOREEXPIRATION  
                    when 13 then -- Start of membership  

                      case MEMBERSHIPLEVELTERM.TERMLENGTHCODE  
                        when 0 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                        when 1 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(year,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                      end  
                    else dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,MEMBERSHIPLEVEL.BEFOREEXPIRATION*-1,MEMBERSHIP.EXPIRATIONDATE))  
                  end  
              end  
          )  
          and (MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.EFFECTIVEDATE < dateadd(month,MEMBERSHIPLEVEL.AFTEREXPIRATION,MEMBERSHIP.EXPIRATIONDATE)  
          and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.EFFECTIVEDATE >=   
            case @WHATHAPPENSIFTHEYGIVEMORECODE   
              when 2 then coalesce(MEMBERSHIP.LASTRENEWEDON,MEMBERSHIP.JOINDATE)  
              else  
                case MEMBERSHIPLEVEL.BEFOREEXPIRATION  
                  when 13 then -- Start of membership  

                    case MEMBERSHIPLEVELTERM.TERMLENGTHCODE  
                      when 0 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                      when 1 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(year,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                    end  
                  else dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,MEMBERSHIPLEVEL.BEFOREEXPIRATION*-1,MEMBERSHIP.EXPIRATIONDATE))  
                end  
            end  
          )  
        group by MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID,MEMBERSHIP.ID,MEMBERSHIPLEVELTERM.LOWAMOUNT,  
            MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIPLEVELTERM.TERMLENGTHCODE,MEMBERSHIP.MEMBERSHIPLEVELID,MEMBERSHIP.MEMBERSHIPLEVELTERMID,MEMBERSHIPLEVELTERM.AMOUNT,MEMBERSHIP.EXPIRATIONDATE, MEMBERSHIPLEVEL.SEQUENCE  
      ) as SUMMEDGIFT  
      cross apply (  
        select top(1)   
          MEMBERSHIPLEVEL.ID as LEVELID,  
          MEMBERSHIPLEVELTERM.ID as TERMID  
        from dbo.MEMBERSHIPLEVEL  
        inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.LEVELID =  MEMBERSHIPLEVEL.ID  
        where MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
          and SUMMEDGIFT.AMOUNT >= (MEMBERSHIPLEVELTERM.LOWAMOUNT)  
          and SUMMEDGIFT.AMOUNT <= (MEMBERSHIPLEVELTERM.AMOUNT)  
          and MEMBERSHIPLEVEL.SEQUENCE >= SUMMEDGIFT.SEQUENCE  
          and MEMBERSHIPLEVELTERM.TERMTIMELENGTH = SUMMEDGIFT.TERMTIMELENGTH   
          and MEMBERSHIPLEVELTERM.TERMLENGTHCODE = SUMMEDGIFT.TERMLENGTHCODE  
          and MEMBERSHIPLEVEL.OBTAINLEVELCODE = 1  
        order by MEMBERSHIPLEVEL.SEQUENCE desc  
      ) as QUALIFIEDLEVEL  

      insert into dbo.MEMBERSHIPTRANSACTION  
      (  
        ID,  
        MEMBERSHIPID,  
        MEMBERSHIPLEVELID,  
        MEMBERSHIPLEVELTERMID,  
        TRANSACTIONDATE,  
        EXPIRATIONDATE,  
        ACTIONCODE,  
        ADDEDBYID,  
        CHANGEDBYID,  
        DATEADDED,  
        DATECHANGED  
      )  
      select   
        LEVELSTORENEW.MEMBERSHIPTRANSACTIONID,  
        LEVELSTORENEW.MEMBERSHIPID,  
        LEVELSTORENEW.MEMBERSHIPLEVELID,  
        LEVELSTORENEW.MEMBERSHIPTERMID,  
        @CURRENTEARLIESTDATETIME,  
        dbo.UFN_DATE_GETLATESTTIME(EXPIRATIONDATE),  
        LEVELSTORENEW.ACTIONCODE,  
        @CHANGEAGENTID,  
        @CHANGEAGENTID,  
        @PROCESSDATE,  
        @PROCESSDATE  
      from #CONTRIBUTIONPROCESS_LEVELSTORENEW as LEVELSTORENEW  

      update dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE   
      set   
        MEMBERSHIPID =  LEVELSTORENEW.MEMBERSHIPID,  
        ORIGINALMEMBERSHIPTRANSACTIONID = LEVELSTORENEW.MEMBERSHIPTRANSACTIONID,  
        CURRENTMEMBERSHIPTRANSACTIONID = LEVELSTORENEW.MEMBERSHIPTRANSACTIONID,  
        CHANGEDBYID = @CHANGEAGENTID,  
        DATECHANGED = @PROCESSDATE  
      from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE   
      inner join #CONTRIBUTIONPROCESS_LEVELSTORENEW as LEVELSTORENEW on LEVELSTORENEW.CONSTITUENTID = MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID  
      inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = LEVELSTORENEW.MEMBERSHIPLEVELID  
      inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = LEVELSTORENEW.MEMBERSHIPID  
      inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.ID = MEMBERSHIP.MEMBERSHIPLEVELTERMID  
      and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
      and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPID is null  
      and (  
         MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.EFFECTIVEDATE < dateadd(month,MEMBERSHIPLEVEL.AFTEREXPIRATION,MEMBERSHIP.EXPIRATIONDATE)  
         and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.EFFECTIVEDATE >=   
         case @WHATHAPPENSIFTHEYGIVEMORECODE   
           when 2 then coalesce(MEMBERSHIP.LASTRENEWEDON,MEMBERSHIP.JOINDATE)  
             else  
               case MEMBERSHIPLEVEL.BEFOREEXPIRATION  
                 when 13 then -- Start of membership  

                   case MEMBERSHIPLEVELTERM.TERMLENGTHCODE  
                     when 0 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                     when 1 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(year,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                   end  
                 else dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,MEMBERSHIPLEVEL.BEFOREEXPIRATION*-1,MEMBERSHIP.EXPIRATIONDATE))  
               end  
         end  
      )  
      and LEVELSTORENEW.EXPIRATIONDATE is not null  


      update dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE   
      set CURRENTMEMBERSHIPTRANSACTIONID = LEVELSTORENEW.MEMBERSHIPTRANSACTIONID  
      from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
      inner join #CONTRIBUTIONPROCESS_LEVELSTORENEW as LEVELSTORENEW on LEVELSTORENEW.MEMBERSHIPID = MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPID  

      update dbo.MEMBERSHIP   
      set   
        STATUSCODE = 0,  
        MEMBERSHIPLEVELID = LEVELSTORENEW.MEMBERSHIPLEVELID,   
        MEMBERSHIPLEVELTERMID =  LEVELSTORENEW.MEMBERSHIPTERMID,  
        LASTRENEWEDON = @CURRENTEARLIESTDATETIME,  
        EXPIRATIONDATE = LEVELSTORENEW.EXPIRATIONDATE,  
        CHANGEDBYID = @CHANGEAGENTID,   
        DATECHANGED = @PROCESSDATE  
      from dbo.MEMBERSHIP  
      inner join #CONTRIBUTIONPROCESS_LEVELSTORENEW LEVELSTORENEW on LEVELSTORENEW.MEMBERSHIPID = MEMBERSHIP.ID  

      delete from #CONTRIBUTIONPROCESS_CONSTITUENTSTOCHECK  
      where CONSTITUENTID in (select LEVELSTORENEW.CONSTITUENTID from #CONTRIBUTIONPROCESS_LEVELSTORENEW LEVELSTORENEW)  

      set @NUMPROCESSED += (select count(*) from #CONTRIBUTIONPROCESS_LEVELSTORENEW)  

      if @WHATHAPPENSIFTHEYGIVEMORECODE = 1  
      begin  

       declare @FINANCIALTRANSACTIONID uniqueidentifier,
       @FINANCIALTRANSACTIONLINEITEMID uniqueidentifier,
       @MEMBERSHIPID uniqueidentifier,
       @ORIGINALMEMBERSHIPTRANSACTIONID uniqueidentifier,
       @CURRENTMEMBERSHIPTRANSACTIONID uniqueidentifier,
       @NEWFINANCIALTRANSACTIONLINEITEMID uniqueidentifier;

      --Remove old FINANCIALTRANSACTIONLINEITEM for which application type is changed and process new FINANCIALTRANSACTIONLINEITEM in membership program

       declare REVENUEPROCESS cursor local fast_forward for  
       select FINANCIALTRANSACTIONID, MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.FINANCIALTRANSACTIONLINEITEMID, MEMBERSHIPID, ORIGINALMEMBERSHIPTRANSACTIONID, CURRENTMEMBERSHIPTRANSACTIONID  
       from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
       inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.FINANCIALTRANSACTIONLINEITEMID  
       where MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
       and FINANCIALTRANSACTIONLINEITEM.DELETEDON is not null  
       and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPID is not null  
       and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID in (select CONSTITUENTID from #CONTRIBUTIONPROCESS_CONSTITUENTSTOCHECK);  

       open REVENUEPROCESS;  
       fetch next from REVENUEPROCESS into @FINANCIALTRANSACTIONID, @FINANCIALTRANSACTIONLINEITEMID, @MEMBERSHIPID, @ORIGINALMEMBERSHIPTRANSACTIONID, @CURRENTMEMBERSHIPTRANSACTIONID;  

       while (@@FETCH_STATUS = 0)  
       begin  
        set @NEWFINANCIALTRANSACTIONLINEITEMID = null;

        select @NEWFINANCIALTRANSACTIONLINEITEMID = MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.FINANCIALTRANSACTIONLINEITEMID  
        from  dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
        inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.FINANCIALTRANSACTIONLINEITEMID  
        where  MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPID is null  
        and FINANCIALTRANSACTIONID = @FINANCIALTRANSACTIONID  
        and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
        and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null;

        if (@NEWFINANCIALTRANSACTIONLINEITEMID is not null)  
        begin  
         update dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE   
         set MEMBERSHIPID = @MEMBERSHIPID,  
         ORIGINALMEMBERSHIPTRANSACTIONID = @ORIGINALMEMBERSHIPTRANSACTIONID,  
         CURRENTMEMBERSHIPTRANSACTIONID = @CURRENTMEMBERSHIPTRANSACTIONID,  
         CHANGEDBYID = @CHANGEAGENTID,  
         DATECHANGED = @PROCESSDATE  
         from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
         where MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.FINANCIALTRANSACTIONLINEITEMID = @NEWFINANCIALTRANSACTIONLINEITEMID;

         delete 
         from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
         where MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.FINANCIALTRANSACTIONLINEITEMID = @FINANCIALTRANSACTIONLINEITEMID;

        end

       fetch next from REVENUEPROCESS into @FINANCIALTRANSACTIONID, @FINANCIALTRANSACTIONLINEITEMID, @MEMBERSHIPID, @ORIGINALMEMBERSHIPTRANSACTIONID, @CURRENTMEMBERSHIPTRANSACTIONID;  
       end

       close REVENUEPROCESS;  
       deallocate REVENUEPROCESS;  

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

        create table #CONTRIBUTIONPROCESS_LEVELSTOUPGRADE  
        (  
          CONSTITUENTID uniqueidentifier,  
          AMOUNTINCURRENCY money,  
          EFFECTIVEDATE date,  
          LEVELID uniqueidentifier,  
          TERMID uniqueidentifier,  
          AFTEREXPIRATION tinyint,  
          TERMTIMELENGTH int,  
          TERMLENGTHCODE tinyint,  
          MEMBERSHIPID uniqueidentifier,  
          MEMBERSHIPTRANSACTIONID uniqueidentifier,  
          MEMBERID uniqueidentifier,  
          EXPIRATIONDATE date  
        )  

        insert into #CONTRIBUTIONPROCESS_LEVELSTOUPGRADE  
        (  
          CONSTITUENTID,  
          AMOUNTINCURRENCY,   
          EFFECTIVEDATE,   
          LEVELID,   
          TERMID,  
          AFTEREXPIRATION,  
          TERMTIMELENGTH,  
          TERMLENGTHCODE,  
          MEMBERSHIPID,  
          MEMBERSHIPTRANSACTIONID,  
          EXPIRATIONDATE  
        )  
        select   
          SUMMEDGIFT.CONSTITUENTID,  
          SUMMEDGIFT.AMOUNTINCURRENCY,  
          SUMMEDGIFT.EFFECTIVEDATE,  
          QUALIFIEDLEVEL.LEVELID,  
          QUALIFIEDLEVEL.TERMID,  
          SUMMEDGIFT.AFTEREXPIRATION,  
          SUMMEDGIFT.TERMTIMELENGTH,  
          SUMMEDGIFT.TERMLENGTHCODE,  
          SUMMEDGIFT.MEMBERSHIPID,  
          NEWID(),  
          SUMMEDGIFT.EXPIRATIONDATE  
        from (  
          select   
            MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID,  
  sum(MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.AMOUNT) as AMOUNTINCURRENCY,  
            max(EFFECTIVEDATE) as EFFECTIVEDATE,  
            MEMBERSHIPLEVEL.ID as LEVELID,  
            MEMBERSHIPLEVEL.AFTEREXPIRATION,  
            MEMBERSHIPLEVELTERM.TERMTIMELENGTH,  
            MEMBERSHIPLEVELTERM.TERMLENGTHCODE,  
            MEMBERSHIP.ID AS MEMBERSHIPID,  
            MEMBERSHIPLEVEL.SEQUENCE,  
            MEMBERSHIPLEVELTERM.AMOUNT as MEMBERSHIPLEVELTERMAMOUNT,  
            MEMBERSHIP.EXPIRATIONDATE  
          from  dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
          inner join dbo.MEMBER on MEMBER.CONSTITUENTID = MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID  
          inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MEMBER.MEMBERSHIPID and MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
          inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = MEMBERSHIP.MEMBERSHIPLEVELID   
          inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.ID = MEMBERSHIP.MEMBERSHIPLEVELTERMID  
          where   
            MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID in (select CONSTITUENTID from #CONTRIBUTIONPROCESS_CONSTITUENTSTOCHECK)  
            and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
             and  (  
              MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.ORIGINALMEMBERSHIPTRANSACTIONID is null  
              or MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.ORIGINALMEMBERSHIPTRANSACTIONID in (  
                select MEMBERSHIPTRANSACTION.ID   
                from dbo.MEMBERSHIPTRANSACTION  
                where MEMBERSHIPTRANSACTION.MEMBERSHIPID = MEMBERSHIP.ID  
                  and MEMBERSHIPTRANSACTION.EXPIRATIONDATE = (  
                    select max(MT.EXPIRATIONDATE)  
                    from dbo.MEMBERSHIPTRANSACTION MT  
                    where MT.MEMBERSHIPID = MEMBERSHIP.ID  
                  )  
              )  
            )  
            and MEMBERSHIP.STATUSCODE <> 2  
            and (  
              @PROCESSDATE <  
                case MEMBERSHIPLEVEL.BEFOREEXPIRATION  
                  when 13 then -- Start of membership  

                    case MEMBERSHIPLEVELTERM.TERMLENGTHCODE  
                      when 0 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                      when 1 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(year,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                    end  
                  else dateadd(month,MEMBERSHIPLEVEL.BEFOREEXPIRATION*-1,MEMBERSHIP.EXPIRATIONDATE)  
                end  
            )  
            and (  
              MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.EFFECTIVEDATE <  
                case MEMBERSHIPLEVEL.BEFOREEXPIRATION  
                  when 13 then -- Start of membership  

                    case MEMBERSHIPLEVELTERM.TERMLENGTHCODE  
                      when 0 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(month,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                      when 1 then dbo.UFN_DATE_GETEARLIESTTIME(dateadd(year,-1 * MEMBERSHIPLEVELTERM.TERMTIMELENGTH,MEMBERSHIP.EXPIRATIONDATE))  
                    end  
                  else dateadd(month,MEMBERSHIPLEVEL.BEFOREEXPIRATION*-1,MEMBERSHIP.EXPIRATIONDATE)  
                end  
            )  
          group by MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID,  
            MEMBERSHIPLEVEL.ID,  
            MEMBERSHIPLEVELTERM.ID,  
            MEMBERSHIPLEVEL.AFTEREXPIRATION,  
            MEMBERSHIPLEVELTERM.TERMTIMELENGTH,  
            MEMBERSHIPLEVELTERM.TERMLENGTHCODE,  
            MEMBERSHIP.ID,  
            MEMBERSHIPLEVEL.SEQUENCE,  
            MEMBERSHIPLEVELTERM.AMOUNT,  
            MEMBERSHIP.EXPIRATIONDATE  
        ) as SUMMEDGIFT  
        cross apply (  
          select top(1)   
            MEMBERSHIPLEVEL.ID as LEVELID,  
            MEMBERSHIPLEVELTERM.ID as TERMID  
          from dbo.MEMBERSHIPLEVEL  
          inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.LEVELID =  MEMBERSHIPLEVEL.ID  
          where MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
            and SUMMEDGIFT.AMOUNTINCURRENCY >= (MEMBERSHIPLEVELTERM.LOWAMOUNT)  
            and SUMMEDGIFT.AMOUNTINCURRENCY <= (MEMBERSHIPLEVELTERM.AMOUNT)  
            and MEMBERSHIPLEVEL.SEQUENCE > SUMMEDGIFT.SEQUENCE  
            and MEMBERSHIPLEVELTERM.TERMTIMELENGTH = SUMMEDGIFT.TERMTIMELENGTH   
            and MEMBERSHIPLEVELTERM.TERMLENGTHCODE = SUMMEDGIFT.TERMLENGTHCODE  
            and MEMBERSHIPLEVEL.OBTAINLEVELCODE = 1  
          order by MEMBERSHIPLEVEL.SEQUENCE desc  
        ) as QUALIFIEDLEVEL  

        update dbo.MEMBERSHIP   
        set   
          MEMBERSHIPLEVELID = LEVELSTOUPGRADE.LEVELID,   
          MEMBERSHIPLEVELTERMID =  LEVELSTOUPGRADE.TERMID,  
          CHANGEDBYID = @CHANGEAGENTID,   
          DATECHANGED = @PROCESSDATE  
        from dbo.MEMBERSHIP  
        inner join #CONTRIBUTIONPROCESS_LEVELSTOUPGRADE as LEVELSTOUPGRADE on LEVELSTOUPGRADE.MEMBERSHIPID = MEMBERSHIP.ID  

        insert into dbo.MEMBERSHIPTRANSACTION  
        (  
          ID,  
          MEMBERSHIPID,  
          MEMBERSHIPLEVELID,  
          MEMBERSHIPLEVELTERMID,  
          TRANSACTIONDATE,  
          EXPIRATIONDATE,  
          ACTIONCODE,  
          ADDEDBYID,  
          CHANGEDBYID,  
          DATEADDED,  
          DATECHANGED  
        )  
        select   
          LEVELSTOUPGRADE.MEMBERSHIPTRANSACTIONID,  
          LEVELSTOUPGRADE.MEMBERSHIPID,  
          LEVELSTOUPGRADE.LEVELID,  
          LEVELSTOUPGRADE.TERMID,  
          @CURRENTEARLIESTDATETIME,  
          dbo.UFN_DATE_GETLATESTTIME(EXPIRATIONDATE),  
          2,  
          @CHANGEAGENTID,  
          @CHANGEAGENTID,  
          @PROCESSDATE,  
          @PROCESSDATE  
        from #CONTRIBUTIONPROCESS_LEVELSTOUPGRADE as LEVELSTOUPGRADE  


        update dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE   
        set   
          MEMBERSHIPID =   LEVELSTOUPGRADE.MEMBERSHIPID,  
          ORIGINALMEMBERSHIPTRANSACTIONID = LEVELSTOUPGRADE.MEMBERSHIPTRANSACTIONID,  
          CURRENTMEMBERSHIPTRANSACTIONID = LEVELSTOUPGRADE.MEMBERSHIPTRANSACTIONID,  
          CHANGEDBYID = @CHANGEAGENTID,  
          DATECHANGED = @PROCESSDATE  
        from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE   
        inner join #CONTRIBUTIONPROCESS_LEVELSTOUPGRADE as LEVELSTOUPGRADE on LEVELSTOUPGRADE.CONSTITUENTID = MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.CONSTITUENTID  
          and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID  
          and MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPID is null  
          and LEVELSTOUPGRADE.EXPIRATIONDATE is not null

        update dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE set  
        CURRENTMEMBERSHIPTRANSACTIONID = LEVELSTOUPGRADE.MEMBERSHIPTRANSACTIONID  
        from dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE  
        inner join #CONTRIBUTIONPROCESS_LEVELSTOUPGRADE as LEVELSTOUPGRADE on LEVELSTOUPGRADE.MEMBERSHIPID = MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE.MEMBERSHIPID  

        set @NUMPROCESSED += (select count(*) from #CONTRIBUTIONPROCESS_LEVELSTOUPGRADE)  

      end --end @WHATHAPPENSIFTHEYGIVEMORECODE = 1  


      drop table #CONTRIBUTIONPROCESS_CONSTITUENTSTOCHECK  

      -- Create success and exception output tables and counts of each for the process status page.  


      set @OUTPUTSQL = N'insert into dbo.' + @OUTPUTTABLE + N' (MEMBERSHIPID, MEMBERSHIPPROGRAMNAME, MEMBERSHIPLEVELNAME, MEMBERSHIPTERMNAME, CONSTITUENTNAME)   
        select   
          LEVELSTORENEW.MEMBERSHIPID,   
          @PROGRAMNAME,   
          MEMBERSHIPLEVEL.NAME,   
          CAST(MEMBERSHIPLEVELTERM.TERMTIMELENGTH as nvarchar(3)) + MEMBERSHIPLEVELTERM.TERMLENGTH,   
          NF.NAME   
        from #CONTRIBUTIONPROCESS_LEVELSTORENEW as LEVELSTORENEW   
        inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.ID = LEVELSTORENEW.MEMBERSHIPTERMID    
        inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = LEVELSTORENEW.MEMBERSHIPLEVELID    
        inner join dbo.CONSTITUENT on CONSTITUENT.ID = LEVELSTORENEW.CONSTITUENTID   
        outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(CONSTITUENT.ID) NF  

        union all   
        select   
          case when LEVELSTOADD.EXISTINGMEMBERSHIPID is null then LEVELSTOADD.MEMBERSHIPID   
            else LEVELSTOADD.EXISTINGMEMBERSHIPID   
          end as MEMBERSHIPID,   
          @PROGRAMNAME,   
          MEMBERSHIPLEVEL.NAME,   
          CAST(MEMBERSHIPLEVELTERM.TERMTIMELENGTH as nvarchar(3)) +  MEMBERSHIPLEVELTERM.TERMLENGTH,   
          NF.NAME   
        from #CONTRIBUTIONPROCESS_LEVELSTOADD as LEVELSTOADD   
        inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.ID = LEVELSTOADD.TERMID   
        inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = LEVELSTOADD.LEVELID   
        inner join dbo.CONSTITUENT on CONSTITUENT.ID = LEVELSTOADD.CONSTITUENTID  
        outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(CONSTITUENT.ID) NF  
        where LEVELSTOADD.EXPIRATIONDATE is not null '  

      if @WHATHAPPENSIFTHEYGIVEMORECODE = 1  
      begin  
        set @OUTPUTSQL = @OUTPUTSQL + 'union all   
        select   
          LEVELSTOUPGRADE.MEMBERSHIPID,   
          @PROGRAMNAME,   
          MEMBERSHIPLEVEL.NAME,   
          CAST(MEMBERSHIPLEVELTERM.TERMTIMELENGTH as nvarchar(3)) + MEMBERSHIPLEVELTERM.TERMLENGTH,  
          NF.NAME  
        from #CONTRIBUTIONPROCESS_LEVELSTOUPGRADE as LEVELSTOUPGRADE   
        inner join dbo.MEMBERSHIPLEVELTERM on MEMBERSHIPLEVELTERM.ID = LEVELSTOUPGRADE.TERMID   
        inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = LEVELSTOUPGRADE.LEVELID   
        inner join dbo.CONSTITUENT on CONSTITUENT.ID = LEVELSTOUPGRADE.CONSTITUENTID   
        outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(CONSTITUENT.ID) NF '  
      end  

      exec sp_executesql @OUTPUTSQL, N'@PROGRAMNAME nvarchar(100)',@PROGRAMNAME=@PROGRAMNAME  

      drop table #CONTRIBUTIONPROCESS_LEVELSTOADD  
      drop table #CONTRIBUTIONPROCESS_LEVELSTORENEW  

      if @WHATHAPPENSIFTHEYGIVEMORECODE = 1  
        drop table #CONTRIBUTIONPROCESS_LEVELSTOUPGRADE;  

    end --end if @ISMULTIPLEREVENUETRANSACTIONSCOUNTED = 1  


    update dbo.MEMBERSHIPPROGRAM  
    set   
      LASTPROCESSEDON =  @PROCESSDATE,  
      CHANGEDBYID = @CHANGEAGENTID,  
      DATECHANGED =  @PROCESSDATE    
    where ID = @MEMBERSHIPPROGRAMID  

  end try  
  begin catch  
    exec dbo.USP_RAISE_ERROR;  
    return 1;  
  end catch  

  return 0;  
end