USP_DATAFORMTEMPLATE_EDIT_RATESCALE_PRICES_2

The save procedure used by the edit dataform template "Rate Scale Prices Edit Data Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN The input ID parameter indicating the ID of the record being edited.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@AMOUNT money IN Group of any size pays
@ISSINGLEPRICE bit IN
@PRICES xml IN Prices
@USEPERTICKETAFTERMAX bit IN Group over size pays

Definition

Copy


                create procedure dbo.USP_DATAFORMTEMPLATE_EDIT_RATESCALE_PRICES_2
                (
                    @ID uniqueidentifier,
                    @CHANGEAGENTID uniqueidentifier = null,
                    @AMOUNT money,
                    @ISSINGLEPRICE bit,
                    @PRICES xml,
                    @USEPERTICKETAFTERMAX bit
                )
                as

                    set nocount on;

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

                    declare @CURRENTDATE datetime
                    set @CURRENTDATE = getdate()

                    --Check to ensure nothing bad happens!

                    if @ISSINGLEPRICE = 1
                        set @USEPERTICKETAFTERMAX = 0;

                    begin try
                        update dbo.RATESCALE
                        set
                            USEPERTICKETAFTERMAX = @USEPERTICKETAFTERMAX,
                            DATECHANGED = @CURRENTDATE,
                            CHANGEDBYID = @CHANGEAGENTID
                        where ID = @ID

                        declare @PRICETABLE table
                        (
                            ID uniqueidentifier,
                            GROUPMINIMUM smallint,
                            GROUPMAXIMUM smallint,
                            AMOUNT money
                        )

                        if @ISSINGLEPRICE = 0
                        begin
                            insert into @PRICETABLE
                            ( ID, GROUPMINIMUM, GROUPMAXIMUM, AMOUNT )
                            select
                                case T.c.value('(ID)[1]','uniqueidentifier')
                                    when '00000000-0000-0000-0000-000000000000' 
                                        then newid()
                                    else 
                                        case when T.c.value('(ID)[1]','uniqueidentifier') is null
                                            then newid()
                                        else
                                            T.c.value('(ID)[1]','uniqueidentifier') end
                                    end,
                                null,
                                T.c.value('(SIZE)[1]','smallint'),
                                T.c.value('(AMOUNT)[1]','money')
                            from
                                @PRICES.nodes('/PRICES/ITEM') T(c)
                            order by T.c.value('(SIZE)[1]','smallint')

                            if exists (select 1 from @PRICETABLE where GROUPMAXIMUM <= 0)
                            begin
                                raiserror('BBERR_GROUPSIZE', 13, 1);
                                return 1;
                            end
                            if exists (select 1 from @PRICETABLE where AMOUNT < 0)
                            begin
                                raiserror('BBERR_MINPRICE', 13, 1);
                                return 1;
                            end

                            if @AMOUNT < 0
                            begin
                                raiserror('BBERR_MINOVERAMOUNT', 13, 1);
                                return 1;
                            end

                            update @PRICETABLE set
                                GROUPMINIMUM = isnull((
                                                select max(GROUPMAXIMUM)
                                                from @PRICETABLE PT2
                                                where PT2.GROUPMAXIMUM < [@PRICETABLE].GROUPMAXIMUM),0)

                            update @PRICETABLE set
                                GROUPMINIMUM = GROUPMINIMUM + 1
                            where GROUPMINIMUM <> 0

                            delete from @PRICETABLE
                            where GROUPMAXIMUM = 0
                        end
                        else
                        begin
                            if @AMOUNT < 0
                            begin
                                raiserror('BBERR_MINAMOUNT', 13, 1);
                                return 1;
                            end
                        end

                        declare @MAXID uniqueidentifier
                        select @MAXID = ID from dbo.RATESCALEPRICE
                        where RATESCALEID = @ID and GROUPMAXIMUM = -1

                        insert into @PRICETABLE
                        ( ID, GROUPMINIMUM,    GROUPMAXIMUM, AMOUNT )
                        select
                            isnull(@MAXID,newid()),
                            isnull(GROUPMAX + 1,0),
                            -1,
                            @AMOUNT
                        from (select max(GROUPMAXIMUM) as GROUPMAX from @PRICETABLE) PT        

                        declare @e int;
                        declare @contextCache varbinary(128);

                        set @contextCache = CONTEXT_INFO();

                        if not @CHANGEAGENTID is null
                          set CONTEXT_INFO @CHANGEAGENTID

                        -- Remove non-existing prices

                        delete from dbo.RATESCALEPRICE
                        where 
                            RATESCALEID = @ID and
                            (
                                not exists
                                (    
                                    select 1 from @PRICETABLE
                                    where [@PRICETABLE].ID = RATESCALEPRICE.ID
                                )
                            )

                        if not @contextCache is null
                            set CONTEXT_INFO @contextCache

                        select @e=@@error;

                        if @e<>0 return -456; --always return non-zero sp result if an error occurs    


                        -- Update existing prices

                        update dbo.RATESCALEPRICE set
                            GROUPMINIMUM = [@PRICETABLE].GROUPMINIMUM,
                            GROUPMAXIMUM = [@PRICETABLE].GROUPMAXIMUM,
                            AMOUNT = [@PRICETABLE].AMOUNT,
                            DATECHANGED = @CURRENTDATE,
                            CHANGEDBYID = @CHANGEAGENTID
                        from @PRICETABLE
                        where
                            RATESCALEPRICE.ID = [@PRICETABLE].ID and
                            (
                                RATESCALEPRICE.GROUPMINIMUM <> [@PRICETABLE].GROUPMINIMUM or
                                RATESCALEPRICE.GROUPMAXIMUM <> [@PRICETABLE].GROUPMAXIMUM or
                                RATESCALEPRICE.AMOUNT <> [@PRICETABLE].AMOUNT
                            )

                        -- Insert new prices

                        insert into dbo.RATESCALEPRICE
                        (
                            ID,
                            RATESCALEID,
                            AMOUNT,
                            GROUPMINIMUM,
                            GROUPMAXIMUM,
                            ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                        )
                        select
                            ID,
                            @ID,
                            AMOUNT,
                            GROUPMINIMUM,
                            GROUPMAXIMUM,
                            @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                        from @PRICETABLE
                        where
                            not exists
                            (
                                select 1 from dbo.RATESCALEPRICE
                                where RATESCALEPRICE.ID = [@PRICETABLE].ID
                            )

                        -- If this includes per ticket pricing, ensure the max price has the proper value

                        if @USEPERTICKETAFTERMAX = 1 and @ISSINGLEPRICE = 0
                        begin
                            declare @MAXPRICE money;
                            select top(1) @MAXPRICE = AMOUNT
                            from dbo.RATESCALEPRICE
                            where RATESCALEID = @ID
                            order by GROUPMAXIMUM desc

                            update dbo.RATESCALEPRICE
                            set AMOUNT = @MAXPRICE,
                                DATECHANGED = @CURRENTDATE,
                                CHANGEDBYID = @CHANGEAGENTID
                            where RATESCALEID = @ID and GROUPMAXIMUM = -1
                        end
                    end try
                    begin catch
                        exec dbo.USP_RAISE_ERROR
                        return 1
                    end catch

                return 0;