USP_GROUPMEMBERADDBULK

Parameters

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

Definition

Copy


CREATE procedure dbo.USP_GROUPMEMBERADDBULK
(
    @ID uniqueidentifier = null output,
    @CHANGEAGENTID uniqueidentifier = null,
    @GROUPID uniqueidentifier,
    @IDSETREGISTERID uniqueidentifier,
    @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,
    @CURRENTAPPUSERID uniqueidentifier = null
)
as
begin

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

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


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

    declare @ADDGROUPMEMBERSINBULKSYSTEMPRIVILEGEID uniqueidentifier = '4f5f223c-c0ed-4a2a-a0b7-32e293c3f3e2'

    declare @ISSYSADMIN bit = 0;

    -- skip security check if no app user is supplied

    if @CURRENTAPPUSERID is not null
    begin
        set @ISSYSADMIN = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);

        declare @GRANTORDENY int = 0;
        select
            @GRANTORDENY = SV.GRANTORDENY
        from
            dbo.V_SECURITY_SYSTEMROLEASSIGNMENT_USER_SYSTEMPRIVILEGE as SV
        where
            SV.APPUSERID = @CURRENTAPPUSERID
            and SV.SYSTEMPRIVILEGECATALOGID = @ADDGROUPMEMBERSINBULKSYSTEMPRIVILEGEID
        order by
            SV.GRANTORDENY asc

        if @ISSYSADMIN = 0 and @GRANTORDENY = 0
        begin
            raiserror ('BBERR_USER_NOT_AUTHORIZED', 13, 1);
        end
    end

    declare @SELECTIONISSTATIC bit = 0;
    select
        @SELECTIONISSTATIC = IDSETREGISTER.STATIC
    from
        dbo.IDSETREGISTER
    where
        IDSETREGISTER.ID = @IDSETREGISTERID

    if @SELECTIONISSTATIC = 0
    begin
        raiserror ('BBERR_SELECTION_NOT_STATIC', 13, 1);
        return 1;
    end

    declare @CURRENTDATE datetime = getdate();

    if @STARTDATE > @CURRENTDATE
    begin
        raiserror ('BBERR_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 @MEMBERS table
    (
        CONSTITUENTID uniqueidentifier,
        ISPREVIOUSMEMBER bit,
        MEMBERID uniqueidentifier,
        MEMBERDATERANGEID uniqueidentifier
    )

    -- Add all constituents in the selection who are not current members, but may have been previous members

    insert into @MEMBERS
    select
        SELECTION.ID as CONSTITUENTID,
        case
            when GROUPMEMBER.ID is null then 0
            else 1
        end as ISPREVIOUSMEMBER,
        case
            -- If previous member, use existing ID

            -- If new member, make a new ID to use to create the record later

            when GROUPMEMBER.ID is null then newid()
            else GROUPMEMBER.ID
        end as MEMBERID,
        case
            -- If previous member, use existing date rangeID

            -- If new member, make a new date range ID to use to create the record later

            when GROUPMEMBER.ID is null then newid()
            else
                (
                    select top 1 GROUPMEMBERDATERANGE.ID
                    from dbo.GROUPMEMBERDATERANGE
                    where GROUPMEMBERDATERANGE.GROUPMEMBERID = GROUPMEMBER.ID
                    order by
                        case
                            when GROUPMEMBERDATERANGE.DATETO is null then 0
                            else 1
                        end,
                    GROUPMEMBERDATERANGE.DATETO desc
                )
        end as MEMBERDATERANGEID
    from dbo.UFN_IDSETREADER_GETRESULTS_GUID(@IDSETREGISTERID) as SELECTION
        left join dbo.GROUPMEMBER on SELECTION.ID = GROUPMEMBER.MEMBERID and GROUPMEMBER.GROUPID = @GROUPID
    where
        dbo.UFN_GROUPMEMBER_ISCURRENTMEMBER(GROUPMEMBER.ID) = 0 and
        SELECTION.ID <> @GROUPID and
        (GROUPMEMBER.GROUPID is null or GROUPMEMBER.GROUPID = @GROUPID) and
        (
            -- no app user (skip security)

            @CURRENTAPPUSERID is null or
            -- sys admin (all records)

            @ISSYSADMIN = 1 or
            -- site security

            (
                exists(
                    select
                        1
                    from
                        dbo.V_SECURITY_SYSTEMROLEASSIGNMENT_USER_SYSTEMPRIVILEGE as SECURITYVIEW
                        left join dbo.SITEPERMISSION
                            on SITEPERMISSION.APPUSERID = SECURITYVIEW.APPUSERID
                            and SITEPERMISSION.SYSTEMROLEID = SECURITYVIEW.SYSTEMROLEID
                    where
                        SECURITYVIEW.APPUSERID = @CURRENTAPPUSERID and
                        SECURITYVIEW.SYSTEMPRIVILEGECATALOGID = @ADDGROUPMEMBERSINBULKSYSTEMPRIVILEGEID and
                        SECURITYVIEW.GRANTORDENY = 1 and
                        (
                            SECURITYVIEW.SITESECURITYMODE = 0
                            or
                            (SITEPERMISSION.SITEID in (select SITEID from dbo.UFN_SITEID_MAPFROM_CONSTITUENTID(SELECTION.ID)) and (SECURITYVIEW.SITESECURITYMODE = 2 or SECURITYVIEW.SITESECURITYMODE = 3))
                            or
                            (SECURITYVIEW.SITESECURITYMODE = 1 and (select top 1 SITEID from dbo.UFN_SITEID_MAPFROM_CONSTITUENTID(SELECTION.ID)) is null)
                        )
                ) and
                -- constituent security

                (
                    -- all constituents

                    exists(
                        select
                            1
                        from
                            dbo.V_SECURITY_SYSTEMROLEASSIGNMENT_USER_SYSTEMPRIVILEGE as SECURITYVIEW
                        where
                            SECURITYVIEW.APPUSERID = @CURRENTAPPUSERID and
                            SECURITYVIEW.SYSTEMPRIVILEGECATALOGID = @ADDGROUPMEMBERSINBULKSYSTEMPRIVILEGEID and
                            SECURITYVIEW.GRANTORDENY = 1 and
                            SECURITYVIEW.RECORDSECURITYMODE = 0
                    ) or
                    -- specific and null constituent groups

                    SELECTION.ID in (
                        select
                            CSAA.CONSTITUENTID as ID
                        from
                            dbo.CONSTIT_SECURITY_ATTRIBUTE_ASSIGNMENT as CSAA
                        where
                            CSAA.CONSTIT_SECURITY_ATTRIBUTEID in
                            (
                                select
                                    SYSTEMROLEAPPUSERCONSTITUENTSECURITY.CONSTITUENTSECURITYATTRIBUTEID
                                from
                                    dbo.V_SECURITY_SYSTEMROLEASSIGNMENT_USER_SYSTEMPRIVILEGE as SECURITYVIEW
                                    inner join dbo.SYSTEMROLEAPPUSER
                                        on SYSTEMROLEAPPUSER.APPUSERID = SECURITYVIEW.APPUSERID
                                        and SYSTEMROLEAPPUSER.SYSTEMROLEID = SECURITYVIEW.SYSTEMROLEID
                                    inner join dbo.SYSTEMROLEAPPUSERCONSTITUENTSECURITY
                                        on SYSTEMROLEAPPUSERCONSTITUENTSECURITY.SYSTEMROLEAPPUSERID = SYSTEMROLEAPPUSER.ID
                                where
                                    SECURITYVIEW.APPUSERID = @CURRENTAPPUSERID and
                                    SECURITYVIEW.SYSTEMPRIVILEGECATALOGID = @ADDGROUPMEMBERSINBULKSYSTEMPRIVILEGEID and
                                    SECURITYVIEW.GRANTORDENY = 1 and
                                    SYSTEMROLEAPPUSER.CONSTITUENTSECURITYMODECODE = 2
                            )
                        union all
                        select
                            ID
                        from
                            dbo.CONSTITUENT
                        where
                            exists(
                                select
                                    1
                                from
                                    dbo.V_SECURITY_SYSTEMROLEASSIGNMENT_USER_SYSTEMPRIVILEGE as SECURITYVIEW
                                where
                                    SECURITYVIEW.APPUSERID = @CURRENTAPPUSERID and
                                    SECURITYVIEW.SYSTEMPRIVILEGECATALOGID = @ADDGROUPMEMBERSINBULKSYSTEMPRIVILEGEID and
                                    SECURITYVIEW.GRANTORDENY = 1 and
                                    SECURITYVIEW.RECORDSECURITYMODE = 1
                            ) and
                            ID not in (
                                select
                                    CONSTIT_SECURITY_ATTRIBUTE_ASSIGNMENT.CONSTITUENTID
                                from
                                    dbo.CONSTIT_SECURITY_ATTRIBUTE_ASSIGNMENT
                            )
                    )
                )
            )
        );

    select top 1 @ID = MEMBERS.MEMBERID
    from @MEMBERS MEMBERS
    order by MEMBERS.MEMBERID;

    declare @GROUPSTARTDATE datetime;
    select @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

    -- The member date range start date should be set to the group start date

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

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

    begin try
        -- Add group members who are not current or previous members

        insert into dbo.GROUPMEMBER
        (
            ID,
            GROUPID,
            MEMBERID,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
        )
        select
            NEWMEMBERS.MEMBERID,
            @GROUPID,
            NEWMEMBERS.CONSTITUENTID,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        from @MEMBERS NEWMEMBERS
        where NEWMEMBERS.ISPREVIOUSMEMBER = 0;

        -- Add date ranges for members who are not current or previous members

        insert into dbo.GROUPMEMBERDATERANGE
        (
            ID,
            GROUPMEMBERID,
            DATEFROM,
            DATETO,
            COMMENTS,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
        )
        select
            NEWMEMBERS.MEMBERDATERANGEID,
            NEWMEMBERS.MEMBERID,
            @STARTDATE,
            @ENDDATE,
            @COMMENTS,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        from @MEMBERS NEWMEMBERS
        where NEWMEMBERS.ISPREVIOUSMEMBER = 0;

        -- Update date ranges for previous members that are being reinstated

        update dbo.GROUPMEMBERDATERANGE set
            DATEFROM = @STARTDATE,
            DATETO = @ENDDATE,
            COMMENTS = @COMMENTS,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        from @MEMBERS MEMBERS
        where
            MEMBERS.ISPREVIOUSMEMBER = 1 and
            MEMBERS.MEMBERDATERANGEID = GROUPMEMBERDATERANGE.ID;

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

        update dbo.GROUPMEMBERROLE set
            STARTDATE =
                case
                    when GROUPMEMBERROLE.STARTDATE < GROUPMEMBERDATERANGE.DATEFROM then GROUPMEMBERDATERANGE.DATEFROM
                    when GROUPMEMBERROLE.STARTDATE > GROUPMEMBERDATERANGE.DATETO then GROUPMEMBERDATERANGE.DATETO
                    else GROUPMEMBERROLE.STARTDATE
                end,
            ENDDATE =
                case
                    when GROUPMEMBERROLE.ENDDATE > GROUPMEMBERDATERANGE.DATETO then GROUPMEMBERDATERANGE.DATETO
                    when GROUPMEMBERROLE.ENDDATE < GROUPMEMBERDATERANGE.DATEFROM then GROUPMEMBERDATERANGE.DATEFROM
                    else GROUPMEMBERROLE.ENDDATE
                end,
            DATECHANGED = @CURRENTDATE,
            CHANGEDBYID = @CHANGEAGENTID
        from dbo.GROUPMEMBERROLE
            inner join dbo.GROUPMEMBER on GROUPMEMBER.ID = GROUPMEMBERROLE.GROUPMEMBERID
            inner join dbo.GROUPMEMBERDATERANGE on GROUPMEMBERDATERANGE.GROUPMEMBERID = GROUPMEMBER.ID
            inner join @MEMBERS MEMBERS on GROUPMEMBER.MEMBERID = MEMBERS.CONSTITUENTID
        where
            MEMBERS.ISPREVIOUSMEMBER = 1 and
            MEMBERS.MEMBERDATERANGEID = GROUPMEMBERDATERANGE.ID;

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

        if not exists(
            select 1
            from dbo.GROUPMEMBER
            where
                GROUPMEMBER.GROUPID = @GROUPID and
                GROUPMEMBER.ISPRIMARY = 1 and
                GROUPMEMBER.MEMBERID <> @ID
            )
        begin
            -- Do not set an expired group member to be the primary

            if @ENDDATE is null
                update dbo.GROUPMEMBER set
                    ISPRIMARY = 1,
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE 
                where
                    GROUPMEMBER.ID = @ID;
        end
    end try
    begin catch
        exec dbo.USP_RAISE_ERROR;
        return 1;
    end catch
end