USP_REVENUE_UPDATEAPPLICATIONS_AUCTIONPACKAGES
This stored procedure will parse through the revenue streams collection, and update all auction items that have been changed, added, or removed.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUEID | uniqueidentifier | IN | |
@REVENUESTREAMS | xml | INOUT |
Definition
Copy
CREATE procedure dbo.USP_REVENUE_UPDATEAPPLICATIONS_AUCTIONPACKAGES
(
@REVENUEID uniqueidentifier,
@REVENUESTREAMS xml output
)
as
begin
--Handle auction package as revenuestream item here. The @ID of the revenuestream is the auctionitem id.
--An auction package does not have a corresponding revenue/revenuesplit record.
--However, all of its items do. We need to swap out the auction package for all
--of the auction item revenuesplits before it gets processed.
--All of the applications/streams that are not auction purchases will the same.
declare @APPLICATIONS table
(
ITEM xml,
APPLICATIONID uniqueidentifier,
APPLIED money
)
declare @AUCTIONITEMPACKAGES table
(
ID uniqueidentifier,
APPLIED money,
ORIGINALVALUE money
)
-- Parse out the applications
insert into @APPLICATIONS(ITEM,APPLICATIONID,APPLIED)
select T.c.query('./*'), T.c.value('(ID)[1]','uniqueidentifier') as 'ID', T.c.value('(APPLIED)[1]','money') as 'APPLIED'
from @REVENUESTREAMS.nodes('/REVENUESTREAMS/ITEM') as T(c)
-- Find the applications that are auction packages
insert into @AUCTIONITEMPACKAGES(ID,APPLIED,ORIGINALVALUE)
select AUCTIONITEM.ID, [Applications].APPLIED, dbo.UFN_AUCTIONITEM_GETVALUE(AUCTIONITEM.ID)
from
@APPLICATIONS [APPLICATIONS]
inner join dbo.AUCTIONITEM on [APPLICATIONS].APPLICATIONID = AUCTIONITEM.ID
inner join dbo.AUCTIONITEMREVENUEPURCHASE on AUCTIONITEM.ID = AUCTIONITEMREVENUEPURCHASE.AUCTIONITEMID
inner join dbo.REVENUE on AUCTIONITEMREVENUEPURCHASE.REVENUEPURCHASEID = REVENUE.ID
where REVENUE.ID = @REVENUEID and AUCTIONITEM.TYPECODE = 1
-- Delete the link to revenue from packages that have been removed from the applications
delete dbo.AUCTIONITEMREVENUEPURCHASE
from
dbo.AUCTIONITEM inner join dbo.AUCTIONITEMREVENUEPURCHASE on AUCTIONITEM.ID = AUCTIONITEMREVENUEPURCHASE.AUCTIONITEMID
where
AUCTIONITEMREVENUEPURCHASE.REVENUEPURCHASEID = @REVENUEID
and
(
(AUCTIONITEM.TYPECODE = 1 and AUCTIONITEM.ID not in (select ID from @AUCTIONITEMPACKAGES))
or
(AUCTIONITEM.TYPECODE = 0 and AUCTIONITEM.PACKAGEID is not null and AUCTIONITEM.PACKAGEID not in (select ID from @AUCTIONITEMPACKAGES))
)
-- Delete the link to revenue split from items in packages that have been removed from the applications
delete dbo.AUCTIONITEMPURCHASE
from
dbo.AUCTIONITEM inner join dbo.AUCTIONITEMPURCHASE on AUCTIONITEM.ID = AUCTIONITEMPURCHASE.AUCTIONITEMID
where
AUCTIONITEMPURCHASE.PURCHASEID in (select ID from dbo.REVENUESPLIT where REVENUEID = @REVENUEID)
and
(
(AUCTIONITEM.TYPECODE = 1 and AUCTIONITEM.ID not in (select ID from @AUCTIONITEMPACKAGES))
or
(AUCTIONITEM.TYPECODE = 0 and AUCTIONITEM.PACKAGEID is not null and AUCTIONITEM.PACKAGEID not in (select ID from @AUCTIONITEMPACKAGES))
)
-- Make sure there are actually auction packages in the applications
if (select count(*) from @AUCTIONITEMPACKAGES) < 1
return;
declare @PACKAGEID uniqueidentifier;
declare @ORIGINALPACKAGEVALUE money;
declare @PACKAGEPURCHASEPRICE money;
declare @APPLICATIONXML xml;
declare PACKAGECURSOR cursor local fast_forward
for select ID,APPLIED,ORIGINALVALUE from @AUCTIONITEMPACKAGES
--This cursor is used to iterate over the auction packages that are in the applications
--so we can add all items that are in the package correctly to the application collection
open PACKAGECURSOR
fetch next from PACKAGECURSOR into @PACKAGEID,@PACKAGEPURCHASEPRICE,@ORIGINALPACKAGEVALUE
while @@FETCH_STATUS = 0
begin
--Keep track of the items in the package, as we will have to re-prorate the amounts
declare @PACKAGEITEMS table
(
REVENUESPLITID uniqueidentifier,
APPLICATIONID uniqueidentifier,
REVENUESPLITAPPLICATIONCODE tinyint,
CURRENTAPPLIED money,
UPDATEDAMOUNT decimal(30,10),
ORIGINALVALUE money
)
insert into @PACKAGEITEMS(REVENUESPLITID,APPLICATIONID,CURRENTAPPLIED,REVENUESPLITAPPLICATIONCODE,ORIGINALVALUE)
select REVENUESPLIT.ID, AUCTIONITEM.ID, REVENUESPLIT.AMOUNT, REVENUESPLIT.APPLICATIONCODE, AUCTIONITEM.VALUE
from
dbo.AUCTIONITEM
inner join dbo.AUCTIONITEMPURCHASE on AUCTIONITEM.ID = AUCTIONITEMPURCHASE.AUCTIONITEMID
inner join dbo.REVENUESPLIT on AUCTIONITEMPURCHASE.PURCHASEID = REVENUESPLIT.ID
where
REVENUESPLIT.REVENUEID = @REVENUEID
and
AUCTIONITEM.PACKAGEID = @PACKAGEID
--Prorate the splits in case the amount for the package changed
update @PACKAGEITEMS
set UPDATEDAMOUNT = ROUND(CAST(ORIGINALVALUE as decimal(30,10))/CAST(@ORIGINALPACKAGEVALUE as decimal(30,10)) * CAST(@PACKAGEPURCHASEPRICE as decimal(30,10)),2)
declare @PRORATEDPURCHASEAMOUNT money = 0;
declare @ROUNDINGDIFFERENCE money = 0;
select @PRORATEDPURCHASEAMOUNT = SUM(UPDATEDAMOUNT) from @PACKAGEITEMS
set @ROUNDINGDIFFERENCE = @PACKAGEPURCHASEPRICE - @PRORATEDPURCHASEAMOUNT
--the difference should be very small, if there is one at all
--add the difference to the largest valued item
if @ROUNDINGDIFFERENCE <> 0
update @PACKAGEITEMS
set UPDATEDAMOUNT = UPDATEDAMOUNT + @ROUNDINGDIFFERENCE
where APPLICATIONID = (select top 1 APPLICATIONID from @PACKAGEITEMS where ORIGINALVALUE = (select MAX(ORIGINALVALUE) from @PACKAGEITEMS))
declare @APPLICATIONID uniqueidentifier;
declare @REVENUESPLITID uniqueidentifier;
declare @APPLIED money;
declare @REVENUESPLITAPPLICATIONCODE tinyint;
declare ITEMCURSOR cursor local fast_forward
for select REVENUESPLITID, APPLICATIONID, UPDATEDAMOUNT, REVENUESPLITAPPLICATIONCODE from @PACKAGEITEMS
--This cursor is used to add each item into the application/revenuestreams collection as its own item
open ITEMCURSOR
fetch next from ITEMCURSOR into @REVENUESPLITID, @APPLICATIONID, @APPLIED, @REVENUESPLITAPPLICATIONCODE
while @@FETCH_STATUS = 0
begin
select @APPLICATIONXML = (select @REVENUESPLITID as ID, @APPLICATIONID as APPLICATIONID,@APPLIED as APPLIED,@REVENUESPLITAPPLICATIONCODE as APPLICATIONCODE
for xml raw(''),type,elements,BINARY BASE64)
insert into @APPLICATIONS(ITEM)
values(@APPLICATIONXML)
fetch next from ITEMCURSOR into @REVENUESPLITID, @APPLICATIONID, @APPLIED, @REVENUESPLITAPPLICATIONCODE
end
CLOSE ITEMCURSOR;
DEALLOCATE ITEMCURSOR;
fetch next from PACKAGECURSOR into @PACKAGEID,@PACKAGEPURCHASEPRICE,@ORIGINALPACKAGEVALUE
end
CLOSE PACKAGECURSOR;
DEALLOCATE PACKAGECURSOR;
--delete the auction packages from the applications that we started with
delete @APPLICATIONS
where APPLICATIONID in (select ID from @AUCTIONITEMPACKAGES)
--update the revenue streams collection
select @REVENUESTREAMS = (select ITEM
from @APPLICATIONS
for xml raw(''),type,elements,root('REVENUESTREAMS'),BINARY BASE64)
end