USP_ITINERARY_RESOURCES_SALESORDERSYNC

Updates the sales order to reflect changes

Parameters

Parameter Parameter Type Mode Description
@ITINERARYID uniqueidentifier IN
@SALESORDERID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


        CREATE procedure dbo.USP_ITINERARY_RESOURCES_SALESORDERSYNC
        (
            @ITINERARYID uniqueidentifier = null,
            @SALESORDERID uniqueidentifier = null,
            @CHANGEAGENTID uniqueidentifier = null
        )
        as
        begin
            set nocount on;

            -- If we aren't given anything to sync, just abort.

            if @ITINERARYID is null and @SALESORDERID is null
                return 0;

            if @SALESORDERID is null
                select @SALESORDERID = RESERVATIONID from dbo.ITINERARY where ID = @ITINERARYID;

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

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

            -- We only need to worry about updates and deletes here as the database integrity requires that there

            -- already are no sales order items which are no longer needed.


            declare @ORDERITEMS table
            (
                ID uniqueidentifier,
                ITINERARYRESOURCEID uniqueidentifier,
                DESCRIPTION nvarchar(255),
                QUANTITY decimal(20,4),
                PRICE money,
                PRICINGSTRUCTURECODE tinyint
            );    

            insert into @ORDERITEMS
            (
                ID,
                ITINERARYRESOURCEID,
                DESCRIPTION,
                QUANTITY,
                PRICE,
                PRICINGSTRUCTURECODE
            )
            select
                SALESORDERITEM.ID as ID,
                ITINERARYRESOURCE.ID as ITINERARYRESOURCEID,
                RESOURCE.NAME as DESCRIPTION,
                case RESOURCE.ISPERTICKETITEM
                    -- Not a per ticket quantity item

                    when 0 then 
                        case ITINERARYRESOURCE.PRICINGSTRUCTURECODE
                            -- Hourly rate per resources

                            when 2 then
                                (
                                    coalesce
                                    (
                                        datediff
                                        (
                                            s, 
                                            dbo.UFN_ITINERARY_STARTDATETIME(ITINERARYRESOURCE.ITINERARYID), 
                                            dbo.UFN_ITINERARY_ENDDATETIME(ITINERARYRESOURCE.ITINERARYID)
                                        ),0
                                    ) / (3600.0)
                                )
                                * ITINERARYRESOURCE.QUANTITYNEEDED
                            else ITINERARYRESOURCE.QUANTITYNEEDED
                        end
                    -- Per ticket quantity item

                    else
                        dbo.UFN_RESOURCE_CALCULATEPERTICKETQUANTITY_2
                        (
                            (
                                coalesce
                                (
                                    (
                                        select sum(ITINERARYATTENDEE.QUANTITY) from dbo.ITINERARYATTENDEE 
                                        where ITINERARYATTENDEE.ITINERARYID = ITINERARYRESOURCE.ITINERARYID
                                    ),0
                                ) * ITINERARYRESOURCE.PERTICKETQUANTITY
                            ), 
                            ITINERARYRESOURCE.PERTICKETDIVISOR
                        ) *
                        case ITINERARYRESOURCE.PRICINGSTRUCTURECODE
                            -- Hourly rate per resources

                            when 2 then 
                            (
                                coalesce
                                (
                                    datediff
                                    (
                                        s, 
                                        dbo.UFN_ITINERARY_STARTDATETIME(ITINERARYRESOURCE.ITINERARYID), 
                                        dbo.UFN_ITINERARY_ENDDATETIME(ITINERARYRESOURCE.ITINERARYID)
                                    ),0
                                ) / (3600.0)
                            )
                            else 1
                        end
                end as QUANTITY,
                case ITINERARYRESOURCE.PRICINGSTRUCTURECODE
                    when 0 then 0
                    else ITINERARYRESOURCE.PRICE
                end as PRICE,
                case RESERVATION.PRICINGCODE
                    when 1 then
                        case coalesce(SALESORDERITEM.PRICINGSTRUCTURECODE,0)
                            when 2 then 2
                            else 
                                case coalesce(RESERVATIONRATESCALE.INCLUDEALLRESOURCES, 0)
                                    when 1 then 1
                                    else
                                        case 
                                            when RESERVATIONRATESCALERESOURCE.ID is null then 0
                                            else 1
                                        end
                                end
                        end        
                    else
                        case coalesce(SALESORDERITEM.PRICINGSTRUCTURECODE,0)
                            when 2 then 2
                            else 0
                        end
                end as PRICINGSTRUCTURECODE
            from dbo.ITINERARYRESOURCE
            inner join dbo.RESOURCE on ITINERARYRESOURCE.RESOURCEID = RESOURCE.ID
            inner join dbo.ITINERARY on ITINERARYRESOURCE.ITINERARYID = ITINERARY.ID
            inner join dbo.RESERVATION on ITINERARY.RESERVATIONID = RESERVATION.ID
            left join dbo.SALESORDERITEMITINERARYRESOURCE on 
                ITINERARYRESOURCE.ID = SALESORDERITEMITINERARYRESOURCE.ITINERARYRESOURCEID
            left join dbo.SALESORDERITEM on 
                SALESORDERITEMITINERARYRESOURCE.SALESORDERITEMID = SALESORDERITEM.ID
            left join dbo.RESERVATIONRATESCALE on RESERVATION.ID = RESERVATIONRATESCALE.ID
            left join dbo.RESERVATIONRATESCALERESOURCE on 
                RESERVATIONRATESCALE.ID = RESERVATIONRATESCALERESOURCE.RESERVATIONRATESCALEID and 
                RESOURCE.ID = RESERVATIONRATESCALERESOURCE.RESOURCEID
            where 
                RESERVATION.ID = @SALESORDERID and
                (
                    @ITINERARYID is null or 
                    ITINERARYRESOURCE.ITINERARYID = @ITINERARYID
                )

            update dbo.SALESORDERITEM set 
                SALESORDERITEM.DESCRIPTION = UPDATEVALUES.DESCRIPTION,
                SALESORDERITEM.QUANTITY = UPDATEVALUES.QUANTITY,
                SALESORDERITEM.PRICE = UPDATEVALUES.PRICE,
                SALESORDERITEM.PRICINGSTRUCTURECODE = UPDATEVALUES.PRICINGSTRUCTURECODE,
                SALESORDERITEM.CHANGEDBYID = @CHANGEAGENTID,
                SALESORDERITEM.DATECHANGED = @CURRENTDATE
            from @ORDERITEMS as UPDATEVALUES
            where
                SALESORDERITEM.ID = UPDATEVALUES.ID and
                (
                    SALESORDERITEM.DESCRIPTION <> UPDATEVALUES.DESCRIPTION or
                    SALESORDERITEM.QUANTITY <> UPDATEVALUES.QUANTITY or
                    SALESORDERITEM.PRICE <> UPDATEVALUES.PRICE or
                    SALESORDERITEM.PRICINGSTRUCTURECODE <> UPDATEVALUES.PRICINGSTRUCTURECODE
                )

            delete from @ORDERITEMS
            where ID is not null

            update @ORDERITEMS set ID = newid()

            insert into dbo.SALESORDERITEM
            (
                ID,
                SALESORDERID,
                TYPECODE,
                DESCRIPTION,
                QUANTITY,
                PRICE,
                PRICINGSTRUCTURECODE,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select 
                ORDERITEMS.ID,
                @SALESORDERID,
                8, --Itinerary Supply/Equipment Resource 

                ORDERITEMS.DESCRIPTION, 
                ORDERITEMS.QUANTITY, 
                ORDERITEMS.PRICE,
                ORDERITEMS.PRICINGSTRUCTURECODE,
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
            from @ORDERITEMS ORDERITEMS

            insert into dbo.SALESORDERITEMITINERARYRESOURCE
            (
                SALESORDERITEMID,
                ITINERARYRESOURCEID,
                RESOURCENAME,
                RESOURCECATEGORYNAME,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select 
                ORDERITEMS.ID,
                ORDERITEMS.ITINERARYRESOURCEID,
                coalesce((
                    select [RESOURCE].[NAME]
                    from dbo.[ITINERARYRESOURCE]
                    inner join dbo.[RESOURCE]
                        on [ITINERARYRESOURCE].[RESOURCEID] = [RESOURCE].[ID]
                    where [ITINERARYRESOURCE].[ID] = [ORDERITEMS].[ITINERARYRESOURCEID]
                ),''),
                coalesce((
                    select [RESOURCECATEGORYCODE].[DESCRIPTION]
                    from dbo.[ITINERARYRESOURCE]
                    inner join dbo.[RESOURCE]
                        on [ITINERARYRESOURCE].[RESOURCEID] = [RESOURCE].[ID]
                    inner join dbo.[RESOURCECATEGORYCODE]
                        on [RESOURCE].[RESOURCECATEGORYCODEID] = [RESOURCECATEGORYCODE].[ID]
                    where [ITINERARYRESOURCE].[ID] = [ORDERITEMS].[ITINERARYRESOURCEID]
                ),''),
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
            from @ORDERITEMS ORDERITEMS
        end