USP_DATAFORMTEMPLATE_EDIT_DISCOUNTDETAIL_2

The save procedure used by the edit dataform template "Discount Details 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.
@NUMBERTOPURCHASE int IN Quantity at full price
@NUMBERTODISCOUNTTYPECODE tinyint IN Quantity discounted
@NUMBERTODISCOUNT int IN Number to discount
@CALCULATIONTYPECODE tinyint IN Calculation type
@DISCOUNTTICKETSFORCODE tinyint IN Limit discount to
@LIMITDISCOUNTSPERORDER bit IN Limit the number of times this discount may be applied
@NUMBEROFDISCOUNTSPERORDER int IN Uses allowed
@DISCOUNTQUALIFYINGPRICETYPES xml IN Buy these price types
@DISCOUNTPRICETYPES xml IN Apply discounts to these price types
@DISCOUNTMERCHANDISEDEPARTMENTS xml IN Departments
@DISCOUNTMERCHANDISEITEMS xml IN Items
@ITEMMERCHANDISEPERCENT decimal(5, 2) IN Value
@ITEMMERCHANDISEAMOUNT money IN Value
@QUALIFYINGDISCOUNTMERCHANDISEDEPARTMENTS xml IN Departments
@QUALIFYINGDISCOUNTMERCHANDISEITEMS xml IN Items
@QUALIFYINGITEMTYPECODE tinyint IN Item type
@DISCOUNTITEMTYPECODE tinyint IN Item type
@DISCOUNTMERCHANDISEFORCODE tinyint IN Limit discount to
@APPLIESTOMERCHANDISECODE tinyint IN Applies to
@QUALIFYINGAPPLIESTOMERCHANDISECODE tinyint IN Triggered by
@DISCOUNTPROGRAMS xml IN Select programs for discount

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_DISCOUNTDETAIL_2
(
    @ID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier = null,
    @NUMBERTOPURCHASE int,
    @NUMBERTODISCOUNTTYPECODE tinyint,
    @NUMBERTODISCOUNT int,
    @CALCULATIONTYPECODE tinyint,
    @DISCOUNTTICKETSFORCODE tinyint,
    @LIMITDISCOUNTSPERORDER bit,
    @NUMBEROFDISCOUNTSPERORDER int,
    @DISCOUNTQUALIFYINGPRICETYPES xml,
    @DISCOUNTPRICETYPES xml,
    @DISCOUNTMERCHANDISEDEPARTMENTS xml,
    @DISCOUNTMERCHANDISEITEMS xml,
    @ITEMMERCHANDISEPERCENT decimal(5, 2),
    @ITEMMERCHANDISEAMOUNT money,
    @QUALIFYINGDISCOUNTMERCHANDISEDEPARTMENTS xml,
    @QUALIFYINGDISCOUNTMERCHANDISEITEMS xml,
    @QUALIFYINGITEMTYPECODE tinyint,
    @DISCOUNTITEMTYPECODE tinyint, -- 0 = tickets, 1 = merchandise

    @DISCOUNTMERCHANDISEFORCODE tinyint,
    @APPLIESTOMERCHANDISECODE tinyint,
    @QUALIFYINGAPPLIESTOMERCHANDISECODE tinyint,
    @DISCOUNTPROGRAMS xml
)
as
    set nocount on;

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

    declare @CURRENTDATE datetime;
    set @CURRENTDATE = getdate();

    begin try
        if @QUALIFYINGITEMTYPECODE = 0
        -- clear out qualifying merchandise discount xmls

        begin
            select @QUALIFYINGDISCOUNTMERCHANDISEDEPARTMENTS = null,
                @QUALIFYINGDISCOUNTMERCHANDISEITEMS = null
        end
        else
            select @DISCOUNTQUALIFYINGPRICETYPES = null

        if @DISCOUNTITEMTYPECODE = 0
        -- clear out discount merchandise xmls

        begin
            select @DISCOUNTMERCHANDISEDEPARTMENTS = null,
                @DISCOUNTMERCHANDISEITEMS = null
        end
        else
            select @DISCOUNTPRICETYPES = null

        declare @APPLIESTOMERCHANDISE bit = case @DISCOUNTITEMTYPECODE when 1 then 1 else 0 end;
        declare @APPLIESTOTICKETS bit = case @DISCOUNTITEMTYPECODE when 0 then 1 else 0 end;

        if @LIMITDISCOUNTSPERORDER = 0
            set @NUMBEROFDISCOUNTSPERORDER = 1

        if @NUMBERTODISCOUNTTYPECODE = 1
            begin
                set @NUMBERTODISCOUNT = 1
                set @LIMITDISCOUNTSPERORDER = 0
                set @NUMBEROFDISCOUNTSPERORDER = 1
            end

        if @CALCULATIONTYPECODE = 0
        begin
            set @ITEMMERCHANDISEPERCENT = 0
            if @APPLIESTOMERCHANDISE = 1 and @ITEMMERCHANDISEAMOUNT = 0
                raiserror('BBERR_INVALIDMERCHANDISEAMOUNT', 13, 1)
        end
        else
        begin
            set @ITEMMERCHANDISEAMOUNT = 0
            if @APPLIESTOMERCHANDISE = 1 and @ITEMMERCHANDISEPERCENT = 0
                raiserror('BBERR_INVALIDMERCHANDISEPERCENT', 13, 1)
        end


        -- now that we passed validation, clone the discount and update only the new version.

        declare @CLONEID uniqueidentifier;
        exec dbo.USP_DISCOUNT_CLONE @ID, @CLONEID output;

        -- Update all xml with new ID's so the originals do not get overwritten (and the changes lost).


        if @DISCOUNTQUALIFYINGPRICETYPES is not null
        begin
            set @DISCOUNTQUALIFYINGPRICETYPES = (
                select newid() as ID, PRICETYPECODEID, SEQUENCE
                from dbo.UFN_DISCOUNT_GETQUALIFYINGPRICETYPES_FROMITEMLISTXML(@DISCOUNTQUALIFYINGPRICETYPES)
                for xml path('ITEM'),type,elements,root('DISCOUNTQUALIFYINGPRICETYPES'),BINARY BASE64
            )
        end

        if @DISCOUNTPRICETYPES is not null
        begin
            set @DISCOUNTPRICETYPES = (
                select newid() as ID, PRICETYPECODEID, SEQUENCE, AMOUNT, [PERCENT]
                from dbo.UFN_DISCOUNT_GETPRICETYPES_FROMITEMLISTXML(@DISCOUNTPRICETYPES)
                order by SEQUENCE
                for xml path('ITEM'),type,elements,root('DISCOUNTPRICETYPES'),BINARY BASE64
            )
        end

        if @DISCOUNTPROGRAMS is not null
        begin
            set @DISCOUNTPROGRAMS = (
                select newid() as DISCOUNTGROUPID, DISCOUNTITEMID, QUALIFYINGITEMID, PROGRAMID
                from dbo.UFN_DISCOUNT_GETDISCOUNTPROGRAMS_FROMITEMLISTXML(@DISCOUNTPROGRAMS)
                for xml path('ITEM'),type,elements,root('DISCOUNTPROGRAMS'),BINARY BASE64
            )
        end

        if @DISCOUNTMERCHANDISEDEPARTMENTS is not null
        begin
            set @DISCOUNTMERCHANDISEDEPARTMENTS = (
                select
                    newid() as ID,
                    newid() as DISCOUNTGROUPID,
                    T.c.value('(MERCHANDISEDEPARTMENTID)[1]','uniqueidentifier') as MERCHANDISEDEPARTMENTID,
                    T.c.value('(SEQUENCE)[1]','integer') as SEQUENCE
                from @DISCOUNTMERCHANDISEDEPARTMENTS.nodes('/DISCOUNTMERCHANDISEDEPARTMENTS/ITEM') T(c)
                for xml path('ITEM'),type,elements,root('DISCOUNTMERCHANDISEDEPARTMENTS'),BINARY BASE64
            )
        end

        if @DISCOUNTMERCHANDISEITEMS is not null
        begin
            set @DISCOUNTMERCHANDISEITEMS = (
                select
                    newid() as ID,
                    newid() as DISCOUNTGROUPID,
                    T.c.value('(MERCHANDISEITEMID)[1]','uniqueidentifier') as MERCHANDISEITEMID,
                    T.c.value('(SEQUENCE)[1]','integer') as SEQUENCE
                from @DISCOUNTMERCHANDISEITEMS.nodes('/DISCOUNTMERCHANDISEITEMS/ITEM') T(c)
                for xml path('ITEM'),type,elements,root('DISCOUNTMERCHANDISEITEMS'),BINARY BASE64
            )
        end

        if @QUALIFYINGDISCOUNTMERCHANDISEDEPARTMENTS is not null
        begin
            set @QUALIFYINGDISCOUNTMERCHANDISEDEPARTMENTS = (
                select
                    newid() as ID,
                    newid() as DISCOUNTGROUPID,
                    T.c.value('(MERCHANDISEDEPARTMENTID)[1]','uniqueidentifier') as MERCHANDISEDEPARTMENTID,
                    T.c.value('(SEQUENCE)[1]','integer') as SEQUENCE
                from @QUALIFYINGDISCOUNTMERCHANDISEDEPARTMENTS.nodes('/QUALIFYINGDISCOUNTMERCHANDISEDEPARTMENTS/ITEM') T(c)
                for xml path('ITEM'),type,elements,root('QUALIFYINGDISCOUNTMERCHANDISEDEPARTMENTS'),BINARY BASE64
            )
        end

        if @QUALIFYINGDISCOUNTMERCHANDISEITEMS is not null
        begin
            set @QUALIFYINGDISCOUNTMERCHANDISEITEMS = (
                select
                    newid() as ID,
                    newid() as DISCOUNTGROUPID,
                    T.c.value('(MERCHANDISEITEMID)[1]','uniqueidentifier') as MERCHANDISEITEMID,
                    T.c.value('(SEQUENCE)[1]','integer') as SEQUENCE
                from @QUALIFYINGDISCOUNTMERCHANDISEITEMS.nodes('/QUALIFYINGDISCOUNTMERCHANDISEITEMS/ITEM') T(c)
                for xml path('ITEM'),type,elements,root('QUALIFYINGDISCOUNTMERCHANDISEITEMS'),BINARY BASE64
            )
        end


        update dbo.DISCOUNT set
            NUMBERTOPURCHASE = @NUMBERTOPURCHASE,
            NUMBERTODISCOUNTTYPECODE = @NUMBERTODISCOUNTTYPECODE,
            NUMBERTODISCOUNT = @NUMBERTODISCOUNT,
            CALCULATIONTYPECODE = @CALCULATIONTYPECODE,
            DISCOUNTTICKETSFORCODE = @DISCOUNTTICKETSFORCODE,
            LIMITDISCOUNTSPERORDER = @LIMITDISCOUNTSPERORDER,
            NUMBEROFDISCOUNTSPERORDER = @NUMBEROFDISCOUNTSPERORDER,
            DISCOUNTITEMTYPECODE = @DISCOUNTITEMTYPECODE,
            QUALIFYINGITEMTYPECODE = @QUALIFYINGITEMTYPECODE,
            MERCHANDISEPERCENT = @ITEMMERCHANDISEPERCENT,
            MERCHANDISEAMOUNT = @ITEMMERCHANDISEAMOUNT,
            DISCOUNTMERCHANDISEFORCODE = @DISCOUNTMERCHANDISEFORCODE,
            APPLIESTOTICKETS = @APPLIESTOTICKETS,
            APPLIESTOMERCHANDISE = @APPLIESTOMERCHANDISE,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        where
            ID = @CLONEID;


        exec dbo.USP_DISCOUNT_GETQUALIFYINGPRICETYPES_UPDATEFROMXML @CLONEID, @DISCOUNTQUALIFYINGPRICETYPES, @CHANGEAGENTID, @CURRENTDATE;
        exec dbo.USP_DISCOUNT_GETPRICETYPES_UPDATEFROMXML @CLONEID, @DISCOUNTPRICETYPES, @CHANGEAGENTID, @CURRENTDATE;

        declare @contextCache varbinary(128);
        /* cache current context information */
        set @contextCache = CONTEXT_INFO();

        /* set CONTEXT_INFO to @CHANGEAGENTID */
        if not @CHANGEAGENTID is null
            set CONTEXT_INFO @CHANGEAGENTID

        delete from dbo.DISCOUNTGROUP
        where DISCOUNTGROUP.ID in
            (
                select DISCOUNTGROUP.ID
                from dbo.DISCOUNTGROUPDETAIL
                inner join dbo.DISCOUNTGROUP on DISCOUNTGROUP.ID = DISCOUNTGROUPDETAIL.DISCOUNTGROUPID
                where DISCOUNTGROUPDETAIL.DISCOUNTGROUPDETAILAPPLICATIONCODE = 3
                    and DISCOUNTGROUP.DISCOUNTID = @CLONEID
            )

        exec dbo.USP_DISCOUNT_ADDDISCOUNTPROGRAMSFROMXML @CLONEID, @DISCOUNTPROGRAMS, 1, @CHANGEAGENTID, @CURRENTDATE, @DISCOUNTITEMTYPECODE, @QUALIFYINGITEMTYPECODE

        if @DISCOUNTITEMTYPECODE = 0
            -- delete all merchandise discounted items

            delete from dbo.DISCOUNTGROUP
            where ID in
            (
                select DISCOUNTGROUP.ID
                from dbo.DISCOUNTGROUP
                inner join dbo.DISCOUNTGROUPDETAIL
                    on DISCOUNTGROUPDETAIL.DISCOUNTGROUPID = DISCOUNTGROUP.ID
                where DISCOUNTGROUP.DISCOUNTID = @CLONEID
                    and DISCOUNTGROUPDETAIL.DISCOUNTGROUPDETAILAPPLICATIONCODE in (0, 1, 2, 5, 6)
                    and DISCOUNTGROUPDETAIL.DISCOUNTEDITEM = 1
            )
        else
            exec dbo.USP_DISCOUNT_UPDATEMERCHANDISE @CLONEID, @CHANGEAGENTID, @CURRENTDATE, @APPLIESTOMERCHANDISECODE, @DISCOUNTMERCHANDISEDEPARTMENTS, @DISCOUNTMERCHANDISEITEMS

        if @QUALIFYINGITEMTYPECODE = 0
            -- delete all merchandise qualifying items

            delete from dbo.DISCOUNTGROUP
            where ID in
            (
                select DISCOUNTGROUP.ID
                from dbo.DISCOUNTGROUP
                inner join dbo.DISCOUNTGROUPDETAIL
                    on DISCOUNTGROUPDETAIL.DISCOUNTGROUPID = DISCOUNTGROUP.ID
                where DISCOUNTGROUP.DISCOUNTID = @CLONEID
                    and DISCOUNTGROUPDETAILAPPLICATIONCODE in (1, 2, 4)
                    and DISCOUNTGROUPDETAIL.DISCOUNTEDITEM = 0
            )
        else
            exec dbo.USP_DISCOUNT_UPDATEQUALIFYINGMERCHANDISE @CLONEID, @CHANGEAGENTID, @CURRENTDATE, @QUALIFYINGAPPLIESTOMERCHANDISECODE, @QUALIFYINGDISCOUNTMERCHANDISEDEPARTMENTS, @QUALIFYINGDISCOUNTMERCHANDISEITEMS

        /* reset CONTEXT_INFO to previous value */
        if not @contextCache is null
            set CONTEXT_INFO @contextCache

    end try

    begin catch
        exec dbo.USP_RAISE_ERROR;
        return 1;
    end catch

    return 0;