UFN_REVENUEBATCH_GETDEFAULTMATCHINGGIFTS_FORCONSTITUENT
Returns the default matching gifts for a single batch constituent.
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@CONSTITUENTID | uniqueidentifier | IN | |
@DATE | datetime | IN | |
@DONATIONAMOUNT | money | IN | |
@DONATIONRECEIPTAMOUNT | money | IN | |
@DONATIONSPLITS | xml | IN |
Definition
Copy
/****
NOTE:
This function is used by UFN_REVENUEBATCH_GETMATCHINGGIFTCONDITIONS to avoid code duplication. You almost certainly want to call UFN_REVENUEBATCH_GETMATCHINGGIFTCONDITIONS
instead of this function.
****/
CREATE function dbo.UFN_REVENUEBATCH_GETDEFAULTMATCHINGGIFTS_FORCONSTITUENT
(
@CONSTITUENTID uniqueidentifier,
@DATE datetime,
@DONATIONAMOUNT money,
@DONATIONRECEIPTAMOUNT money,
@DONATIONSPLITS xml
)
returns @R table
(
ORGANIZATIONID uniqueidentifier,
RELATIONSHIPID uniqueidentifier,
MATCHINGGIFTCONDITIONTYPEID uniqueidentifier,
AMOUNT money,
DATE datetime,
SPLITS xml,
COULDNOTDEFAULTMATCHINGGIFT bit
)
as
begin
declare @MATCHINGGIFTCONDITIONS table
(
RELATIONSHIPID uniqueidentifier,
ORGANIZATIONID uniqueidentifier,
MATCHINGGIFTCONDITIONID uniqueidentifier,
MATCHINGFACTOR decimal(5,2),
MINMATCHPERGIFT money,
MAXMATCHPERGIFT money,
MAXMATCHANNUAL money,
MAXMATCHTOTAL money,
MATCHTYPECODE tinyint,
REVENUETYPECODE tinyint
);
declare @DONATIONSPLITS_T table
(
ID uniqueidentifier,
DESIGNATIONID uniqueidentifier,
DESIGNATIONTRANSLATION nvarchar(200),
AMOUNT money,
SEQUENCE int,
APPLICATIONCODE tinyint,
TYPECODE tinyint
);
declare @RELATIONSHIPID uniqueidentifier;
declare @ORGANIZATIONID uniqueidentifier;
declare @MATCHINGGIFTCONDITIONID uniqueidentifier;
declare @MATCHINGFACTOR decimal(5,2);
declare @MINMATCHPERGIFT money;
declare @MAXMATCHPERGIFT money;
declare @MAXMATCHANNUAL money;
declare @MAXMATCHTOTAL money;
declare @MATCHTYPECODE tinyint;
declare @REVENUETYPECODE tinyint;
declare @APPLICATIONCODE tinyint;
declare @AMOUNT money;
declare @MGAMOUNT money;
declare @MGSPLITS xml;
set @AMOUNT = @DONATIONAMOUNT; --We'll be modifying the amount and I want to have a pristine copy available for the future
insert into @DONATIONSPLITS_T(ID, DESIGNATIONID, DESIGNATIONTRANSLATION, AMOUNT, SEQUENCE, APPLICATIONCODE, TYPECODE)
select
T.c.value('(ID)[1]', 'uniqueidentifier'),
T.c.value('(DESIGNATIONID)[1]', 'uniqueidentifier'),
DESIGNATION.NAME,
T.c.value('(AMOUNT)[1]', 'money'),
T.c.value('(SEQUENCE)[1]', 'int'),
T.c.value('(APPLICATIONCODE)[1]', 'tinyint'),
T.c.value('(TYPECODE)[1]', 'tinyint')
from @DONATIONSPLITS.nodes('/SPLITS/ITEM') T(c)
inner join DESIGNATION on DESIGNATION.ID = T.c.value('(DESIGNATIONID)[1]', 'uniqueidentifier');
insert into @MATCHINGGIFTCONDITIONS(RELATIONSHIPID, ORGANIZATIONID, MATCHINGGIFTCONDITIONID, MATCHINGFACTOR, MINMATCHPERGIFT, MAXMATCHPERGIFT, MAXMATCHANNUAL, MAXMATCHTOTAL, MATCHTYPECODE, REVENUETYPECODE)
select RELATIONSHIPID, ORGANIZATIONID, MATCHINGGIFTCONDITIONID, MATCHINGFACTOR, MINMATCHPERGIFT, MAXMATCHPERGIFT, MAXMATCHANNUAL, MAXMATCHTOTAL, MATCHTYPECODE, REVENUETYPECODE
from dbo.UFN_REVENUEBATCH_GETMATCHINGGIFTCONDITIONS(@CONSTITUENTID);
declare CUR_MATCHINGGIFTCONDITIONS cursor local fast_forward for
select RELATIONSHIPID, ORGANIZATIONID, MATCHINGGIFTCONDITIONID, MATCHINGFACTOR, MINMATCHPERGIFT, MAXMATCHPERGIFT, MAXMATCHANNUAL, MAXMATCHTOTAL, MATCHTYPECODE, REVENUETYPECODE
from @MATCHINGGIFTCONDITIONS;
open CUR_MATCHINGGIFTCONDITIONS;
fetch next from CUR_MATCHINGGIFTCONDITIONS into @RELATIONSHIPID, @ORGANIZATIONID, @MATCHINGGIFTCONDITIONID, @MATCHINGFACTOR, @MINMATCHPERGIFT, @MAXMATCHPERGIFT,
@MAXMATCHANNUAL, @MAXMATCHTOTAL, @MATCHTYPECODE, @REVENUETYPECODE;
while @@FETCH_STATUS = 0
begin
declare @GENERATECLAIMS bit;
set @GENERATECLAIMS = 1;
select @AMOUNT = sum(AMOUNT)
from @DONATIONSPLITS_T where TYPECODE = @REVENUETYPECODE;
--check if we need to apply the full amount or the tax portion
if @MATCHTYPECODE = 1
begin
if exists(select ID from @DONATIONSPLITS_T where TYPECODE <> @REVENUETYPECODE)
set @GENERATECLAIMS = 0; --If we're only matching the tax-deductible portions but some of the splits aren't to be matched, we can't figure out how much to match
else
set @MGAMOUNT = @DONATIONRECEIPTAMOUNT * @MATCHINGFACTOR;
end
else
begin
set @MGAMOUNT = @AMOUNT * @MATCHINGFACTOR;
end
--determine if the matching gift needs to be adjusted based on the conditions of the MG organization
--REVISIT: This function will not take batch gifts into account. Not sure how to deal with it.
set @MGAMOUNT = dbo.UFN_MATCHINGGIFTPLEDGE_CALCULATEMGAMOUNT(@CONSTITUENTID, @ORGANIZATIONID, @MGAMOUNT, @DATE, @MAXMATCHPERGIFT, @MAXMATCHANNUAL, @MAXMATCHTOTAL);
if @MGAMOUNT >= @MINMATCHPERGIFT and @MGAMOUNT > 0 and @GENERATECLAIMS = 1
begin
--Get new MG splits
select @MGSPLITS = (select sum(AMOUNT) as AMOUNT, DESIGNATIONID, DESIGNATIONTRANSLATION, TYPECODE
from @DONATIONSPLITS_T where TYPECODE = @REVENUETYPECODE
group by DESIGNATIONID, DESIGNATIONTRANSLATION, TYPECODE
for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64);
select @APPLICATIONCODE = APPLICATIONCODE from @DONATIONSPLITS_T where TYPECODE = @REVENUETYPECODE;
set @MGSPLITS = dbo.UFN_REVENUEBATCH_GETAUTOMGSPLITS(@AMOUNT, @MGAMOUNT, @MGSPLITS, @REVENUETYPECODE, @APPLICATIONCODE);
insert into @R(ORGANIZATIONID, RELATIONSHIPID, MATCHINGGIFTCONDITIONTYPEID, AMOUNT, DATE, SPLITS, COULDNOTDEFAULTMATCHINGGIFT)
values(@ORGANIZATIONID, @RELATIONSHIPID, @MATCHINGGIFTCONDITIONID, @MGAMOUNT, @DATE, @MGSPLITS, 0);
end
else
begin
if @GENERATECLAIMS = 0
begin
--For some reason, we've decided not to default claims. Indicate this fact.
insert into @R(ORGANIZATIONID, RELATIONSHIPID, MATCHINGGIFTCONDITIONTYPEID, AMOUNT, DATE, SPLITS, COULDNOTDEFAULTMATCHINGGIFT)
values (@ORGANIZATIONID, @RELATIONSHIPID, @MATCHINGGIFTCONDITIONID, null, null, null, 1);
end
end
fetch next from CUR_MATCHINGGIFTCONDITIONS into @RELATIONSHIPID, @ORGANIZATIONID, @MATCHINGGIFTCONDITIONID, @MATCHINGFACTOR, @MINMATCHPERGIFT, @MAXMATCHPERGIFT,
@MAXMATCHANNUAL, @MAXMATCHTOTAL, @MATCHTYPECODE, @REVENUETYPECODE;
end
--When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long
close CUR_MATCHINGGIFTCONDITIONS;
deallocate CUR_MATCHINGGIFTCONDITIONS;
return;
end