USP_DATAFORMTEMPLATE_ADD_SALESORDERITEMTICKET_DAILYADMISSION_ADD

The save procedure used by the add dataform template "Sales Order Item Daily Admission Add".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@ORDERID uniqueidentifier IN Input parameter indicating the context ID for the record being added.
@PRICETYPES xml IN Prices
@PROGRAMID uniqueidentifier IN Program
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@DATA xml IN Data
@OPTIONS xml IN Options
@CALLBACKURL nvarchar(255) IN Callback URL
@SYSTEMTYPENAME nvarchar(255) IN System Type Name
@ASSEMBLYNAME nvarchar(255) IN Assembly Name
@ATTRIBUTES xml IN Attributes
@CATEGORYNAME nvarchar(255) IN Category Name
@EXPIREDCALLBACKURL nvarchar(255) IN Expired callback URL
@ACKNOWLEDGEMENT nvarchar(max) IN Acknowledgement

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_SALESORDERITEMTICKET_DAILYADMISSION_ADD
(
    @ID uniqueidentifier = null output,
    @ORDERID uniqueidentifier,
    @PRICETYPES xml = null,
    @PROGRAMID uniqueidentifier = null,
    @CHANGEAGENTID uniqueidentifier = null,
    @DATA xml = null,
    @OPTIONS xml = null,
    @CALLBACKURL nvarchar(255) = '',
    @SYSTEMTYPENAME nvarchar(255) = '',
    @ASSEMBLYNAME nvarchar(255) = '',
    @ATTRIBUTES xml = null,
    @CATEGORYNAME nvarchar(255) = '',
    @EXPIREDCALLBACKURL nvarchar(255) = '',
    @ACKNOWLEDGEMENT nvarchar(max) = ''
)
as
    set nocount on;

    declare @QUANTITY integer;

    select @QUANTITY = sum(T.items.value('(QUANTITY)[1]', 'integer'))
    from @PRICETYPES.nodes('/PRICETYPES/ITEM') T(items);

    if @ID is null
        set @ID = newid();

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

    declare @CURRENTDATE datetime = getdate();

    declare @SALESMETHODTYPECODE tinyint = 0;
    select @SALESMETHODTYPECODE = [SALESMETHODTYPECODE]
    from dbo.[SALESORDER]
    where [ID] = @ORDERID;

    --For online, we need to make sure that this ticket can be delivered
    if @SALESMETHODTYPECODE = 2
    begin
        declare @SALESMETHODID uniqueidentifier = dbo.UFN_SALESMETHOD_GETIDFROMTYPECODE(2);
        declare @DELIVERYMETHODEXISTS bit = 0
        exec dbo.USP_DELIVERYMETHOD_INFO_BYSALESMETHODID
            @SALESMETHODID,
            @DELIVERYMETHODEXISTS output;

        if @DELIVERYMETHODEXISTS = 0
            raiserror('ERR_HASNODELIVERYMETHOD', 13, 1);
    end

    declare @ORDERITEMS table
        (ID uniqueidentifier,
        QUANTITY int,
        PRICETYPECODEID uniqueidentifier,
        PRICETYPE nvarchar(100),
        PRICE money);

    insert into @ORDERITEMS
    select
        isnull(T.items.value('(SALESORDERITEMID)[1]','uniqueidentifier'), newid()),
        T.items.value('(QUANTITY)[1]','integer'),
        T.items.value('(PRICETYPECODEID)[1]', 'uniqueidentifier'),
        T.items.value('(PRICETYPE)[1]','nvarchar(100)'),
        T.items.value('(FACEPRICE)[1]','decimal(19,2)')  -- 4/20/09, LeeCh, Bug 19897 - Changed decimal(9,2) into decimal (19,2) to avoid decimal overflow error. See work item fix and attachment for details.
    from @PRICETYPES.nodes('/PRICETYPES/ITEM') T(items)
    where T.items.value('(QUANTITY)[1]','integer') > 0;

    if not exists (
        select 1
        from @ORDERITEMS ITEMS
        inner join dbo.PROGRAMPRICE on PROGRAMPRICE.PRICETYPECODEID = ITEMS.PRICETYPECODEID and PROGRAMPRICE.PROGRAMID = @PROGRAMID
    )
    begin
        raiserror('The given price type is not available for this program.', 13, 1);
    end

    begin try
        exec dbo.USP_SALESORDER_ISCOMPLETE_RAISERROR @ORDERID, @EXCLUDEGROUPSALES = 1;

        -- 4/20/09, LeeCh, Bug 19897, Starts
        -- Check if total overflows by adding the total in new order items and the total in existing order items
        -- An overflow error will be processed in the catch block

        declare @TOTAL money;

        -- total in new order items
        select @TOTAL = SUM(QUANTITY * PRICE)
        from @ORDERITEMS;

        -- total in existing order items
        select @TOTAL = @TOTAL + isnull(SUM(SALESORDERITEM.TOTAL), 0)
        from dbo.SALESORDERITEM
        left join dbo.SALESORDERITEMFEE on SALESORDERITEM.ID = SALESORDERITEMFEE.ID
        where
            SALESORDERITEM.SALESORDERID = @ORDERID
            and (
                SALESORDERITEM.TYPECODE <> 3
                or (
                    SALESORDERITEM.TYPECODE = 3 and SALESORDERITEMFEE.APPLIESTOCODE = 0
                )
            );

        -- 4/20/09, LeeCh, Bug 19897, Ends

        --build description
        declare @DESCRIPTION nvarchar(100);
        select @DESCRIPTION = PROGRAM.NAME from dbo.PROGRAM where PROGRAM.ID = @PROGRAMID;

        update dbo.SALESORDERITEM set
            SALESORDERITEM.QUANTITY = SALESORDERITEM.QUANTITY + ITEMS.QUANTITY,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        from @ORDERITEMS ITEMS
        where
            SALESORDERID = @ORDERID
            and SALESORDERITEM.ID in
            (
                select SALESORDERITEMTICKET.ID
                from dbo.SALESORDERITEMTICKET
                inner join dbo.SALESORDERITEM as B on SALESORDERITEMTICKET.ID = B.ID
                left join dbo.SALESORDERITEMTICKETCOMBINATION on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
                where B.SALESORDERID = @ORDERID and
                    PROGRAMID = @PROGRAMID and
                    SALESORDERITEMTICKET.PRICETYPECODEID = ITEMS.PRICETYPECODEID and
                    SALESORDERITEMTICKETCOMBINATION.ID is null
            );

        insert into dbo.SALESORDERITEM
            (ID, SALESORDERID, TYPECODE, DESCRIPTION, QUANTITY, PRICE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, DATA, OPTIONS, CALLBACKURL, SYSTEMTYPENAME, ASSEMBLYNAME, ATTRIBUTES, CATEGORYNAME, EXPIREDCALLBACKURL, ACKNOWLEDGEMENT)
        select
            ITEMS.ID,
            @ORDERID,
            0,
            @DESCRIPTION + ' - ' + ITEMS.PRICETYPE,
            ITEMS.QUANTITY,
            ITEMS.PRICE,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE,
            @DATA,
            @OPTIONS,
            @CALLBACKURL,
            @SYSTEMTYPENAME,
            @ASSEMBLYNAME,
            @ATTRIBUTES,
            @CATEGORYNAME,
            @EXPIREDCALLBACKURL,
            @ACKNOWLEDGEMENT
        from @ORDERITEMS ITEMS
        where
            not exists
            (
                select 1 from dbo.SALESORDERITEM
                inner join dbo.SALESORDERITEMTICKET on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
                left join dbo.SALESORDERITEMTICKETCOMBINATION on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
                where
                    SALESORDERID = @ORDERID and
                    PROGRAMID = @PROGRAMID and
                    SALESORDERITEMTICKET.PRICETYPECODEID = ITEMS.PRICETYPECODEID and
                    SALESORDERITEMTICKETCOMBINATION.ID is null
            );

        insert into dbo.SALESORDERITEMTICKET
        (
            ID,
            PROGRAMID,
            PROGRAMNAME,
            PROGRAMCATEGORYNAME,
            PRICETYPECODEID,
            PRICE,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
        )
        select
            ITEMS.ID,
            @PROGRAMID,
            coalesce((select [PROGRAM].[NAME] from dbo.[PROGRAM] where [PROGRAM].[ID] = @PROGRAMID),''),
            coalesce((
                select [PROGRAMCATEGORYCODE].[DESCRIPTION]
                from dbo.[PROGRAM]
                inner join dbo.[PROGRAMCATEGORYCODE]
                    on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
                where [PROGRAM].[ID] = @PROGRAMID
            ),''),
            ITEMS.PRICETYPECODEID,
            ITEMS.PRICE,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        from @ORDERITEMS ITEMS
        where
            ITEMS.ID in
            ( select ID from dbo.SALESORDERITEM where SALESORDERID = @ORDERID );

        exec dbo.USP_SALESORDER_CALCULATEFEES @ORDERID, @CHANGEAGENTID;

        exec dbo.USP_SALESORDER_APPLYITEMDISCOUNTS @ORDERID, @CHANGEAGENTID;
        exec dbo.USP_SALESORDER_APPLYORDERDISCOUNTS @ORDERID, @CHANGEAGENTID;

        exec dbo.USP_SALESORDER_CALCULATETAXES @ORDERID, @CHANGEAGENTID;

    end try

    begin catch
        -- 4/20/09, LeeCh, Bug 19897, Starts
        -- catch the datatype money overflow error,

        if ERROR_NUMBER() = 8115
        begin
            raiserror('ERR_TICKETINSERT_MONEYOVERFLOW', 13, 1);
        end

        -- 4/20/09, LeeCh, Bug 19897, Ends

        exec dbo.USP_RAISE_ERROR;
        return 1;
    end catch

    return 0;