USP_DATAFORMTEMPLATE_ADD_DAILYSALESORDER_MANUALDISCOUNT

The save procedure used by the add dataform template "Daily Sales Order Manual Discount Add Data 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
@PROMOTIONALCODE nvarchar(50) IN Promotion code
@ISPROMOTIONALCODE bit IN
@ISLIMITED bit IN
@NUMBEROFDISCOUNTSPERORDER int IN
@ISMEMBERSHIPPROMO bit IN
@ISADJUSTABLEDISCOUNT bit IN

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_DAILYSALESORDER_MANUALDISCOUNT
(
    @ID uniqueidentifier = null output,
    @SALESORDERID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier = null,
    @DISCOUNTID uniqueidentifier = null,
    @PROMOTIONALCODE nvarchar(50) = '',
    @ISPROMOTIONALCODE bit = 0,
    @ISLIMITED bit = 0,
    @NUMBEROFDISCOUNTSPERORDER int = 1,
    @ISMEMBERSHIPPROMO bit = 0,
    @ISADJUSTABLEDISCOUNT bit = 0
)
as

set nocount on;

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

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

declare @SALESMETHODTYPECODE tinyint;
declare @STATUSCODE tinyint;
declare @CURRENTDATE datetime;
set @CURRENTDATE = getdate();

select
    @SALESMETHODTYPECODE = SALESMETHODTYPECODE,
    @STATUSCODE = STATUSCODE
from dbo.SALESORDER
where ID = @SALESORDERID;

if @STATUSCODE in (1, 5)
    raiserror('BBERR_INVALIDSTATUS', 13, 1);

--If we only have the promotional code, get the discount id
if @ISPROMOTIONALCODE = 1
begin
    select
        @DISCOUNTID = DISCOUNTID
    from dbo.PROMOTIONALCODE
    where
        PROMOTIONALCODE = @PROMOTIONALCODE
        and (VALIDFROM is null or @CURRENTDATE >= dbo.UFN_DATE_GETEARLIESTTIME(VALIDFROM))
        and (VALIDTO is null or @CURRENTDATE <= dbo.UFN_DATE_GETLATESTTIME(VALIDTO))
        and dbo.UFN_DISCOUNT_AVAILABLEFORORDER(DISCOUNTID, @SALESORDERID) = 1;

    if (@DISCOUNTID is null) and ((@SALESMETHODTYPECODE <> 3))
    begin
        select
            @DISCOUNTID = MEMBERSHIPPROMOCODE.MEMBERSHIPPROMOID,
            @ISMEMBERSHIPPROMO = 1
        from dbo.MEMBERSHIPPROMOCODE
        inner join dbo.MEMBERSHIPPROMO on MEMBERSHIPPROMO.ID = MEMBERSHIPPROMOCODE.MEMBERSHIPPROMOID
        where
            MEMBERSHIPPROMOCODE.PROMOTIONALCODE = @PROMOTIONALCODE
            and (MEMBERSHIPPROMOCODE.VALIDFROM is null or @CURRENTDATE >= dbo.UFN_DATE_GETEARLIESTTIME(MEMBERSHIPPROMOCODE.VALIDFROM))
            and (MEMBERSHIPPROMOCODE.VALIDTO is null or @CURRENTDATE <= dbo.UFN_DATE_GETLATESTTIME(MEMBERSHIPPROMOCODE.VALIDTO))
            and MEMBERSHIPPROMO.ISACTIVE = 1;
    end
end

