USP_PLEDGE_ADDPAYMENT
Adds a payment to a pledge.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUEID | uniqueidentifier | IN | |
@APPLICATIONID | uniqueidentifier | IN | |
@APPLIEDAMOUNT | money | IN | |
@CONSTITUENTID | uniqueidentifier | IN | |
@DATE | datetime | IN | |
@UNAPPLIEDMATCHINGGIFTSPLITS | xml | IN | |
@APPLICATIONTYPE | tinyint | IN | |
@AMOUNTPAID | money | INOUT | |
@CREATIONDATE | datetime | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CREATEDSPLITS | xml | INOUT | |
@OVERPAYMENTAPPLICATIONTYPECODE | tinyint | IN | |
@BUSINESSUNITSAPPLIED | bit | IN | |
@APPLIEDBASEAMOUNT | money | IN | |
@APPLIEDORGANIZATIONAMOUNT | money | IN | |
@APPLICATIONSPLITS | xml | IN |
Definition
Copy
CREATE procedure dbo.USP_PLEDGE_ADDPAYMENT
(
@REVENUEID uniqueidentifier,
@APPLICATIONID uniqueidentifier,
@APPLIEDAMOUNT money,
@CONSTITUENTID uniqueidentifier,
@DATE datetime,
@UNAPPLIEDMATCHINGGIFTSPLITS xml,
@APPLICATIONTYPE tinyint,
@AMOUNTPAID money = null output,
@CREATIONDATE datetime = null,
@CHANGEAGENTID uniqueidentifier = null,
@CREATEDSPLITS xml = null output,
@OVERPAYMENTAPPLICATIONTYPECODE tinyint = null,
@BUSINESSUNITSAPPLIED bit = 0,
@APPLIEDBASEAMOUNT money = null,
@APPLIEDORGANIZATIONAMOUNT money = null,
@APPLICATIONSPLITS xml = null
)
as
set nocount on
declare @EMPTYGUID uniqueidentifier;
set @EMPTYGUID = '00000000-0000-0000-0000-000000000000';
declare @PAYMENTTRANSACTIONCURRENCYID uniqueidentifier;
declare @PAYMENTBASECURRENCYID uniqueidentifier;
declare @PAYMENTBASEEXCHANGERATEID uniqueidentifier;
declare @PAYMENTORGANIZATIONEXCHANGERATEID uniqueidentifier;
declare @PAYMENTBASETOORGANIZATIONEXCHANGERATEID uniqueidentifier;
declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
select
@PAYMENTTRANSACTIONCURRENCYID = FINANCIALTRANSACTION.TRANSACTIONCURRENCYID,
@PAYMENTBASECURRENCYID = CURRENCYSET.BASECURRENCYID,
@PAYMENTBASEEXCHANGERATEID = FINANCIALTRANSACTION.BASEEXCHANGERATEID,
@PAYMENTORGANIZATIONEXCHANGERATEID = FINANCIALTRANSACTION.ORGEXCHANGERATEID
from
dbo.FINANCIALTRANSACTION inner join dbo.PDACCOUNTSYSTEM on FINANCIALTRANSACTION.PDACCOUNTSYSTEMID = PDACCOUNTSYSTEM.ID
inner join dbo.CURRENCYSET on PDACCOUNTSYSTEM.CURRENCYSETID = CURRENCYSET.ID
where
FINANCIALTRANSACTION.ID = @REVENUEID
and FINANCIALTRANSACTION.DELETEDON is null;
set @PAYMENTBASETOORGANIZATIONEXCHANGERATEID = dbo.UFN_CURRENCYEXCHANGERATE_GETLATESTBASETOORGANIZATIONRATE(@PAYMENTBASECURRENCYID, @DATE, null, @PAYMENTORGANIZATIONEXCHANGERATEID);
if @APPLICATIONID <> @EMPTYGUID
begin
--Error if an exchange rate isn't entered, but the transaction and base currencies are different,
-- and the payment is for anything other than a donation, other, or unapplied MG.
if @PAYMENTBASEEXCHANGERATEID is null and @PAYMENTTRANSACTIONCURRENCYID <> @PAYMENTBASECURRENCYID
begin
raiserror('BBERR_INVALIDAPPLICATIONSWITHNORATE : Payments without an exchange rate can only be applied to the donation, other, or unapplied matching gift application types.', 13, 1);
return 1;
end
declare @INSTALLMENTSUM money
set @INSTALLMENTSUM = @APPLIEDAMOUNT;
exec dbo.USP_PLEDGE_PAYINSTALLMENTS
@APPLICATIONID,
@REVENUEID,
@INSTALLMENTSUM output,
@CHANGEAGENTID,
@CREATIONDATE,
@CREATEDSPLITS output,
@OVERPAYMENTAPPLICATIONTYPECODE,
@APPLIEDBASEAMOUNT,
@APPLIEDORGANIZATIONAMOUNT,
@APPLICATIONSPLITS;
set @AMOUNTPAID = @INSTALLMENTSUM;
declare @PLEDGESPLIT table
(
ID uniqueidentifier,
SOURCEREVENUESPLITID uniqueidentifier,
DESIGNATIONID uniqueidentifier,
AMOUNT money
)
insert into @PLEDGESPLIT
(
ID,
SOURCEREVENUESPLITID,
DESIGNATIONID,
AMOUNT -- this is the base amount of the revenue split
)
select
T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
T.c.value('(SOURCEREVENUESPLITID)[1]','uniqueidentifier') AS 'SOURCEREVENUESPLITID',
T.c.value('(DESIGNATIONID)[1]','uniqueidentifier') AS 'DESIGNATIONID',
T.c.value('(AMOUNT)[1]','money') AS 'AMOUNT'
from @CREATEDSPLITS.nodes('/SPLITS/ITEM') T(c)
-- Generate campaigns for payment splits from pledges
--Delete previous values
delete REVENUESPLITCAMPAIGN
from dbo.REVENUESPLITCAMPAIGN inner join @PLEDGESPLIT t1 on REVENUESPLITCAMPAIGN.REVENUESPLITID = t1.ID
insert into dbo.REVENUESPLITCAMPAIGN
(
REVENUESPLITID,
CAMPAIGNID,
CAMPAIGNSUBPRIORITYID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
PLEDGESPLIT.ID,
REVENUESPLITCAMPAIGN.CAMPAIGNID,
REVENUESPLITCAMPAIGN.CAMPAIGNSUBPRIORITYID,
@CHANGEAGENTID, @CHANGEAGENTID, @CREATIONDATE, @CREATIONDATE
from @PLEDGESPLIT as PLEDGESPLIT
--inner join dbo.INSTALLMENTSPLITPAYMENT on PLEDGESPLIT.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
--inner join dbo.FINANCIALTRANSACTIONLINEITEM on PLEDGESPLIT.SOURCEREVENUESPLITID = FINANCIALTRANSACTIONLINEITEM.ID
inner join dbo.REVENUESPLITCAMPAIGN on PLEDGESPLIT.SOURCEREVENUESPLITID = REVENUESPLITCAMPAIGN.REVENUESPLITID
inner join dbo.CAMPAIGN on REVENUESPLITCAMPAIGN.CAMPAIGNID = CAMPAIGN.ID
where CAMPAIGN.ISACTIVE=1;
/* update appeal id with source appealid if appealid isn't supplied during payment */
update REX set
APPEALID = coalesce(REX.APPEALID, R.APPEALID),
MAILINGID = coalesce(REX.MAILINGID, R.MAILINGID),
SOURCECODE = coalesce(nullif(REX.SOURCECODE, ''), R.SOURCECODE),
CHANNELCODEID = coalesce(REX.CHANNELCODEID, R.CHANNELCODEID)
from dbo.REVENUE_EXT REX
join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on REX.ID = FTLI.FINANCIALTRANSACTIONID
join dbo.INSTALLMENTSPLITPAYMENT ISP on FTLI.ID = ISP.PAYMENTID
join dbo.REVENUE_EXT R on ISP.PLEDGEID = R.ID
where REX.ID = @REVENUEID
-- Create recognitions unless the application is a matching gift claim OR pending gift
if @APPLICATIONTYPE NOT IN (7,17)
begin
declare @REVENUEGIVENANONYMOUSLY bit,
@SOURCEREVENUESPLITID uniqueidentifier = null
select @REVENUEGIVENANONYMOUSLY = R.GIVENANONYMOUSLY
from dbo.REVENUE_EXT R
where R.ID = @REVENUEID
/*Friends Asking Friends pledge should credit the original recognition */
if exists(select R.ID from dbo.REVENUE_EXT R inner join dbo.EVENT E on R.APPEALID = E.APPEALID inner join dbo.EVENTEXTENSION EX on E.ID = EX.EVENTID where R.ID = @APPLICATIONID)
begin
select @SOURCEREVENUESPLITID = SOURCEREVENUESPLITID from @PLEDGESPLIT
end
delete REVENUERECOGNITION
from dbo.REVENUERECOGNITION inner join @PLEDGESPLIT t1 on REVENUERECOGNITION.REVENUESPLITID = t1.ID
insert into dbo.REVENUERECOGNITION
(
REVENUESPLITID,
CONSTITUENTID,
AMOUNT,
EFFECTIVEDATE,
REVENUERECOGNITIONTYPECODEID,
BASECURRENCYID,
ORGANIZATIONAMOUNT,
ORGANIZATIONEXCHANGERATEID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
PLEDGESPLIT.ID,
RECOGNITIONS.CONSTITUENTID,
RECOGNITIONS.AMOUNT,
@DATE,
RECOGNITIONS.REVENUERECOGNITIONTYPECODEID,
@PAYMENTBASECURRENCYID,
case when @PAYMENTBASECURRENCYID = @ORGANIZATIONCURRENCYID
then RECOGNITIONS.AMOUNT
else dbo.UFN_CURRENCY_CONVERT(RECOGNITIONS.AMOUNT, @PAYMENTBASETOORGANIZATIONEXCHANGERATEID)
end,
@PAYMENTBASETOORGANIZATIONEXCHANGERATEID,
@CHANGEAGENTID, @CHANGEAGENTID, @CREATIONDATE, @CREATIONDATE
from @PLEDGESPLIT as PLEDGESPLIT
cross apply dbo.UFN_REVENUEDETAIL_GETDEFAULTRECOGNITIONS(@REVENUEGIVENANONYMOUSLY, @CONSTITUENTID, AMOUNT, @DATE, @SOURCEREVENUESPLITID) as RECOGNITIONS /*@SOURCEREVENUESPLITID is null most of cases except FAF pledge payment*/
end
delete REVENUESOLICITOR
from dbo.REVENUESOLICITOR inner join @PLEDGESPLIT t1 on REVENUESOLICITOR.REVENUESPLITID = t1.ID
insert into dbo.REVENUESOLICITOR
(
REVENUESPLITID,
CONSTITUENTID,
AMOUNT,
SEQUENCE,
BASECURRENCYID,
ORGANIZATIONAMOUNT,
ORGANIZATIONEXCHANGERATEID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
PLEDGESPLIT.ID,
REVENUESOLICITOR.CONSTITUENTID,
--JamesWill 04/03/2006 CR239791-033106 According to documentation, @APPLIEDAMOUNT will
--implicitly cast as a decimal. Explicitly performing the cast rounds it, however, and
--gives an incorrect result.
case when cast(SOURCESPLIT.BASEAMOUNT as decimal(30, 5)) <> 0
then cast(REVENUESOLICITOR.AMOUNT * (cast(PLEDGESPLIT.AMOUNT as decimal(30, 5))/ cast(SOURCESPLIT.BASEAMOUNT as decimal(30, 5))) as money)
else 0.0
end,
REVENUESOLICITOR.SEQUENCE,
@PAYMENTBASECURRENCYID,
case when cast(SOURCESPLIT.BASEAMOUNT as decimal(30, 5)) <> 0
then
case when @PAYMENTBASECURRENCYID = @ORGANIZATIONCURRENCYID
then cast(REVENUESOLICITOR.AMOUNT * (cast(PLEDGESPLIT.AMOUNT as decimal(30, 5))/ cast(SOURCESPLIT.BASEAMOUNT as decimal(30, 5))) as money)
else dbo.UFN_CURRENCY_CONVERT((cast(REVENUESOLICITOR.AMOUNT * (cast(PLEDGESPLIT.AMOUNT as decimal(30, 5))/ cast(SOURCESPLIT.BASEAMOUNT as decimal(30, 5))) as money)), @PAYMENTBASETOORGANIZATIONEXCHANGERATEID)
end
else
0.0
end,
@PAYMENTBASETOORGANIZATIONEXCHANGERATEID,
@CHANGEAGENTID, @CHANGEAGENTID, @CREATIONDATE, @CREATIONDATE
from @PLEDGESPLIT as PLEDGESPLIT
inner join dbo.FINANCIALTRANSACTIONLINEITEM as SOURCESPLIT on PLEDGESPLIT.SOURCEREVENUESPLITID = SOURCESPLIT.ID
inner join dbo.REVENUESPLIT_EXT on SOURCESPLIT.ID = REVENUESPLIT_EXT.ID
inner join dbo.REVENUESOLICITOR on SOURCESPLIT.ID = REVENUESOLICITOR.REVENUESPLITID
where SOURCESPLIT.DELETEDON is null
and SOURCESPLIT.TYPECODE <> 1
-- Copy category codes from the source splits
delete REVENUECATEGORY
from dbo.REVENUECATEGORY inner join @PLEDGESPLIT t1 on REVENUECATEGORY.ID = t1.ID
insert into dbo.REVENUECATEGORY
(
ID,
GLREVENUECATEGORYMAPPINGID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
PLEDGESPLIT.ID,
REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID,
@CHANGEAGENTID, @CHANGEAGENTID, @CREATIONDATE, @CREATIONDATE
from @PLEDGESPLIT as PLEDGESPLIT
inner join dbo.REVENUECATEGORY on PLEDGESPLIT.SOURCEREVENUESPLITID = REVENUECATEGORY.ID
-- Copy opportunity from source
delete REVENUEOPPORTUNITY
from dbo.REVENUEOPPORTUNITY inner join @PLEDGESPLIT t1 on REVENUEOPPORTUNITY.ID = t1.ID
insert into dbo.REVENUEOPPORTUNITY
(
ID,
OPPORTUNITYID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
PLEDGESPLIT.ID,
REVENUEOPPORTUNITY.OPPORTUNITYID,
@CHANGEAGENTID, @CHANGEAGENTID, @CREATIONDATE, @CREATIONDATE
from @PLEDGESPLIT as PLEDGESPLIT
inner join dbo.REVENUEOPPORTUNITY on PLEDGESPLIT.SOURCEREVENUESPLITID = REVENUEOPPORTUNITY.ID
end
else
begin
declare @UNAPPLIEDMGSPLITS table
(
ID uniqueidentifier,
AMOUNT money,
DESIGNATIONID uniqueidentifier,
REVENUEID uniqueidentifier,
APPLICATIONCODE tinyint,
TYPECODE tinyint
)
insert into @UNAPPLIEDMGSPLITS
(
ID,
AMOUNT,
DESIGNATIONID,
REVENUEID,
APPLICATIONCODE,
TYPECODE
)
select
T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
T.c.value('(AMOUNT)[1]','money') AS 'AMOUNT',
T.c.value('(DESIGNATIONID)[1]','uniqueidentifier') AS 'DESIGNATIONID',
T.c.value('(REVENUEID)[1]','uniqueidentifier') AS 'REVENUEID',
7 as APPLICATIONCODE, -- Matching Gift
0 as TYPECODE -- Gift
from @UNAPPLIEDMATCHINGGIFTSPLITS.nodes('/UNAPPLIEDMATCHINGGIFTSPLITS/ITEM') T(c)
update @UNAPPLIEDMGSPLITS set ID = newid() where ID is null
select @CREATEDSPLITS =
(
select
ID,
AMOUNT,
DESIGNATIONID,
REVENUEID,
APPLICATIONCODE,
TYPECODE
from @UNAPPLIEDMGSPLITS
for xml raw('ITEM'),type,elements,root('SPLITS'),BINARY BASE64
);
exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @CREATEDSPLITS, @APPLIEDAMOUNT;
exec dbo.USP_REVENUE_GETSPLITS_ADDFROMXML @REVENUEID, @CREATEDSPLITS, @CHANGEAGENTID, @CREATIONDATE;
-- Generate default campaigns
insert into dbo.REVENUESPLITCAMPAIGN
(
REVENUESPLITID,
CAMPAIGNID,
CAMPAIGNSUBPRIORITYID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
UNAPPLIEDMGSPLITS.ID,
DEFAULTCAMPAIGNS.CAMPAIGNID,
DEFAULTCAMPAIGNS.CAMPAIGNSUBPRIORITYID,
@CHANGEAGENTID, @CHANGEAGENTID, @CREATIONDATE, @CREATIONDATE
from @UNAPPLIEDMGSPLITS UNAPPLIEDMGSPLITS
cross apply dbo.UFN_DESIGNATION_GETDEFAULTCAMPAIGNS(UNAPPLIEDMGSPLITS.DESIGNATIONID, @DATE) as DEFAULTCAMPAIGNS
-- Generate default recognition credits
insert into dbo.REVENUERECOGNITION
(
REVENUESPLITID,
CONSTITUENTID,
REVENUERECOGNITIONTYPECODEID,
AMOUNT,
EFFECTIVEDATE,
BASECURRENCYID,
ORGANIZATIONAMOUNT,
ORGANIZATIONEXCHANGERATEID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
UNAPPLIEDMGSPLITS.ID,
RECOGNITIONS.CONSTITUENTID,
RECOGNITIONS.REVENUERECOGNITIONTYPECODEID,
RECOGNITIONS.AMOUNT,
FINANCIALTRANSACTION.DATE,
@PAYMENTBASECURRENCYID,
case when @PAYMENTBASECURRENCYID = @ORGANIZATIONCURRENCYID
then RECOGNITIONS.AMOUNT
else dbo.UFN_CURRENCY_CONVERT(RECOGNITIONS.AMOUNT, @PAYMENTBASETOORGANIZATIONEXCHANGERATEID)
end,
@PAYMENTBASETOORGANIZATIONEXCHANGERATEID,
@CHANGEAGENTID, @CHANGEAGENTID, @CREATIONDATE, @CREATIONDATE
from @UNAPPLIEDMGSPLITS UNAPPLIEDMGSPLITS
inner join dbo.FINANCIALTRANSACTION on @REVENUEID = FINANCIALTRANSACTION.ID
inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
cross apply dbo.UFN_REVENUEDETAIL_GETDEFAULTRECOGNITIONS(REVENUE_EXT.GIVENANONYMOUSLY, @CONSTITUENTID, UNAPPLIEDMGSPLITS.AMOUNT, @DATE, null) as RECOGNITIONS
set @AMOUNTPAID = @APPLIEDAMOUNT;
end
if @APPLICATIONTYPE = 7
begin
select @REVENUEGIVENANONYMOUSLY = R.GIVENANONYMOUSLY
from dbo.REVENUE_EXT R
where R.ID = @REVENUEID
set @CREATEDSPLITS = dbo.UFN_REVENUESPLIT_CONVERTAMOUNTSINXML(@CREATEDSPLITS, @PAYMENTBASECURRENCYID, @PAYMENTORGANIZATIONEXCHANGERATEID, @PAYMENTBASECURRENCYID, null)
-- (Lhunt 12/14/2010: moved code that creates default recognition credits based on MGC preferences to a separate stored procedure so other areas of the apps can use it)
exec dbo.USP_RECOGNITIONCREDITS_ADDBASEDONMGCPREFERENCES
@SPLITS = @CREATEDSPLITS,
@APPLICATIONID = @APPLICATIONID,
@CHANGEAGENTID = @CHANGEAGENTID,
@CURRENTDATE = @CREATIONDATE,
@REVENUEGIVENANONYMOUSLY = @REVENUEGIVENANONYMOUSLY
end
if @APPLICATIONTYPE = 17
begin
declare @RECOGNITIONCONSTITUENTID uniqueidentifier,
@DATEENTERED datetime,
@REVENUESPLITID uniqueidentifier
select
@RECOGNITIONCONSTITUENTID=RR.CONSTITUENTID,
@DATEENTERED = REV.DATE
from dbo.FINANCIALTRANSACTION REV
join dbo.FINANCIALTRANSACTIONLINEITEM RS ON REV.ID = RS.FINANCIALTRANSACTIONID
join dbo.REVENUERECOGNITION RR on RS.ID = RR.REVENUESPLITID
where REV.ID = @APPLICATIONID
if @RECOGNITIONCONSTITUENTID is not null
begin
set @CREATEDSPLITS = dbo.UFN_REVENUESPLIT_CONVERTAMOUNTSINXML(@CREATEDSPLITS, dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY(), null, dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY(), null)
exec dbo.USP_RECOGNITIONCREDIT_ADDDEFAULTSFORMGSPLITS @CREATEDSPLITS, @RECOGNITIONCONSTITUENTID, @DATEENTERED, null, @CHANGEAGENTID, @CREATIONDATE;
end
end
--Copy revenue attributes of the recurring gift to the payment
exec dbo.USP_REVENUEATTRIBUTES_COPYTOREVENUE @APPLICATIONID, @REVENUEID, @CHANGEAGENTID
/* Apply business units */
if @BUSINESSUNITSAPPLIED = 0
exec dbo.USP_REVENUESPLIT_APPLYBUSINESSUNITS @REVENUEID, @CHANGEAGENTID, @CREATIONDATE;