USP_SALESORDER_CALCULATETAXES
Calculates taxes for an order.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ORDERID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_SALESORDER_CALCULATETAXES
(
@ORDERID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier
)
as
set nocount on;
if dbo.UFN_SALESORDER_ISTAXEXEMPT(@ORDERID) = 1 begin
return;
end
declare @CURRENTDATE datetime;
set @CURRENTDATE = getdate();
declare @contextCache varbinary(128);
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
declare @SALESMETHODTYPECODE tinyint
select @SALESMETHODTYPECODE = SALESMETHODTYPECODE from dbo.SALESORDER where ID = @ORDERID
declare @ORDERTICKET table
(
ID uniqueidentifier,
PROGRAMID uniqueidentifier,
TOTAL money
)
insert into @ORDERTICKET
select
SALESORDERITEM.ID,
SALESORDERITEMTICKET.PROGRAMID,
SALESORDERITEM.TOTAL
from
dbo.SALESORDERITEM
inner join
dbo.SALESORDERITEMTICKET on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
where
SALESORDERITEM.SALESORDERID = @ORDERID
and SALESORDERITEM.PRICINGSTRUCTURECODE <> 1; -- Flat rate
declare @MERCHANDISETAXES table
(
TAXID uniqueidentifier,
TAXNAME nvarchar(100),
TOTALTAX decimal(7,4),
SALESORDERITEMID uniqueidentifier,
SALESORDERITEMTOTAL money
);
insert into @MERCHANDISETAXES
select
TAX.ID,
TAX.NAME,
TAX.TOTALTAX,
SALESORDERITEM.ID,
SALESORDERITEM.TOTAL
from
dbo.SALESORDERITEM
inner join
dbo.SALESORDERITEMMERCHANDISE on SALESORDERITEMMERCHANDISE.ID = SALESORDERITEM.ID
inner join
dbo.MERCHANDISEPRODUCTINSTANCE on MERCHANDISEPRODUCTINSTANCE.ID = SALESORDERITEMMERCHANDISE.MERCHANDISEPRODUCTINSTANCEID
inner join
dbo.MERCHANDISEPRODUCT on MERCHANDISEPRODUCT.ID = MERCHANDISEPRODUCTINSTANCE.MERCHANDISEPRODUCTID
inner join
dbo.TAX on TAX.ID = MERCHANDISEPRODUCT.TAXID
where
SALESORDERITEM.SALESORDERID = @ORDERID
and TAX.ISACTIVE = 1
and SALESORDERITEM.PRICINGSTRUCTURECODE <> 1 -- Flat rate
and MERCHANDISEPRODUCT.TAXID is not null
begin try
-- Taxes table variable... contains all taxes in current order, including a bit to describe the kind of tax.
declare @TAXES table
(
ID uniqueidentifier,
TAXID uniqueidentifier,
TAXNAME nvarchar(100),
TOTALS money,
TOTALTAX decimal(7,4),
ISPROGRAMTAX bit
)
-- Inserting program taxes
insert into @TAXES
select
null,
TAX.ID,
TAX.NAME,
sum(ITEMAMOUNTPAID.TOTALAFTERDISCOUNTS) * TAX.TOTALTAX * .01,
TAX.TOTALTAX,
1
from dbo.TAX
inner join dbo.PROGRAMTAX on PROGRAMTAX.TAXID = TAX.ID
inner join @ORDERTICKET OT on OT.PROGRAMID = PROGRAMTAX.PROGRAMID
outer apply (
select sum(SALESORDERITEMITEMDISCOUNT.AMOUNT) TOTAL
from dbo.SALESORDERITEMITEMDISCOUNT
where SALESORDERITEMITEMDISCOUNT.SALESORDERITEMID = OT.ID
) ITEMDISCOUNTS
outer apply (
select sum(SALESORDERITEMORDERDISCOUNTDETAIL.AMOUNT) TOTAL
from dbo.SALESORDERITEMORDERDISCOUNTDETAIL
where SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMID = OT.ID
) ORDERDISCOUNTS
cross apply (
select OT.TOTAL - coalesce(ITEMDISCOUNTS.TOTAL, 0) - coalesce(ORDERDISCOUNTS.TOTAL, 0) as TOTALAFTERDISCOUNTS
) as ITEMAMOUNTPAID
where
TAX.ISACTIVE = 1
group by TAX.ID, TAX.TOTALTAX, TAX.NAME;
-- Inserting fee taxes
insert into @TAXES
select
null,
TAX.ID as TAXID,
TAX.NAME,
round((isnull(SUM(SALESORDERITEM.TOTAL),0) * TAX.TOTALTAX * .01),2),
TAX.TOTALTAX,
0
from dbo.SALESORDERITEM
inner join dbo.SALESORDERITEMFEE on SALESORDERITEM.ID = SALESORDERITEMFEE.ID
inner join dbo.FEETAX on FEETAX.FEEID = SALESORDERITEMFEE.FEEID
inner join dbo.TAX on TAX.ID = FEETAX.TAXID
where
SALESORDERITEM.SALESORDERID = @ORDERID and
TAX.ISACTIVE = 1 and
[SALESORDERITEM].PRICINGSTRUCTURECODE <> 1 -- Flat rate
group by TAX.ID, TAX.TOTALTAX, TAX.NAME
-- Inserting itinerary supply/equipment resource taxes
insert into @TAXES
select
null,
TAX.ID as TAXID,
TAX.NAME,
round((isnull(SUM(SALESORDERITEM.TOTAL),0) * TAX.TOTALTAX * .01),2),
TAX.TOTALTAX,
0
from dbo.SALESORDERITEM
inner join dbo.SALESORDERITEMITINERARYRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYRESOURCE.SALESORDERITEMID
inner join dbo.ITINERARYRESOURCE on SALESORDERITEMITINERARYRESOURCE.ITINERARYRESOURCEID = ITINERARYRESOURCE.ID
inner join dbo.RESOURCETAX on ITINERARYRESOURCE.RESOURCEID = RESOURCETAX.RESOURCEID
inner join dbo.TAX on TAX.ID = RESOURCETAX.TAXID
where
SALESORDERITEM.SALESORDERID = @ORDERID and
TAX.ISACTIVE = 1 and
[SALESORDERITEM].PRICINGSTRUCTURECODE <> 1 -- Flat rate
group by TAX.ID, TAX.TOTALTAX, TAX.NAME
-- Inserting itinerary item supply/equipment resource taxes
insert into @TAXES
select
null,
TAX.ID as TAXID,
TAX.NAME,
round((isnull(SUM(SALESORDERITEM.TOTAL),0) * TAX.TOTALTAX * .01),2),
TAX.TOTALTAX,
0
from dbo.SALESORDERITEM
inner join dbo.SALESORDERITEMITINERARYITEMRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYITEMRESOURCE.SALESORDERITEMID
inner join dbo.ITINERARYITEMRESOURCE on SALESORDERITEMITINERARYITEMRESOURCE.ITINERARYITEMRESOURCEID = ITINERARYITEMRESOURCE.ID
inner join dbo.RESOURCETAX on ITINERARYITEMRESOURCE.RESOURCEID = RESOURCETAX.RESOURCEID
inner join dbo.TAX on TAX.ID = RESOURCETAX.TAXID
where
SALESORDERITEM.SALESORDERID = @ORDERID and
TAX.ISACTIVE = 1 and
[SALESORDERITEM].PRICINGSTRUCTURECODE <> 1 -- Flat rate
group by TAX.ID, TAX.TOTALTAX, TAX.NAME
-- Inserting itinerary staffing resource taxes
insert into @TAXES
select
null,
TAX.ID as TAXID,
TAX.NAME,
round((isnull(SUM(SALESORDERITEM.TOTAL),0) * TAX.TOTALTAX * .01),2),
TAX.TOTALTAX,
0
from dbo.SALESORDERITEM
inner join dbo.SALESORDERITEMITINERARYSTAFFRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYSTAFFRESOURCE.SALESORDERITEMID
inner join dbo.ITINERARYSTAFFRESOURCE on SALESORDERITEMITINERARYSTAFFRESOURCE.ITINERARYSTAFFRESOURCEID = ITINERARYSTAFFRESOURCE.ID
inner join dbo.VOLUNTEERTYPETAX on ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID = VOLUNTEERTYPETAX.VOLUNTEERTYPEID
inner join dbo.TAX on TAX.ID = VOLUNTEERTYPETAX.TAXID
where
SALESORDERITEM.SALESORDERID = @ORDERID and
TAX.ISACTIVE = 1 and
[SALESORDERITEM].PRICINGSTRUCTURECODE <> 1 -- Flat rate
group by TAX.ID, TAX.TOTALTAX, TAX.NAME
-- Inserting itinerary item staffing resource taxes
insert into @TAXES
select
null,
TAX.ID as TAXID,
TAX.NAME,
round((isnull(SUM(SALESORDERITEM.TOTAL),0) * TAX.TOTALTAX * .01),2),
TAX.TOTALTAX,
0
from dbo.SALESORDERITEM
inner join dbo.SALESORDERITEMITINERARYITEMSTAFFRESOURCE on SALESORDERITEM.ID = SALESORDERITEMITINERARYITEMSTAFFRESOURCE.SALESORDERITEMID
inner join dbo.ITINERARYITEMSTAFFRESOURCE on SALESORDERITEMITINERARYITEMSTAFFRESOURCE.ITINERARYITEMSTAFFRESOURCEID = ITINERARYITEMSTAFFRESOURCE.ID
inner join dbo.VOLUNTEERTYPETAX on ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID = VOLUNTEERTYPETAX.VOLUNTEERTYPEID
inner join dbo.TAX on TAX.ID = VOLUNTEERTYPETAX.TAXID
where
SALESORDERITEM.SALESORDERID = @ORDERID and
TAX.ISACTIVE = 1 and
[SALESORDERITEM].PRICINGSTRUCTURECODE <> 1 -- Flat rate
group by TAX.ID, TAX.TOTALTAX, TAX.NAME
-- Inserting merchandise taxes
insert into @TAXES
select
null,
MERCHANDISETAXES.TAXID,
MERCHANDISETAXES.TAXNAME,
sum(ITEMAMOUNTPAID.TOTALAFTERDISCOUNTS) * MERCHANDISETAXES.TOTALTAX * .01,
MERCHANDISETAXES.TOTALTAX,
0
from
@MERCHANDISETAXES as MERCHANDISETAXES
outer apply (
select sum(SALESORDERITEMITEMDISCOUNT.AMOUNT) TOTAL
from dbo.SALESORDERITEMITEMDISCOUNT
where SALESORDERITEMITEMDISCOUNT.SALESORDERITEMID = MERCHANDISETAXES.SALESORDERITEMID
) ITEMDISCOUNTS
outer apply (
select sum(SALESORDERITEMORDERDISCOUNTDETAIL.AMOUNT) TOTAL
from dbo.SALESORDERITEMORDERDISCOUNTDETAIL
where SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMID = MERCHANDISETAXES.SALESORDERITEMID
) ORDERDISCOUNTS
cross apply (
select MERCHANDISETAXES.SALESORDERITEMTOTAL - coalesce(ITEMDISCOUNTS.TOTAL, 0) - coalesce(ORDERDISCOUNTS.TOTAL, 0) as TOTALAFTERDISCOUNTS
) as ITEMAMOUNTPAID
group by
MERCHANDISETAXES.TAXID, MERCHANDISETAXES.TOTALTAX, MERCHANDISETAXES.TAXNAME;
-- Removing taxes for $0
delete from @TAXES
where round([TOTALS],2) = 0
-- Only attempt update or insert taxes if needed
if exists(select * from @TAXES) begin
-- Updating the IDs of the SOIs that already exist
update @TAXES set
TAXES.ID = SALESORDERITEM.ID
from @TAXES TAXES
inner join dbo.SALESORDERITEMTAX on
TAXES.TAXID = SALESORDERITEMTAX.TAXID
inner join dbo.SALESORDERITEM on
SALESORDERITEMTAX.TAXITEMID = SALESORDERITEM.ID
where
SALESORDERITEM.TYPECODE = 4 and
SALESORDERITEM.SALESORDERID = @ORDERID;
-- Updating the Tax SALESORDERITEM(s) to reflect new totals.
with TAXTOTALS_CTE as
(
select
ID as SALESORDERITEMID,
round(sum(TOTALS),2) as TOTAL
from @TAXES
where ID is not null
group by ID
)
update dbo.SALESORDERITEM with (rowlock) set
PRICE = TAXTOTALS_CTE.TOTAL,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from TAXTOTALS_CTE
where
TAXTOTALS_CTE.SALESORDERITEMID = SALESORDERITEM.ID
-- Prepare new taxes for insertion, taxes with null IDs do not exist as taxes yet
declare @TAXESTOTAL table
(
ID uniqueidentifier,
TAXNAME nvarchar(100),
TOTALS decimal(20,4),
TOTALTAX decimal(20, 4)
)
insert into @TAXESTOTAL
select
newid(),
TAXES.TAXNAME,
round(sum(TAXES.TOTALS),2),
TAXES.TOTALTAX
from @TAXES TAXES
where TAXES.ID is null
group by TAXES.TAXNAME, TAXES.TOTALTAX
-- Inserting Tax SALESORDERITEM(s)
insert into dbo.SALESORDERITEM
(
ID,
SALESORDERID,
TYPECODE,
DESCRIPTION,
QUANTITY,
PRICE,
[PERCENT],
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED,
ASSEMBLYNAME, SYSTEMTYPENAME
)
select
TAXES.ID,
@ORDERID,
4,
TAXES.TAXNAME,
1,
TAXES.TOTALS,
TAXES.TOTALTAX,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE,
case @SALESMETHODTYPECODE when 2 then 'Blackbaud.AppFx.CMS.FCL.ShoppingCart.SalesOrder' else '' end,
case @SALESMETHODTYPECODE when 2 then 'Blackbaud.AppFx.ContentManagement.FrameworkClassLibrary.ShoppingCart.SalesOrder.TaxItem' else '' end
from @TAXESTOTAL TAXES
-- Updating the IDs of the SOIs that already exist, need this update to properly link all SALESORDERITEMTAX items.
update @TAXES set
ID = TAXESTOTAL.ID
from @TAXESTOTAL TAXESTOTAL
where
TAXESTOTAL.TOTALTAX = [@TAXES].TOTALTAX and
TAXESTOTAL.TAXNAME = [@TAXES].TAXNAME;
-- Inserting linking items.. Program Taxes first
insert into dbo.SALESORDERITEMTAX
(
TAXID,
TAXNAME,
SALESORDERITEMID,
TAXITEMID,
TOTALTAX,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
TAX.ID,
TAX.NAME,
OT.ID,
TAXES.ID,
TAX.TOTALTAX,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
from dbo.TAX
inner join dbo.PROGRAMTAX on PROGRAMTAX.TAXID = TAX.ID
inner join @TAXES TAXES on TAXES.TAXID = TAX.ID
inner join @ORDERTICKET OT on
OT.PROGRAMID = PROGRAMTAX.PROGRAMID
where
not exists
(
select * from dbo.SALESORDERITEMTAX
inner join @TAXES TAXES on
SALESORDERITEMTAX.TAXID = TAXES.TAXID and
SALESORDERITEMTAX.TAXITEMID = TAXES.ID
where
SALESORDERITEMTAX.SALESORDERITEMID = OT.ID
) and
TAXES.ISPROGRAMTAX = 1
group by TAX.ID, TAX.NAME, OT.ID, TAXES.ID, TAX.TOTALTAX
-- Fee Taxes
insert into dbo.SALESORDERITEMTAX
(
TAXID,
TAXNAME,
SALESORDERITEMID,
TAXITEMID,
TOTALTAX,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
TAX.ID,
TAX.NAME,
SALESORDERITEM.ID,
TAXES.ID,
TAX.TOTALTAX,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
from dbo.TAX
inner join dbo.FEETAX on FEETAX.TAXID = TAX.ID
inner join @TAXES TAXES on TAXES.TAXID = TAX.ID
inner join dbo.SALESORDERITEMFEE on SALESORDERITEMFEE.FEEID = FEETAX.FEEID
inner join dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMFEE.ID
where
not exists
(
select * from dbo.SALESORDERITEMTAX SOIT
where
SOIT.TAXID = TAXES.TAXID and
SOIT.SALESORDERITEMID = SALESORDERITEM.ID and
SOIT.TAXITEMID = TAXES.ID
) and
TAXES.ISPROGRAMTAX = 0 and
SALESORDERITEM.SALESORDERID = @ORDERID
group by TAX.ID, TAX.NAME, SALESORDERITEM.ID, TAXES.ID, TAX.TOTALTAX
-- Inserting itinerary supply/equipment resource taxes
insert into dbo.SALESORDERITEMTAX
(
TAXID,
TAXNAME,
SALESORDERITEMID,
TAXITEMID,
TOTALTAX,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
TAX.ID,
TAX.NAME,
SALESORDERITEM.ID,
TAXES.ID,
TAX.TOTALTAX,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
from dbo.TAX
inner join dbo.RESOURCETAX on RESOURCETAX.TAXID = TAX.ID
inner join @TAXES TAXES on TAXES.TAXID = TAX.ID
inner join dbo.ITINERARYRESOURCE on RESOURCETAX.RESOURCEID = ITINERARYRESOURCE.RESOURCEID
inner join dbo.SALESORDERITEMITINERARYRESOURCE on ITINERARYRESOURCE.ID = SALESORDERITEMITINERARYRESOURCE.ITINERARYRESOURCEID
inner join dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMITINERARYRESOURCE.SALESORDERITEMID
where
not exists
(
select * from dbo.SALESORDERITEMTAX SOIT
where
SOIT.TAXID = TAXES.TAXID and
SOIT.SALESORDERITEMID = SALESORDERITEM.ID and
SOIT.TAXITEMID = TAXES.ID
) and
TAXES.ISPROGRAMTAX = 0 and
SALESORDERITEM.SALESORDERID = @ORDERID
group by TAX.ID, TAX.NAME, SALESORDERITEM.ID, TAXES.ID, TAX.TOTALTAX
-- Inserting itinerary item supply/equipment resource taxes
insert into dbo.SALESORDERITEMTAX
(
TAXID,
TAXNAME,
SALESORDERITEMID,
TAXITEMID,
TOTALTAX,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
TAX.ID,
TAX.NAME,
SALESORDERITEM.ID,
TAXES.ID,
TAX.TOTALTAX,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
from dbo.TAX
inner join dbo.RESOURCETAX on RESOURCETAX.TAXID = TAX.ID
inner join @TAXES TAXES on TAXES.TAXID = TAX.ID
inner join dbo.ITINERARYITEMRESOURCE on RESOURCETAX.RESOURCEID = ITINERARYITEMRESOURCE.RESOURCEID
inner join dbo.SALESORDERITEMITINERARYITEMRESOURCE on ITINERARYITEMRESOURCE.ID = SALESORDERITEMITINERARYITEMRESOURCE.ITINERARYITEMRESOURCEID
inner join dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMITINERARYITEMRESOURCE.SALESORDERITEMID
where
not exists
(
select * from dbo.SALESORDERITEMTAX SOIT
where
SOIT.TAXID = TAXES.TAXID and
SOIT.SALESORDERITEMID = SALESORDERITEM.ID and
SOIT.TAXITEMID = TAXES.ID
) and
TAXES.ISPROGRAMTAX = 0 and
SALESORDERITEM.SALESORDERID = @ORDERID
group by TAX.ID, TAX.NAME, SALESORDERITEM.ID, TAXES.ID, TAX.TOTALTAX
-- Inserting itinerary staffing resource taxes
insert into dbo.SALESORDERITEMTAX
(
TAXID,
TAXNAME,
SALESORDERITEMID,
TAXITEMID,
TOTALTAX,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
TAX.ID,
TAX.NAME,
SALESORDERITEM.ID,
TAXES.ID,
TAX.TOTALTAX,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
from dbo.TAX
inner join dbo.VOLUNTEERTYPETAX on VOLUNTEERTYPETAX.TAXID = TAX.ID
inner join @TAXES TAXES on TAXES.TAXID = TAX.ID
inner join dbo.ITINERARYSTAFFRESOURCE on VOLUNTEERTYPETAX.VOLUNTEERTYPEID = ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID
inner join dbo.SALESORDERITEMITINERARYSTAFFRESOURCE on ITINERARYSTAFFRESOURCE.ID = SALESORDERITEMITINERARYSTAFFRESOURCE.ITINERARYSTAFFRESOURCEID
inner join dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMITINERARYSTAFFRESOURCE.SALESORDERITEMID
where
not exists
(
select * from dbo.SALESORDERITEMTAX SOIT
where
SOIT.TAXID = TAXES.TAXID and
SOIT.SALESORDERITEMID = SALESORDERITEM.ID and
SOIT.TAXITEMID = TAXES.ID
) and
TAXES.ISPROGRAMTAX = 0 and
SALESORDERITEM.SALESORDERID = @ORDERID
group by TAX.ID, TAX.NAME, SALESORDERITEM.ID, TAXES.ID, TAX.TOTALTAX
-- Inserting itinerary item staffing resource taxes
insert into dbo.SALESORDERITEMTAX
(
TAXID,
TAXNAME,
SALESORDERITEMID,
TAXITEMID,
TOTALTAX,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
TAX.ID,
TAX.NAME,
SALESORDERITEM.ID,
TAXES.ID,
TAX.TOTALTAX,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
from dbo.TAX
inner join dbo.VOLUNTEERTYPETAX on VOLUNTEERTYPETAX.TAXID = TAX.ID
inner join @TAXES TAXES on TAXES.TAXID = TAX.ID
inner join dbo.ITINERARYITEMSTAFFRESOURCE on VOLUNTEERTYPETAX.VOLUNTEERTYPEID = ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID
inner join dbo.SALESORDERITEMITINERARYITEMSTAFFRESOURCE on ITINERARYITEMSTAFFRESOURCE.ID = SALESORDERITEMITINERARYITEMSTAFFRESOURCE.ITINERARYITEMSTAFFRESOURCEID
inner join dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMITINERARYITEMSTAFFRESOURCE.SALESORDERITEMID
where
not exists
(
select * from dbo.SALESORDERITEMTAX SOIT
where
SOIT.TAXID = TAXES.TAXID and
SOIT.SALESORDERITEMID = SALESORDERITEM.ID and
SOIT.TAXITEMID = TAXES.ID
) and
TAXES.ISPROGRAMTAX = 0 and
SALESORDERITEM.SALESORDERID = @ORDERID
group by TAX.ID, TAX.NAME, SALESORDERITEM.ID, TAXES.ID, TAX.TOTALTAX
-- Inserting merchandise taxes
insert into dbo.SALESORDERITEMTAX
(
TAXID,
TAXNAME,
SALESORDERITEMID,
TAXITEMID,
TOTALTAX,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
MERCHANDISETAXES.TAXID,
MERCHANDISETAXES.TAXNAME,
MERCHANDISETAXES.SALESORDERITEMID,
MERCHANDISETAXITEM.ID,
MERCHANDISETAXES.TOTALTAX,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
from
@MERCHANDISETAXES MERCHANDISETAXES
cross apply (
select top 1 TAXES.ID
from @TAXES as TAXES
where TAXES.ISPROGRAMTAX = 0 and TAXES.TAXID = MERCHANDISETAXES.TAXID
) as MERCHANDISETAXITEM
where
not exists
(
select * from dbo.SALESORDERITEMTAX SOIT
where
SOIT.TAXID = MERCHANDISETAXES.TAXID and
SOIT.SALESORDERITEMID = MERCHANDISETAXES.SALESORDERITEMID and
SOIT.TAXITEMID = MERCHANDISETAXITEM.ID
);
end
-- Deleting taxes that no longer exist.
declare @TAXESTOBEDELETED table (ID uniqueidentifier)
insert into @TAXESTOBEDELETED
select ID from dbo.SALESORDERITEM with (nolock)
where
SALESORDERID = @ORDERID and
TYPECODE = 4 and
not exists
(
select 1 from @TAXES TAXES
where TAXES.ID = SALESORDERITEM.ID
)
if @@rowcount > 0 begin
set @contextCache = CONTEXT_INFO();
set CONTEXT_INFO @CHANGEAGENTID;
delete from dbo.SALESORDERITEMTAX
where TAXITEMID in (select ID from @TAXESTOBEDELETED);
delete from dbo.SALESORDERITEM with (rowlock)
where ID in (select ID from @TAXESTOBEDELETED);
if @contextCache is not null begin
set CONTEXT_INFO @contextCache;
end
end
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;