USP_DATAFORMTEMPLATE_ADD_DAILYSALESORDER_DISCOUNT

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

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@SALESORDERID uniqueidentifier IN Input parameter indicating the context ID for the record being added.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@DISCOUNTID uniqueidentifier IN Discount
@NUMBEROFDISCOUNTSPERORDER int IN Number of discounts per order
@ISLIMITED bit IN Is limited

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_DAILYSALESORDER_DISCOUNT
(
    @ID uniqueidentifier = null output,
    @SALESORDERID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier = null,
    @DISCOUNTID uniqueidentifier = null,
    @NUMBEROFDISCOUNTSPERORDER int = 0,
    @ISLIMITED bit = 0
)
as
    set nocount on;

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

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

    declare @LIMITAPPLICATIONTYPECODE tinyint = 0
    select
        @LIMITAPPLICATIONTYPECODE = [DISCOUNTLIMITAPPLICATIONTYPECODE]
    from dbo.[DAILYSALEITEMDISCOUNT]
    where [DISCOUNTID] = @DISCOUNTID

    select
        @ID = ID
    from dbo.[SALESORDERMANUALDISCOUNT]
    where [SALESORDERID] = @SALESORDERID
        and [DISCOUNTID] = @DISCOUNTID

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

        if @ID is null
        begin
            exec dbo.USP_DATAFORMTEMPLATE_ADD_ORDERDISCOUNTMANUAL @ID output, @SALESORDERID, @CHANGEAGENTID, @DISCOUNTID, @NUMBEROFDISCOUNTSPERORDER, @ISLIMITED
        end
        else
        begin
            if @ISLIMITED = 1 and @LIMITAPPLICATIONTYPECODE = 1
            begin
                --Figure out the limit
                select
                    @NUMBEROFDISCOUNTSPERORDER = @NUMBEROFDISCOUNTSPERORDER + coalesce([NUMBEROFDISCOUNTSPERORDER], 0)
                from dbo.[SALESORDERDISCOUNTLIMITOVERRIDE]
                where [SALESORDERID] = @SALESORDERID and
                    [DISCOUNTID] = @DISCOUNTID

                --Don't let the limit input by the user be more than the system configured limit
                select
                    @NUMBEROFDISCOUNTSPERORDER =
                        case when [LIMITDISCOUNTSPERORDER] = 1 and @NUMBEROFDISCOUNTSPERORDER > [NUMBEROFDISCOUNTSPERORDER] then
                            [NUMBEROFDISCOUNTSPERORDER]
                        else
                            @NUMBEROFDISCOUNTSPERORDER
                        end
                from dbo.[DISCOUNT]
                where [ID] = @DISCOUNTID;

                --If we already have a limit, just update it.  Otherwise, add it
                if exists (select [ID] from dbo.[SALESORDERDISCOUNTLIMITOVERRIDE]
                            where [SALESORDERID] = @SALESORDERID and [DISCOUNTID] = @DISCOUNTID)
                begin --update the limit
                    update dbo.[SALESORDERDISCOUNTLIMITOVERRIDE] set
                        [NUMBEROFDISCOUNTSPERORDER] = @NUMBEROFDISCOUNTSPERORDER,
                        CHANGEDBYID = @CHANGEAGENTID,
                        DATECHANGED = @CURRENTDATE
                    where [SALESORDERID] = @SALESORDERID and [DISCOUNTID] = @DISCOUNTID
                end
                else
                begin  --add the limit
                    insert into dbo.[SALESORDERDISCOUNTLIMITOVERRIDE]
                        (ID, SALESORDERID, DISCOUNTID, NUMBEROFDISCOUNTSPERORDER, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                    values
                        (newid(), @SALESORDERID, @DISCOUNTID, @NUMBEROFDISCOUNTSPERORDER, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE)
                end
            end
            else if @ISLIMITED = 0
            begin
                declare @LIMITID uniqueidentifier = null

                select @LIMITID = [ID]
                from dbo.[SALESORDERDISCOUNTLIMITOVERRIDE]
                where [SALESORDERID] = @SALESORDERID and [DISCOUNTID] = @DISCOUNTID

                if @LIMITID is not null
                begin
                    exec dbo.USP_SALESORDERDISCOUNTLIMITOVERRIDE_DELETEBYID_WITHCHANGEAGENTID @LIMITID, @CHANGEAGENTID
                end
            end

            exec dbo.USP_SALESORDER_APPLYITEMDISCOUNTS @SALESORDERID, @CHANGEAGENTID;
            exec dbo.USP_SALESORDER_APPLYORDERDISCOUNTS @SALESORDERID, @CHANGEAGENTID;
            exec dbo.USP_SALESORDER_CALCULATETAXES @SALESORDERID, @CHANGEAGENTID;
        end

        -- Is it really necessary to recalculate fees here? They don't seem to be affected by discounts at all (even percent-based fees use the item's original price).
        exec dbo.USP_SALESORDER_CALCULATEFEES @SALESORDERID, @CHANGEAGENTID;

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

    return 0;