USP_ITINERARYITEMS_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_ITINERARYITEMS_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,
                ITINERARYITEMRESOURCEID uniqueidentifier,
                DESCRIPTION nvarchar(255),
                QUANTITY decimal(20,4),
                PRICE money,
                PRICINGSTRUCTURECODE tinyint
            );

            insert into @ORDERITEMS
            (
                ID,
                ITINERARYITEMRESOURCEID,
                DESCRIPTION,
                QUANTITY,
                PRICE,
                PRICINGSTRUCTURECODE
            )
            select
                SALESORDERITEM.ID as ID,
                ITINERARYITEMRESOURCE.ID as ITINERARYITEMRESOURCEID,
                ITINERARYITEM.NAME + ' - ' + RESOURCE.NAME as DESCRIPTION,
                case RESOURCE.ISPERTICKETITEM
                    when 0 then 
                        case ITINERARYITEMRESOURCE.PRICINGSTRUCTURECODE
                            when 2 then
                                (
                                    coalesce
                                    (
                                        datediff
                                        (
                                            s, 
                                            ITINERARYITEM.STARTDATETIME,
                                            ITINERARYITEM.ENDDATETIME
                                        ),0
                                    ) / (3600.0)
                                )
                                * ITINERARYITEMRESOURCE.QUANTITYNEEDED
                            else ITINERARYITEMRESOURCE.QUANTITYNEEDED
                        end
                    else
                        dbo.UFN_RESOURCE_CALCULATEPERTICKETQUANTITY_2
                        (
                            ( 
                                coalesce
                                (
                                    (
                                        select sum(ITINERARYATTENDEE.QUANTITY) from dbo.ITINERARYATTENDEE 
                                        where ITINERARYATTENDEE.ITINERARYID = ITINERARY.ID
                                    ),0
                                ) * ITINERARYITEMRESOURCE.PERTICKETQUANTITY
                            ), 
                            ITINERARYITEMRESOURCE.PERTICKETDIVISOR
                        ) *
                        case ITINERARYITEMRESOURCE.PRICINGSTRUCTURECODE
                            -- Hourly rate per resources

                            when 2 then 
                            (
                                coalesce
                                (
                                    datediff
                                    (
                                        s, 
                                        ITINERARYITEM.STARTDATETIME,
                                        ITINERARYITEM.ENDDATETIME
                                    ),0
                                ) / (3600.0)
                            )
                            else 1
                        end
                end as QUANTITY,
                case ITINERARYITEMRESOURCE.PRICINGSTRUCTURECODE
                    when 0 then 0
                    else ITINERARYITEMRESOURCE.PRICE
                end as PRICE,
                case RESERVATION.PRICINGCODE
                    when 1 then
                        case COALESCE(RESERVATIONRATESCALE.INCLUDEALLRESOURCES, 0)
                            when 1 then 1
                            else
                                case when RESERVATIONRATESCALERESOURCE.ID is null
                                    then 0
                                    else 1
                                end
                        end
                    else
                        case SALESORDERITEM.PRICINGSTRUCTURECODE
                            when 2 then 2
                            else 0
                        end
                end as PRICINGSTRUCTURECODE
            from dbo.ITINERARYITEMRESOURCE
            inner join dbo.RESOURCE on ITINERARYITEMRESOURCE.RESOURCEID = RESOURCE.ID
            inner join dbo.ITINERARYITEM on ITINERARYITEMRESOURCE.ITINERARYITEMID = ITINERARYITEM.ID
            inner join dbo.ITINERARY on ITINERARYITEM.ITINERARYID = ITINERARY.ID
            inner join dbo.RESERVATION on ITINERARY.RESERVATIONID = RESERVATION.ID
            left join dbo.SALESORDERITEMITINERARYITEMRESOURCE on 
                ITINERARYITEMRESOURCE.ID = SALESORDERITEMITINERARYITEMRESOURCE.ITINERARYITEMRESOURCEID
            left join dbo.SALESORDERITEM on 
                SALESORDERITEMITINERARYITEMRESOURCE.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 
                    ITINERARYITEM.ITINERARYID = @ITINERARYID
                ) and
                ITINERARYITEM.INVALIDREASONCODE = 0

            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,
                9, --Itinerary Item Supply/Equipment Resource 

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

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