UFN_REVENUE_GETTRIBUTESFORAMOUNT
Returns tributes for a given revenue record record and updated amount.
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUEID | uniqueidentifier | IN | |
@TRANSACTIONAMOUNT | money | IN | |
@BASEEXCHANGERATEID | uniqueidentifier | IN | |
@EXCHANGERATE | decimal(20, 8) | IN |
Definition
Copy
CREATE function dbo.UFN_REVENUE_GETTRIBUTESFORAMOUNT
(
@REVENUEID uniqueidentifier,
@TRANSACTIONAMOUNT money,
@BASEEXCHANGERATEID uniqueidentifier,
@EXCHANGERATE decimal(20,8)
)
returns @TRIBUTETABLE table
(
TRIBUTEID uniqueidentifier,
AMOUNT money,
DESIGNATIONID uniqueidentifier,
SEQUENCE int,
REVENUETRIBUTEID uniqueidentifier,
BASECURRENCYID uniqueidentifier,
ORGANIZATIONAMOUNT money,
ORGANIZATIONEXCHANGERATEID uniqueidentifier
)
as begin
--Tributes are in base and not transaction, so convert the revenue transaction amount to base using the
--provided exchange rate information.
declare @UNROUNDED decimal(20,8);
declare @BASEAMOUNT money;
declare @BASECURRENCYID uniqueidentifier;
declare @TRIBUTES xml;
if not @BASEEXCHANGERATEID = '00000000-0000-0000-0000-000000000001'
select @EXCHANGERATE = RATE from dbo.CURRENCYEXCHANGERATE where ID = @BASEEXCHANGERATEID;
--We can get the rounding information from the revenue record.
declare @DECIMALDIGITS tinyint;
declare @ROUNDINGTYPECODE tinyint;
select
@DECIMALDIGITS = CURRENCY.DECIMALDIGITS,
@ROUNDINGTYPECODE = CURRENCY.ROUNDINGTYPECODE,
@BASECURRENCYID = CURRENCY.ID
from dbo.CURRENCY
inner join dbo.CURRENCYSET on CURRENCY.ID = CURRENCYSET.BASECURRENCYID
inner join dbo.PDACCOUNTSYSTEM on CURRENCYSET.ID = PDACCOUNTSYSTEM.CURRENCYSETID
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.PDACCOUNTSYSTEMID = PDACCOUNTSYSTEM.ID
where FINANCIALTRANSACTION.ID = @REVENUEID;
set @UNROUNDED = dbo.UFN_CURRENCY_APPLYRATE(@TRANSACTIONAMOUNT, @EXCHANGERATE);
if not @BASEEXCHANGERATEID = '00000000-0000-0000-0000-000000000001' and @BASEEXCHANGERATEID is not null
set @BASEAMOUNT = dbo.UFN_CURRENCY_ROUND(@UNROUNDED, @DECIMALDIGITS, @ROUNDINGTYPECODE);
else
set @BASEAMOUNT = @TRANSACTIONAMOUNT
--Get the current organization exchange rate so we can convert the new tribute amount from base to organization.
declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier = null;
if not @ORGANIZATIONCURRENCYID = @BASECURRENCYID
set @ORGANIZATIONEXCHANGERATEID = dbo.UFN_CURRENCYEXCHANGERATE_GETLATESTORGANIZATIONRATE(@BASECURRENCYID, @ORGANIZATIONCURRENCYID, null, null, null);
declare @OLDREVENUEBASEAMOUNT money;
select @OLDREVENUEBASEAMOUNT = FINANCIALTRANSACTION.BASEAMOUNT from dbo.FINANCIALTRANSACTION where FINANCIALTRANSACTION.ID = @REVENUEID;
set @TRIBUTES = (
select AMOUNT, ID
from REVENUETRIBUTE
where REVENUEID = @REVENUEID
for xml raw('ITEM'),type,elements,root('AMOUNTSTOPRORATE'),binary base64
);
with [CTE] as
(
select
REVENUETRIBUTE.TRIBUTEID,
NEWAMOUNT.AMOUNT as AMOUNT,
TRIBUTE.DESIGNATIONID,
row_number() over(order by REVENUETRIBUTE.DATEADDED) as SEQUENCE,
REVENUETRIBUTE.ID as REVENUETRIBUTEID,
REVENUETRIBUTE.BASECURRENCYID
from dbo.REVENUETRIBUTE
inner join dbo.UFN_SPLITS_GETPRORATEDSPLITS(@OLDREVENUEBASEAMOUNT, @BASEAMOUNT, @TRIBUTES) NEWAMOUNT on REVENUETRIBUTE.ID = NEWAMOUNT.ID
inner join dbo.TRIBUTE on TRIBUTE.ID = REVENUETRIBUTE.TRIBUTEID
left join dbo.CURRENCY on CURRENCY.ID = REVENUETRIBUTE.BASECURRENCYID
where REVENUETRIBUTE.REVENUEID = @REVENUEID
)
insert into @TRIBUTETABLE(TRIBUTEID, AMOUNT, DESIGNATIONID, SEQUENCE, REVENUETRIBUTEID,
BASECURRENCYID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID)
select
TRIBUTEID,
AMOUNT,
DESIGNATIONID,
SEQUENCE,
REVENUETRIBUTEID,
BASECURRENCYID,
case
when @ORGANIZATIONEXCHANGERATEID is null then AMOUNT
else dbo.UFN_CURRENCY_CONVERT(AMOUNT, @ORGANIZATIONEXCHANGERATEID)
end,
@ORGANIZATIONEXCHANGERATEID
from [CTE];
return
end