USP_DATAFORMTEMPLATE_ADD_REGISTRANTMAINEVENTFROMINVITEE

The save procedure used by the add dataform template "Registrant Main Event from Invitee Add Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@INVITEEID uniqueidentifier IN Input parameter indicating the context ID for the record being added.
@CONSTITUENTID uniqueidentifier IN Registrant
@DATEPURCHASED datetime IN Date
@PACKAGEREGISTRATIONS xml IN Packages
@PACKAGESPRICES xml IN
@SINGLEEVENTREGISTRATIONS xml IN Single events
@WAIVEBENEFITS bit IN Waive benefits
@REGISTRANTMAPPINGS xml IN

Definition

Copy


                    CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_REGISTRANTMAINEVENTFROMINVITEE
                    (
                        @ID uniqueidentifier = null output,
                        @CHANGEAGENTID uniqueidentifier = null,
                        @INVITEEID uniqueidentifier,
                        @CONSTITUENTID uniqueidentifier = null,
                        @DATEPURCHASED datetime = null,
                        @PACKAGEREGISTRATIONS xml = null,
                        @PACKAGESPRICES xml = null,
                        @SINGLEEVENTREGISTRATIONS xml = null,
                        @WAIVEBENEFITS bit = null,
                        @REGISTRANTMAPPINGS xml = null
                    )
                    as
                        set nocount on;

                        declare @CURRENTDATE datetime;

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

                        set @CURRENTDATE = getdate();

                        begin try
                            declare @EVENTID uniqueidentifier;
                            select @EVENTID = EVENTID from dbo.INVITEE where ID = @INVITEEID;

                            --List the registrations that will be created

                            declare @REGISTRATIONTOADDTABLE table
                            (
                                EVENTID uniqueidentifier,
                                EVENTPRICEID uniqueidentifier,
                                AMOUNT money,
                                RECEIPTAMOUNT money,
                                QUANTITY int,
                                DATEPURCHASED datetime,
                                REGISTRATIONPACKAGEID uniqueidentifier,
                                REGISTRANTREGISTRATIONID uniqueidentifier default newid()
                            );

                            declare @PACKAGECOUNT int;
                            insert into @REGISTRATIONTOADDTABLE
                            (
                                EVENTID,
                                EVENTPRICEID,
                                AMOUNT,
                                RECEIPTAMOUNT,
                                QUANTITY,
                                DATEPURCHASED,
                                REGISTRATIONPACKAGEID
                            )
                            select
                                EVENTPRICE.EVENTID,
                                PACKAGEPRICE.EVENTPRICEID,
                                (EVENTPRICE.AMOUNT * SELECTEDPACKAGE.QUANTITY),
                                (EVENTPRICE.RECEIPTAMOUNT * SELECTEDPACKAGE.QUANTITY),
                                SELECTEDPACKAGE.QUANTITY,
                                @DATEPURCHASED,
                                SELECTEDPACKAGE.PACKAGEREGISTRATIONPACKAGEID
                            from
                                (
                                    --TODO: Change to FROMITEMLISTXML function

                                    SELECT
                                    T.c.value('(PACKAGEREGISTRATIONPACKAGEID)[1]','uniqueidentifier') AS 'PACKAGEREGISTRATIONPACKAGEID',
                                    T.c.value('(QUANTITY)[1]','int') AS 'QUANTITY'
                                    FROM   @PACKAGEREGISTRATIONS.nodes('/PACKAGEREGISTRATIONS/ITEM') T(c)
                                ) SELECTEDPACKAGE
                                inner join dbo.UFN_REGISTRATIONPACKAGE_GETPACKAGESPRICES_FROMITEMLISTXML(@PACKAGESPRICES) PACKAGEPRICE on SELECTEDPACKAGE.PACKAGEREGISTRATIONPACKAGEID = PACKAGEPRICE.ID
                                inner join dbo.EVENTPRICE on PACKAGEPRICE.EVENTPRICEID = EVENTPRICE.ID;

                            set @PACKAGECOUNT = @@ROWCOUNT;

                            --TODO: Fix this hack with a new FROMITEMLISTXML function or by changing the field names in the spec

                            set @SINGLEEVENTREGISTRATIONS = replace(cast(@SINGLEEVENTREGISTRATIONS as nvarchar(max)), N'SINGLEEVENTREGISTRATIONS>', N'REGISTRATIONS>');
                            set @SINGLEEVENTREGISTRATIONS = replace(cast(@SINGLEEVENTREGISTRATIONS as nvarchar(max)), N'SINGLEEVENTREGISTRATIONEVENTPRICEID>', N'EVENTPRICEID>');

                            declare @REGISTRATIONCOUNT int;
                            insert into @REGISTRATIONTOADDTABLE
                            (
                                EVENTID,
                                EVENTPRICEID,
                                AMOUNT,
                                RECEIPTAMOUNT,
                                QUANTITY,
                                DATEPURCHASED,
                                REGISTRATIONPACKAGEID
                            )
                            select
                                EVENTPRICE.EVENTID,
                                SELECTEDREGISTRATION.EVENTPRICEID,
                                SELECTEDREGISTRATION.AMOUNT,
                                SELECTEDREGISTRATION.RECEIPTAMOUNT,
                                SELECTEDREGISTRATION.QUANTITY,
                                @DATEPURCHASED,
                                null
                            from
                                dbo.UFN_REGISTRANT_GETREGISTRATIONS_FROMITEMLISTXML(@SINGLEEVENTREGISTRATIONS) SELECTEDREGISTRATION
                                inner join dbo.EVENTPRICE on SELECTEDREGISTRATION.EVENTPRICEID = EVENTPRICE.ID;

                            set @REGISTRATIONCOUNT = @@ROWCOUNT;

                            --When there are no packages or registrations options the registrant is just added to the main event

                            --Otherwise the rest of the procedure is executed

                            if @PACKAGECOUNT + @REGISTRATIONCOUNT = 0
                                insert into dbo.REGISTRANT
                                (
                                    [EVENTID],
                                    [CONSTITUENTID],
                                    [ATTENDED],
                                    [WILLNOTATTEND],
                                    [GUESTOFREGISTRANTID],
                                    [BENEFITSWAIVED],
                                    [ADDEDBYID],
                                    [CHANGEDBYID],
                                    [DATEADDED],
                                    [DATECHANGED]
                                )
                                values
                                (
                                    @EVENTID,
                                    @CONSTITUENTID,
                                    0, --Not attended by default

                                    0, --Will attend

                                    null,
                                    @WAIVEBENEFITS,
                                    @CHANGEAGENTID,
                                    @CHANGEAGENTID,
                                    @CURRENTDATE,
                                    @CURRENTDATE
                                )

                            else
                            begin
                                -- There are packages or registrations to add


                                /*
                                --List the registration mappings
                                declare @REGISTRANTMAPPINGTABLE table
                                (
                                    REGISTRATIONPACKAGEID uniqueidentifier,
                                    EVENTID uniqueidentifier,
                                    EVENTPRICEID uniqueidentifier,
                                    CONSTITUENTID uniqueidentifier,
                                    PREFERENCES xml,
                                    MAPPINGID uniqueidentifier default newid() --Used to connect preferences to unknown guest registrant IDs
                                );

                                insert into @REGISTRANTMAPPINGTABLE
                                (
                                    REGISTRATIONPACKAGEID,
                                    EVENTID,
                                    EVENTPRICEID,
                                    CONSTITUENTID,
                                    PREFERENCES
                                )
                                --TODO: Change to FROMITEMLISTXML function
                                SELECT
                                T.c.value('(REGISTRATIONPACKAGEID)[1]','uniqueidentifier') AS 'REGISTRATIONPACKAGEID',
                                T.c.value('(EVENTID)[1]','uniqueidentifier') AS 'EVENTID',
                                T.c.value('(EVENTPRICEID)[1]','uniqueidentifier') AS 'EVENTPRICEID',
                                T.c.value('(CONSTITUENTID)[1]','uniqueidentifier') AS 'CONSTITUENTID',
                                T.c.value('(PREFERENCES)[1]','nvarchar(max)') AS 'PREFERENCES'
                                FROM   @REGISTRANTMAPPINGS.nodes('/REGISTRANTMAPPINGS/ITEM') T(c);
                                */

                                --List the registration mappings

                                declare @REGISTRANTMAPPINGTABLE table
                                (
                                    REGISTRATIONPACKAGEID uniqueidentifier,
                                    EVENTID uniqueidentifier,
                                    EVENTPRICEID uniqueidentifier,
                                    CONSTITUENTID uniqueidentifier,
                                    MAPPINGID uniqueidentifier default newid() --Used to connect preferences to unknown guest registrant IDs

                                );

                                insert into @REGISTRANTMAPPINGTABLE
                                (
                                    REGISTRATIONPACKAGEID,
                                    EVENTID,
                                    EVENTPRICEID,
                                    CONSTITUENTID
                                )
                                --TODO: Change to FROMITEMLISTXML function

                                SELECT
                                T.c.value('(REGISTRATIONPACKAGEID)[1]','uniqueidentifier') AS 'REGISTRATIONPACKAGEID',
                                T.c.value('(EVENTID)[1]','uniqueidentifier') AS 'EVENTID',
                                T.c.value('(EVENTPRICEID)[1]','uniqueidentifier') AS 'EVENTPRICEID',
                                T.c.value('(CONSTITUENTID)[1]','uniqueidentifier') AS 'CONSTITUENTID'
                                FROM   @REGISTRANTMAPPINGS.nodes('/REGISTRANTMAPPINGS/ITEM') T(c);                                

                                --Replace the well-known GUIDs for registrant mapping with the actual IDs

                                update @REGISTRANTMAPPINGTABLE
                                set
                                    CONSTITUENTID = @CONSTITUENTID
                                where
                                    CONSTITUENTID = '0F87025C-8FCA-4392-9780-45E4569DC331'; --Well-known GUID for registrant


                                update @REGISTRANTMAPPINGTABLE
                                set
                                    CONSTITUENTID = null
                                where
                                    CONSTITUENTID = 'C776DAB5-65B2-4258-ADAE-AE396D28E251'; --Well-known GUID for unknown guest


                                --List the event-to-constituent mappings by expanding the package mappings

                                declare @REGISTRANTEVENTMAPPINGTABLE table
                                (
                                    REGISTRANTID uniqueidentifier default newid(), --Used to keep track of unknown guests

                                    MAPPINGID uniqueidentifier, --Used to map the registrant ID for unknown guests back to preferences in @REGISTRANTMAPPINGTABLE

                                    EVENTID uniqueidentifier,
                                    EVENTPRICEID uniqueidentifier,
                                    CONSTITUENTID uniqueidentifier
                                );

                                insert into @REGISTRANTEVENTMAPPINGTABLE
                                (
                                    MAPPINGID,
                                    EVENTID,
                                    EVENTPRICEID,
                                    CONSTITUENTID
                                )
                                select
                                    REGISTRANTMAPPING.MAPPINGID,
                                    coalesce(EVENTPRICE.EVENTID, REGISTRANTMAPPING.EVENTID),
                                    coalesce(EVENTPRICE.ID, REGISTRANTMAPPING.EVENTPRICEID),
                                    REGISTRANTMAPPING.CONSTITUENTID
                                from
                                    @REGISTRANTMAPPINGTABLE REGISTRANTMAPPING
                                    left join dbo.UFN_REGISTRATIONPACKAGE_GETPACKAGESPRICES_FROMITEMLISTXML(@PACKAGESPRICES) PACKAGEPRICE on REGISTRANTMAPPING.REGISTRATIONPACKAGEID = PACKAGEPRICE.ID
                                    left join dbo.EVENTPRICE on PACKAGEPRICE.EVENTPRICEID = EVENTPRICE.ID;

                                --MAPPINGID and REGISTRANTID are only used for unknown guests so clear out the meaningless IDs

                                update @REGISTRANTEVENTMAPPINGTABLE
                                set
                                    MAPPINGID = null,
                                    REGISTRANTID = null
                                from
                                    @REGISTRANTEVENTMAPPINGTABLE
                                where
                                    CONSTITUENTID is not null;

                                --Add a registrant row for events with registrations

                                --Filter for existing registrant records, which would cause an error; adding a registrant to an event where they are already registered implies adding registrations

                                --Existing registrants may already be marked with WILLNOTATTEND as false and that value will not be changed, those with WILLNOTATTEND set to true will be updated in the next statement

                                insert into dbo.REGISTRANT
                                (
                                    [EVENTID],
                                    [CONSTITUENTID],
                                    [ATTENDED],
                                    [WILLNOTATTEND],
                                    [GUESTOFREGISTRANTID],
                                    [BENEFITSWAIVED],
                                    [ADDEDBYID],
                                    [CHANGEDBYID],
                                    [DATEADDED],
                                    [DATECHANGED]
                                )
                                select distinct
                                    MAPPING.EVENTID,
                                    @CONSTITUENTID,
                                    0, --Not attended

                                    case
                                        when exists
                                        (
                                            select
                                                MAPPINGFORCONSTITUENT.CONSTITUENTID
                                            from
                                                @REGISTRANTEVENTMAPPINGTABLE MAPPINGFORCONSTITUENT
                                            where
                                                MAPPINGFORCONSTITUENT.EVENTID = MAPPING.EVENTID
                                                and MAPPINGFORCONSTITUENT.CONSTITUENTID = @CONSTITUENTID
                                        )
                                        then
                                            0 --Will attend (the registrant is mapped to a registration for this event)

                                        else
                                            1 --Will not attend

                                    end, --CR261256-120706 by determining the correct WILLNOTATTEND value in this insert we avoid an unneeded row in the audit table

                                    null,
                                    @WAIVEBENEFITS,
                                    @CHANGEAGENTID,
                                    @CHANGEAGENTID,
                                    @CURRENTDATE,
                                    @CURRENTDATE
                                from
                                    @REGISTRANTEVENTMAPPINGTABLE MAPPING
                                    left join dbo.REGISTRANT on
                                        MAPPING.EVENTID = REGISTRANT.EVENTID
                                        and @CONSTITUENTID = REGISTRANT.CONSTITUENTID
                                where
                                    REGISTRANT.ID is null;

                                --Update the WILLNOTATTEND bit to 0 on events where the registrant is mapped to a

                                --registration and that registrant is currently marked as will not attend.

                                update dbo.REGISTRANT
                                set
                                    WILLNOTATTEND = 0, --Will attend

                                    CHANGEDBYID = @CHANGEAGENTID,
                                    DATECHANGED = @CURRENTDATE
                                from
                                    @REGISTRANTEVENTMAPPINGTABLE MAPPING
                                    inner join dbo.REGISTRANT on
                                        MAPPING.EVENTID = REGISTRANT.EVENTID
                                        and @CONSTITUENTID = REGISTRANT.CONSTITUENTID
                                where
                                    MAPPING.CONSTITUENTID = @CONSTITUENTID
                                    and WILLNOTATTEND = 1;

                                --Add a registrant row for the guests mapped to events (excluding unknown guests)

                                --Filter for existing registrant records where the guest is already a guest of the same constituent

                                --Allow errors where the guest is a guest of some other constituent for the same event, a constituent may only be a guest once per event

                                insert into    dbo.REGISTRANT
                                (
                                    [EVENTID],
                                    [CONSTITUENTID],
                                    [ATTENDED],
                                    [WILLNOTATTEND],
                                    [GUESTOFREGISTRANTID],
                                    [BENEFITSWAIVED],
                                    [ADDEDBYID],
                                    [CHANGEDBYID],
                                    [DATEADDED],
                                    [DATECHANGED]
                                )
                                select distinct
                                    MAPPING.EVENTID,
                                    MAPPING.CONSTITUENTID,
                                    0, --Not attended

                                    0, --Will attend

                                    HOSTREGISTRANT.ID,
                                    @WAIVEBENEFITS,
                                    @CHANGEAGENTID,
                                    @CHANGEAGENTID,
                                    @CURRENTDATE,
                                    @CURRENTDATE
                                from
                                    @REGISTRANTEVENTMAPPINGTABLE MAPPING
                                    inner join dbo.REGISTRANT HOSTREGISTRANT on
                                        MAPPING.EVENTID = HOSTREGISTRANT.EVENTID
                                        and @CONSTITUENTID = HOSTREGISTRANT.CONSTITUENTID
                                    left join dbo.REGISTRANT EXISTINGGUEST on
                                        MAPPING.EVENTID = EXISTINGGUEST.EVENTID
                                        and MAPPING.CONSTITUENTID = EXISTINGGUEST.CONSTITUENTID
                                        and HOSTREGISTRANT.ID = EXISTINGGUEST.GUESTOFREGISTRANTID
                                where
                                    MAPPING.CONSTITUENTID is not null
                                    and MAPPING.CONSTITUENTID <> @CONSTITUENTID
                                    and EXISTINGGUEST.ID is null;

                                --Add a registrant row for the unknown guests mapped to events

                                --Always adds unknown guests even if the registrant already has existing unknown guests

                                insert into    dbo.REGISTRANT
                                (
                                    [ID],
                                    [EVENTID],
                                    [CONSTITUENTID],
                                    [ATTENDED],
                                    [WILLNOTATTEND],
                                    [GUESTOFREGISTRANTID],
                                    [BENEFITSWAIVED],
                                    [ADDEDBYID],
                                    [CHANGEDBYID],
                                    [DATEADDED],
                                    [DATECHANGED]
                                )
                                select
                                    MAPPING.REGISTRANTID,
                                    MAPPING.EVENTID,
                                    null,
                                    0, --Not attended

                                    0, --Will attend

                                    HOSTREGISTRANT.ID,
                                    @WAIVEBENEFITS,
                                    @CHANGEAGENTID,
                                    @CHANGEAGENTID,
                                    @CURRENTDATE,
                                    @CURRENTDATE
                                from
                                    @REGISTRANTEVENTMAPPINGTABLE MAPPING
                                    inner join dbo.REGISTRANT HOSTREGISTRANT on
                                        MAPPING.EVENTID = HOSTREGISTRANT.EVENTID
                                        and @CONSTITUENTID = HOSTREGISTRANT.CONSTITUENTID
                                where
                                    MAPPING.CONSTITUENTID is null;

                                --Add the packages to the registrant record

                                insert into dbo.REGISTRANTPACKAGE
                                (
                                    [CONSTITUENTID],
                                    [REGISTRATIONPACKAGEID],
                                    [GUESTOFCONSTITUENTID],
                                    [ADDEDBYID],
                                    [CHANGEDBYID],
                                    [DATEADDED],
                                    [DATECHANGED]
                                )
                                select
                                    REGISTRATIONMAPPING.CONSTITUENTID,
                                    REGISTRATIONMAPPING.REGISTRATIONPACKAGEID,
                                    null,
                                    @CHANGEAGENTID,
                                    @CHANGEAGENTID,
                                    @CURRENTDATE,
                                    @CURRENTDATE
                                from
                                    @REGISTRANTMAPPINGTABLE REGISTRATIONMAPPING
                                where
                                    REGISTRATIONMAPPING.REGISTRATIONPACKAGEID <> '00000000-0000-0000-0000-000000000000'
                                    and REGISTRATIONMAPPING.CONSTITUENTID = @CONSTITUENTID;

                                --Add the packages to the guest and unknown guest records

                                insert into dbo.REGISTRANTPACKAGE
                                (
                                    [CONSTITUENTID],
                                    [REGISTRATIONPACKAGEID],
                                    [GUESTOFCONSTITUENTID],
                                    [ADDEDBYID],
                                    [CHANGEDBYID],
                                    [DATEADDED],
                                    [DATECHANGED]
                                )
                                select
                                    REGISTRATIONMAPPING.CONSTITUENTID,
                                    REGISTRATIONMAPPING.REGISTRATIONPACKAGEID,
                                    @CONSTITUENTID,
                                    @CHANGEAGENTID,
                                    @CHANGEAGENTID,
                                    @CURRENTDATE,
                                    @CURRENTDATE
                                from
                                    @REGISTRANTMAPPINGTABLE REGISTRATIONMAPPING
                                where
                                    REGISTRATIONMAPPING.REGISTRATIONPACKAGEID <> '00000000-0000-0000-0000-000000000000'
                                    and
                                    (
                                        REGISTRATIONMAPPING.CONSTITUENTID is null
                                        or
                                        REGISTRATIONMAPPING.CONSTITUENTID <> @CONSTITUENTID
                                    );

                                /*
                                --Iterate over preferences on the registrant and guests
                                declare PREFERENCECURSOR cursor local fast_forward for
                                select
                                    MAPPING.CONSTITUENTID,
                                    MAPPING.MAPPINGID,
                                    MAPPING.PREFERENCES
                                from
                                    @REGISTRANTMAPPINGTABLE MAPPING;

                                declare @PREFERENCESCONSTITUENTID uniqueidentifier;
                                declare @PREFERENCESMAPPINGID uniqueidentifier;
                                declare @PREFERENCES xml;
                                open PREFERENCECURSOR;
                                    fetch next from PREFERENCECURSOR into @PREFERENCESCONSTITUENTID, @PREFERENCESMAPPINGID, @PREFERENCES;

                                    while @@FETCH_STATUS = 0
                                    begin
                                        --Save the current preferences
                                        insert into dbo.REGISTRANTPREFERENCE
                                        (
                                            REGISTRANTID,
                                            EVENTPREFERENCEID,
                                            QUANTITY,
                                            ADDEDBYID,
                                            CHANGEDBYID,
                                            DATEADDED,
                                            DATECHANGED
                                        )
                                        select
                                            coalesce(REGISTRANT.ID, UNKNOWNGUESTMAPPING.REGISTRANTID),
                                            SELECTEDPREFERENCE.EVENTPREFERENCEID,
                                            SELECTEDPREFERENCE.QUANTITY,
                                            @CHANGEAGENTID,
                                            @CHANGEAGENTID,
                                            @CURRENTDATE,
                                            @CURRENTDATE
                                        from
                                            dbo.UFN_REGISTRANT_GETPREFERENCES_FROMITEMLISTXML(@PREFERENCES) SELECTEDPREFERENCE
                                            inner join dbo.EVENTPREFERENCE on SELECTEDPREFERENCE.EVENTPREFERENCEID = EVENTPREFERENCE.ID
                                            inner join dbo.EVENTPREFERENCEGROUP on EVENTPREFERENCE.EVENTPREFERENCEGROUPID = EVENTPREFERENCEGROUP.ID
                                            left join dbo.REGISTRANT on
                                                    EVENTPREFERENCEGROUP.EVENTID = REGISTRANT.EVENTID
                                                    and @PREFERENCESCONSTITUENTID = REGISTRANT.CONSTITUENTID
                                            left join @REGISTRANTEVENTMAPPINGTABLE UNKNOWNGUESTMAPPING on
                                                EVENTPREFERENCEGROUP.EVENTID = UNKNOWNGUESTMAPPING.EVENTID
                                                and @PREFERENCESMAPPINGID = UNKNOWNGUESTMAPPING.MAPPINGID;

                                        fetch next from PREFERENCECURSOR into @PREFERENCESCONSTITUENTID, @PREFERENCESMAPPINGID, @PREFERENCES;
                                    end

                                --When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long
                                close PREFERENCECURSOR;
                                deallocate PREFERENCECURSOR;
                                set @PREFERENCESCONSTITUENTID = null;
                                set @PREFERENCESMAPPINGID = null;
                                set @PREFERENCES = null;
                                */

                                --Add the registrations

                                insert into dbo.REGISTRANTREGISTRATION
                                (
                                    ID,
                                    REGISTRANTID,
                                    EVENTPRICEID,
                                    QUANTITY,
                                    AMOUNT,
                                    RECEIPTAMOUNT,
                                    DATEPURCHASED,
                                    ADDEDBYID,
                                    CHANGEDBYID,
                                    DATEADDED,
                                    DATECHANGED
                                )
                                select
                                    SELECTEDREGISTRATION.REGISTRANTREGISTRATIONID,
                                    REGISTRANT.ID,
                                    SELECTEDREGISTRATION.EVENTPRICEID,
                                    SELECTEDREGISTRATION.QUANTITY,
                                    SELECTEDREGISTRATION.AMOUNT,
                                    SELECTEDREGISTRATION.RECEIPTAMOUNT,
                                    SELECTEDREGISTRATION.DATEPURCHASED,
                                    @CHANGEAGENTID,
                                    @CHANGEAGENTID,
                                    @CURRENTDATE,
                                    @CURRENTDATE
                                from
                                    @REGISTRATIONTOADDTABLE SELECTEDREGISTRATION
                                    inner join dbo.REGISTRANT on
                                        SELECTEDREGISTRATION.EVENTID = REGISTRANT.EVENTID
                                        and @CONSTITUENTID = REGISTRANT.CONSTITUENTID;

                                --Add the default benefits for the added registrations, give benefits to

                                --the registrant/guests when they are mapped and when the registration count is 1.

                                insert into dbo.REGISTRANTBENEFIT
                                (
                                    REGISTRANTID,
                                    BENEFITID,
                                    UNITVALUE,
                                    QUANTITY,
                                    TOTALVALUE,
                                    DETAILS,
                                    ADDEDBYID,
                                    CHANGEDBYID,
                                    DATEADDED,
                                    DATECHANGED
                                )
                                select
                                    coalesce(REGISTRANTEVENTMAPPING.REGISTRANTID, REGISTRANT.ID),
                                    EVENTPRICEBENEFIT.BENEFITID,
                                    EVENTPRICEBENEFIT.UNITVALUE,
                                    EVENTPRICEBENEFIT.QUANTITY,
                                    (EVENTPRICEBENEFIT.UNITVALUE * EVENTPRICEBENEFIT.QUANTITY),
                                    EVENTPRICEBENEFIT.DETAILS,
                                    @CHANGEAGENTID,
                                    @CHANGEAGENTID,
                                    @CURRENTDATE,
                                    @CURRENTDATE
                                from
                                    @REGISTRANTEVENTMAPPINGTABLE REGISTRANTEVENTMAPPING
                                    inner join dbo.EVENTPRICEBENEFIT on REGISTRANTEVENTMAPPING.EVENTPRICEID = EVENTPRICEBENEFIT.EVENTPRICEID
                                    left join dbo.EVENTPRICE on REGISTRANTEVENTMAPPING.EVENTPRICEID = EVENTPRICE.ID
                                    left join dbo.EVENTREGISTRATIONTYPE on EVENTPRICE.EVENTREGISTRATIONTYPEID = EVENTREGISTRATIONTYPE.ID
                                    left join dbo.REGISTRANT on
                                        REGISTRANTEVENTMAPPING.EVENTID = REGISTRANT.EVENTID
                                        and REGISTRANTEVENTMAPPING.CONSTITUENTID = REGISTRANT.CONSTITUENTID
                                where
                                    EVENTPRICE.REGISTRATIONCOUNT = 1;

                                --Benefits from registration options with high registration counts always

                                --go to the registrant so that they don't have to be divided among guests

                                insert into dbo.REGISTRANTBENEFIT
                                (
                                    REGISTRANTID,
                                    BENEFITID,
                                    UNITVALUE,
                                    QUANTITY,
                                    TOTALVALUE,
                                    DETAILS,
                                    ADDEDBYID,
                                    CHANGEDBYID,
                                    DATEADDED,
                                    DATECHANGED
                                )
                                select
                                    REGISTRANT.ID,
                                    EVENTPRICEBENEFIT.BENEFITID,
                                    (SELECTEDREGISTRATION.QUANTITY * EVENTPRICEBENEFIT.UNITVALUE),
                                    (SELECTEDREGISTRATION.QUANTITY * EVENTPRICEBENEFIT.QUANTITY),
                                    ((SELECTEDREGISTRATION.QUANTITY * EVENTPRICEBENEFIT.UNITVALUE) * (SELECTEDREGISTRATION.QUANTITY * EVENTPRICEBENEFIT.QUANTITY)),
                                    EVENTPRICEBENEFIT.DETAILS,
                                    @CHANGEAGENTID,
                                    @CHANGEAGENTID,
                                    @CURRENTDATE,
                                    @CURRENTDATE
                                from
                                    @REGISTRATIONTOADDTABLE SELECTEDREGISTRATION
                                    inner join dbo.EVENTPRICEBENEFIT on SELECTEDREGISTRATION.EVENTPRICEID = EVENTPRICEBENEFIT.EVENTPRICEID
                                    left join dbo.EVENTPRICE on SELECTEDREGISTRATION.EVENTPRICEID = EVENTPRICE.ID
                                    left join dbo.EVENTREGISTRATIONTYPE on EVENTPRICE.EVENTREGISTRATIONTYPEID = EVENTREGISTRATIONTYPE.ID
                                    left join dbo.REGISTRANT on
                                        SELECTEDREGISTRATION.EVENTID = REGISTRANT.EVENTID
                                        and @CONSTITUENTID = REGISTRANT.CONSTITUENTID
                                where
                                    EVENTPRICE.REGISTRATIONCOUNT > 1;
                            end

                            --Multiple registrant rows can be created so always select and return the registrant ID for the current event

                            --If registrant did not register for main event return the registrant ID for a sub event.

                            select
                                @ID = ID
                            from
                                dbo.REGISTRANT
                            where
                                CONSTITUENTID = @CONSTITUENTID and
                                EVENTID = @EVENTID;

                            if @ID is null
                                select top(1)
                                    @ID = REGISTRANT.ID
                                from
                                    dbo.REGISTRANT
                                inner join dbo.EVENT on REGISTRANT.EVENTID = EVENT.ID
                                where
                                    REGISTRANT.CONSTITUENTID = @CONSTITUENTID and
                                    EVENT.MAINEVENTID = @EVENTID;
                        end try

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

                        return 0;