USP_REGISTRANT_DELETE

Executes the "Registrant: Delete" record operation.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN Input parameter indicating the ID of the record being deleted.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the delete.

Definition

Copy


                    CREATE procedure dbo.USP_REGISTRANT_DELETE
                    (
                        @ID uniqueidentifier,
                        @CHANGEAGENTID uniqueidentifier
                    )
                    as
                        set nocount on;

                        --check deletion rules, if any


                        declare @contextCache varbinary(128);
                        declare @registrantCount int;
                        declare @eventID uniqueidentifier;
                        declare @constituentID uniqueidentifier;

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

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

                        begin try
                            /* cache current context information */
                            set @contextCache = CONTEXT_INFO();

                            /* set CONTEXT_INFO to @CHANGEAGENTID */
                            set CONTEXT_INFO @CHANGEAGENTID;

                            select
                                @eventID = EVENTID,
                                @constituentID = CONSTITUENTID
                            from dbo.REGISTRANT
                            where ID = @ID;

                            select
                                @registrantCount = count(id)
                            from dbo.REGISTRANT
                            where
                                EVENTID = @eventID
                                and CONSTITUENTID = @constituentID;

                            --There is only one REGISTRANTTRAVEL and/or REGISTRANTLODGING record for each registrant.

                            --There maybe more than one REGISTRANT record for an EVENTID/CONSTITUENTID combo.

                            --Don't delete the REGISTRANTTRAVEL or REGISTRANTLODGING records if another REGISTRANT record is related to them.

                            if @registrantCount < 2
                            begin
                                -- Delete registrant travel records

                                delete from 
                                    dbo.REGISTRANTTRAVEL
                                from 
                                    dbo.REGISTRANT
                                    left join REGISTRANTTRAVEL 
                                        on REGISTRANTTRAVEL.REGISTRANTCONSTITUENTID = REGISTRANT.CONSTITUENTID
                                where REGISTRANT.ID = @ID
                                    and REGISTRANTTRAVEL.MAINEVENTID = REGISTRANT.EVENTID;

                                -- Delete registrant lodging records

                                delete from 
                                    dbo.REGISTRANTLODGING
                                from 
                                    dbo.REGISTRANT
                                    left join REGISTRANTLODGING 
                                        on REGISTRANTLODGING.REGISTRANTCONSTITUENTID = REGISTRANT.CONSTITUENTID
                                where REGISTRANT.ID = @ID
                                    and 
                                    (
                                        REGISTRANTLODGING.MAINEVENTID = REGISTRANT.EVENTID --MAINEVENTID is no longer used, keep it here just in case

                                        or REGISTRANTLODGING.EVENTID = REGISTRANT.EVENTID
                                    );
                            end

                            -- Delete group member record

                            delete from dbo.EVENTGROUPMEMBER where REGISTRANTID = @ID;

                            -- Delete guest's member record

                            delete from dbo.EVENTGROUPMEMBER where EVENTGROUPMEMBER.REGISTRANTID in(select ID from dbo.REGISTRANT where REGISTRANT.GUESTOFREGISTRANTID = @ID);

                            -- Delete any seats for the registrant and guests

                            update dbo.EVENTSEATINGSEAT set 
                                EVENTSEATINGSEAT.REGISTRANTID = null,
                                CHANGEDBYID = @CHANGEAGENTID,
                                DATECHANGED = @CURRENTDATE
                            where 
                                EVENTSEATINGSEAT.REGISTRANTID = @ID or 
                                exists(select GUEST.ID from dbo.REGISTRANT as GUEST where GUEST.GUESTOFREGISTRANTID = @ID and GUEST.ID = EVENTSEATINGSEAT.REGISTRANTID);

                            -- Delete any team fundraising information for this registrant if this is a team fundraising event

                            -- Deleting from TEAMFUNDRAISER cascade deletes from TEAMFUNDRAISINGTEAMMEMBER

                            delete from
                                dbo.TEAMFUNDRAISER
                            from
                                dbo.REGISTRANT
                                left join dbo.EVENT on REGISTRANT.EVENTID = EVENT.ID
                                left join dbo.TEAMFUNDRAISER on
                                    REGISTRANT.CONSTITUENTID = TEAMFUNDRAISER.CONSTITUENTID
                                    and EVENT.APPEALID = TEAMFUNDRAISER.APPEALID
                            where
                                REGISTRANT.ID = @ID
                                or REGISTRANT.GUESTOFREGISTRANTID = @ID;

                            delete from
                                dbo.TEAMFUNDRAISINGTEAMCAPTAIN
                            from
                                dbo.REGISTRANT
                                left join dbo.EVENT on REGISTRANT.EVENTID = EVENT.ID
                                left join dbo.TEAMFUNDRAISINGTEAM on EVENT.APPEALID = TEAMFUNDRAISINGTEAM.APPEALID
                                left join dbo.TEAMFUNDRAISINGTEAMCAPTAIN on
                                    REGISTRANT.CONSTITUENTID = TEAMFUNDRAISINGTEAMCAPTAIN.CONSTITUENTID
                                    and TEAMFUNDRAISINGTEAM.ID = TEAMFUNDRAISINGTEAMCAPTAIN.TEAMFUNDRAISINGTEAMID
                            where
                                REGISTRANT.ID = @ID
                                or REGISTRANT.GUESTOFREGISTRANTID = @ID;

                            -- Delete any registrant registration maps for this registrant and their guests

                            -- Deleting from REGISTRANTREGISTRATIONMAP cascade deletes REGISTRANTPREFERENCEMAP

                            delete from
                                dbo.REGISTRANTREGISTRATIONMAP
                            from
                                dbo.REGISTRANT
                                left join dbo.REGISTRANTREGISTRATIONMAP on REGISTRANT.ID = REGISTRANTREGISTRATIONMAP.REGISTRANTID
                            where
                                REGISTRANT.ID = @ID
                                or REGISTRANT.GUESTOFREGISTRANTID = @ID;

                            -- Delete any guests of this registrant

                            delete from dbo.REGISTRANT where REGISTRANT.GUESTOFREGISTRANTID = @ID;

                            /* reset CONTEXT_INFO to previous value */
                            if not @contextCache is null
                                set CONTEXT_INFO @contextCache;

                            --Delete pending sales order items that used registrantid

                            declare @ORDERITEM uniqueidentifier = null
                            declare deletesalesitems_cursor cursor local fast_forward for 
                                select [ID] 
                                from dbo.[SALESORDERITEM] 
                                where exists (
                                    select [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID]
                                    from dbo.[SALESORDERITEMEVENTREGISTRATION]
                                    inner join dbo.[SALESORDERITEM] as [SOI]
                                        on [SALESORDERITEMEVENTREGISTRATION].[ID] = [SOI].[ID]
                                    inner join dbo.[SALESORDER]
                                        on [SOI].[SALESORDERID] = [SALESORDER].[ID]
                                    where 
                                        [SALESORDER].[STATUSCODE] = 0 and
                                        [SOI].[ID] = [SALESORDERITEM].[ID] and
                                        [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] = @ID
                                )

                            open deletesalesitems_cursor

                            fetch next from deletesalesitems_cursor
                            into @ORDERITEM

                            while @@FETCH_STATUS = 0
                            begin
                                exec dbo.USP_SALESORDERITEM_DELETE @ORDERITEM, @CHANGEAGENTID

                                fetch next from deletesalesitems_cursor
                                into @ORDERITEM
                            end

                            --When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long

                            close deletesalesitems_cursor;
                            deallocate deletesalesitems_cursor;

                            exec USP_REGISTRANT_DELETEBYID_WITHCHANGEAGENTID @ID, @CHANGEAGENTID;

                            return 0;
                        end try

                        begin catch
                            exec dbo.USP_RAISE_ERROR
                            return 1
                        end catch