USP_RESERVATION_UPDATEFLATRATEPERTICKETPRICE

Updates the price used on a reservation when a flat rate with per ticket pricing is used.

Parameters

Parameter Parameter Type Mode Description
@RESERVATIONID uniqueidentifier IN
@RESERVATIONRATESCALEPRICEID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CURRENTDATE datetime IN

Definition

Copy


CREATE procedure dbo.USP_RESERVATION_UPDATEFLATRATEPERTICKETPRICE
(
    @RESERVATIONID uniqueidentifier,
    @RESERVATIONRATESCALEPRICEID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier,
    @CURRENTDATE datetime
)
as
begin

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

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

    if @RESERVATIONRATESCALEPRICEID is null
        set @RESERVATIONRATESCALEPRICEID = dbo.UFN_RESERVATION_GETRATESCALEPRICE(@RESERVATIONID)

    declare @ISFLATRATE bit;
    declare @USEPERTICKETAFTERMAX bit;
    declare @GROUPMAXIMUM int;

    select
        @ISFLATRATE = PRICINGCODE,
        @USEPERTICKETAFTERMAX = coalesce(RESERVATIONRATESCALE.USEPERTICKETAFTERMAX, 0),
        @GROUPMAXIMUM = coalesce(RESERVATIONRATESCALEPRICE.GROUPMAXIMUM, 0)
    from dbo.RESERVATION
        left join RESERVATIONRATESCALE on RESERVATIONRATESCALE.ID = RESERVATION.ID
        left join RESERVATIONRATESCALEPRICE on RESERVATIONRATESCALEPRICE.RESERVATIONRATESCALEID = RESERVATIONRATESCALE.ID
    where
        RESERVATION.ID = @RESERVATIONID and
        RESERVATIONRATESCALEPRICE.ID = @RESERVATIONRATESCALEPRICEID

    if @ISFLATRATE = 1 and @USEPERTICKETAFTERMAX = 1 and @GROUPMAXIMUM = -1
    begin
        declare @EXCESSATTENDEES int;
        declare @TOTALAMOUNT money;

        select 
            @EXCESSATTENDEES = 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 = @RESERVATIONID

        select
            @EXCESSATTENDEES = case GROUPMINIMUM
                when 0 then @EXCESSATTENDEES 
                else @EXCESSATTENDEES - coalesce(GROUPMINIMUM - 1, 0)
            end
        from dbo.RESERVATIONRATESCALEPRICE
        where ID = @RESERVATIONRATESCALEPRICEID

        select TOP(1)
            @TOTALAMOUNT = coalesce(AMOUNT, 0.0)
        from dbo.RESERVATIONRATESCALEPRICE
        where RESERVATIONRATESCALEID = @RESERVATIONID
        order by GROUPMAXIMUM desc

        declare @TICKETTYPES table
        (
            ID uniqueidentifier,
            QUANTITY int,
            AMOUNT money
        );

        insert into @TICKETTYPES
        (
            ID,
            AMOUNT,
            QUANTITY
        )
        select
            newid(),
            PRICE,
            QUANTITY
        from dbo.UFN_RESERVATION_GETPERPERSONCHARGES(@RESERVATIONID, 1)

        declare @PRICETYPEID uniqueidentifier;
        declare @AMOUNT money;
        declare @QUANTITY int;

        while @EXCESSATTENDEES > 0
        begin
            select top(1)
                @PRICETYPEID = ID,
                @AMOUNT = AMOUNT,
                @QUANTITY = QUANTITY
            from @TICKETTYPES
            order by AMOUNT asc

            if @PRICETYPEID is null
            begin
                set @EXCESSATTENDEES = 0;
            end
            else
            begin
                if @QUANTITY >= @EXCESSATTENDEES
                begin
                    set @TOTALAMOUNT = @TOTALAMOUNT + (@AMOUNT * @EXCESSATTENDEES);
                    set @EXCESSATTENDEES = 0;
                end
                else
                begin
                    set @TOTALAMOUNT = @TOTALAMOUNT + (@AMOUNT * @QUANTITY);
                    set @EXCESSATTENDEES = @EXCESSATTENDEES - @QUANTITY;
                end
                delete from @TICKETTYPES where ID = @PRICETYPEID;
            end
        end

        declare @OLDTOTAL money
        select @OLDTOTAL = AMOUNT 
        from dbo.RESERVATIONRATESCALEPRICE 
        where ID = @RESERVATIONRATESCALEPRICEID

        if @TOTALAMOUNT <> @OLDTOTAL
        begin
            update dbo.RESERVATIONRATESCALEPRICE
            set
                AMOUNT = @TOTALAMOUNT,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            where ID = @RESERVATIONRATESCALEPRICEID

            -- Re-calculate the applications

            exec dbo.USP_RESERVATIONRATESCALE_RECREATEAPPLICATIONS @RESERVATIONID, @CHANGEAGENTID, @CURRENTDATE, @OLDTOTAL;
        end
    end

    return 0
end