USP_RESERVATIONRATESCALE_RECREATEAPPLICATIONS

Keep existing applications on a reservation and recreate dollar amounts based on percentage of total.

Parameters

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

Definition

Copy


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

            set nocount on;

            if exists(select top(1) 1 from dbo.RESERVATIONRATESCALE where ID = @ID)
            begin

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

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

                declare @ITINERARYATTENDEECOUNT smallint
                select 
                    @ITINERARYATTENDEECOUNT = isnull(sum(QUANTITY),0
                from dbo.ITINERARYATTENDEE
                inner join dbo.ITINERARY on
                    ITINERARY.ID = ITINERARYATTENDEE.ITINERARYID
                inner join dbo.RESERVATION on
                    RESERVATION.ID = ITINERARY.RESERVATIONID
                where
                    RESERVATION.ID = @ID

                declare @TOTALAMOUNT money
                select
                    @TOTALAMOUNT = RESERVATIONRATESCALEPRICE.AMOUNT
                from dbo.RESERVATIONRATESCALEPRICE
                inner join dbo.RESERVATIONRATESCALE on
                    RESERVATIONRATESCALE.ID = RESERVATIONRATESCALEPRICE.RESERVATIONRATESCALEID
                where
                    RESERVATIONRATESCALE.ID = @ID and
                    @ITINERARYATTENDEECOUNT >= GROUPMINIMUM and
                    (
                        @ITINERARYATTENDEECOUNT <= GROUPMAXIMUM or
                        GROUPMAXIMUM = -1
                    )

                if @OLDTOTALAMOUNT is null
                begin
                    select 
                        @OLDTOTALAMOUNT = AMOUNT 
                    from dbo.RESERVATIONRATESCALEPRICE RRSP
                    inner join dbo.RESERVATIONRATESCALE on
                        RESERVATIONRATESCALE.ID = RRSP.RESERVATIONRATESCALEID
                    where
                        INUSE = 1 and
                        RESERVATIONRATESCALE.ID = @ID
                end

                declare @RESERVATIONAPPLICATIONS table
                (
                    ID uniqueidentifier,
                    AMOUNT money
                )
                insert into @RESERVATIONAPPLICATIONS
                select
                    ID,
                    AMOUNT
                from dbo.RESERVATIONRATESCALEAPPLICATION
                where 
                    RESERVATIONRATESCALEAPPLICATION.RESERVATIONRATESCALEID = @ID

                if @OLDTOTALAMOUNT > 0  -- prevent div by 0

                    update @RESERVATIONAPPLICATIONS set
                        AMOUNT = round((AMOUNT / @OLDTOTALAMOUNT) * @TOTALAMOUNT,2)
                else
                begin  -- make an educated guess on application amounts


                    declare @APPLICATIONPCTMAP table (
                        RESERVATIONRATESCALEAPPLICATIONID uniqueidentifier,
                        PCT decimal
                    )

                    insert into @APPLICATIONPCTMAP
                    select RRA.ID, RA.[PERCENT]
                    from dbo.RATESCALE
                    inner join dbo.RESERVATIONRATESCALE on RESERVATIONRATESCALE.RATESCALEID = RATESCALE.ID
                    inner join dbo.RESERVATIONRATESCALEAPPLICATION as RRA on RRA.RESERVATIONRATESCALEID = RESERVATIONRATESCALE.ID
                    inner join dbo.RATESCALEAPPLICATION as RA on RA.RATESCALEID = RATESCALE.ID
                    where RESERVATIONRATESCALE.ID = @ID
                        and (RA.PROGRAMID = RRA.PROGRAMID
                        or RA.RESOURCEID = RRA.RESOURCEID
                        or RA.FEEID = RRA.FEEID
                        or RA.VOLUNTEERTYPEID = RRA.VOLUNTEERTYPEID)


                    update @RESERVATIONAPPLICATIONS set
                        AMOUNT = round(coalesce((select PCT / 100 from @APPLICATIONPCTMAP where RESERVATIONRATESCALEAPPLICATIONID = ID), 0) * @TOTALAMOUNT,2)


                end

                declare @TOTALAPPLICATIONSAMOUNT money
                select
                    @TOTALAPPLICATIONSAMOUNT = sum(AMOUNT)
                from @RESERVATIONAPPLICATIONS

                if @TOTALAPPLICATIONSAMOUNT <> @TOTALAMOUNT -- Sometimes percentages will not match up to exact dollar amounts

                begin
                    declare @AMOUNTDIFFERENCE money
                    set @AMOUNTDIFFERENCE = @TOTALAMOUNT - @TOTALAPPLICATIONSAMOUNT

                    if @AMOUNTDIFFERENCE <= 1.0 and @AMOUNTDIFFERENCE >= -1.0 -- We don't want to adjust for applications that went too far over initially

                    begin
                        declare @TOPAPPLICATIONID uniqueidentifier
                        select top(1) @TOPAPPLICATIONID = ID from @RESERVATIONAPPLICATIONS 
                        where AMOUNT <> 0.0 and AMOUNT + @AMOUNTDIFFERENCE >= 0.0

                        update @RESERVATIONAPPLICATIONS set 
                            AMOUNT = AMOUNT + @AMOUNTDIFFERENCE
                        where ID = @TOPAPPLICATIONID
                    end
                end

                update dbo.RESERVATIONRATESCALEAPPLICATION set
                    RESERVATIONRATESCALEAPPLICATION.AMOUNT = [@RESERVATIONAPPLICATIONS].AMOUNT,
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE
                from @RESERVATIONAPPLICATIONS
                where [@RESERVATIONAPPLICATIONS].ID = RESERVATIONRATESCALEAPPLICATION.ID
            end
        end