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

            insert into @ORDERITEMS
            (
                ID,
                ITINERARYSTAFFRESOURCEID,
                DESCRIPTION,
                QUANTITY,
                PRICE,
                PRICINGSTRUCTURECODE
            )
            select
                SALESORDERITEM.ID as ID,
                ITINERARYSTAFFRESOURCE.ID as ITINERARYSTAFFRESOURCEID,
                VOLUNTEERTYPE.NAME as DESCRIPTION,
                case ITINERARYSTAFFRESOURCE.PRICINGSTRUCTURECODE
                    when 2 then
                        (
                            coalesce
                            (
                                datediff
                                (
                                    s, 
                                    dbo.UFN_ITINERARY_STARTDATETIME(ITINERARYSTAFFRESOURCE.ITINERARYID), 
                                    dbo.UFN_ITINERARY_ENDDATETIME(ITINERARYSTAFFRESOURCE.ITINERARYID)
                                ),0
                            ) / (3600.0)
                        )
                        * ITINERARYSTAFFRESOURCE.QUANTITYNEEDED
                    else ITINERARYSTAFFRESOURCE.QUANTITYNEEDED
                end as QUANTITY,
                case ITINERARYSTAFFRESOURCE.PRICINGSTRUCTURECODE
                    when 0 then 0
                    else ITINERARYSTAFFRESOURCE.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.ITINERARYSTAFFRESOURCE
            inner join dbo.VOLUNTEERTYPE on ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID = VOLUNTEERTYPE.ID
            inner join dbo.ITINERARY on ITINERARY.ID = ITINERARYSTAFFRESOURCE.ITINERARYID
            inner join dbo.RESERVATION on ITINERARY.RESERVATIONID = RESERVATION.ID
            left join dbo.SALESORDERITEMITINERARYSTAFFRESOURCE on 
                ITINERARYSTAFFRESOURCE.ID = SALESORDERITEMITINERARYSTAFFRESOURCE.ITINERARYSTAFFRESOURCEID
            left join dbo.SALESORDERITEM on 
                SALESORDERITEMITINERARYSTAFFRESOURCE.SALESORDERITEMID = SALESORDERITEM.ID
            left join dbo.RESERVATIONRATESCALE on RESERVATION.ID = RESERVATIONRATESCALE.ID
            left join dbo.RESERVATIONRATESCALESTAFFRESOURCE on 
                RESERVATIONRATESCALE.ID = RESERVATIONRATESCALESTAFFRESOURCE.RESERVATIONRATESCALEID and 
                ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID = RESERVATIONRATESCALESTAFFRESOURCE.VOLUNTEERTYPEID
            where 
                RESERVATION.ID = @SALESORDERID and
                (
                    @ITINERARYID is null or 
                    ITINERARYSTAFFRESOURCE.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,
                10, --Itinerary Staffing Resource 

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

            insert into dbo.SALESORDERITEMITINERARYSTAFFRESOURCE
            (
                SALESORDERITEMID,
                ITINERARYSTAFFRESOURCEID,
                VOLUNTEERTYPENAME,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select 
                ORDERITEMS.ID,
                ORDERITEMS.ITINERARYSTAFFRESOURCEID,
                ORDERITEMS.DESCRIPTION,
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
            from @ORDERITEMS ORDERITEMS
        end