USP_DISCOUNT_CLONE
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@CLONEID | uniqueidentifier | INOUT |
Definition
Copy
CREATE procedure dbo.USP_DISCOUNT_CLONE
(
@ID uniqueidentifier,
@CLONEID uniqueidentifier = null output
)
as begin
-- WARNING
-- This SP does absolutely nothing. It originally existed so that we could know the exact configuration of a discount
-- at the time it was applied to an order, which would allow us to recalculate the discounted value of the order when
-- partially refunding it (since many discounts depend on the specific items in the order).
-- However, the decision has been made that we are not recalculating anything for completed orders.
-- Rather than undoing 20+ files, since that decision may change, the lower-risk solution is simply to not clone discounts and
-- make everything work the same way it used to.
-- /WARNING
-- if not exists (select 1 from dbo.SALESORDERITEMITEMDISCOUNT where DISCOUNTID = @ID)
-- and not exists (select 1 from dbo.SALESORDERITEMORDERDISCOUNT where DISCOUNTID = @ID)
-- begin
set @CLONEID = @ID;
return 0;
-- end
if @CLONEID is null set @CLONEID = newid();
declare @CURRENTDATETIME datetime = getdate();
declare @CHANGEAGENTID uniqueidentifier;
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
declare @APPLIESTOCODE tinyint;
declare @DISCOUNTTYPECODE tinyint;
declare @NAME nvarchar(max);
select
@APPLIESTOCODE = APPLIESTOCODE,
@DISCOUNTTYPECODE = DISCOUNTTYPECODE,
@NAME = NAME
from dbo.DISCOUNT where ID = @ID;
-- Update original to get around NAME uniqueness constraint in insert below
update dbo.DISCOUNT
set
NAME = NAME + ' - archived ' + convert(nvarchar(max), @CURRENTDATETIME, 121),
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATETIME
where ID = @ID;
-- Exact copy of original, except for ID and audit columns
insert into dbo.DISCOUNT (ID, NAME, [DESCRIPTION], APPLIESTOCODE, APPLICATIONTYPECODE, DISCOUNTTYPECODE, CALCULATIONTYPECODE, [PERCENT], AMOUNT, NUMBERTOPURCHASE, NUMBERTODISCOUNTTYPECODE, NUMBERTODISCOUNT, LIMITDISCOUNTSPERORDER, NUMBEROFDISCOUNTSPERORDER, DISCOUNTTICKETSFORCODE, APPLIESTOMERCHANDISE, APPLIESTOTICKETS, MERCHANDISEAMOUNT, MERCHANDISEPERCENT, QUALIFYINGITEMTYPECODE, DISCOUNTITEMTYPECODE, DISCOUNTMERCHANDISEFORCODE, ISACTIVE, ORIGINALDISCOUNTID, SUPERSEDEDBYID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select @CLONEID, @NAME, [DESCRIPTION], APPLIESTOCODE, APPLICATIONTYPECODE, DISCOUNTTYPECODE, CALCULATIONTYPECODE, [PERCENT], AMOUNT, NUMBERTOPURCHASE, NUMBERTODISCOUNTTYPECODE, NUMBERTODISCOUNT, LIMITDISCOUNTSPERORDER, NUMBEROFDISCOUNTSPERORDER, DISCOUNTTICKETSFORCODE, APPLIESTOMERCHANDISE, APPLIESTOTICKETS, MERCHANDISEAMOUNT, MERCHANDISEPERCENT, QUALIFYINGITEMTYPECODE, DISCOUNTITEMTYPECODE, DISCOUNTMERCHANDISEFORCODE, ISACTIVE, ORIGINALDISCOUNTID, null, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATETIME, @CURRENTDATETIME
from dbo.DISCOUNT
where ID = @ID;
update dbo.DISCOUNT
set
ISACTIVE = 0,
SUPERSEDEDBYID = @CLONEID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATETIME
where ID = @ID;
if @APPLIESTOCODE = 1
begin
-- Copy DISCOUNT sub-tables for item-level discounts
insert into dbo.DISCOUNTPRICETYPE (ID, DISCOUNTID, PRICETYPECODEID, [PERCENT], AMOUNT, SEQUENCE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select newid(), @CLONEID, PRICETYPECODEID, [PERCENT], AMOUNT, SEQUENCE, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATETIME, @CURRENTDATETIME
from dbo.DISCOUNTPRICETYPE
where DISCOUNTID = @ID;
-- Many tables reference DISCOUNTGROUP or DISCOUNTGROUPDETAIL, so we have to store their ID's.
declare @NEWDISCOUNTGROUPIDS table (OLDID uniqueidentifier, NEWID uniqueidentifier);
declare @NEWDISCOUNTGROUPDETAILIDS table (OLDID uniqueidentifier, NEWID uniqueidentifier);
begin -- DISCOUNTGROUP
insert into @NEWDISCOUNTGROUPIDS
select ID, newid()
from dbo.DISCOUNTGROUP
where DISCOUNTID = @ID;
insert into dbo.DISCOUNTGROUP (ID, DISCOUNTID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select NEWDISCOUNTGROUPIDS.NEWID, @CLONEID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATETIME, @CURRENTDATETIME
from dbo.DISCOUNTGROUP
inner join @NEWDISCOUNTGROUPIDS NEWDISCOUNTGROUPIDS on NEWDISCOUNTGROUPIDS.OLDID = DISCOUNTGROUP.ID;
end
begin -- DISCOUNTGROUPDETAIL
insert into @NEWDISCOUNTGROUPDETAILIDS
select ID, newid()
from dbo.DISCOUNTGROUPDETAIL
where DISCOUNTGROUPID in (select OLDID from @NEWDISCOUNTGROUPIDS);
insert into dbo.DISCOUNTGROUPDETAIL (ID, DISCOUNTGROUPID, DISCOUNTEDITEM, DISCOUNTGROUPDETAILAPPLICATIONCODE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select NEWDISCOUNTGROUPDETAILIDS.NEWID, NEWDISCOUNTGROUPIDS.NEWID, DISCOUNTEDITEM, DISCOUNTGROUPDETAILAPPLICATIONCODE, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATETIME, @CURRENTDATETIME
from dbo.DISCOUNTGROUPDETAIL
inner join @NEWDISCOUNTGROUPDETAILIDS NEWDISCOUNTGROUPDETAILIDS on NEWDISCOUNTGROUPDETAILIDS.OLDID = DISCOUNTGROUPDETAIL.ID
inner join @NEWDISCOUNTGROUPIDS NEWDISCOUNTGROUPIDS on NEWDISCOUNTGROUPIDS.OLDID = DISCOUNTGROUPDETAIL.DISCOUNTGROUPID;
end
begin -- DISCOUNTGROUPDETAILPROGRAM
insert into dbo.DISCOUNTGROUPDETAILPROGRAM (ID, PROGRAMID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select NEWDISCOUNTGROUPDETAILIDS.NEWID, PROGRAMID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATETIME, @CURRENTDATETIME
from dbo.DISCOUNTGROUPDETAILPROGRAM
inner join @NEWDISCOUNTGROUPDETAILIDS NEWDISCOUNTGROUPDETAILIDS on NEWDISCOUNTGROUPDETAILIDS.OLDID = DISCOUNTGROUPDETAILPROGRAM.ID;
end
begin -- DISCOUNTGROUPDETAILMERCHANDISEDEPARTMENT
insert into dbo.DISCOUNTGROUPDETAILMERCHANDISEDEPARTMENT (ID, MERCHANDISEDEPARTMENTID, SEQUENCE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select NEWDISCOUNTGROUPDETAILIDS.NEWID, MERCHANDISEDEPARTMENTID, SEQUENCE, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATETIME, @CURRENTDATETIME
from dbo.DISCOUNTGROUPDETAILMERCHANDISEDEPARTMENT
inner join @NEWDISCOUNTGROUPDETAILIDS NEWDISCOUNTGROUPDETAILIDS on NEWDISCOUNTGROUPDETAILIDS.OLDID = DISCOUNTGROUPDETAILMERCHANDISEDEPARTMENT.ID;
end
begin -- DISCOUNTGROUPDETAILMERCHANDISEITEM
insert into dbo.DISCOUNTGROUPDETAILMERCHANDISEITEM (ID, MERCHANDISEITEMID, SEQUENCE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select NEWDISCOUNTGROUPDETAILIDS.NEWID, MERCHANDISEITEMID, SEQUENCE, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATETIME, @CURRENTDATETIME
from dbo.DISCOUNTGROUPDETAILMERCHANDISEITEM
inner join @NEWDISCOUNTGROUPDETAILIDS NEWDISCOUNTGROUPDETAILIDS on NEWDISCOUNTGROUPDETAILIDS.OLDID = DISCOUNTGROUPDETAILMERCHANDISEITEM.ID;
end
begin -- GROUPSIZEDISCOUNT (by quantity)
insert into dbo.GROUPSIZEDISCOUNT (ID, DISCOUNTID, GROUPSIZE, [PERCENT], AMOUNT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select newid(), @CLONEID, GROUPSIZE, [PERCENT], AMOUNT, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATETIME, @CURRENTDATETIME
from dbo.GROUPSIZEDISCOUNT
where DISCOUNTID = @ID;
end
begin -- DISCOUNTQUALIFYINGPRICETYPE
insert into dbo.DISCOUNTQUALIFYINGPRICETYPE (ID, DISCOUNTID, PRICETYPECODEID, SEQUENCE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select newid(), @CLONEID, PRICETYPECODEID, SEQUENCE, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATETIME, @CURRENTDATETIME
from dbo.DISCOUNTQUALIFYINGPRICETYPE
where DISCOUNTID = @ID;
end
end
-- Update references on tables that don't need to be copied (these do not affect calculations, only availability to the customer).
update dbo.PROMOTIONALCODE
set DISCOUNTID = @CLONEID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATETIME
where DISCOUNTID = @ID
update dbo.DISCOUNTADDRESS
set ID = @CLONEID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATETIME
where ID = @ID;
update dbo.DISCOUNTAVAILABILITY
set DISCOUNTID = @CLONEID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATETIME
where DISCOUNTID = @ID;
update dbo.DISCOUNTCONSTITUENCY
set DISCOUNTID = @CLONEID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATETIME
where DISCOUNTID = @ID;
update dbo.DISCOUNTGLMAPPING
set ID = @CLONEID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATETIME
where ID = @ID;
update dbo.DISCOUNTMEMBER
set DISCOUNTID = @CLONEID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATETIME
where DISCOUNTID = @ID;
update dbo.DISCOUNTTAX
set DISCOUNTID = @CLONEID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATETIME
where DISCOUNTID = @ID;
update dbo.PROGRAMDISCOUNT
set DISCOUNTID = @CLONEID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATETIME
where DISCOUNTID = @ID;
update dbo.SALESMETHODDISCOUNT
set DISCOUNTID = @CLONEID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATETIME
where DISCOUNTID = @ID;
update dbo.DAILYSALEITEMDISCOUNT
set DISCOUNTID = @CLONEID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATETIME
where DISCOUNTID = @ID;
end