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;