USP_SALESORDERITEMEVENTREGISTRATION_ADD

Adds collection of host registrants to order.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT
@SALESORDERID uniqueidentifier IN
@REGISTRATIONS xml IN
@CURRENTDATE datetime IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


            CREATE procedure dbo.USP_SALESORDERITEMEVENTREGISTRATION_ADD (
                @ID uniqueidentifier output
                @SALESORDERID uniqueidentifier, 
                @REGISTRATIONS xml,
                @CURRENTDATE datetime = null,
                @CHANGEAGENTID uniqueidentifier = null
            )
            as
            begin
                if @CHANGEAGENTID is null  
                    exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

                if @CURRENTDATE is null
                    set @CURRENTDATE = getdate()

                --Determine which other registrations could have been created/altered

                declare @SELECTEDREGISTRATIONS table (
                    [ID] uniqueidentifier,
                    [REGISTRANTID] uniqueidentifier,
                    [CONSTITUENTID] uniqueidentifier,
                    [EVENTID] uniqueidentifier,
                    [AMOUNT] money --Order total

                )

                insert @SELECTEDREGISTRATIONS
                select
                    coalesce(( --Get sales order item id for registrations that already exist in order

                        select [SALESORDERITEMEVENTREGISTRATION].[ID]
                        from dbo.[SALESORDERITEMEVENTREGISTRATION]
                        inner join dbo.[SALESORDERITEM]
                            on [SALESORDERITEMEVENTREGISTRATION].[ID] = [SALESORDERITEM].[ID]
                        where 
                            [SALESORDERITEM].[SALESORDERID] = @SALESORDERID and
                            [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] = T.registrant.value('(REGISTRANTID)[1]', 'uniqueidentifier')
                        ),newid()) as [ID],
                    T.registrant.value('(REGISTRANTID)[1]', 'uniqueidentifier') as [REGISTRANTID],
                    (select [REGISTRANT].[CONSTITUENTID] from dbo.REGISTRANT where [REGISTRANT].[ID] = T.registrant.value('(REGISTRANTID)[1]', 'uniqueidentifier')) as [CONSTITUENTID],
                    (
                        select [REGISTRANT].[EVENTID]
                        from dbo.[REGISTRANT]
                        where [REGISTRANT].[ID] = T.registrant.value('(REGISTRANTID)[1]', 'uniqueidentifier')
                    ) as [EVENTID],
                    T.registrant.value('(AMOUNT)[1]', 'money') as [AMOUNT]
                from @REGISTRATIONS.nodes('/REGISTRATIONS/ITEM') T(registrant)
                where T.registrant.value('(ISSELECTED)[1]', 'bit') = 1

                --Return a valid sales order item id

                set @ID = (select top 1 [ID] from @SELECTEDREGISTRATIONS)

                --Add/Update Sales order items

                begin try
                    --If the user entered an AMOUNT < 0, return an error

                    if exists (
                        select [ID]
                        from @SELECTEDREGISTRATIONS
                        where [AMOUNT] < 0
                    )
                    begin
                        raiserror('BBEER_REGISTRATIONS_INVALIDAMOUNT', 13, 1);
                        return 1;
                    end

                    declare @CONSTITUENTID uniqueidentifier = null
                    if 1 = (select count(distinct [CONSTITUENTID]) from @SELECTEDREGISTRATIONS)
                        set @CONSTITUENTID = (select top 1 [CONSTITUENTID] from @SELECTEDREGISTRATIONS)

                    --Make the CONSTITUENTID the patron of the order if there is no patron

                    if @CONSTITUENTID is not null and (select [CONSTITUENTID] from dbo.[SALESORDER] where [ID] = @SALESORDERID) is null
                    begin
                        update dbo.[SALESORDER]
                        set
                            [CONSTITUENTID] = @CONSTITUENTID,
                            [DATECHANGED] = @CURRENTDATE,
                            [CHANGEDBYID] = @CHANGEAGENTID
                        where [ID] = @SALESORDERID
                    end

                    --Make the CONSTITUENTID the recipient of the order if there is no recipient

                    if @CONSTITUENTID is not null and (select [RECIPIENTID] from dbo.[SALESORDER] where [ID] = @SALESORDERID) is null
                    begin
                        update dbo.[SALESORDER]
                        set
                            [RECIPIENTID] = @CONSTITUENTID,
                            [ADDRESSID] = (select top(1) [ID] from dbo.[ADDRESS] where [CONSTITUENTID] = @CONSTITUENTID and [ISPRIMARY] = 1 and [DONOTMAIL] = 0),
                            [PHONEID] = (select top(1) [ID] from dbo.[PHONE] where [PHONE].[CONSTITUENTID] = @CONSTITUENTID and [PHONE].[ISPRIMARY] = 1 and [DONOTCALL] = 0),
                            [EMAILADDRESSID] = (select top(1) [ID] from dbo.[EMAILADDRESS] where [CONSTITUENTID] = @CONSTITUENTID and [ISPRIMARY] = 1 and [DONOTEMAIL] = 0),
                            [DATECHANGED] = @CURRENTDATE,
                            [CHANGEDBYID] = @CHANGEAGENTID
                        where [ID] = @SALESORDERID
                    end

                    --Update registrations that may have changed through registration form

                    update dbo.[SALESORDERITEM]
                    set 
                        [PRICE] = (
                            select [AMOUNT] 
                            from @SELECTEDREGISTRATIONS as [REGISTRATIONS]
                            inner join dbo.[SALESORDERITEMEVENTREGISTRATION]
                                on [REGISTRATIONS].[REGISTRANTID] = [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID]
                            where [SALESORDERITEMEVENTREGISTRATION].[ID] = [SALESORDERITEM].[ID]
                        ),
                        [CHANGEDBYID] = @CHANGEAGENTID
                        [DATECHANGED] = @CURRENTDATE
                    where exists (
                        select [REGISTRATIONS].[REGISTRANTID]
                        from @SELECTEDREGISTRATIONS as [REGISTRATIONS]
                        inner join dbo.[SALESORDERITEMEVENTREGISTRATION]
                            on [REGISTRATIONS].[REGISTRANTID] = [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID]
                        inner join dbo.[SALESORDERITEM] as [SOI]
                            on [SALESORDERITEMEVENTREGISTRATION].[ID] = [SOI].[ID]
                        where 
                            [SALESORDERITEM].[SALESORDERID] = @SALESORDERID and
                            [SOI].[ID] = [SALESORDERITEM].[ID]
                    )

                    update dbo.[SALESORDERITEMEVENTREGISTRANTREGISTRATION]
                    set 
                        [QUANTITY] = (
                            select coalesce(sum([REGISTRANTREGISTRATION].[QUANTITY]),0)
                            from dbo.[SALESORDERITEMEVENTREGISTRATION]
                            inner join dbo.[REGISTRANTREGISTRATION]
                                on [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRANTREGISTRATION].[REGISTRANTID]
                            where 
                                [REGISTRANTREGISTRATION].[EVENTPRICEID] = [SALESORDERITEMEVENTREGISTRANTREGISTRATION].[EVENTPRICEID] and
                                [SALESORDERITEMEVENTREGISTRATION].[ID] = [SALESORDERITEMEVENTREGISTRANTREGISTRATION].[SALESORDERITEMEVENTREGISTRATIONID]
                        ),
                        [AMOUNT] = (
                            select coalesce(sum([REGISTRANTREGISTRATION].[AMOUNT]),0)
                            from dbo.[SALESORDERITEMEVENTREGISTRATION]
                            inner join dbo.[REGISTRANTREGISTRATION]
                                on [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRANTREGISTRATION].[REGISTRANTID]
                            where 
                                [REGISTRANTREGISTRATION].[EVENTPRICEID] = [SALESORDERITEMEVENTREGISTRANTREGISTRATION].[EVENTPRICEID] and
                                [SALESORDERITEMEVENTREGISTRATION].[ID] = [SALESORDERITEMEVENTREGISTRANTREGISTRATION].[SALESORDERITEMEVENTREGISTRATIONID]
                        ),
                        [CHANGEDBYID] = @CHANGEAGENTID
                        [DATECHANGED] = @CURRENTDATE
                    where exists (
                        select [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID]
                        from @SELECTEDREGISTRATIONS as [REGISTRATIONS]
                        inner join dbo.[REGISTRANTREGISTRATION]
                            on [REGISTRATIONS].[REGISTRANTID] = [REGISTRANTREGISTRATION].[REGISTRANTID]
                        inner join dbo.[SALESORDERITEMEVENTREGISTRATION]
                        on [REGISTRATIONS].[REGISTRANTID] = [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID]
                        inner join dbo.[SALESORDERITEM]
                            on [SALESORDERITEM].[ID] = [SALESORDERITEMEVENTREGISTRATION].[ID]
                        where 
                            [SALESORDERITEM].[SALESORDERID] = @SALESORDERID and 
                            [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRATIONS].[REGISTRANTID] and
                            [SALESORDERITEMEVENTREGISTRANTREGISTRATION].[EVENTPRICEID] = [REGISTRANTREGISTRATION].[EVENTPRICEID]
                    )

                    insert into dbo.[SALESORDERITEM]
                    (
                        [ID],
                        [SALESORDERID],
                        [TYPECODE],
                        [DESCRIPTION],
                        [QUANTITY],
                        [PRICE],
                        [ADDEDBYID], 
                        [CHANGEDBYID], 
                        [DATEADDED], 
                        [DATECHANGED]
                    )
                    select
                        [ID], 
                        @SALESORDERID
                        6
                        dbo.UFN_EVENT_GETNAME([EVENTID]),
                        1,
                        [AMOUNT],
                        @CHANGEAGENTID
                        @CHANGEAGENTID
                        @CURRENTDATE
                        @CURRENTDATE
                    from @SELECTEDREGISTRATIONS    as [REGISTRATIONS]
                    where 
                        --Registration is not already in order

                        [REGISTRANTID] not in (
                            select [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID]
                            from dbo.[SALESORDERITEMEVENTREGISTRATION]
                            inner join dbo.[SALESORDERITEM]
                                on [SALESORDERITEM].[ID] = [SALESORDERITEMEVENTREGISTRATION].[ID]
                            where [SALESORDERITEM].[SALESORDERID] = @SALESORDERID
                        )

                    insert into dbo.[SALESORDERITEMEVENTREGISTRATION]
                    (
                        [ID],
                        [REGISTRANTID],
                        [EVENTNAME],
                        [ADDEDBYID], 
                        [CHANGEDBYID], 
                        [DATEADDED], 
                        [DATECHANGED]
                    )
                    select
                        [ID], 
                        [REGISTRANTID],
                        coalesce((select [EVENT].[NAME] from dbo.[EVENT] where [EVENT].[ID] = [REGISTRATIONS].[EVENTID]),''),
                        @CHANGEAGENTID
                        @CHANGEAGENTID
                        @CURRENTDATE
                        @CURRENTDATE
                    from @SELECTEDREGISTRATIONS    as [REGISTRATIONS]
                    where 
                        --Registration not already in order

                        [REGISTRANTID] not in (
                            select [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID]
                            from dbo.[SALESORDERITEMEVENTREGISTRATION]
                            inner join dbo.[SALESORDERITEM]
                                on [SALESORDERITEM].[ID] = [SALESORDERITEMEVENTREGISTRATION].[ID]
                            where [SALESORDERITEM].[SALESORDERID] = @SALESORDERID
                        )

                    insert into dbo.[SALESORDERITEMEVENTREGISTRANTREGISTRATION]
                    (
                        [ID],
                        [SALESORDERITEMEVENTREGISTRATIONID],
                        [EVENTPRICEID],
                        [QUANTITY],
                        [AMOUNT],
                        [ADDEDBYID], 
                        [CHANGEDBYID], 
                        [DATEADDED], 
                        [DATECHANGED]
                    )
                    select
                        newid(),
                        [REGISTRATIONS].[ID],  
                        [REGISTRANTREGISTRATION].[EVENTPRICEID],
                        coalesce(sum([REGISTRANTREGISTRATION].[QUANTITY]),0),
                        coalesce(sum([REGISTRANTREGISTRATION].[AMOUNT]),0),
                        @CHANGEAGENTID
                        @CHANGEAGENTID
                        @CURRENTDATE
                        @CURRENTDATE
                    from @SELECTEDREGISTRATIONS    as [REGISTRATIONS]
                    inner join dbo.[REGISTRANTREGISTRATION]
                        on [REGISTRATIONS].[REGISTRANTID] = [REGISTRANTREGISTRATION].[REGISTRANTID]
                    where not exists ( --Allows for new pricing information on new and altered registrations

                            select [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID]
                            from dbo.[SALESORDERITEMEVENTREGISTRATION]
                            inner join dbo.[SALESORDERITEM]
                                on [SALESORDERITEM].[ID] = [SALESORDERITEMEVENTREGISTRATION].[ID]
                            inner join dbo.[SALESORDERITEMEVENTREGISTRANTREGISTRATION]
                                on [SALESORDERITEMEVENTREGISTRATION].[ID] = [SALESORDERITEMEVENTREGISTRANTREGISTRATION].[SALESORDERITEMEVENTREGISTRATIONID]
                            where 
                                [SALESORDERITEM].[SALESORDERID] = @SALESORDERID and 
                                [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRATIONS].[REGISTRANTID] and
                                [SALESORDERITEMEVENTREGISTRANTREGISTRATION].[EVENTPRICEID] = [REGISTRANTREGISTRATION].[EVENTPRICEID]
                        )
                    group by 
                        [REGISTRANTREGISTRATION].[EVENTPRICEID], 
                        [REGISTRATIONS].[ID]

                    --Delete pricing data that has been deleted from registrations that are in the cart that have been edited within the form

                    declare @ORDERITEM uniqueidentifier = null
                    declare deleteprice_cursor cursor local fast_forward for 
                        select [SALESORDERITEMEVENTREGISTRANTREGISTRATION].[ID] 
                        from dbo.[SALESORDERITEMEVENTREGISTRANTREGISTRATION]
                        inner join dbo.[SALESORDERITEMEVENTREGISTRATION]
                            on [SALESORDERITEMEVENTREGISTRANTREGISTRATION].[SALESORDERITEMEVENTREGISTRATIONID] = [SALESORDERITEMEVENTREGISTRATION].[ID]
                        inner join dbo.[SALESORDERITEM]
                            on [SALESORDERITEMEVENTREGISTRATION].[ID] = [SALESORDERITEM].[ID]
                        where 
                            [SALESORDERITEMEVENTREGISTRANTREGISTRATION].[EVENTPRICEID] not in (
                                select [EVENTPRICEID]
                                from dbo.[REGISTRANTREGISTRATION]
                                where [REGISTRANTREGISTRATION].[REGISTRANTID] = [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID]
                            ) and
                            [SALESORDERITEM].[SALESORDERID] = @SALESORDERID

                    OPEN deleteprice_cursor

                    FETCH NEXT FROM deleteprice_cursor
                    INTO @ORDERITEM

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

                        FETCH NEXT FROM deleteprice_cursor
                        INTO @ORDERITEM
                    end
                    close deleteprice_cursor
                    deallocate deleteprice_cursor

                    if exists (select top 1 1 from dbo.SALESORDERITEM where SALESORDERID = @SALESORDERID)
                    begin                        
                        exec dbo.USP_COMBINATION_REMOVEINELIGIBLECOMBINATIONS @SALESORDERID, @CHANGEAGENTID;
                        exec dbo.USP_SALESORDER_APPLYITEMDISCOUNTS @SALESORDERID, @CHANGEAGENTID;
                        exec dbo.USP_SALESORDER_APPLYORDERDISCOUNTS @SALESORDERID, @CHANGEAGENTID;
                        exec dbo.USP_SALESORDER_CALCULATETAXES @SALESORDERID, @CHANGEAGENTID;
                    end

                end try

                begin catch
                    exec dbo.USP_RAISE_ERROR
                    return 1
                end catch
            end