USP_MEMBERSHIP_ADDMEMBERSHIPTRANSACTION

Parameters

Parameter Parameter Type Mode Description
@MEMBERSHIPID uniqueidentifier INOUT
@CHANGEAGENTID uniqueidentifier IN
@CONSTITUENTID uniqueidentifier IN
@MEMBERSHIPPROGRAMID uniqueidentifier IN
@MEMBERSHIPLEVELID uniqueidentifier IN
@MEMBERSHIPLEVELTERMID uniqueidentifier IN
@MEMBERSHIPLEVELTYPECODEID uniqueidentifier IN
@TRANSACTIONDATE datetime IN
@EXPIRATIONDATE datetime IN
@NUMBEROFCHILDREN smallint IN
@COMMENTS nvarchar(1000) IN
@ISGIFT bit IN
@GIVENBYID uniqueidentifier IN
@SENDRENEWALCODE smallint IN
@MEMBERS xml IN
@MEMBERSHIPCARDS xml IN
@ADDONS xml IN
@REVENUESPLITID uniqueidentifier IN
@TRANSACTIONID uniqueidentifier INOUT

Definition

Copy


CREATE procedure dbo.USP_MEMBERSHIP_ADDMEMBERSHIPTRANSACTION
(
  @MEMBERSHIPID uniqueidentifier = null output,
  @CHANGEAGENTID uniqueidentifier = null,
  @CONSTITUENTID uniqueidentifier,
  @MEMBERSHIPPROGRAMID uniqueidentifier = null,
  @MEMBERSHIPLEVELID uniqueidentifier = null,
  @MEMBERSHIPLEVELTERMID uniqueidentifier = null,
  @MEMBERSHIPLEVELTYPECODEID uniqueidentifier = null,
  @TRANSACTIONDATE datetime = null,
  @EXPIRATIONDATE datetime = null,
  @NUMBEROFCHILDREN smallint = 0,
  @COMMENTS nvarchar(1000) = null,
  @ISGIFT bit = 0,
  @GIVENBYID uniqueidentifier = null,
  @SENDRENEWALCODE smallint = 1,
  @MEMBERS xml = null,
  @MEMBERSHIPCARDS xml = null,
  @ADDONS xml = null,
  @REVENUESPLITID uniqueidentifier = null,
  @TRANSACTIONID uniqueidentifier = null output
)
as
begin
  set nocount on;

  if @MEMBERSHIPID is null
    set @MEMBERSHIPID = newid();

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

  declare @CURRENTDATE datetime;
  set @CURRENTDATE = getdate();

  begin try

    declare @MEMBERSTABLE table (
      ID uniqueidentifier,
      SALESORDERITEMMEMBERID uniqueidentifier,
      CONSTITUENTID uniqueidentifier,
      ISPRIMARY bit
    );

    insert into @MEMBERSTABLE
      select
        T.members.value('(MEMBERID)[1]','uniqueidentifier') as 'ID',
        T.members.value('(SALESORDERITEMMEMBERID)[1]','uniqueidentifier') as 'SALESORDERITEMMEMBERID',
        T.members.value('(CONSTITUENTID)[1]','uniqueidentifier') as 'CONSTITUENTID',
        T.members.value('(ISPRIMARY)[1]','bit') as 'ISPRIMARY'
      from @MEMBERS.nodes('/MEMBERS/ITEM') T(members);

    update @MEMBERSTABLE set
      ID = newid()
    where (ID is null)
    or (ID = '00000000-0000-0000-0000-000000000000');

    update @MEMBERSTABLE
      set ID = newid()
    from @MEMBERSTABLE MEMBERS
    inner join dbo.MEMBER ON MEMBERS.ID = MEMBER.ID
    where MEMBERS.CONSTITUENTID <> MEMBER.CONSTITUENTID;


    declare @MEMBERSHIPCARDSTABLE table (
      ID uniqueidentifier,
      SALESORDERITEMMEMBERID uniqueidentifier,
      NAMEONCARD nvarchar(700),
      EXPIRATIONDATE datetime,
      MEMBERID uniqueidentifier,
      ACTIONCODE tinyint -- 0: Insert; 1: Update; 2: Cancel.

    );

    insert into @MEMBERSHIPCARDSTABLE
      select
        T.cards.value('(MEMBERSHIPCARDID)[1]','uniqueidentifier') as 'ID',
        T.cards.value('(SALESORDERITEMMEMBERID)[1]','uniqueidentifier') as 'SALESORDERITEMMEMBERID',
        T.cards.value('(NAMEONCARD)[1]','nvarchar(700)') as 'NAMEONCARD',
        --The "GETLATESTTIME" date function has been inlined here for performance (the part with "dateadd(ms, -003...")...

        dateadd(ms, -003, dateadd(d, 1, cast(cast(T.cards.value('(EXPIRATIONDATE)[1]','datetime') as date) as datetime))) as 'EXPIRATIONDATE',
        null as 'MEMBERID',
        0
      from @MEMBERSHIPCARDS.nodes('/MEMBERSHIPCARDS/ITEM') T(cards)
      where T.cards.value('(NAMEONCARD)[1]','nvarchar(700)') <> '';

    update @MEMBERSHIPCARDSTABLE set
      ID = newid()
    where (ID is null)
    or (ID = '00000000-0000-0000-0000-000000000000');

    update @MEMBERSHIPCARDSTABLE set
      MEMBERID = M.ID
    from @MEMBERSHIPCARDSTABLE C
    inner join @MEMBERSTABLE M on C.SALESORDERITEMMEMBERID = M.SALESORDERITEMMEMBERID;

    update @MEMBERSHIPCARDSTABLE
      set ID = newid()
    from @MEMBERSHIPCARDSTABLE MEMBERSHIPCARDS
    inner join dbo.MEMBERSHIPCARD ON MEMBERSHIPCARDS.ID = MEMBERSHIPCARD.ID
    where MEMBERSHIPCARDS.MEMBERID <> MEMBERSHIPCARD.MEMBERID;

    declare @ADDONSTABLE table (
      ADDONID uniqueidentifier,
      ADDONTYPECODE tinyint,
      PRICE money,
      QUANTITY int,
      SPLITID uniqueidentifier
    );

    insert into @ADDONSTABLE
      select
        T.addons.value('(ADDONID)[1]','uniqueidentifier'),
        T.addons.value('(ADDONTYPECODE)[1]','tinyint'),
        T.addons.value('(PRICE)[1]','money'),
        T.addons.value('(QUANTITY)[1]','int'),
        T.addons.value('(SPLITID)[1]','uniqueidentifier')
      from @ADDONS.nodes('/ADDONS/ITEM') T(addons);

    set @TRANSACTIONDATE = cast(@TRANSACTIONDATE as date);

    if @EXPIRATIONDATE is not null
      set @EXPIRATIONDATE = dbo.UFN_DATE_GETLATESTTIME(@EXPIRATIONDATE);

    declare @ACTIONCODE tinyint;

    -- determine action code

    declare @PREVEXPRDATE datetime,
            @PREVLEVELID uniqueidentifier,
            @PREVACTIONCODE tinyint;

    select top 1
      @PREVEXPRDATE = EXPIRATIONDATE,
      @PREVLEVELID = MEMBERSHIPLEVELID,
      @PREVACTIONCODE = ACTIONCODE
    from dbo.MEMBERSHIPTRANSACTION
    where MEMBERSHIPID = @MEMBERSHIPID
    and TRANSACTIONDATE <= @TRANSACTIONDATE
    order by TRANSACTIONDATE desc, DATEADDED desc;

    set @ACTIONCODE = dbo.UFN_MEMBERSHIPTRANSACTION_DETERMINENEWACTIONCODE(@PREVLEVELID,
                                                                           @PREVEXPRDATE,
                                                                           @PREVACTIONCODE,
                                                                           @MEMBERSHIPLEVELID,
                                                                           @TRANSACTIONDATE);

    if @ACTIONCODE = 0 and not exists (select 1 from dbo.MEMBERSHIP where MEMBERSHIP.ID = @MEMBERSHIPID)
    begin
      -- Join a new membership


      -- Multiple memberships validation

      declare @MULTIPLEMEMBERSHIPSALLOWED int;
      select
        @MULTIPLEMEMBERSHIPSALLOWED = ALLOWMULTIPLEMEMBERSHIPS
      from dbo.MEMBERSHIPPROGRAM
      where ID = @MEMBERSHIPPROGRAMID;

      if @MULTIPLEMEMBERSHIPSALLOWED = 0
        if exists (
          select 1 
          from dbo.MEMBER 
          inner join dbo.MEMBERSHIP
          on MEMBER.MEMBERSHIPID = MEMBERSHIP.ID
          where
            MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID 
            and STATUSCODE <> 1
            and MEMBER.ISDROPPED <> 1
            and MEMBER.CONSTITUENTID in (
              select CONSTITUENTID
              from @MEMBERSTABLE
            )
        )
          raiserror('This membership program does not allow multiple memberships from the same constituent.', 13, 1);

      insert into dbo.MEMBERSHIP (
        ID,
        MEMBERSHIPPROGRAMID,
        MEMBERSHIPLEVELID,
        MEMBERSHIPLEVELTERMID,
        MEMBERSHIPLEVELTYPECODEID,
        JOINDATE,
        EXPIRATIONDATE,
        NUMBEROFCHILDREN,
        COMMENTS,
        ISGIFT,
        GIVENBYID,
        SENDRENEWALCODE,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED
      ) values (
        @MEMBERSHIPID,
        @MEMBERSHIPPROGRAMID,
        @MEMBERSHIPLEVELID,
        @MEMBERSHIPLEVELTERMID,
        @MEMBERSHIPLEVELTYPECODEID,
        @TRANSACTIONDATE,
        @EXPIRATIONDATE,
        @NUMBEROFCHILDREN,
        '',
        @ISGIFT,
        @GIVENBYID,
        @SENDRENEWALCODE,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @CURRENTDATE,
        @CURRENTDATE
      );

    end
    else
    begin
      -- Renew/Upgrade/Downgrade/Re-join an existing membership

      if (@EXPIRATIONDATE is not null)
        if @EXPIRATIONDATE < (select JOINDATE from dbo.MEMBERSHIP where ID = @MEMBERSHIPID)
          raiserror('The expiration date must come after the transaction date.', 13, 1);

      update dbo.MEMBERSHIP set
        MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID
        MEMBERSHIPLEVELTERMID = @MEMBERSHIPLEVELTERMID
        MEMBERSHIPLEVELTYPECODEID = @MEMBERSHIPLEVELTYPECODEID,
        NUMBEROFCHILDREN = @NUMBEROFCHILDREN,
        ISGIFT = @ISGIFT,
        GIVENBYID = @GIVENBYID,
        SENDRENEWALCODE = @SENDRENEWALCODE,
        EXPIRATIONDATE = @EXPIRATIONDATE,
        LASTRENEWEDON = @TRANSACTIONDATE,
        STATUSCODE = 0,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
      where
        ID = @MEMBERSHIPID;
    end

    -- Save membership transaction

    if @TRANSACTIONID is null
      set @TRANSACTIONID = newid()

    insert into dbo.MEMBERSHIPTRANSACTION (
      ID,
      MEMBERSHIPID,
      MEMBERSHIPLEVELID,
      MEMBERSHIPLEVELTERMID,
      MEMBERSHIPLEVELTYPECODEID,
      TRANSACTIONDATE,
      EXPIRATIONDATE,
      REVENUESPLITID,
      ISGIFT,
      DONORID,
      NUMBEROFCHILDREN,
      COMMENTS,
      ACTIONCODE,
      ADDEDBYID,
      CHANGEDBYID,
      DATEADDED,
      DATECHANGED
    ) values (
      @TRANSACTIONID,
      @MEMBERSHIPID,
      @MEMBERSHIPLEVELID,
      @MEMBERSHIPLEVELTERMID,
      @MEMBERSHIPLEVELTYPECODEID,
      @TRANSACTIONDATE,
      @EXPIRATIONDATE,
      @REVENUESPLITID,
      @ISGIFT,
      @GIVENBYID,
      @NUMBEROFCHILDREN,
      @COMMENTS,
      @ACTIONCODE,
      @CHANGEAGENTID,
      @CHANGEAGENTID,
      @CURRENTDATE,
      @CURRENTDATE
    );

    --Save Addons

    declare @TRANSACTIONCURRENCYID uniqueidentifier;
    declare @BASECURRENCYID uniqueidentifier;
    declare @BASEEXCHANGERATEID uniqueidentifier;
    declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
    declare @DATE datetime;

    select
      @TRANSACTIONCURRENCYID = FT.TRANSACTIONCURRENCYID,
      @BASECURRENCYID = isnull(EXT.NONPOSTABLEBASECURRENCYID, V.BASECURRENCYID),
      @BASEEXCHANGERATEID = FT.BASEEXCHANGERATEID,
      @ORGANIZATIONEXCHANGERATEID = FT.ORGEXCHANGERATEID,
      @DATE = FT.DATE
    from
        dbo.FINANCIALTRANSACTION as FT
    inner join
        dbo.REVENUE_EXT as EXT on EXT.ID = FT.ID
    inner join
        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
    left outer join
        dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I as V with (noexpand) on V.FINANCIALTRANSACTIONID = FT.ID
    where
        LI.ID = @REVENUESPLITID
        and FT.DELETEDON is null;

    insert into dbo.MEMBERSHIPADDON(ID, MEMBERSHIPID, ADDONID, QUANTITY, EXPIRATIONDATE, MEMBERSHIPTRANSACTIONID, REVENUESPLITID, PURCHASEPRICE,
                TRANSACTIONPURCHASEPRICE, ORGANIZATIONPURCHASEPRICE, TRANSACTIONCURRENCYID, BASECURRENCYID, BASEEXCHANGERATEID,
                ORGANIZATIONEXCHANGERATEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
    select 
      newid(),
      @MEMBERSHIPID,
      ADDONID,
      QUANTITY,
      @EXPIRATIONDATE,
      @TRANSACTIONID,
      SPLITID,
      case when @BASEEXCHANGERATEID is null then PRICE
        else dbo.UFN_CURRENCY_CONVERT(PRICE, @BASEEXCHANGERATEID)
      end,
      PRICE,
      case when @ORGANIZATIONEXCHANGERATEID is null then PRICE
        else dbo.UFN_CURRENCY_CONVERT(PRICE, @ORGANIZATIONEXCHANGERATEID
      end,
      @TRANSACTIONCURRENCYID,
      @BASECURRENCYID,
      @BASEEXCHANGERATEID,
      @ORGANIZATIONEXCHANGERATEID,
      @CHANGEAGENTID,
      @CHANGEAGENTID,
      @CURRENTDATE,
      @CURRENTDATE
    from @ADDONSTABLE

    -- Save members

    if @ACTIONCODE = 0 and not exists (select 1 from dbo.MEMBERSHIP where MEMBERSHIP.ID = @MEMBERSHIPID)
    begin
      insert into dbo.MEMBER (
        ID,
        MEMBERSHIPID,
        CONSTITUENTID,
        ISPRIMARY,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED
      ) select ID,
          @MEMBERSHIPID,
          CONSTITUENTID,
          ISPRIMARY,
          @CHANGEAGENTID,
          @CHANGEAGENTID,
          @CURRENTDATE,
          @CURRENTDATE
      from @MEMBERSTABLE
    end
    else
    begin
      --Remove dropped members

      update dbo.MEMBER set
        ISDROPPED = 1,
        ISPRIMARY = 0,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
      where [MEMBER].ID in (
        select ID from dbo.UFN_MEMBERSHIP_GETMEMBERS(@MEMBERSHIPID)
        EXCEPT
        select MEMBERS.ID from @MEMBERSTABLE MEMBERS
      );

      --check to see which members are going to not be dropped anymore... sync their memberids via SALESORDERITEMMEMBER

      update @MEMBERSHIPCARDSTABLE set
        CARDS.MEMBERID = MEMBER.ID
      from @MEMBERSHIPCARDSTABLE CARDS
      inner join dbo.SALESORDERITEMMEMBER on SALESORDERITEMMEMBER.ID = CARDS.SALESORDERITEMMEMBERID
      inner join dbo.MEMBER on MEMBER.CONSTITUENTID = SALESORDERITEMMEMBER.CONSTITUENTID
      where MEMBER.MEMBERSHIPID = @MEMBERSHIPID
      and MEMBER.ISDROPPED = 1
      and CARDS.MEMBERID <> MEMBER.ID;

      --Update existing members

      update dbo.MEMBER set
        MEMBER.ISPRIMARY = MEMBERS.ISPRIMARY,
        MEMBER.CHANGEDBYID = @CHANGEAGENTID,
        MEMBER.DATECHANGED = @CURRENTDATE
      from dbo.MEMBER
      inner join @MEMBERSTABLE MEMBERS on MEMBER.CONSTITUENTID = MEMBERS.CONSTITUENTID
      where MEMBER.MEMBERSHIPID = @MEMBERSHIPID;


      --Add new members

      insert into dbo.MEMBER(ID, CONSTITUENTID, MEMBERSHIPID, ISPRIMARY, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
        select ID, MEMBERS.CONSTITUENTID, @MEMBERSHIPID, ISPRIMARY, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
        from @MEMBERSTABLE MEMBERS
        where MEMBERS.CONSTITUENTID not in (
          select CONSTITUENTID
          from dbo.MEMBER
          where MEMBER.MEMBERSHIPID = @MEMBERSHIPID
          and MEMBER.ISDROPPED = 0
        );
    end

    -- Save membership cards

    -- Get existing membership cards

    declare @EXISTINGCARDS table (
      ID uniqueidentifier,
      MEMBERID  uniqueidentifier,
      EXPIRATIONDATE datetime,
      NAMEONCARD nvarchar(700),
      STATUSCODE tinyint
    );

    insert into @EXISTINGCARDS 
      select
        MEMBERSHIPCARD.ID, 
        MEMBERSHIPCARD.MEMBERID, 
        MEMBERSHIPCARD.EXPIRATIONDATE, 
        MEMBERSHIPCARD.NAMEONCARD, 
        MEMBERSHIPCARD.STATUSCODE
      from dbo.MEMBERSHIPCARD 
      inner join dbo.MEMBER on MEMBERSHIPCARD.MEMBERID = MEMBER.ID 
      where MEMBER.MEMBERSHIPID = @MEMBERSHIPID
      and MEMBERSHIPCARD.STATUSCODE <> 2;

    if @@rowcount = 0
    begin
      -- No existing membership cards

      insert into dbo.[MEMBERSHIPCARD] (
        [ID],
        [MEMBERID],
        [NAMEONCARD],
        [EXPIRATIONDATE],
        [ADDEDBYID],
        [CHANGEDBYID],
        [DATEADDED],
        [DATECHANGED]
      )
      select
        [ID],
        [MEMBERID],
        [NAMEONCARD],
        [EXPIRATIONDATE],
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @CURRENTDATE,
        @CURRENTDATE
      from @MEMBERSHIPCARDSTABLE;
    end
    else
    begin
      -- Mark the cards need to be updated, do not update expiration date if the expiration date of existing care is null

      update @MEMBERSHIPCARDSTABLE set
        ACTIONCODE = 1,
        EXPIRATIONDATE = case when EXISTINGCARDS.EXPIRATIONDATE is null then
                           null
                         when (EXISTINGCARDS.EXPIRATIONDATE > NEWCARDS.EXPIRATIONDATE and EXISTINGCARDS.STATUSCODE = 1) then
                           EXISTINGCARDS.EXPIRATIONDATE
                         else
                           NEWCARDS.EXPIRATIONDATE
                         end
      from @MEMBERSHIPCARDSTABLE NEWCARDS
      inner join @EXISTINGCARDS EXISTINGCARDS on NEWCARDS.ID = EXISTINGCARDS.ID;

      -- If existing membership card is printed

      update @MEMBERSHIPCARDSTABLE set
        ACTIONCODE = 2
      from @MEMBERSHIPCARDSTABLE NEWCARDS 
      inner join @EXISTINGCARDS EXISTINGCARDS on NEWCARDS.ID = EXISTINGCARDS.ID 
      where EXISTINGCARDS.STATUSCODE = 1 and 
        (((EXISTINGCARDS.EXPIRATIONDATE is not null) and EXISTINGCARDS.EXPIRATIONDATE < NEWCARDS.EXPIRATIONDATE) or
        EXISTINGCARDS.NAMEONCARD <> NEWCARDS.NAMEONCARD);

      insert @MEMBERSHIPCARDSTABLE 
        select
      newid(),
          SALESORDERITEMMEMBERID,
          NAMEONCARD,
          EXPIRATIONDATE,
          MEMBERID,
          0
        from @MEMBERSHIPCARDSTABLE 
        where ACTIONCODE = 2;

      -- if existing membership card no longer exists in the XML table

      insert @MEMBERSHIPCARDSTABLE 
        select
          ID,
          null,
          NAMEONCARD,
          EXPIRATIONDATE,
          MEMBERID,
          2
        from @EXISTINGCARDS 
        where ID not in (select ID from @MEMBERSHIPCARDSTABLE);

      -- Make sure cards that should be cancelled are cancelled first.

      update dbo.MEMBERSHIPCARD set
        MEMBERSHIPCARD.STATUSCODE = 2,
        MEMBERSHIPCARD.CHANGEDBYID = @CHANGEAGENTID,
        MEMBERSHIPCARD.DATECHANGED = @CURRENTDATE
      from dbo.MEMBERSHIPCARD
      inner join @MEMBERSHIPCARDSTABLE on MEMBERSHIPCARD.ID = [@MEMBERSHIPCARDSTABLE].ID
      where [@MEMBERSHIPCARDSTABLE].ACTIONCODE = 2;

      update dbo.[MEMBERSHIPCARD] set
        [MEMBERSHIPCARD].[NAMEONCARD] = NEWCARDS.[NAMEONCARD],
        [MEMBERSHIPCARD].[EXPIRATIONDATE] = NEWCARDS.[EXPIRATIONDATE],
        [MEMBERSHIPCARD].[MEMBERID] = NEWCARDS.[MEMBERID],
        [MEMBERSHIPCARD].[STATUSCODE] = [MEMBERSHIPCARD].[STATUSCODE],
        [MEMBERSHIPCARD].[CHANGEDBYID] = @CHANGEAGENTID,
        [MEMBERSHIPCARD].[DATECHANGED] = @CURRENTDATE
      from dbo.[MEMBERSHIPCARD]
      inner join @MEMBERSHIPCARDSTABLE as NEWCARDS on [MEMBERSHIPCARD].ID = NEWCARDS.ID
      where NEWCARDS.ACTIONCODE <> 2;

      insert into dbo.[MEMBERSHIPCARD] (
        [ID],
        [MEMBERID],
        [NAMEONCARD],
        [EXPIRATIONDATE],
        [ADDEDBYID],
        [CHANGEDBYID],
        [DATEADDED],
        [DATECHANGED]
      )
      select
        [ID],
        [MEMBERID],
        [NAMEONCARD],
        [EXPIRATIONDATE],
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @CURRENTDATE,
        @CURRENTDATE
      from @MEMBERSHIPCARDSTABLE as NEWCARDS
      where NEWCARDS.ACTIONCODE = 0;
    end
  end try

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

  return 0;
end