USP_DATAFORMTEMPLATE_EDIT_MEMBERS

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@MEMBERS xml IN
@NUMBEROFCHILDREN smallint IN

Definition

Copy

CREATE procedure dbo.[USP_DATAFORMTEMPLATE_EDIT_MEMBERS]
(
    @ID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier = null,
    @MEMBERS xml,
    @NUMBEROFCHILDREN smallint
)
as
    begin try
        declare @CURRENTDATE datetime;
        set @CURRENTDATE = getdate();

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

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

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

        if not exists (select 1 from @MEMBERSTABLE where ISPRIMARY = 1)
            raiserror('BBERR_PRIMARYMEMBERMISSING', 13, 1);

        update @MEMBERSTABLE set ID = newid()
        from
            @MEMBERSTABLE MEMBERSTABLE
        left join dbo.MEMBER
            on MEMBERSTABLE.ID = MEMBER.ID
        where MEMBERSTABLE.ID is null
            or MEMBERSTABLE.ID = '00000000-0000-0000-0000-000000000000'
            or (MEMBER.ID is not null and MEMBERSTABLE.CONSTITUENTID <> MEMBER.CONSTITUENTID);

        -- Drop member records not in the collection
        update dbo.MEMBER set
            ISDROPPED = 1,
            ISPRIMARY = 0,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        from
            dbo.MEMBER
        left outer join
            @MEMBERSTABLE as MEMBERSTABLE on MEMBERSTABLE.ID = MEMBER.ID
        where
            MEMBER.MEMBERSHIPID = @ID
            and MEMBERSTABLE.ID is null;

        -- Cancel cards belonging to dropped members
        update dbo.MEMBERSHIPCARD set
            STATUSCODE = 2,  -- Cancelled
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        from
            dbo.MEMBERSHIPCARD
        inner join
            dbo.MEMBER on MEMBER.ID = MEMBERSHIPCARD.MEMBERID
        left outer join
            @MEMBERSTABLE as MEMBERSTABLE on MEMBERSTABLE.ID = MEMBER.ID
        where
            MEMBER.MEMBERSHIPID = @ID
            and MEMBERSTABLE.ID is null;

        -- Update existing member records
        update dbo.MEMBER set
            CONSTITUENTID = MEMBERSTABLE.CONSTITUENTID,
            ISPRIMARY = MEMBERSTABLE.ISPRIMARY,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        from
            dbo.MEMBER
        inner join
            @MEMBERSTABLE as MEMBERSTABLE on MEMBERSTABLE.ID = MEMBER.ID
        where
            MEMBER.ISDROPPED = 0;

        -- Insert new member records
        insert into dbo.[MEMBER]
        (
            [ID],
            [CONSTITUENTID],
            [MEMBERSHIPID],
            [ISPRIMARY],
            [ADDEDBYID],
            [CHANGEDBYID],
            [DATEADDED],
            [DATECHANGED]
        )
        select
            newid(),
            CONSTITUENTID,
            @ID as [MEMBERSHIPID],
            ISPRIMARY,
            @CHANGEAGENTID as [ADDEDBYID],
            @CHANGEAGENTID as [CHANGEDBYID],
            @CURRENTDATE as [DATEADDED],
            @CURRENTDATE as [DATECHANGED]
        from
            @MEMBERSTABLE
        where
            ID not in (select ID from dbo.[MEMBER] where [MEMBERSHIPID] = @ID);

        update dbo.[MEMBERSHIP] set
            [NUMBEROFCHILDREN] = @NUMBEROFCHILDREN,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        where ID = @ID;
    end try

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

    return 0;