if @ISMEMBERSHIPPROMO = 1
begin
    begin try
        exec dbo.USP_SALESORDER_ADDMEMBERSHIPPROMO @ID, @SALESORDERID, @DISCOUNTID, @CHANGEAGENTID, @CURRENTDATE, @PROMOTIONALCODE;
    end try

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

    --Get the manual discount id so we know if we've already added it
    declare @SALESORDERMANUALDISCOUNTID uniqueidentifier
    select
        @SALESORDERMANUALDISCOUNTID = [ID]
    from dbo.[SALESORDERMANUALDISCOUNT]
    where [DISCOUNTID] = @DISCOUNTID and [SALESORDERID] = @SALESORDERID;

    begin try

        if @ISADJUSTABLEDISCOUNT = 0
        begin
            if @SALESORDERMANUALDISCOUNTID is null
            begin
                -- This discount hasn't been added yet. First add the SALESORDERMANUALDISCOUNT record via one of the following two SP's.

                if @ISPROMOTIONALCODE = 1
                begin
                    -- This SP includes calls to APPLYITEMDISCOUNTS, APPLYORDERDISCOUNTS, and CALCULATETAXES.
                    exec dbo.USP_DATAFORMTEMPLATE_ADD_ORDERDISCOUNTWITHCODE @ID,@SALESORDERID,@CHANGEAGENTID,@PROMOTIONALCODE;
                end
                else begin
                    -- This SP includes calls to APPLYITEMDISCOUNTS, APPLYORDERDISCOUNTS, and CALCULATETAXES.
                    exec dbo.USP_DATAFORMTEMPLATE_ADD_ORDERDISCOUNTMANUAL @ID, @SALESORDERID, @CHANGEAGENTID, @DISCOUNTID, @NUMBEROFDISCOUNTSPERORDER, @ISLIMITED;
                end
            end
            else begin
                if @SALESMETHODTYPECODE = 2  -- Online
                begin
                    raiserror('BBERR_DISCOUNT_ALREADYUSED', 13, 1);
                end
            end

            -- Get the limit override id so we know if we already have an override value
            declare @SALESORDERDISCOUNTLIMITOVERRIDEID uniqueidentifier;
            select
                @SALESORDERDISCOUNTLIMITOVERRIDEID = ID
            from dbo.SALESORDERDISCOUNTLIMITOVERRIDE
            where DISCOUNTID = @DISCOUNTID and SALESORDERID = @SALESORDERID;

            if @ISLIMITED = 1
            begin
                --Make sure the user-specified value is less than or equal to 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 @SALESORDERDISCOUNTLIMITOVERRIDEID is null
                begin  --If the limit doesn't exist already, add it
                    insert into dbo.[SALESORDERDISCOUNTLIMITOVERRIDE] (
                        [ID],
                        [SALESORDERID],
                        [DISCOUNTID],
                        [NUMBEROFDISCOUNTSPERORDER],
                        [ADDEDBYID],
                        [CHANGEDBYID],
                        [DATEADDED],
                        [DATECHANGED]
                    )
                    values (
                        newid(),
                        @SALESORDERID,
                        @DISCOUNTID,
                        @NUMBEROFDISCOUNTSPERORDER,
                        @CHANGEAGENTID,
                        @CHANGEAGENTID,
                        @CURRENTDATE,
                        @CURRENTDATE
                    );
                end
                else begin --If the limit exists, update it
                    update dbo.[SALESORDERDISCOUNTLIMITOVERRIDE] set
                        [NUMBEROFDISCOUNTSPERORDER] = @NUMBEROFDISCOUNTSPERORDER,
                        [CHANGEDBYID] = @CHANGEAGENTID,
                        [DATECHANGED] = @CURRENTDATE
                    where [ID] = @SALESORDERDISCOUNTLIMITOVERRIDEID;
                end
            end
            else if @ISLIMITED = 0 and @SALESORDERDISCOUNTLIMITOVERRIDEID is not null
            begin  --If we've changed it to not have a limit, but we already have a user-entered limit override value, delete it
                exec USP_SALESORDERDISCOUNTLIMITOVERRIDE_DELETEBYID_WITHCHANGEAGENTID @SALESORDERDISCOUNTLIMITOVERRIDEID, @CHANGEAGENTID;
            end
        end

        if @ISADJUSTABLEDISCOUNT = 1 or @SALESORDERMANUALDISCOUNTID is not null
        begin
            -- Discounts that are non-adjustable and have not already been added are calculated above.
            -- If we are now applying a discount that has already been applied, the user may have changed the number of times to apply, so we do need to recalculate.

            if (select APPLIESTOCODE from dbo.DISCOUNT where ID = @DISCOUNTID) = 1  -- Item-level
            begin
                -- No need to do this for an order-level discount, because they don't affect item-level calculations.
                exec dbo.USP_SALESORDER_APPLYITEMDISCOUNTS @SALESORDERID, @CHANGEAGENTID;
            end

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

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

end

return 0;