USP_GROUPMEMBERADD

This stored procedure is used to encapsulate the logic for adding members to constituent groups.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT
@CHANGEAGENTID uniqueidentifier IN
@GROUPID uniqueidentifier IN
@MEMBERID uniqueidentifier IN
@RECOGNIZEMEMBERFORHOUSEHOLD bit IN
@STARTDATE date IN
@USENULLSTARTDATE bit IN
@ENDDATE date IN
@COMMENTS nvarchar(300) IN

Definition

Copy


CREATE procedure dbo.USP_GROUPMEMBERADD
(
  @ID uniqueidentifier = null output,
  @CHANGEAGENTID uniqueidentifier = null,    
  @GROUPID uniqueidentifier,
  @MEMBERID uniqueidentifier = null,
  @RECOGNIZEMEMBERFORHOUSEHOLD bit = 0, -- Only applies when adding a member to a household

  @STARTDATE date = null,
  @USENULLSTARTDATE bit = 0, -- If a null startdate is passed in, use it instead of the group start date

  @ENDDATE date = null,
  @COMMENTS nvarchar(300) = null
)
as
  set nocount on;

  -- Developer note: This procedure is very closely related to USP_GROUPMEMBERADDBULK.

  -- Any changes made to the logic should be made in both procedures if applicable.


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

  if @STARTDATE > @CURRENTDATE
  begin
    raiserror ('ERR_STARTDATE_CANNOT_BE_IN_FUTURE', 13, 1);
    return 1;
  end

  if @ENDDATE > @CURRENTDATE
  begin
    raiserror ('BBERR_ENDDATE_CANNOT_BE_IN_FUTURE', 13, 1);
    return 1;
  end

  declare @GROUPTYPECODE tinyint;
  declare @GROUPSTARTDATE datetime;
  declare @EXISTINGID uniqueidentifier;
  declare @EXISTINGDATERANGEID uniqueidentifier;

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

  --Find the existing groupmember record and groupmemberdaterange for this constituent if they exist 

  --(constituent may be a previous member of this group)

  select
    @EXISTINGID = ID
  from
    dbo.GROUPMEMBER
  where
    GROUPID = @GROUPID and
    MEMBERID = @MEMBERID;

  select top 1
    @EXISTINGDATERANGEID = ID
  from
    dbo.GROUPMEMBERDATERANGE 
  where
    GROUPMEMBERID = @EXISTINGID
  order by 
    case
      when DATETO is null then 0
      else 1
    end
    DATETO desc

  if dbo.UFN_GROUPMEMBER_ISCURRENTMEMBER(@EXISTINGID) = 1
    raiserror('CK_GROUPMEMBER_ALREADYINGROUP', 13, 1);

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

  select
    @GROUPTYPECODE = GROUPTYPECODE,
    @GROUPSTARTDATE = STARTDATE
  from
    dbo.GROUPDATA
  where
    ID = @GROUPID;

  if @STARTDATE is not null and @GROUPSTARTDATE is not null
    if @STARTDATE < @GROUPSTARTDATE
    begin
      raiserror ('ERR_STARTDATE_CANNOT_BE_BEFORE_GROUPSTARTDATE', 13, 1);
      return 1;
    end

  --If the group is a Household GROUPTYPECODE = 0 (built in type) then the member date range start date should be null

  --Otherwise, the member date range start date should be set to the group start date

  if @GROUPTYPECODE = 1 and @STARTDATE is null and @USENULLSTARTDATE = 0
    set @STARTDATE = @GROUPSTARTDATE;

  if @COMMENTS is null
    set @COMMENTS = '';

  begin try
    if @EXISTINGID is null
      insert into dbo.GROUPMEMBER
      (
        ID,
        GROUPID,
        MEMBERID,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED
      )
      values
      (
        @ID,
        @GROUPID,
        @MEMBERID,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @CURRENTDATE,
        @CURRENTDATE
      );
    else
      set @ID = @EXISTINGID;

    if @EXISTINGDATERANGEID is null
      insert into dbo.GROUPMEMBERDATERANGE
      (
        ID,
        GROUPMEMBERID,
        DATEFROM,
        DATETO,
        COMMENTS,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED
      )
      values
      (
        newid(),
        @ID,
        @STARTDATE,
        @ENDDATE,
        @COMMENTS,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @CURRENTDATE,
        @CURRENTDATE
      );
    else
    begin
      --Extend the existing date range

      update dbo.GROUPMEMBERDATERANGE set
        DATEFROM = @STARTDATE,
        DATETO = @ENDDATE,
        COMMENTS = @COMMENTS,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
      where
        ID = @EXISTINGDATERANGEID;

      --Update the role dates in case the member dates were changed

      exec dbo.USP_GROUPMEMBERROLE_UPDATEDATES @ID, @CHANGEAGENTID;
    end

    --If there is no existing primary member, make the new member the primary member

    if not exists(select 1 from dbo.GROUPMEMBER GM where GM.GROUPID = @GROUPID and GM.ISPRIMARY = 1 and GM.MEMBERID <> @MEMBERID)
      begin
        --we want to make sure that we're not setting an expired group member to be the primary

        if @ENDDATE is null
          update dbo.GROUPMEMBER set
            ISPRIMARY = 1,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE 
          where
            ID = @ID;
      end


    -- GROUPTYPECODE = 0 indicates household

    if @GROUPTYPECODE = 0 and @RECOGNIZEMEMBERFORHOUSEHOLD = 1
    begin
      -- Update an existing recognition default entry between the two constituents

      -- to have a matchfactor of 100 if it already exists.  Otherwise, create the entry.

      update dbo.REVENUERECOGNITIONDEFAULT set
        MATCHFACTOR = 100,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
      where
        SOURCECONSTITUENTID = @GROUPID and
        RECIPIENTCONSTITUENTID = @MEMBERID;

      if @@ROWCOUNT = 0
      begin
        insert into dbo.REVENUERECOGNITIONDEFAULT
        (
          SOURCECONSTITUENTID,
          RECIPIENTCONSTITUENTID,
          MATCHFACTOR,
          ADDEDBYID,
          CHANGEDBYID,
          DATEADDED,
          DATECHANGED
        )
        values
        (
          @GROUPID,
          @MEMBERID,
          100,
          @CHANGEAGENTID,
          @CHANGEAGENTID,
          @CURRENTDATE,
          @CURRENTDATE
        )
      end
    end
  end try
  begin catch
    exec dbo.USP_RAISE_ERROR;
    return 1;
  end catch

  return 0;