USP_RESERVATION_DISTRIBUTEAPPLICATIONS

Distributes dollar amounts to sales order items for all of the program applications on a Reservation.

Parameters

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

Definition

Copy


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

            set nocount on;

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

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

            exec dbo.USP_RESERVATIONRATESCALE_UPDATEAUTOMATICPROGRAMAPPLICATIONS @ID, @CHANGEAGENTID, @CURRENTDATE;
            exec dbo.USP_RESERVATIONRATESCALE_UPDATEAUTOMATICRESOURCEAPPLICATIONS @ID, @CHANGEAGENTID, @CURRENTDATE;
            exec dbo.USP_RESERVATIONRATESCALE_UPDATEAUTOMATICSTAFFRESOURCEAPPLICATIONS @ID, @CHANGEAGENTID, @CURRENTDATE;

            declare @PROGRAMS table
            (
                PROGRAMID uniqueidentifier,
                PROGRAMCOUNT smallint,
                AMOUNT money,
                NEEDSOFFSET bit
            )

            declare @EVENTS table
            (
                PROGRAMID uniqueidentifier,
                EVENTCOUNT smallint,
                AMOUNT money
            )

            declare @RESOURCES table
            (
                RESOURCEID uniqueidentifier,
                RESOURCECOUNT smallint,
                AMOUNT money,
                NEEDSOFFSET bit
            )

            declare @STAFFRESOURCES table
            (
                VOLUNTEERTYPEID uniqueidentifier,
                VOLUNTEERTYPECOUNT smallint,
                AMOUNT money,
                NEEDSOFFSET bit
            )

            insert into @PROGRAMS (PROGRAMID, PROGRAMCOUNT)
            select
                PROGRAMID,
                count(PROGRAMID)
            from dbo.SALESORDERITEM
            inner join dbo.SALESORDERITEMTICKET on
                SALESORDERITEMTICKET.ID = SALESORDERITEM.ID
            where
                SALESORDERID = @ID and
                PROGRAMID is not null and
                EVENTID is null
            group by PROGRAMID

            insert into @EVENTS (PROGRAMID, EVENTCOUNT)
            select
                EVENT.PROGRAMID,
                count(EVENT.PROGRAMID)
            from dbo.SALESORDERITEM
            inner join dbo.SALESORDERITEMTICKET on
                SALESORDERITEMTICKET.ID = SALESORDERITEM.ID
            inner join dbo.EVENT on 
                SALESORDERITEMTICKET.EVENTID = EVENT.ID
            where
                SALESORDERID = @ID and
                SALESORDERITEMTICKET.EVENTID is not null
            group by EVENT.PROGRAMID

            update @PROGRAMS set
                PROGRAMCOUNT = PROGRAMCOUNT + EVENTCOUNT
            from @EVENTS 
            where [@EVENTS].PROGRAMID = [@PROGRAMS].PROGRAMID

            insert into @PROGRAMS (PROGRAMID, PROGRAMCOUNT)
            select
                PROGRAMID,
                EVENTCOUNT
            from @EVENTS 
            where PROGRAMID not in (select PROGRAMID from @PROGRAMS)

            update @PROGRAMS set
                AMOUNT = round(RRSA.[AMOUNT] / [@PROGRAMS].PROGRAMCOUNT , 2),
                NEEDSOFFSET = case
                                when round(RRSA.[AMOUNT] / [@PROGRAMS].PROGRAMCOUNT, 2) * [@PROGRAMS].PROGRAMCOUNT <> RRSA.[AMOUNT]
                                    then 1
                                else 0 end
            from dbo.RESERVATIONRATESCALEAPPLICATION RRSA
            inner join dbo.RESERVATIONRATESCALE RRS on
                RRSA.RESERVATIONRATESCALEID = RRS.ID
            where
                RRS.ID = @ID and
                [@PROGRAMS].PROGRAMID = RRSA.PROGRAMID

            update dbo.SALESORDERITEM set
                FLATRATEPRICE = isnull([@PROGRAMS].AMOUNT,0.0),
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from dbo.SALESORDERITEMTICKET
            inner join @PROGRAMS on
                SALESORDERITEMTICKET.PROGRAMID = [@PROGRAMS].PROGRAMID or
                exists (
                    select 1 from dbo.EVENT 
                    where 
                        EVENT.ID = SALESORDERITEMTICKET.EVENTID and 
                        EVENT.PROGRAMID = [@PROGRAMS].PROGRAMID
                )
            where
                SALESORDERID = @ID and
                SALESORDERITEMTICKET.ID = SALESORDERITEM.ID and
                PRICINGSTRUCTURECODE = 1 and
                FLATRATEPRICE <> isnull([@PROGRAMS].AMOUNT,0.0)

            if exists (select 1 from @PROGRAMS where NEEDSOFFSET = 1)
            begin
                declare @PROGRAMOFFSETITEMS table
                (
                    ID uniqueidentifier,
                    PROGRAMID uniqueidentifier,
                    OFFSET money
                )

                insert into @PROGRAMOFFSETITEMS (PROGRAMID, OFFSET)
                select
                    RRSA.PROGRAMID,
                    RRSA.[AMOUNT] - ( round(RRSA.[AMOUNT] / [@PROGRAMS].PROGRAMCOUNT , 2) * [@PROGRAMS].PROGRAMCOUNT )
                from @PROGRAMS
                inner join dbo.RESERVATIONRATESCALEAPPLICATION RRSA on
                    RRSA.PROGRAMID = [@PROGRAMS].PROGRAMID
                inner join dbo.RESERVATIONRATESCALE RRS on
                    RRSA.RESERVATIONRATESCALEID = RRS.ID
                where
                    RRS.ID = @ID and
                    NEEDSOFFSET = 1

                -- Grab the any sales order item that contains the program to be the offset    

                update @PROGRAMOFFSETITEMS set
                    ID = (
                            select top(1) SALESORDERITEM.ID
                            from dbo.SALESORDERITEM
                            inner join dbo.SALESORDERITEMTICKET on
                                SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
                            where
                                SALESORDERID = @ID and
                                (
                                    SALESORDERITEMTICKET.PROGRAMID = [@PROGRAMOFFSETITEMS].PROGRAMID or
                                    [@PROGRAMOFFSETITEMS].PROGRAMID = (select PROGRAMID from dbo.EVENT where EVENT.ID = SALESORDERITEMTICKET.EVENTID)
                                )
                        )

                update dbo.SALESORDERITEM set
                    FLATRATEPRICE = FLATRATEPRICE + isnull(OFFSET,0.0),
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE
                from @PROGRAMOFFSETITEMS
                where 
                    SALESORDERITEM.ID = [@PROGRAMOFFSETITEMS].ID

            end



            insert into @RESOURCES (RESOURCEID, RESOURCECOUNT)
            select
                RESOURCEID,
                count(RESOURCEID)
            from (
                select RESOURCEID
                from dbo.SALESORDERITEM
                    inner join dbo.SALESORDERITEMITINERARYRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYRESOURCE.SALESORDERITEMID
                    inner join dbo.ITINERARYRESOURCE on SALESORDERITEMITINERARYRESOURCE.ITINERARYRESOURCEID = ITINERARYRESOURCE.ID
                where SALESORDERITEM.SALESORDERID = @ID

                union all

                select RESOURCEID
                from dbo.SALESORDERITEM
                    inner join dbo.SALESORDERITEMITINERARYITEMRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYITEMRESOURCE.SALESORDERITEMID
                    inner join dbo.ITINERARYITEMRESOURCE on SALESORDERITEMITINERARYITEMRESOURCE.ITINERARYITEMRESOURCEID = ITINERARYITEMRESOURCE.ID
                where SALESORDERITEM.SALESORDERID = @ID
            ) T
            group by RESOURCEID

            insert into @STAFFRESOURCES (VOLUNTEERTYPEID, VOLUNTEERTYPECOUNT)
            select
                VOLUNTEERTYPEID,
                count(VOLUNTEERTYPEID)
            from (
                select VOLUNTEERTYPEID
                from dbo.SALESORDERITEM
                    inner join dbo.SALESORDERITEMITINERARYSTAFFRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYSTAFFRESOURCE.SALESORDERITEMID
                    inner join dbo.ITINERARYSTAFFRESOURCE on SALESORDERITEMITINERARYSTAFFRESOURCE.ITINERARYSTAFFRESOURCEID = ITINERARYSTAFFRESOURCE.ID
                where SALESORDERITEM.SALESORDERID = @ID

                union all

                select VOLUNTEERTYPEID
                from dbo.SALESORDERITEM
                    inner join dbo.SALESORDERITEMITINERARYITEMSTAFFRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYITEMSTAFFRESOURCE.SALESORDERITEMID
                    inner join dbo.ITINERARYITEMSTAFFRESOURCE on SALESORDERITEMITINERARYITEMSTAFFRESOURCE.ITINERARYITEMSTAFFRESOURCEID = ITINERARYITEMSTAFFRESOURCE.ID
                where SALESORDERITEM.SALESORDERID = @ID
            ) T
            group by VOLUNTEERTYPEID

            update @RESOURCES set
                AMOUNT = round(RRSA.[AMOUNT] / [@RESOURCES].RESOURCECOUNT , 2),
                NEEDSOFFSET = case
                                when round(RRSA.[AMOUNT] / [@RESOURCES].RESOURCECOUNT, 2) * [@RESOURCES].RESOURCECOUNT <> RRSA.[AMOUNT]
                                    then 1
                                else 0 end
            from dbo.RESERVATIONRATESCALEAPPLICATION RRSA
            inner join dbo.RESERVATIONRATESCALE RRS on
                RRSA.RESERVATIONRATESCALEID = RRS.ID
            where
                RRS.ID = @ID and
                [@RESOURCES].RESOURCEID = RRSA.RESOURCEID

            update @STAFFRESOURCES set
                AMOUNT = round(RRSA.[AMOUNT] / [@STAFFRESOURCES].VOLUNTEERTYPECOUNT , 2),
                NEEDSOFFSET = case
                                when round(RRSA.[AMOUNT] / [@STAFFRESOURCES].VOLUNTEERTYPECOUNT, 2) * [@STAFFRESOURCES].VOLUNTEERTYPECOUNT <> RRSA.[AMOUNT]
                                    then 1
                                else 0 end
            from dbo.RESERVATIONRATESCALEAPPLICATION RRSA
            inner join dbo.RESERVATIONRATESCALE RRS on
                RRSA.RESERVATIONRATESCALEID = RRS.ID
            where
                RRS.ID = @ID and
                [@STAFFRESOURCES].VOLUNTEERTYPEID = RRSA.VOLUNTEERTYPEID



            update dbo.SALESORDERITEM set
                FLATRATEPRICE = coalesce([@RESOURCES].AMOUNT,0.0),
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from dbo.SALESORDERITEM
                inner join dbo.SALESORDERITEMITINERARYRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYRESOURCE.SALESORDERITEMID
                inner join dbo.ITINERARYRESOURCE on SALESORDERITEMITINERARYRESOURCE.ITINERARYRESOURCEID = ITINERARYRESOURCE.ID
                inner join @RESOURCES on ITINERARYRESOURCE.RESOURCEID = [@RESOURCES].RESOURCEID
            where
                SALESORDERITEM.SALESORDERID = @ID and
                SALESORDERITEM.PRICINGSTRUCTURECODE = 1 and
                FLATRATEPRICE <> coalesce([@RESOURCES].AMOUNT,0.0)

            update dbo.SALESORDERITEM set
                FLATRATEPRICE = coalesce([@RESOURCES].AMOUNT,0.0),
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from dbo.SALESORDERITEM
                inner join dbo.SALESORDERITEMITINERARYITEMRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYITEMRESOURCE.SALESORDERITEMID
                inner join dbo.ITINERARYITEMRESOURCE on SALESORDERITEMITINERARYITEMRESOURCE.ITINERARYITEMRESOURCEID = ITINERARYITEMRESOURCE.ID
                inner join @RESOURCES on ITINERARYITEMRESOURCE.RESOURCEID = [@RESOURCES].RESOURCEID
            where
                SALESORDERITEM.SALESORDERID = @ID and
                SALESORDERITEM.PRICINGSTRUCTURECODE = 1 and
                FLATRATEPRICE <> coalesce([@RESOURCES].AMOUNT,0.0)


            update dbo.SALESORDERITEM set
                FLATRATEPRICE = coalesce([@STAFFRESOURCES].AMOUNT,0.0),
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from dbo.SALESORDERITEM
                inner join dbo.SALESORDERITEMITINERARYSTAFFRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYSTAFFRESOURCE.SALESORDERITEMID
                inner join dbo.ITINERARYSTAFFRESOURCE on SALESORDERITEMITINERARYSTAFFRESOURCE.ITINERARYSTAFFRESOURCEID = ITINERARYSTAFFRESOURCE.ID
                inner join @STAFFRESOURCES on ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID = [@STAFFRESOURCES].VOLUNTEERTYPEID
            where
                SALESORDERITEM.SALESORDERID = @ID and
                SALESORDERITEM.PRICINGSTRUCTURECODE = 1 and
                FLATRATEPRICE <> coalesce([@STAFFRESOURCES].AMOUNT,0.0)

            update dbo.SALESORDERITEM set
                FLATRATEPRICE = coalesce([@STAFFRESOURCES].AMOUNT,0.0),
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from dbo.SALESORDERITEM
                inner join dbo.SALESORDERITEMITINERARYITEMSTAFFRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYITEMSTAFFRESOURCE.SALESORDERITEMID
                inner join dbo.ITINERARYITEMSTAFFRESOURCE on SALESORDERITEMITINERARYITEMSTAFFRESOURCE.ITINERARYITEMSTAFFRESOURCEID = ITINERARYITEMSTAFFRESOURCE.ID
                inner join @STAFFRESOURCES on ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID = [@STAFFRESOURCES].VOLUNTEERTYPEID
            where
                SALESORDERITEM.SALESORDERID = @ID and
                SALESORDERITEM.PRICINGSTRUCTURECODE = 1 and
                FLATRATEPRICE <> coalesce([@STAFFRESOURCES].AMOUNT,0.0)


            if exists (select 1 from @RESOURCES where NEEDSOFFSET = 1)
            begin
                declare @RESOURCEOFFSETITEMS table
                (
                    ID uniqueidentifier,
                    RESOURCEID uniqueidentifier,
                    OFFSET money
                )

                insert into @RESOURCEOFFSETITEMS (RESOURCEID, OFFSET)
                select
                    RRSA.RESOURCEID,
                    RRSA.[AMOUNT] - ( round(RRSA.[AMOUNT] / [@RESOURCES].RESOURCECOUNT , 2) * [@RESOURCES].RESOURCECOUNT )
                from @RESOURCES
                    inner join dbo.RESERVATIONRATESCALEAPPLICATION RRSA on
                        RRSA.RESOURCEID = [@RESOURCES].RESOURCEID
                    inner join dbo.RESERVATIONRATESCALE RRS on
                        RRSA.RESERVATIONRATESCALEID = RRS.ID
                where
                    RRS.ID = @ID and
                    NEEDSOFFSET = 1

                -- Grab the any sales order item that contains the resource to be the offset    

                update @RESOURCEOFFSETITEMS set
                    ID = (
                        select top(1) SALESORDERITEMID
                        from (
                            select SALESORDERITEM.ID as SALESORDERITEMID
                            from dbo.SALESORDERITEM
                                inner join dbo.SALESORDERITEMITINERARYRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYRESOURCE.SALESORDERITEMID
                                inner join dbo.ITINERARYRESOURCE on SALESORDERITEMITINERARYRESOURCE.ITINERARYRESOURCEID = ITINERARYRESOURCE.ID
                            where SALESORDERITEM.SALESORDERID = @ID
                                and ITINERARYRESOURCE.RESOURCEID = [@RESOURCEOFFSETITEMS].RESOURCEID

                            union all

                            select SALESORDERITEM.ID as SALESORDERITEMID
                            from dbo.SALESORDERITEM
                                inner join dbo.SALESORDERITEMITINERARYITEMRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYITEMRESOURCE.SALESORDERITEMID
                                inner join dbo.ITINERARYITEMRESOURCE on SALESORDERITEMITINERARYITEMRESOURCE.ITINERARYITEMRESOURCEID = ITINERARYITEMRESOURCE.ID
                            where SALESORDERITEM.SALESORDERID = @ID
                                and ITINERARYITEMRESOURCE.RESOURCEID = [@RESOURCEOFFSETITEMS].RESOURCEID
                        ) T
                    )

                update dbo.SALESORDERITEM set
                    FLATRATEPRICE = FLATRATEPRICE + isnull(OFFSET,0.0),
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE
                from @RESOURCEOFFSETITEMS
                where 
                    SALESORDERITEM.ID = [@RESOURCEOFFSETITEMS].ID
            end

            if exists (select 1 from @STAFFRESOURCES where NEEDSOFFSET = 1)
            begin
                declare @STAFFRESOURCEOFFSETITEMS table
                (
                    ID uniqueidentifier,
                    VOLUNTEERTYPEID uniqueidentifier,
                    OFFSET money
                )

                insert into @STAFFRESOURCEOFFSETITEMS (VOLUNTEERTYPEID, OFFSET)
                select
                    RRSA.VOLUNTEERTYPEID,
                    RRSA.[AMOUNT] - ( round(RRSA.[AMOUNT] / [@STAFFRESOURCES].VOLUNTEERTYPECOUNT , 2) * [@STAFFRESOURCES].VOLUNTEERTYPECOUNT )
                from @STAFFRESOURCES
                    inner join dbo.RESERVATIONRATESCALEAPPLICATION RRSA on
                        RRSA.VOLUNTEERTYPEID = [@STAFFRESOURCES].VOLUNTEERTYPEID
                inner join dbo.RESERVATIONRATESCALE RRS on
                    RRSA.RESERVATIONRATESCALEID = RRS.ID
                where
                    RRS.ID = @ID and
                    NEEDSOFFSET = 1

                -- Grab the any sales order item that contains the resource to be the offset    

                update @STAFFRESOURCEOFFSETITEMS set
                    ID = (
                        select top(1) SALESORDERITEMID
                        from (
                            select SALESORDERITEM.ID as SALESORDERITEMID
                            from dbo.SALESORDERITEM
                                inner join dbo.SALESORDERITEMITINERARYSTAFFRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYSTAFFRESOURCE.SALESORDERITEMID
                                inner join dbo.ITINERARYSTAFFRESOURCE on SALESORDERITEMITINERARYSTAFFRESOURCE.ITINERARYSTAFFRESOURCEID = ITINERARYSTAFFRESOURCE.ID
                            where SALESORDERITEM.SALESORDERID = @ID
                                and ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID = [@STAFFRESOURCEOFFSETITEMS].VOLUNTEERTYPEID

                            union all

                            select SALESORDERITEM.ID as SALESORDERITEMID
                            from dbo.SALESORDERITEM
                                inner join dbo.SALESORDERITEMITINERARYITEMSTAFFRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYITEMSTAFFRESOURCE.SALESORDERITEMID
                                inner join dbo.ITINERARYITEMSTAFFRESOURCE on SALESORDERITEMITINERARYITEMSTAFFRESOURCE.ITINERARYITEMSTAFFRESOURCEID = ITINERARYITEMSTAFFRESOURCE.ID
                            where SALESORDERITEM.SALESORDERID = @ID
                                and ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID = [@STAFFRESOURCEOFFSETITEMS].VOLUNTEERTYPEID
                        ) T
                    )

                update dbo.SALESORDERITEM set
                    FLATRATEPRICE = FLATRATEPRICE + isnull(OFFSET,0.0),
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE
                from @STAFFRESOURCEOFFSETITEMS
                where 
                    SALESORDERITEM.ID = [@STAFFRESOURCEOFFSETITEMS].ID
            end
        end