UFN_REVENUE_GENERATEAUCTIONPURCHASEGLDISTRIBUTION
Generates GL Account Code for auction purchases from the account code mappings defined in the system.
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUEID | uniqueidentifier | IN | |
@IGNOREREVENUEID | uniqueidentifier | IN |
Definition
Copy
CREATE function dbo.UFN_REVENUE_GENERATEAUCTIONPURCHASEGLDISTRIBUTION
(
@REVENUEID uniqueidentifier,
@IGNOREREVENUEID uniqueidentifier
)
returns @DISTRIBUTIONS table
(
REVENUEID uniqueidentifier,
GLPAYMENTMETHODREVENUETYPEMAPPINGID uniqueidentifier,
TRANSACTIONTYPECODE tinyint,
POSTDATE datetime,
POSTSTATUSCODE tinyint,
ACCOUNTSTRING nvarchar(100),
PROJECT nvarchar(100) ,
AMOUNT money,
REFERENCE nvarchar(255),
ERRORMESSAGE nvarchar(max),
PAYMENTMETHODCODE tinyint,
REVENUETRANSACTIONTYPECODE tinyint,
ACCOUNTID uniqueidentifier,
REVENUESPLITTYPECODE tinyint,
AUCTIONITEMVALUE money,
AUCTIONITEMPOSTSTATUSCODE tinyint,
REVENUEPURCHASEID uniqueidentifier,
AUCTIONITEMPURCHASEAMOUNT money,
REVENUESPLITAMOUNT money
)
as
begin
--The distributions for auction items/auction item purchases are different than
--everything else in the system. Auction items can be purchased by multiple
--revenue transactions, and we have to calculate a all distributions based off of all
--the postable payments towards the auction item.
--When one payment changes, we must re-calculate all of the distributions!!
--If the @IGNOREREVENUEID is not null, then we do not count any revenue towards auction items
--with that ID
declare @AUCTIONITEMS table
(
ID uniqueidentifier,
REVENUEAUCTIONDONATIONID uniqueidentifier,
VALUE money,
DONOTPOST tinyint,
PAYMENTCOUNT int
)
--Start by finding all items that are affected by this payment
insert into @AUCTIONITEMS
select
AUCTIONITEM.ID,
AUCTIONITEM.REVENUEAUCTIONDONATIONID,
AUCTIONITEM.VALUE,
REVENUE.DONOTPOST,
count(AUCTIONITEMREVENUEPURCHASE.ID)
from
dbo.AUCTIONITEMREVENUEPURCHASE
inner join dbo.AUCTIONITEM on AUCTIONITEMREVENUEPURCHASE.AUCTIONITEMID = AUCTIONITEM.ID
inner join dbo.REVENUE on AUCTIONITEMREVENUEPURCHASE.REVENUEPURCHASEID = REVENUE.ID
left join dbo.REVENUEPOSTED on REVENUE.ID = REVENUEPOSTED.ID
where
AUCTIONITEM.ID in (select AUCTIONITEMID from dbo.AUCTIONITEMREVENUEPURCHASE [AUCTIONITEMPURCHASE] where [AUCTIONITEMPURCHASE].REVENUEPURCHASEID = @REVENUEID)
group by AUCTIONITEM.ID,AUCTIONITEM.REVENUEAUCTIONDONATIONID,AUCTIONITEM.VALUE,REVENUE.DONOTPOST
-- Create a cursor to generate new distributions for affected items/payments
-- We do that by finding all payment records that helped pay for the items
declare @PERCENTAGEOFTOTALPURCHASE decimal(30,10) = 0;
declare @AUCTIONITEM_CURRENTPAYMENTCOUNT int = 0;
declare @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID uniqueidentifier,@PAYMENTCURSOR_REVENUEPURCHASEID uniqueidentifier, @PAYMENTCURSOR_AUCTIONITEMID uniqueidentifier, @PAYMENTCURSOR_PAYMENTCOUNT integer;
declare PAYMENTCURSOR cursor local fast_forward
for select AUCTIONITEMS.REVENUEAUCTIONDONATIONID,AUCTIONITEMREVENUEPURCHASE.REVENUEPURCHASEID, AUCTIONITEMS.ID, AUCTIONITEMS.PAYMENTCOUNT
from
@AUCTIONITEMS AUCTIONITEMS
inner join dbo.AUCTIONITEMREVENUEPURCHASE on AUCTIONITEMS.ID = AUCTIONITEMREVENUEPURCHASE.AUCTIONITEMID
order by AUCTIONITEMS.ID
open PAYMENTCURSOR
fetch next from PAYMENTCURSOR into @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID,@PAYMENTCURSOR_REVENUEPURCHASEID,@PAYMENTCURSOR_AUCTIONITEMID,@PAYMENTCURSOR_PAYMENTCOUNT
while @@FETCH_STATUS = 0
begin
select @AUCTIONITEM_CURRENTPAYMENTCOUNT = @AUCTIONITEM_CURRENTPAYMENTCOUNT + 1;
insert into @DISTRIBUTIONS
select
AUCTIONITEM.REVENUEAUCTIONDONATIONID as REVENUEID,
dbo.UFN_POSTTOGLPROCESS_GETGLPAYMENTMETHODREVENUETYPEMAPPINGID(REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE, REVENUE.TRANSACTIONTYPECODE, CODES.REVENUESPLITTYPECODE, 12, tf.TRANSACTIONTYPECODE) as GLPAYMENTMETHODREVENUETYPEMAPPINGID,
tf.TRANSACTIONTYPECODE,
REVENUE.POSTDATE,
case when REVENUE.DONOTPOST = 1 then 2 when REVENUEPOSTED.ID is not null then 0 else 1 end as POSTSTATUSCODE,
tf.ACCOUNTSTRING,
tf.PROJECTCODE as PROJECT,
0 as AMOUNT, -- We figure this below to ensure no rounding issues
dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, REVENUEPAYMENTMETHOD.PAYMENTMETHOD, CODES.REVENUESPLITTYPE) as REFERENCE,
tf.ERRORMESSAGE,
REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE,
REVENUE.TRANSACTIONTYPECODE as REVENUETRANSACTIONTYPECODE,
tf.ACCOUNTID as ACCOUNTID,
CODES.REVENUESPLITTYPECODE,
AUCTIONITEM.VALUE as AUCTIONITEMVALUE,
case
when AUCTIONITEMDONATION.DONOTPOST = 1 then 2
when AUCTIONITEMDONATIONPOSTED.ID is not null then 0
else 1
end as AUCTIONITEMPOSTSTATUSCODE,
REVENUE.ID as REVENUEPURCHASEID,
case
when @IGNOREREVENUEID is null then
PURCHASEPRICE.AMOUNT
when @IGNOREREVENUEID is not null then
PURCHASEPRICEIGNOREREVENUE.AMOUNT
end,
REVENUESPLIT.AMOUNT
from
dbo.REVENUE with (nolock)
inner join dbo.REVENUEPAYMENTMETHOD with (nolock) on REVENUE.ID = REVENUEPAYMENTMETHOD.REVENUEID
left join dbo.REVENUEPOSTED with (nolock) on REVENUEPOSTED.ID = REVENUE.ID
inner join dbo.REVENUESPLIT with (nolock) on REVENUE.ID = REVENUESPLIT.REVENUEID
inner join dbo.AUCTIONITEMPURCHASE with (nolock) on AUCTIONITEMPURCHASE.PURCHASEID = REVENUESPLIT.ID
inner join dbo.AUCTIONITEM with (nolock) on AUCTIONITEM.ID = AUCTIONITEMPURCHASE.AUCTIONITEMID
inner join dbo.REVENUE as AUCTIONITEMDONATION with (nolock) on AUCTIONITEM.REVENUEAUCTIONDONATIONID = AUCTIONITEMDONATION.ID
left join dbo.REVENUEPOSTED as AUCTIONITEMDONATIONPOSTED with (nolock) on AUCTIONITEMDONATIONPOSTED.ID = AUCTIONITEMDONATION.ID
cross join
(
select '12' as REVENUESPLITTYPECODE, 'Auction purchase' as REVENUESPLITTYPE, 'Payment' as REVENUETYPE, '0' as REVENUETYPECODE
union all
select '203' as REVENUESPLITTYPECODE, 'Auction purchase gain' AS REVENUESPLITTYPE, 'Payment' as REVENUETYPE, '0' as REVENUETYPECODE
union all
select '204' as REVENUESPLITTYPECODE, 'Auction purchase loss' AS REVENUESPLITTYPE, 'Payment' as REVENUETYPE, '0' as REVENUETYPECODE
) as CODES
cross apply dbo.UFN_REVENUE_GENERATEGLACCOUNT(REVENUESPLIT.ID, REVENUE.TRANSACTIONTYPECODE, CODES.REVENUESPLITTYPECODE, REVENUESPLIT.APPLICATIONCODE, REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE, null) as tf
cross apply dbo.UFN_AUCTIONITEM_GETPOSTABLEPURCHASEAMOUNT(AUCTIONITEM.ID, null) as PURCHASEPRICE
cross apply dbo.UFN_AUCTIONITEM_GETPOSTABLEPURCHASEAMOUNT(AUCTIONITEM.ID, @IGNOREREVENUEID) as PURCHASEPRICEIGNOREREVENUE
where
(REVENUE.ID = @PAYMENTCURSOR_REVENUEPURCHASEID)
and
(@IGNOREREVENUEID is null or (REVENUE.ID <> @IGNOREREVENUEID))
and
(AUCTIONITEM.ID = @PAYMENTCURSOR_AUCTIONITEMID)
and
(
(@IGNOREREVENUEID is null and CODES.REVENUESPLITTYPECODE = 203 and AUCTIONITEM.VALUE < PURCHASEPRICE.AMOUNT) -- Gain
or
(@IGNOREREVENUEID is not null and CODES.REVENUESPLITTYPECODE = 203 and AUCTIONITEM.VALUE < PURCHASEPRICEIGNOREREVENUE.AMOUNT) -- Gain
or
(@IGNOREREVENUEID is null and CODES.REVENUESPLITTYPECODE = 204 and AUCTIONITEM.VALUE > PURCHASEPRICE.AMOUNT) -- Loss
or
(@IGNOREREVENUEID is not null and CODES.REVENUESPLITTYPECODE = 204 and AUCTIONITEM.VALUE > PURCHASEPRICEIGNOREREVENUE.AMOUNT) -- Loss
or
(CODES.REVENUESPLITTYPECODE = 12)
)
and
(REVENUE.DONOTPOST <> 1)
--Figure the distribution amounts here
declare @REVENUESPLITAMOUNT decimal(30,10) = 0;
declare @AUCTIONITEMPURCHASEAMOUNT decimal(30,10) = 0;
select
@AUCTIONITEMPURCHASEAMOUNT = cast(AUCTIONITEMPURCHASEAMOUNT as decimal(30,10)),
@REVENUESPLITAMOUNT = cast(REVENUESPLITAMOUNT as decimal(30,10))
from @DISTRIBUTIONS
where REVENUEPURCHASEID = @PAYMENTCURSOR_REVENUEPURCHASEID and REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID
if @AUCTIONITEMPURCHASEAMOUNT <> 0
select @PERCENTAGEOFTOTALPURCHASE = @PERCENTAGEOFTOTALPURCHASE + (@REVENUESPLITAMOUNT/@AUCTIONITEMPURCHASEAMOUNT)
if @PAYMENTCURSOR_PAYMENTCOUNT <> @AUCTIONITEM_CURRENTPAYMENTCOUNT
begin
update @DISTRIBUTIONS
set AMOUNT =
case
when REVENUESPLITTYPECODE = 12 then
round((cast(AUCTIONITEMVALUE as decimal(30,10)) * @PERCENTAGEOFTOTALPURCHASE) - (select sum(AMOUNT) from @DISTRIBUTIONS where REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID and REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 0),2)
when REVENUESPLITTYPECODE in (203,204) then
round((abs(cast(AUCTIONITEMVALUE as decimal(30,10)) - cast(AUCTIONITEMPURCHASEAMOUNT as decimal(30,10))) * @PERCENTAGEOFTOTALPURCHASE) - (select sum(AMOUNT) from @DISTRIBUTIONS where REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID and REVENUESPLITTYPECODE in (203,204) and TRANSACTIONTYPECODE = 0),2)
end
where REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID and REVENUEPURCHASEID = @PAYMENTCURSOR_REVENUEPURCHASEID
end
else
begin
--The last payment towards an item deals with the rounding issues
--It just gets what is left to distribute
update @DISTRIBUTIONS
set AMOUNT =
case
when REVENUESPLITTYPECODE = 12 then
round(AUCTIONITEMVALUE - (select sum(AMOUNT) from @DISTRIBUTIONS where REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID and REVENUESPLITTYPECODE = 12 and TRANSACTIONTYPECODE = 0),2)
when REVENUESPLITTYPECODE in (203,204) then
round(abs(abs(AUCTIONITEMVALUE - AUCTIONITEMPURCHASEAMOUNT) - (select sum(AMOUNT) from @DISTRIBUTIONS where REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID and REVENUESPLITTYPECODE in (203,204) and TRANSACTIONTYPECODE = 0)),2)
end
where REVENUEID = @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID and REVENUEPURCHASEID = @PAYMENTCURSOR_REVENUEPURCHASEID
end
--Reset the payment count and totals if we are moving on to a different item
if @PAYMENTCURSOR_PAYMENTCOUNT = @AUCTIONITEM_CURRENTPAYMENTCOUNT
select @AUCTIONITEM_CURRENTPAYMENTCOUNT = 0,@PERCENTAGEOFTOTALPURCHASE = 0
fetch next from PAYMENTCURSOR into @PAYMENTCURSOR_REVENUEAUCTIONDONATIONID,@PAYMENTCURSOR_REVENUEPURCHASEID,@PAYMENTCURSOR_AUCTIONITEMID,@PAYMENTCURSOR_PAYMENTCOUNT
end
close PAYMENTCURSOR
deallocate PAYMENTCURSOR
return
end