UFN_REVENUE_BUILDSPLITSFOROPPORTUNITYGIFTINCURRENCY
Return
Return Type |
---|
xml |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@OPPORTUNITYID | uniqueidentifier | IN | |
@TYPECODE | tinyint | IN | |
@APPLICATIONCODE | tinyint | IN | |
@CURRENCYID | uniqueidentifier | IN |
Definition
Copy
create function dbo.UFN_REVENUE_BUILDSPLITSFOROPPORTUNITYGIFTINCURRENCY
(
@OPPORTUNITYID uniqueidentifier,
@TYPECODE tinyint,
@APPLICATIONCODE tinyint,
@CURRENCYID uniqueidentifier
)
returns xml as
begin
declare @OPP_TRANSACTIONCURRENCYID uniqueidentifier;
select top 1 @OPP_TRANSACTIONCURRENCYID = TRANSACTIONCURRENCYID from dbo.OPPORTUNITYDESIGNATION where OPPORTUNITYDESIGNATION.OPPORTUNITYID = @OPPORTUNITYID;
declare @OUTSTANDINGDESIGNATIONS table
(
DESIGNATIONID uniqueidentifier,
AMOUNT money
);
insert into @OUTSTANDINGDESIGNATIONS
select
OD.DESIGNATIONID,
OD.TRANSACTIONAMOUNT - coalesce(
(
select
sum
(
-- When the base currency of the designation does not match the transaction currency of the split,
-- we need to convert the split amount to the designation currency in order to perform the subtraction
-- on like currencies.
case
when RS.TRANSACTIONCURRENCYID = @OPP_TRANSACTIONCURRENCYID
then RS.TRANSACTIONAMOUNT
else
dbo.UFN_CURRENCY_CONVERT(RS.TRANSACTIONAMOUNT,
dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(RS.TRANSACTIONCURRENCYID, @OPP_TRANSACTIONCURRENCYID, REVENUE.DATE, 1, null))
end
)
from
dbo.REVENUEOPPORTUNITY RO
inner join
dbo.REVENUESPLIT RS on RS.ID = RO.ID
inner join
dbo.REVENUE on RS.REVENUEID = REVENUE.ID
where
RO.OPPORTUNITYID = OD.OPPORTUNITYID and
RS.DESIGNATIONID = OD.DESIGNATIONID
), 0)
from
dbo.OPPORTUNITYDESIGNATION OD
where
OD.OPPORTUNITYID = @OPPORTUNITYID;
delete from @OUTSTANDINGDESIGNATIONS where AMOUNT <= 0;
declare @SUMMEDAMOUNT money;
select @SUMMEDAMOUNT = sum(OD.TRANSACTIONAMOUNT) from dbo.OPPORTUNITYDESIGNATION OD where OD.OPPORTUNITYID = @OPPORTUNITYID;
declare @TOTALOUTSTANDINGAMOUNT money;
select @TOTALOUTSTANDINGAMOUNT = sum(AMOUNT) from @OUTSTANDINGDESIGNATIONS;
declare @OPP_TRANSACTIONEXCHANGERATEID uniqueidentifier = dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(@OPP_TRANSACTIONCURRENCYID, @CURRENCYID, getdate(), 1, null);
declare @SPLITS xml;
if @SUMMEDAMOUNT >= @TOTALOUTSTANDINGAMOUNT
begin
set @SPLITS =
(
select
null [ID],
DESIGNATIONID,
case
when @CURRENCYID = @OPP_TRANSACTIONCURRENCYID
then AMOUNT
else
dbo.UFN_CURRENCY_CONVERT(AMOUNT, @OPP_TRANSACTIONEXCHANGERATEID)
end as AMOUNT,
@TYPECODE as TYPECODE,
@APPLICATIONCODE as APPLICATIONCODE,
@CURRENCYID TRANSACTIONCURRENCYID
from
@OUTSTANDINGDESIGNATIONS
group by
DESIGNATIONID, AMOUNT
for xml raw('ITEM'), type, elements, root('SPLITS'), BINARY BASE64
);
end
else
begin
set @SPLITS =
(
select
null [ID],
DESIGNATIONID,
case
when @CURRENCYID = @OPP_TRANSACTIONCURRENCYID
then ((AMOUNT / @TOTALOUTSTANDINGAMOUNT) * @SUMMEDAMOUNT)
else
dbo.UFN_CURRENCY_CONVERT(((AMOUNT / @TOTALOUTSTANDINGAMOUNT) * @SUMMEDAMOUNT), @OPP_TRANSACTIONEXCHANGERATEID)
end as AMOUNT,
@TYPECODE as TYPECODE,
@APPLICATIONCODE as APPLICATIONCODE,
@CURRENCYID TRANSACTIONCURRENCYID
from
@OUTSTANDINGDESIGNATIONS
group by
DESIGNATIONID, AMOUNT
for xml raw('ITEM'), type, elements, root('SPLITS'), BINARY BASE64
);
end
return @SPLITS;
end