UFN_REVENUE_GENERATEDEFAULTGIFTFEESWITHTRANSACTIONAMOUNT_3
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUEID | uniqueidentifier | IN | |
@CONSTITUENTID | uniqueidentifier | IN | |
@PAYMENTMETHOD | tinyint | IN | |
@TRANSACTIONAMOUNT | money | IN | |
@RECEIPTAMOUNT | money | IN | |
@BASECURRENCYID | uniqueidentifier | IN | |
@TRANSACTIONCURRENCYID | uniqueidentifier | IN | |
@BASEEXCHANGERATEID | uniqueidentifier | IN | |
@ORGANIZATIONEXCHANGERATEID | uniqueidentifier | IN | |
@SPLITS | xml | IN | |
@ORGANIZATIONAMOUNT | money | IN |
Definition
Copy
CREATE function dbo.UFN_REVENUE_GENERATEDEFAULTGIFTFEESWITHTRANSACTIONAMOUNT_3 (
@REVENUEID uniqueidentifier
,@CONSTITUENTID uniqueidentifier
,@PAYMENTMETHOD tinyint
,@TRANSACTIONAMOUNT money
,@RECEIPTAMOUNT money
,@BASECURRENCYID uniqueidentifier
,@TRANSACTIONCURRENCYID uniqueidentifier
,@BASEEXCHANGERATEID uniqueidentifier
,@ORGANIZATIONEXCHANGERATEID uniqueidentifier
,@SPLITS xml
,@ORGANIZATIONAMOUNT money
)
returns @GIFTFEES table (
ID uniqueidentifier
,FEE money
,WAIVED bit
,SPLITRECEIPTAMOUNT money
,BASECURRENCYID uniqueidentifier
,ORGANIZATIONAMOUNT money
,ORGANIZATIONEXCHANGERATEID uniqueidentifier
,TRANSACTIONAMOUNT money
,TRANSACTIONCURRENCYID uniqueidentifier
,BASEEXCHANGERATEID uniqueidentifier
)
as
begin
--Do nothing if this is turned off.
if dbo.UFN_GIFTFEE_ENABLED() = 0
return;
if @PAYMENTMETHOD is not null
begin
if dbo.UFN_GIFTFEE_PAYMENTMETHODEXCLUDED_2(@PAYMENTMETHOD) = 1
return;
end
else
begin
if dbo.UFN_GIFTFEE_PAYMENTMETHODEXCLUDED(@REVENUEID) = 1
return;
end
if dbo.UFN_GIFTFEE_CONSTITUENTEXCLUDED(@CONSTITUENTID) = 1
return;
declare @SPLITSTABLE table (
ID uniqueidentifier
,TRANSACTIONAMOUNT money
,APPLICATIONCODE int
,DESIGNATIONLEVELID uniqueidentifier
,RECEIPTAMOUNT money
,ORGANIZATIONTOTALAMOUNT money
,BASECURRENCYID uniqueidentifier
,TRANSACTIONCURRENCYID uniqueidentifier
,BASEEXCHANGERATEID uniqueidentifier
,ORGANIZATIONEXCHANGERATEID uniqueidentifier
);
if @SPLITS is not null
begin
insert into @SPLITSTABLE
select T.c.value('(ID)[1]', 'uniqueidentifier') as 'ID'
,T.c.value('(TRANSACTIONAMOUNT)[1]', 'money') as 'TRANSACTIONAMOUNT'
,T.c.value('(APPLICATIONCODE)[1]', 'int') as 'APPLICATIONCODE'
,T.c.value('(DESIGNATIONLEVELID)[1]', 'uniqueidentifier') as 'DESIGNATIONLEVELID'
,@RECEIPTAMOUNT as 'RECEIPTAMOUT'
,@ORGANIZATIONAMOUNT as 'ORGANIZATIONTOTALAMOUNT'
,@BASECURRENCYID as 'BASECURRENCYID'
,@TRANSACTIONCURRENCYID as 'TRANSACTIONCURRENCYID'
,@BASEEXCHANGERATEID as 'BASEEXCHANGERATEID'
,@ORGANIZATIONEXCHANGERATEID as 'ORGANIZATIONEXCHANGERATEID'
from @SPLITS.nodes('/SPLITS/ITEM') T(c);
declare @SPLITID uniqueidentifier;
declare @SPLITAMOUNT money;
declare @ORGANIZATIONTOTALAMOUNT money;
declare @APPLICATIONCODE tinyint;
declare @DESIGNATIONLEVELID uniqueidentifier;
declare @FEETRANSACTIONAMOUNT money;
declare @FEEBASEAMOUNT money;
declare @FEEORGANIZATIONAMOUNT money;
declare APPLICATIONCURSOR cursor local fast_forward
for
select *
from @SPLITSTABLE
open APPLICATIONCURSOR;
fetch next
from APPLICATIONCURSOR
into @SPLITID
,@SPLITAMOUNT
,@APPLICATIONCODE
,@DESIGNATIONLEVELID
,@RECEIPTAMOUNT
,@ORGANIZATIONTOTALAMOUNT
,@BASECURRENCYID
,@TRANSACTIONCURRENCYID
,@BASEEXCHANGERATEID
,@ORGANIZATIONEXCHANGERATEID
while (@@FETCH_STATUS = 0)
begin
--since receipt amount does not live on the split level we need to calculate receipt amount weight and apply
--it to the split amount to account for this.
--doesn't need this if APPLICATIONCODE is 10 (order) since the split amount will match receipt amount based on transaction type code
-- TylerAr, 1/12/2011, NOTICE: the above strategy does NOT accurately reconstruct the receipt amounts
-- on sales order items, receipt amounts are calculated based on many factors. This is an arbitrary approximation.
--LeeCh, 1/2/2011, receipt amount is not always the same as split amount on an order.
--if @APPLICATIONCODE <> 10
--begin
if @TRANSACTIONAMOUNT <= 0 --account for divide by zero
begin
set @SPLITAMOUNT = 0
set @ORGANIZATIONTOTALAMOUNT = 0
end
else
begin
--This calculation can cause rounding issues but since the fees relative to the splits will
--usually be small the rounding should be negligible.
set @SPLITAMOUNT = (cast(@SPLITAMOUNT as decimal(30, 5)) * cast(@RECEIPTAMOUNT as decimal(30, 5))) / @TRANSACTIONAMOUNT
if (@ORGANIZATIONAMOUNT is null)
set @ORGANIZATIONTOTALAMOUNT = (cast(@TRANSACTIONAMOUNT as decimal(30, 5)) * cast(@RECEIPTAMOUNT as decimal(30, 5))) / @TRANSACTIONAMOUNT
else
set @ORGANIZATIONTOTALAMOUNT = (cast(@ORGANIZATIONTOTALAMOUNT as decimal(30, 5)) * cast(@RECEIPTAMOUNT as decimal(30, 5))) / @TRANSACTIONAMOUNT
end
--end
-- Multicurrency RobertDi 6/1/2010 - This function requires a total amount in org currency
-- and a split amount in transaction currency.
-- It returns a fee in transaction currency.
set @FEETRANSACTIONAMOUNT = dbo.UFN_PAYMENTAPPLICATION_GETGIFTFEE(@SPLITID, @SPLITAMOUNT, @ORGANIZATIONTOTALAMOUNT, @APPLICATIONCODE, @DESIGNATIONLEVELID);
-- Get the fee amounts in other currencies.
declare @DATE datetime;
set @DATE = getdate();
select @FEEBASEAMOUNT = BASEAMOUNT
,@FEEORGANIZATIONAMOUNT = ORGANIZATIONAMOUNT
,@BASEEXCHANGERATEID = BASEEXCHANGERATEID
,@TRANSACTIONCURRENCYID = TRANSACTIONCURRENCYID
from dbo.UFN_CURRENCY_GETCURRENCYVALUES(@FEETRANSACTIONAMOUNT, @DATE, @BASECURRENCYID, @BASEEXCHANGERATEID, @TRANSACTIONCURRENCYID);
--Insert gift fee
if @FEETRANSACTIONAMOUNT is not null
insert into @GIFTFEES (
ID
,FEE
,WAIVED
,SPLITRECEIPTAMOUNT
,BASECURRENCYID
,ORGANIZATIONAMOUNT
,ORGANIZATIONEXCHANGERATEID
,TRANSACTIONAMOUNT
,TRANSACTIONCURRENCYID
,BASEEXCHANGERATEID
)
values (
@SPLITID
,@FEEBASEAMOUNT
,case
when @FEETRANSACTIONAMOUNT = 0
then 1
else 0
end
,@SPLITAMOUNT
,@BASECURRENCYID
,@FEEORGANIZATIONAMOUNT
,@ORGANIZATIONEXCHANGERATEID
,@FEETRANSACTIONAMOUNT
,@TRANSACTIONCURRENCYID
,@BASEEXCHANGERATEID
);
fetch next
from APPLICATIONCURSOR
into @SPLITID
,@SPLITAMOUNT
,@APPLICATIONCODE
,@DESIGNATIONLEVELID
,@RECEIPTAMOUNT
,@ORGANIZATIONTOTALAMOUNT
,@BASECURRENCYID
,@TRANSACTIONCURRENCYID
,@BASEEXCHANGERATEID
,@ORGANIZATIONEXCHANGERATEID;
end
close APPLICATIONCURSOR;
deallocate APPLICATIONCURSOR;
end
return;
end