USP_ITINERARYITEM_STAFFRESOURCES_SALESORDERSYNC

Updates the sales order to reflect changes

Parameters

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

Definition

Copy


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

            if @SALESORDERID is null
                select @SALESORDERID = ITINERARY.RESERVATIONID
                from dbo.ITINERARY
                inner join dbo.ITINERARYITEM on ITINERARY.ID = ITINERARYITEM.ITINERARYID
                where ITINERARYITEM.ID = @ITINERARYITEMID

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

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

            declare @STARTDATETIME as datetime;
            declare @ENDDATETIME as datetime;

            select
                @STARTDATETIME = STARTDATETIME,
                @ENDDATETIME = ENDDATETIME
            from dbo.ITINERARYITEM
            where ID = @ITINERARYITEMID

            declare @DURATION as decimal(20,4)
            if @ENDDATETIME is null or @STARTDATETIME is null
                set @DURATION = 0
            else
                set @DURATION = datediff(s, @STARTDATETIME, @ENDDATETIME) / (3600.0)

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

            insert into @ORDERITEMS
            (
                ID,
                ITINERARYITEMSTAFFRESOURCEID,
                DESCRIPTION,
                QUANTITY,
                PRICE,
                PRICINGSTRUCTURECODE
            )
            select
                SALESORDERITEM.ID as ID,
                ITINERARYITEMSTAFFRESOURCE.ID as ITINERARYITEMSTAFFRESOURCEID,
                ITINERARYITEM.NAME + ' - ' + VOLUNTEERTYPE.NAME as DESCRIPTION,
                case ITINERARYITEMSTAFFRESOURCE.PRICINGSTRUCTURECODE
                    when 2 then
                        @DURATION * ITINERARYITEMSTAFFRESOURCE.QUANTITYNEEDED
                    else
                        ITINERARYITEMSTAFFRESOURCE.QUANTITYNEEDED
                end as QUANTITY,
                case ITINERARYITEMSTAFFRESOURCE.PRICINGSTRUCTURECODE
                    when 0 then 0
                    else ITINERARYITEMSTAFFRESOURCE.PRICE
                end as PRICE,
                case RESERVATION.PRICINGCODE
                    when 1 then
                        case COALESCE(RESERVATIONRATESCALE.INCLUDEALLSTAFFRESOURCES, 0)
                            when 1 then 1
                            else
                                case when RESERVATIONRATESCALESTAFFRESOURCE.ID is null
                                    then 0
                                    else 1
                                end
                        end
                    else
                        case coalesce(SALESORDERITEM.PRICINGSTRUCTURECODE, 0)
                            when 2 then 2
                            else 0
                        end
                end as PRICINGSTRUCTURECODE
            from dbo.ITINERARYITEMSTAFFRESOURCE
            inner join dbo.VOLUNTEERTYPE on 
                ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID = VOLUNTEERTYPE.ID
            inner join dbo.ITINERARYITEM on 
                ITINERARYITEMSTAFFRESOURCE.ITINERARYITEMID = ITINERARYITEM.ID
            inner join dbo.ITINERARY on 
                ITINERARYITEM.ITINERARYID = ITINERARY.ID
            inner join dbo.RESERVATION on 
                ITINERARY.RESERVATIONID = RESERVATION.ID
            left join dbo.SALESORDERITEMITINERARYITEMSTAFFRESOURCE on 
                ITINERARYITEMSTAFFRESOURCE.ID = SALESORDERITEMITINERARYITEMSTAFFRESOURCE.ITINERARYITEMSTAFFRESOURCEID
            left join dbo.SALESORDERITEM on 
                SALESORDERITEMITINERARYITEMSTAFFRESOURCE.SALESORDERITEMID = SALESORDERITEM.ID
            left join dbo.RESERVATIONRATESCALE on RESERVATION.ID = RESERVATIONRATESCALE.ID
            left join dbo.RESERVATIONRATESCALESTAFFRESOURCE on RESERVATIONRATESCALE.ID = RESERVATIONRATESCALESTAFFRESOURCE.RESERVATIONRATESCALEID and ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID = RESERVATIONRATESCALESTAFFRESOURCE.VOLUNTEERTYPEID
            where 
                ITINERARYITEMSTAFFRESOURCE.ITINERARYITEMID = @ITINERARYITEMID 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,
                11, --Itinerary Item Staffing Resource 

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

            insert into dbo.SALESORDERITEMITINERARYITEMSTAFFRESOURCE
            (
                SALESORDERITEMID,
                ITINERARYITEMSTAFFRESOURCEID,
                VOLUNTEERTYPENAME,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select 
                ORDERITEMS.ID,
                ORDERITEMS.ITINERARYITEMSTAFFRESOURCEID,
                coalesce((
                    select [VOLUNTEERTYPE].[NAME]
                    from dbo.[ITINERARYITEMSTAFFRESOURCE] 
                    inner join dbo.[VOLUNTEERTYPE]
                        on [ITINERARYITEMSTAFFRESOURCE].[VOLUNTEERTYPEID] = [VOLUNTEERTYPE].[ID]
                    where [ITINERARYITEMSTAFFRESOURCE].[ID] = [ORDERITEMS].[ITINERARYITEMSTAFFRESOURCEID]
                ),''),
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
            from @ORDERITEMS ORDERITEMS
        end