USP_REVENUE_APPLYTOREVENUESTREAMS
Stored proc to apply a payment to one or more revenue streams
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUEID | uniqueidentifier | IN | |
@CONSTITUENTID | uniqueidentifier | IN | |
@DATE | datetime | IN | |
@REVENUESTREAMS | xml | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CREATIONDATE | datetime | IN | |
@SPLITSDECLININGGIFTAID | xml | INOUT | |
@COVENANTGIFTSPLITS | xml | INOUT | |
@GIFTAIDSPONSORSHIPSPLITS | xml | INOUT | |
@PDACCOUNTSYSTEMID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_REVENUE_APPLYTOREVENUESTREAMS
(
@REVENUEID uniqueidentifier,
@CONSTITUENTID uniqueidentifier,
@DATE datetime,
@REVENUESTREAMS xml,
@CHANGEAGENTID uniqueidentifier,
@CREATIONDATE datetime,
@SPLITSDECLININGGIFTAID xml = null output,
@COVENANTGIFTSPLITS xml = null output,
@GIFTAIDSPONSORSHIPSPLITS xml = null output,
@PDACCOUNTSYSTEMID uniqueidentifier = null
)
as
set nocount on;
declare @APPLICATIONID uniqueidentifier;
declare @APPLICATIONTYPE tinyint;
declare @APPLIEDAMOUNT money;
declare @APPLIEDBASEAMOUNT money;
declare @APPLIEDORGANIZATIONAMOUNT money;
declare @APPLICATIONSPLITS xml;
declare @TRANSACTIONCURRENCYID uniqueidentifier;
declare @BASECURRENCYID uniqueidentifier;
declare @BASEEXCHANGERATEID uniqueidentifier;
declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
declare @APPLICATIONCODE tinyint;
declare @GIFTFIELDS xml;
declare @OTHERFIELDS xml;
declare @DECLINESGIFTAID bit;
declare @ISGIFTAIDSPONSORSHIP bit;
declare @OVERPAYMENTAPPLICATIONTYPECODE tinyint;
declare @DESIGNATIONID uniqueidentifier;
declare @OPPORTUNITYID uniqueidentifier;
declare @CATEGORYCODEID uniqueidentifier;
declare @OTHERTYPECODEID uniqueidentifier;
declare @CAMPAIGNS xml;
declare @SOLICITORS xml;
declare @RECOGNITIONCREDITS xml;
declare @MEMBERSHIPS xml;
declare @REVENUETYPECODE tinyint;
declare @SPLITSGIFTAIDINFOTBL table
(
REVENUESPLITID uniqueidentifier,
DECLINESGIFTAID bit,
ISCOVENANT bit,
ISSPONSORSHIP bit
)
if @PDACCOUNTSYSTEMID is null
set @PDACCOUNTSYSTEMID = '4B121C2C-CCE6-440D-894C-EA0DEF80D50B'
select
@TRANSACTIONCURRENCYID = FT.TRANSACTIONCURRENCYID,
@BASEEXCHANGERATEID = FT.BASEEXCHANGERATEID,
@ORGANIZATIONEXCHANGERATEID = FT.ORGEXCHANGERATEID
from
dbo.FINANCIALTRANSACTION as FT
where
FT.ID = @REVENUEID;
select
@BASECURRENCYID = CS.BASECURRENCYID
from PDACCOUNTSYSTEM as PAS
inner join CURRENCYSET as CS on PAS.CURRENCYSETID = CS.ID
where PAS.ID = @PDACCOUNTSYSTEMID
-- Revenue stream amounts need to be converted by proportion unless they were already converted by USP_REVENUE_UPDATEREVENUESTREAMS
if ((@REVENUESTREAMS.exist('/REVENUESTREAMS/ITEM/BASEAMOUNT') = 0) and (@REVENUESTREAMS.exist('/REVENUESTREAMS/ITEM/APPLIEDBASEAMOUNT') = 0)) or ((@REVENUESTREAMS.exist('/REVENUESTREAMS/ITEM/ORGANIZATIONAMOUNT') = 0) and (@REVENUESTREAMS.exist('/REVENUESTREAMS/ITEM/APPLIEDORGANIZATIONAMOUNT') = 0))
set @REVENUESTREAMS = dbo.UFN_REVENUE_REVENUESTREAMS_CONVERTAMOUNTSINXML(@REVENUESTREAMS, @BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASEEXCHANGERATEID);
declare APPLICATIONSCURSOR cursor local fast_forward for
select
APPLICATIONID,
APPLIED,
APPLICATIONCODE,
GIFTFIELDS,
OTHERFIELDS,
MEMBERSHIPS,
DECLINESGIFTAID,
ISSPONSORSHIP,
OVERPAYMENTAPPLICATIONTYPECODE,
APPLIEDBASEAMOUNT,
APPLIEDORGANIZATIONAMOUNT,
APPLICATIONSPLITS,
CATEGORYCODEID
from dbo.UFN_REVENUE_GETAPPLICATIONS_FROMXML(@REVENUESTREAMS)
--TODO WHAT DO WE DO WITH THIS NOW
declare @UNAPPLIEDMATCHINGGIFTSPLITS xml
declare @RECEIPTTYPEPERPAYMENTFOUND bit
SET @RECEIPTTYPEPERPAYMENTFOUND = 0
begin try
open APPLICATIONSCURSOR;
fetch next from APPLICATIONSCURSOR into @APPLICATIONID, @APPLIEDAMOUNT, @APPLICATIONTYPE, @GIFTFIELDS, @OTHERFIELDS, @MEMBERSHIPS, @DECLINESGIFTAID, @ISGIFTAIDSPONSORSHIP, @OVERPAYMENTAPPLICATIONTYPECODE, @APPLIEDBASEAMOUNT, @APPLIEDORGANIZATIONAMOUNT, @APPLICATIONSPLITS, @CATEGORYCODEID;
while @@FETCH_STATUS = 0
begin
if @APPLICATIONCODE = -1
raiserror('The application type is not supported.', 13, 1);
declare @AMOUNTPAID money
set @AMOUNTPAID = @APPLIEDAMOUNT;
if @APPLICATIONTYPE = 0 --Gift
begin
SELECT top 1
@DESIGNATIONID = T.c.value('(DESIGNATIONID)[1]','uniqueidentifier'),
@OPPORTUNITYID = T.c.value('(OPPORTUNITYID)[1]','uniqueidentifier'),
@CATEGORYCODEID = T.c.value('(CATEGORYCODEID)[1]','uniqueidentifier'),
@CAMPAIGNS = c.query('./CAMPAIGNS'),
@SOLICITORS = c.query('./SOLICITORS'),
@RECOGNITIONCREDITS = c.query('./RECOGNITIONS'),
@REVENUETYPECODE = T.c.value('(REVENUETYPECODE)[1]','tinyint')
FROM @GIFTFIELDS.nodes('/GIFTFIELDS/ITEM') T(c);
declare @GIFTID uniqueidentifier
set @GIFTID = null
exec dbo.USP_GIFT_ADDPAYMENT
@REVENUEID = @REVENUEID,
@AMOUNT = @APPLIEDAMOUNT,
@DESIGNATIONID = @DESIGNATIONID,
@OPPORTUNITYID = @OPPORTUNITYID,
@CAMPAIGNS = @CAMPAIGNS,
@SOLICITORS = @SOLICITORS,
@RECOGNITIONCREDITS = @RECOGNITIONCREDITS,
@CATEGORYCODEID = @CATEGORYCODEID,
@CREATIONDATE = @CREATIONDATE,
@CHANGEAGENTID = @CHANGEAGENTID,
@ID = @GIFTID output,
@REVENUETYPECODE = @REVENUETYPECODE,
@BASEAMOUNT = @APPLIEDBASEAMOUNT,
@ORGANIZATIONAMOUNT = @APPLIEDORGANIZATIONAMOUNT;
if @DECLINESGIFTAID = 1
insert into @SPLITSGIFTAIDINFOTBL (REVENUESPLITID, DECLINESGIFTAID) values (@GIFTID, 1)
if @ISGIFTAIDSPONSORSHIP = 1
begin
if exists(select 1 from @SPLITSGIFTAIDINFOTBL where REVENUESPLITID = @GIFTID)
begin
update @SPLITSGIFTAIDINFOTBL set ISSPONSORSHIP = 1 where REVENUESPLITID = @GIFTID;
end
else
begin
insert into @SPLITSGIFTAIDINFOTBL (REVENUESPLITID, ISSPONSORSHIP) values (@GIFTID, 1);
end
end
end
if @APPLICATIONTYPE = 1 --Event Registration
exec dbo.USP_EVENT_ADDPAYMENT
@REVENUEID = @REVENUEID,
@APPLICATIONID = @APPLICATIONID,
@APPLIEDAMOUNT = @APPLIEDAMOUNT,
@CREATIONDATE = @CREATIONDATE,
@CHANGEAGENTID = @CHANGEAGENTID,
@APPLIEDBASEAMOUNT = @APPLIEDBASEAMOUNT,
@APPLIEDORGANIZATIONAMOUNT = @APPLIEDORGANIZATIONAMOUNT,
@CATEGORYCODEID = @CATEGORYCODEID;
if @APPLICATIONTYPE in (
2, --Pledge
7, --MG Pledge
6, --Planned Gift
8, --Grant award
13, --Donor Challenge
17, --Pending gift
19 --Membership installment plan
)
begin
declare @PLEDGECREATEDSPLITS xml
exec dbo.USP_PLEDGE_ADDPAYMENT
@REVENUEID = @REVENUEID,
@APPLICATIONID = @APPLICATIONID,
@APPLIEDAMOUNT = @APPLIEDAMOUNT,
@CONSTITUENTID = @CONSTITUENTID,
@DATE = @DATE,
@UNAPPLIEDMATCHINGGIFTSPLITS = @UNAPPLIEDMATCHINGGIFTSPLITS,
@APPLICATIONTYPE = @APPLICATIONTYPE,
@AMOUNTPAID = @AMOUNTPAID output,
@CREATIONDATE = @CREATIONDATE,
@CHANGEAGENTID = @CHANGEAGENTID,
@CREATEDSPLITS = @PLEDGECREATEDSPLITS output,
@OVERPAYMENTAPPLICATIONTYPECODE = @OVERPAYMENTAPPLICATIONTYPECODE,
@APPLIEDBASEAMOUNT = @APPLIEDBASEAMOUNT,
@APPLIEDORGANIZATIONAMOUNT = @APPLIEDORGANIZATIONAMOUNT,
@APPLICATIONSPLITS = @APPLICATIONSPLITS;
if @AMOUNTPAID <> @APPLIEDAMOUNT
raiserror('BBERR_PLEDGENOTFULLYAPPLIED', 13, 1);
if @APPLICATIONTYPE = 2
begin
if @RECEIPTTYPEPERPAYMENTFOUND = 0
begin
-- reset the receipttypecode for pledge since initially set to just payment
-- which does not get the correct preference.
declare @PLEDGERECEIPTTYPECODE tinyint;
set @PLEDGERECEIPTTYPECODE = dbo.UFN_CONSTITUENT_GETRECEIPTPREFERENCE(@CONSTITUENTID,@APPLICATIONTYPE);
if @PLEDGERECEIPTTYPECODE = 0
begin
set @RECEIPTTYPEPERPAYMENTFOUND = 1
end
update dbo.REVENUE_EXT
set RECEIPTTYPECODE = @PLEDGERECEIPTTYPECODE
where ID = @REVENUEID;
end
end
-- Default the declines gift aid and covenant values for a pledge payment split from the pledge split
insert into @SPLITSGIFTAIDINFOTBL
(
REVENUESPLITID,
DECLINESGIFTAID,
ISCOVENANT
)
select
T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
REVENUESPLITGIFTAID.DECLINESGIFTAID,
REVENUESPLITGIFTAID.ISCOVENANT
from @PLEDGECREATEDSPLITS.nodes('/SPLITS/ITEM') T(c)
inner join dbo.REVENUESPLITGIFTAID on T.c.value('(SOURCEREVENUESPLITID)[1]','uniqueidentifier') = REVENUESPLITGIFTAID.ID
where
REVENUESPLITGIFTAID.DECLINESGIFTAID = 1 or
REVENUESPLITGIFTAID.ISCOVENANT = 1
select
T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
REVENUESPLITGIFTAID.ID,
REVENUESPLITGIFTAID.DECLINESGIFTAID,
REVENUESPLITGIFTAID.ISCOVENANT
from @PLEDGECREATEDSPLITS.nodes('/SPLITS/ITEM') T(c)
inner join dbo.REVENUESPLITGIFTAID on T.c.value('(SOURCEREVENUESPLITID)[1]','uniqueidentifier') = REVENUESPLITGIFTAID.ID
end
if @APPLICATIONTYPE = 3 --Recurring Gift
begin
declare @RECURRINGGIFTCREATEDSPLITS xml
exec dbo.USP_RECURRINGGIFT_ADDPAYMENT
@REVENUEID = @REVENUEID,
@APPLICATIONID = @APPLICATIONID,
@APPLIEDAMOUNT = @APPLIEDAMOUNT,
@CONSTITUENTID = @CONSTITUENTID,
@DATE = @DATE,
@CREATIONDATE = @CREATIONDATE,
@CHANGEAGENTID = @CHANGEAGENTID,
@CREATEDSPLITS = @RECURRINGGIFTCREATEDSPLITS output,
@BASEAPPLIEDAMOUNT = @APPLIEDBASEAMOUNT,
@ORGANIZATIONAPPLIEDAMOUNT = @APPLIEDORGANIZATIONAMOUNT;
if @RECEIPTTYPEPERPAYMENTFOUND = 0
begin
-- reset the receipttypecode for recurring gift since initially set to just payment
-- which does not get the correct preference.
declare @RECEIPTTYPECODE tinyint;
set @RECEIPTTYPECODE = dbo.UFN_CONSTITUENT_GETRECEIPTPREFERENCE(@CONSTITUENTID,@APPLICATIONTYPE);
if @RECEIPTTYPECODE = 0
begin
set @RECEIPTTYPEPERPAYMENTFOUND = 1
end
update dbo.REVENUE_EXT
set RECEIPTTYPECODE = @RECEIPTTYPECODE
where ID = @REVENUEID;
end
-- Default the declines gift aid value for a pledge payment split from the pledge split
insert into @SPLITSGIFTAIDINFOTBL
(
REVENUESPLITID,
DECLINESGIFTAID
)
select
T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
1
from @RECURRINGGIFTCREATEDSPLITS.nodes('/SPLITS/ITEM') T(c)
inner join dbo.REVENUESPLITGIFTAID on T.c.value('(SOURCEREVENUESPLITID)[1]','uniqueidentifier') = REVENUESPLITGIFTAID.ID
where REVENUESPLITGIFTAID.DECLINESGIFTAID = 1
end
if @APPLICATIONTYPE = 4 --Other
begin
SELECT top 1
@DESIGNATIONID = T.c.value('(DESIGNATIONID)[1]','uniqueidentifier'),
@OTHERTYPECODEID = T.c.value('(OTHERTYPECODEID)[1]','uniqueidentifier'),
@CATEGORYCODEID = T.c.value('(CATEGORYCODEID)[1]','uniqueidentifier'),
@CAMPAIGNS = c.query('./CAMPAIGNS'),
@SOLICITORS = c.query('./SOLICITORS'),
@RECOGNITIONCREDITS = c.query('./RECOGNITIONS')
FROM @OTHERFIELDS.nodes('/OTHERFIELDS/ITEM') T(c);
exec dbo.USP_OTHER_ADDPAYMENT
@REVENUEID = @REVENUEID,
@AMOUNT = @APPLIEDAMOUNT,
@DESIGNATIONID = @DESIGNATIONID,
@OTHERTYPECODEID = @OTHERTYPECODEID,
@CAMPAIGNS = @CAMPAIGNS,
@SOLICITORS = @SOLICITORS,
@CATEGORYCODEID = @CATEGORYCODEID,
@RECOGNITIONCREDITS = @RECOGNITIONCREDITS,
@CREATIONDATE = @CREATIONDATE,
@CHANGEAGENTID = @CHANGEAGENTID,
@BASEAMOUNT = @APPLIEDBASEAMOUNT,
@ORGANIZATIONAMOUNT = @APPLIEDORGANIZATIONAMOUNT;
end
if @APPLICATIONTYPE = 5 --Membership
begin
exec dbo.USP_MEMBERSHIP_ADDPAYMENT
@REVENUEID = @REVENUEID,
@CONSTITUENTID = @CONSTITUENTID,
@MEMBERSHIPID = @APPLICATIONID,
@AMOUNT = @APPLIEDAMOUNT,
@TRANSACTIONDATE = @DATE,
@MEMBERSHIPS = @MEMBERSHIPS,
@CREATIONDATE = @CREATIONDATE,
@CHANGEAGENTID = @CHANGEAGENTID,
@BASEAMOUNT = @APPLIEDBASEAMOUNT,
@ORGANIZATIONAMOUNT = @APPLIEDORGANIZATIONAMOUNT;
end
if @APPLICATIONTYPE = 100 -- unnappliedmatching gift claim
begin
SELECT top 1
@DESIGNATIONID = T.c.value('(DESIGNATIONID)[1]','uniqueidentifier'),
@CATEGORYCODEID = T.c.value('(CATEGORYCODEID)[1]','uniqueidentifier'),
@CAMPAIGNS = c.query('./CAMPAIGNS'),
@SOLICITORS = c.query('./SOLICITORS'),
@RECOGNITIONCREDITS = c.query('./RECOGNITIONS')
FROM @GIFTFIELDS.nodes('/GIFTFIELDS/ITEM') T(c);
exec dbo.USP_UNAPPLIEDMG_ADDPAYMENT
@REVENUEID = @REVENUEID,
@AMOUNT = @APPLIEDAMOUNT,
@DESIGNATIONID = @DESIGNATIONID,
@CAMPAIGNS = @CAMPAIGNS,
@SOLICITORS = @SOLICITORS,
@RECOGNITIONCREDITS = @RECOGNITIONCREDITS,
@CATEGORYCODEID = @CATEGORYCODEID,
@CREATIONDATE = @CREATIONDATE,
@CHANGEAGENTID = @CHANGEAGENTID,
@BASEAMOUNT = @APPLIEDBASEAMOUNT,
@ORGANIZATIONAMOUNT = @APPLIEDORGANIZATIONAMOUNT;
end
if @APPLICATIONTYPE = 12 --auction item purchase
begin
exec dbo.USP_AUCTIONPURCHASE_ADDPAYMENT
@REVENUEID = @REVENUEID,
@APPLICATIONID = @APPLICATIONID,
@APPLIEDAMOUNT = @APPLIEDAMOUNT,
@CONSTITUENTID = @CONSTITUENTID,
@DATE = @DATE,
@CHANGEAGENTID = @CHANGEAGENTID,
@PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID,
@BASEAPPLIEDAMOUNT = @APPLIEDBASEAMOUNT,
@ORGANIZATIONAPPLIEDAMOUNT = @APPLIEDORGANIZATIONAMOUNT;
end
if @APPLICATIONTYPE = 15 --Event Sponsorship
begin
exec dbo.USP_SPONSOR_ADDPAYMENT
@REVENUEID = @REVENUEID,
@APPLICATIONID = @APPLICATIONID,
@APPLIEDAMOUNT = @APPLIEDAMOUNT,
@CREATIONDATE = @CREATIONDATE,
@CHANGEAGENTID = @CHANGEAGENTID,
@BASEAPPLIEDAMOUNT = @APPLIEDBASEAMOUNT,
@ORGANIZATIONAPPLIEDAMOUNT = @APPLIEDORGANIZATIONAMOUNT;
end
fetch next from APPLICATIONSCURSOR into @APPLICATIONID, @APPLIEDAMOUNT, @APPLICATIONTYPE, @GIFTFIELDS, @OTHERFIELDS, @MEMBERSHIPS, @DECLINESGIFTAID, @ISGIFTAIDSPONSORSHIP, @OVERPAYMENTAPPLICATIONTYPECODE, @APPLIEDBASEAMOUNT, @APPLIEDORGANIZATIONAMOUNT, @APPLICATIONSPLITS, @CATEGORYCODEID;
end
end try
begin catch
exec dbo.USP_RAISE_ERROR;
end catch
--When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long
close APPLICATIONSCURSOR;
deallocate APPLICATIONSCURSOR;
set @SPLITSDECLININGGIFTAID = (select
REVENUESPLITID
from @SPLITSGIFTAIDINFOTBL
where DECLINESGIFTAID = 1
for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64)
set @COVENANTGIFTSPLITS = (select
REVENUESPLITID
from @SPLITSGIFTAIDINFOTBL
where ISCOVENANT = 1
for xml raw('ITEM'),type,elements,root('COVENANTGIFTSPLITS'),BINARY BASE64)
set @GIFTAIDSPONSORSHIPSPLITS = (select
REVENUESPLITID
from @SPLITSGIFTAIDINFOTBL
where ISSPONSORSHIP = 1
for xml raw('ITEM'),type,elements,root('GIFTAIDSPONSORSHIPSPLITS'),BINARY BASE64)