USP_ITINERARY_UPDATEITEMQUANTITIES

After editing an itinerary, update item quantities.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CURRENTDATE datetime IN

Definition

Copy


        CREATE procedure dbo.USP_ITINERARY_UPDATEITEMQUANTITIES
        (
            @ID uniqueidentifier = null,
            @CHANGEAGENTID uniqueidentifier = null,
            @CURRENTDATE datetime = null
        )
        as
        begin

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

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

            declare @RESERVATIONID uniqueidentifier

            select @RESERVATIONID = RESERVATIONID
            from dbo.ITINERARY where ID = @ID

            exec dbo.USP_RESERVATION_UPDATEITEMQUANTITIES @RESERVATIONID, @CHANGEAGENTID;

            declare @ORDERITEMS table
            (
                ID uniqueidentifier,
                QUANTITY decimal(20,4),
                PRICETYPECODEID uniqueidentifier,
                DESCRIPTION nvarchar(255),
                EVENTID uniqueidentifier,
                PROGRAMID uniqueidentifier,
                PRICE money,
                STARTDATE datetime,
                PRICINGSTRUCTURECODE tinyint,
                ITINERARYITEMTYPECODE tinyint
            );

            -- Scheduled Events, distinct per event

            with CTE_DISTINCT_EVENTS as
            (
                select distinct
                    ITINERARYATTENDEE.QUANTITY as QUANTITY,
                    ITINERARYATTENDEE.PRICETYPECODEID as PRICETYPECODEID,
                    EVENTID
                from dbo.ITINERARY
                inner join dbo.ITINERARYATTENDEE on
                    ITINERARY.ID = ITINERARYATTENDEE.ITINERARYID
                inner join dbo.ITINERARYITEM on
                    ITINERARY.ID = ITINERARYITEM.ITINERARYID
                inner join dbo.EVENT on
                    ITINERARYITEM.EVENTID = EVENT.ID
                where
                    ITINERARY.ID = @ID and 
                    ITINERARYITEM.ITEMTYPECODE = 0 and
                    not exists 
                    (
                        select PRICETYPECODEID 
                        from dbo.SALESORDERITEMTICKET
                        inner join dbo.SALESORDERITEM on
                            SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
                        where 
                            SALESORDERITEM.SALESORDERID = @RESERVATIONID and
                            SALESORDERITEMTICKET.EVENTID = ITINERARYITEM.EVENTID and
                            SALESORDERITEMTICKET.PRICETYPECODEID = ITINERARYATTENDEE.PRICETYPECODEID
                    )
            )            
            insert into @ORDERITEMS
            ( QUANTITY, PRICETYPECODEID, EVENTID, PROGRAMID, ITINERARYITEMTYPECODE)
            select
                sum(QUANTITY),
                PRICETYPECODEID,
                EVENTID,
                (select PROGRAMID from dbo.EVENT where ID = EVENTID),
                0
            from CTE_DISTINCT_EVENTS
            group by PRICETYPECODEID, EVENTID;            



            -- daily admission programs, distinct per program per day    

            with CTE_DISTINCT as
            (
                select distinct
                    ITINERARYATTENDEE.QUANTITY as QUANTITY,
                    ITINERARYATTENDEE.PRICETYPECODEID as PRICETYPECODEID,
                    PROGRAMID,
                    STARTDATE
                from dbo.ITINERARY
                inner join dbo.ITINERARYATTENDEE on
                    ITINERARY.ID = ITINERARYATTENDEE.ITINERARYID
                inner join dbo.ITINERARYITEM on
                    ITINERARY.ID = ITINERARYITEM.ITINERARYID
                inner join dbo.PROGRAM on
                    ITINERARYITEM.PROGRAMID = PROGRAM.ID
                where
                    ITINERARY.ID = @ID and 
                    ITINERARYITEM.ITEMTYPECODE = 1 and
                    ITINERARYATTENDEE.PRICETYPECODEID not in 
                    (
                        select PRICETYPECODEID 
                        from dbo.SALESORDERITEMTICKET
                        inner join dbo.SALESORDERITEM on
                            SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
                        where 
                            SALESORDERITEM.SALESORDERID = @RESERVATIONID and
                            SALESORDERITEMTICKET.PROGRAMID = ITINERARYITEM.PROGRAMID
                    )
            )            
            insert into @ORDERITEMS
            ( QUANTITY, PRICETYPECODEID, PROGRAMID, ITINERARYITEMTYPECODE)
            select
                sum(QUANTITY),
                PRICETYPECODEID,
                PROGRAMID,
                1
            from CTE_DISTINCT
            group by PRICETYPECODEID, PROGRAMID

            -- additional information that couldn't be done with distinct

            update @ORDERITEMS set
                DESCRIPTION = EVENT.NAME + ' - '
            from dbo.EVENT
            where
                EVENT.ID = [@ORDERITEMS].EVENTID and
                [@ORDERITEMS].ID is null

            update @ORDERITEMS set
                DESCRIPTION = PROGRAM.NAME + ' - '
            from dbo.PROGRAM
            where
                PROGRAM.ID = [@ORDERITEMS].PROGRAMID and
                [@ORDERITEMS].ID is null

            -- final information for daily admission programs and events

            update @ORDERITEMS set
                [@ORDERITEMS].ID = newid(),
                DESCRIPTION = [@ORDERITEMS].DESCRIPTION + PRICETYPECODE.DESCRIPTION
            from dbo.PRICETYPECODE
            where
                PRICETYPECODE.ID = [@ORDERITEMS].PRICETYPECODEID and
                [@ORDERITEMS].ID is null

            -- Events with specific prices

            update @ORDERITEMS set
                PRICE = PROGRAMEVENTPRICE.FACEPRICE
            from dbo.PROGRAMEVENTPRICE
            where 
                PROGRAMEVENTPRICE.EVENTID = [@ORDERITEMS].EVENTID and
                [@ORDERITEMS].PRICETYPECODEID = PROGRAMEVENTPRICE.PRICETYPECODEID

            -- Events without specific prices

            update @ORDERITEMS set
                PRICE = PROGRAMPRICE.FACEPRICE
            from dbo.PROGRAMPRICE 
            inner join dbo.EVENT on 
                EVENT.PROGRAMID = PROGRAMPRICE.PROGRAMID
            where 
                EVENT.ID = [@ORDERITEMS].EVENTID and
                [@ORDERITEMS].PRICE is null and
                [@ORDERITEMS].PRICETYPECODEID = PROGRAMPRICE.PRICETYPECODEID and
                not exists 
                (
                    select 1 from dbo.PROGRAMEVENTPRICE
                    where PROGRAMEVENTPRICE.EVENTID = EVENT.ID
                )


            --Programs with specific prices

            update @ORDERITEMS set
                PRICE = PROGRAMPRICE.FACEPRICE
            from dbo.PROGRAMPRICE
            where 
                PROGRAMPRICE.PROGRAMID = [@ORDERITEMS].PROGRAMID and
                [@ORDERITEMS].PRICETYPECODEID = PROGRAMPRICE.PRICETYPECODEID

            update @ORDERITEMS set PRICINGSTRUCTURECODE = 0

            -- Set items to be flat rate if the reservation is flat rate and the program is included

            declare @ISFLATRATE bit = 0
            select @ISFLATRATE = 1 from dbo.RESERVATION
            where ID = @RESERVATIONID and PRICINGCODE = 1
            if @ISFLATRATE = 1
            begin
                update @ORDERITEMS set PRICINGSTRUCTURECODE = 1
                where 
                    dbo.UFN_RESERVATIONRATESCALE_ISEVENTINCLUDED(@RESERVATIONID,[@ORDERITEMS].EVENTID) = 1 or
                    dbo.UFN_RESERVATIONRATESCALE_ISPROGRAMINCLUDED(@RESERVATIONID,[@ORDERITEMS].PROGRAMID) = 1
            end

            if exists (select 1 from @ORDERITEMS where PRICE is null)
                raiserror('BBERR_INVALIDPRICETYPE', 13, 1);

            -- insert new items

            insert into dbo.SALESORDERITEM
                (ID, SALESORDERID, TYPECODE, DESCRIPTION, QUANTITY, PRICE, PRICINGSTRUCTURECODE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            select
                ITEMS.ID, 
                @RESERVATIONID
                0
                ITEMS.DESCRIPTION, 
                ITEMS.QUANTITY, 
                ITEMS.PRICE,
                ITEMS.PRICINGSTRUCTURECODE,
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
            from @ORDERITEMS ITEMS

            insert into dbo.SALESORDERITEMTICKET
            (
                ID,
                EVENTID,
                PROGRAMID,
                PROGRAMNAME,
                PROGRAMCATEGORYNAME,
                PRICETYPECODEID,
                PRICE, 
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED, 
                DATECHANGED
            )
            select
                ITEMS.ID, 
                ITEMS.EVENTID,
                ITEMS.PROGRAMID,
                case ITEMS.ITINERARYITEMTYPECODE
                    when 1 then coalesce((select [NAME] from dbo.[PROGRAM] where [ID] = [ITEMS].[PROGRAMID]),'')
                    when 0 then coalesce((
                        select [PROGRAM].[NAME] 
                        from dbo.[EVENT]
                        inner join dbo.[PROGRAM]
                            on [EVENT].[PROGRAMID] = [PROGRAM].[ID]
                        where [EVENT].[ID] = [ITEMS].[EVENTID]
                    ),'')
                end,
                case ITEMS.ITINERARYITEMTYPECODE
                    when 1 then coalesce((
                        select [PROGRAMCATEGORYCODE].[DESCRIPTION] 
                        from dbo.[PROGRAM] 
                        inner join dbo.[PROGRAMCATEGORYCODE]
                            on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
                        where [PROGRAM].[ID] = [ITEMS].[PROGRAMID]
                    ),'')
                    when 0 then coalesce((
                        select [PROGRAMCATEGORYCODE].[DESCRIPTION]
                        from dbo.[EVENT]
                        inner join dbo.[PROGRAM]
                            on [EVENT].[PROGRAMID] = [PROGRAM].[ID]
                        inner join dbo.[PROGRAMCATEGORYCODE]
                            on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
                        where [EVENT].[ID] = [ITEMS].[EVENTID]
                    ),'')
                end,
                ITEMS.PRICETYPECODEID,
                ITEMS.PRICE,
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
            from @ORDERITEMS ITEMS

            -- Be sure the Event capacity isn't over maximum

            declare @ERROREVENTID uniqueidentifier
            select top(1) @ERROREVENTID = EVENTID from dbo.SALESORDERITEMTICKET SOITOUTER
                inner join dbo.SALESORDERITEM SOIOUTER on 
                    SOITOUTER.ID = SOIOUTER.ID
                where
                    SOIOUTER.SALESORDERID = @RESERVATIONID and
                    dbo.UFN_SALESORDERTICKET_VALIDQUANTITY(
                        SOITOUTER.EVENTID, 
                        @RESERVATIONID,
                        isnull((
                            select sum(SOIINNER.QUANTITY) 
                            from dbo.SALESORDERITEM SOIINNER
                            inner join dbo.SALESORDERITEMTICKET SOITINNER on
                                SOIINNER.ID = SOITINNER.ID
                            where
                                SOIINNER.SALESORDERID = @RESERVATIONID and
                                SOITINNER.EVENTID = SOITOUTER.EVENTID
                            ),0)                                
                    ) = 0

            if @ERROREVENTID is not null
            begin
                declare @ERRORMESSAGE nvarchar(500)
                declare @DIFFERENCE integer = 0;
                declare @QUANTITY integer = 0;

                set @ERRORMESSAGE = dbo.UFN_TRANSLATIONFUNCTION_EVENT_GETNAME(@ERROREVENTID)
                set @DIFFERENCE = 0 - dbo.UFN_EVENT_GETAVAILABILITY(@ERROREVENTID)

                set @ERRORMESSAGE = @ERRORMESSAGE + ' does not have enough capacity for this group. You can either reduce the group size by ' + 
                            convert(nvarchar(10), @DIFFERENCE) + ' or choose a different event.' 

                raiserror(@ERRORMESSAGE, 13, 1)            
            end

            if @ISFLATRATE = 1
            begin
                exec dbo.USP_RESERVATION_DISTRIBUTEAPPLICATIONS @RESERVATIONID, @CHANGEAGENTID, @CURRENTDATE;    
                exec dbo.USP_SALESORDER_CALCULATEFEES @RESERVATIONID, @CHANGEAGENTID;
                exec dbo.USP_RESERVATION_CALCULATEFLATRATEFEES @RESERVATIONID, @CHANGEAGENTID;
                --exec dbo.USP_SALESORDER_APPLYITEMDISCOUNTS @ID, @CHANGEAGENTID;

                --exec dbo.USP_SALESORDER_APPLYORDERDISCOUNTS @ID, @CHANGEAGENTID;

                exec dbo.USP_SALESORDER_CALCULATETAXES @RESERVATIONID, @CHANGEAGENTID;
                exec dbo.USP_RESERVATIONRATESCALE_UPDATETAXES @RESERVATIONID, @CHANGEAGENTID, @CURRENTDATE;
            end
            else
            begin
                exec dbo.USP_SALESORDER_CALCULATEFEES @RESERVATIONID, @CHANGEAGENTID;
                exec dbo.USP_SALESORDER_APPLYITEMDISCOUNTS @RESERVATIONID, @CHANGEAGENTID;
                exec dbo.USP_SALESORDER_APPLYORDERDISCOUNTS @RESERVATIONID, @CHANGEAGENTID;
                exec dbo.USP_SALESORDER_CALCULATETAXES @RESERVATIONID, @CHANGEAGENTID;
            end
        end