USP_RECONCILEMATCHINGGIFT_UPDATEPAYMENTSPLITS
Updates a matching gift payment's splits when reconciling matching gifts.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUESPLITID | uniqueidentifier | IN | |
@TOTALAMOUNTAPPLIED | money | IN | |
@REVENUESPLITAMOUNT | money | IN | |
@REVENUEID | uniqueidentifier | IN | |
@NEWDESIGNATIONEXISTS | bit | IN | |
@CLAIMSPAIDCOUNT | int | IN | |
@DESIGNATIONSPAIDXML | xml | IN | |
@PAYMENTDESIGNATIONID | uniqueidentifier | IN | |
@POSTDATE | datetime | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CREATIONDATE | datetime | IN | |
@REVENUESPLITDESIGNATIONCHANGED | uniqueidentifier | INOUT |
Definition
Copy
CREATE procedure dbo.USP_RECONCILEMATCHINGGIFT_UPDATEPAYMENTSPLITS
(
@REVENUESPLITID uniqueidentifier,
@TOTALAMOUNTAPPLIED money,
@REVENUESPLITAMOUNT money,
@REVENUEID uniqueidentifier,
@NEWDESIGNATIONEXISTS bit,
@CLAIMSPAIDCOUNT int,
@DESIGNATIONSPAIDXML xml,
@PAYMENTDESIGNATIONID uniqueidentifier,
@POSTDATE datetime,
@CHANGEAGENTID uniqueidentifier,
@CREATIONDATE datetime,
@REVENUESPLITDESIGNATIONCHANGED uniqueidentifier = null output
)
as
set nocount on;
-- Holds the designations and amounts being paid
declare @DESIGNATIONSPAID table
(
INSTALLMENTSPLITPAYMENTID uniqueidentifier,
DESIGNATIONID uniqueidentifier,
REVENUESPLITID uniqueidentifier,
AMOUNT money,
BASEAMOUNT money,
APPLICATIONID uniqueidentifier
);
insert into @DESIGNATIONSPAID(INSTALLMENTSPLITPAYMENTID, DESIGNATIONID, REVENUESPLITID, AMOUNT, APPLICATIONID)
select
T.c.value('(INSTALLMENTSPLITPAYMENTID)[1]','uniqueidentifier'),
T.c.value('(DESIGNATIONID)[1]','uniqueidentifier'),
T.c.value('(REVENUESPLITID)[1]','uniqueidentifier'),
T.c.value('(AMOUNT)[1]','money'),
T.c.value('(APPLICATIONID)[1]','uniqueidentifier')
from @DESIGNATIONSPAIDXML.nodes('/DESIGNATIONSPAID/ITEM') T(c);
-- First, if all the split amount was simply given to a different designation and was only applied to a single
-- claim, just update the designation ID for the existing split
if @NEWDESIGNATIONEXISTS = 1 and @TOTALAMOUNTAPPLIED = @REVENUESPLITAMOUNT and @CLAIMSPAIDCOUNT = 1
begin
update dbo.REVENUESPLIT set
DESIGNATIONID = (select DESIGNATIONID from @DESIGNATIONSPAID),
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CREATIONDATE
where ID = @REVENUESPLITID;
set @REVENUESPLITDESIGNATIONCHANGED = @REVENUESPLITID;
end
else
begin
declare @INSTALLMENTSPLITPAYMENTIDTONOTUPDATE uniqueidentifier, @RECOGNITIONS xml, @SOLICITORS xml;
set @RECOGNITIONS = (select ID, AMOUNT
from dbo.REVENUERECOGNITION
where REVENUESPLITID = @REVENUESPLITID
for xml raw('ITEM'),type,elements,root('AMOUNTSTOPRORATE'),binary base64);
set @SOLICITORS = (select ID, AMOUNT
from dbo.REVENUESOLICITOR
where REVENUESPLITID = @REVENUESPLITID
for xml raw('ITEM'),type,elements,root('AMOUNTSTOPRORATE'),binary base64);
declare @DELETEEXISTINGSPLIT bit;
set @DELETEEXISTINGSPLIT = 0;
declare @PAYMENTBASEAMOUNT money, @DEDUCTBASEAMOUNT money, @DEDUCTORGANIZATIONAMOUNT money;
declare @BASECURRENCYID uniqueidentifier, @BASEEXCHANGERATEID uniqueidentifier, @TRANSACTIONCURRENCYID uniqueidentifier, @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
select
@PAYMENTBASEAMOUNT = AMOUNT,
@BASECURRENCYID = BASECURRENCYID,
@BASEEXCHANGERATEID = BASEEXCHANGERATEID,
@TRANSACTIONCURRENCYID = TRANSACTIONCURRENCYID,
@ORGANIZATIONEXCHANGERATEID = ORGANIZATIONEXCHANGERATEID
from dbo.REVENUESPLIT
where ID = @REVENUESPLITID;
declare @BASEDECIMALDIGITS tinyint;
select
@BASEDECIMALDIGITS = DECIMALDIGITS
from dbo.CURRENCY
where CURRENCY.ID = @BASECURRENCYID;
if @TOTALAMOUNTAPPLIED < @REVENUESPLITAMOUNT or
exists(select top 1 INSTALLMENTSPLITPAYMENTID from @DESIGNATIONSPAID where DESIGNATIONID = @PAYMENTDESIGNATIONID)
begin
declare @AMOUNTTODEDUCT money;
if @TOTALAMOUNTAPPLIED < @REVENUESPLITAMOUNT
set @AMOUNTTODEDUCT = @TOTALAMOUNTAPPLIED;
else
begin
select top 1
@INSTALLMENTSPLITPAYMENTIDTONOTUPDATE = INSTALLMENTSPLITPAYMENTID
from @DESIGNATIONSPAID
where DESIGNATIONID = @PAYMENTDESIGNATIONID;
select @AMOUNTTODEDUCT = sum(AMOUNT)
from @DESIGNATIONSPAID
where INSTALLMENTSPLITPAYMENTID <> @INSTALLMENTSPLITPAYMENTIDTONOTUPDATE;
end
exec dbo.USP_CURRENCY_GETCURRENCYVALUES
@AMOUNT = @AMOUNTTODEDUCT,
@DATE = null,
@BASECURRENCYID = @BASECURRENCYID,
@BASEEXCHANGERATEID = @BASEEXCHANGERATEID,
@TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID,
@BASEAMOUNT = @DEDUCTBASEAMOUNT output,
@ORGANIZATIONAMOUNT = @DEDUCTORGANIZATIONAMOUNT output,
@ORGANIZATIONEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID;
update dbo.REVENUESPLIT set
TRANSACTIONAMOUNT = TRANSACTIONAMOUNT - @AMOUNTTODEDUCT,
AMOUNT = @PAYMENTBASEAMOUNT - @DEDUCTBASEAMOUNT,
ORGANIZATIONAMOUNT = ORGANIZATIONAMOUNT - @DEDUCTORGANIZATIONAMOUNT,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CREATIONDATE
where ID = @REVENUESPLITID;
--Bug#734240 - Updating JOURNALENTRY table AMOUNT fields, since these are not updated when updating REVENUESPLIT
update dbo.JOURNALENTRY set
TRANSACTIONAMOUNT = TRANSACTIONAMOUNT - @AMOUNTTODEDUCT,
BASEAMOUNT = @PAYMENTBASEAMOUNT - @DEDUCTBASEAMOUNT,
ORGAMOUNT = ORGAMOUNT - @DEDUCTORGANIZATIONAMOUNT,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CREATIONDATE
where FINANCIALTRANSACTIONLINEITEMID = @REVENUESPLITID;
update dbo.REVENUERECOGNITION set
AMOUNT = UPDATEDAMOUNT.AMOUNT,
ORGANIZATIONAMOUNT = case
when BASECURRENCYID <> @ORGANIZATIONCURRENCYID
then dbo.UFN_CURRENCY_CONVERT(UPDATEDAMOUNT.AMOUNT, ORGANIZATIONEXCHANGERATEID)
else UPDATEDAMOUNT.AMOUNT
end,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CREATIONDATE
from dbo.UFN_SPLITS_PRORATEAMOUNTS(@PAYMENTBASEAMOUNT, @PAYMENTBASEAMOUNT - @DEDUCTBASEAMOUNT, @BASEDECIMALDIGITS, @RECOGNITIONS) UPDATEDAMOUNT
where REVENUERECOGNITION.ID = UPDATEDAMOUNT.ID;
update dbo.REVENUESOLICITOR set
AMOUNT = UPDATEDAMOUNT.AMOUNT,
ORGANIZATIONAMOUNT = case
when BASECURRENCYID <> @ORGANIZATIONCURRENCYID
then dbo.UFN_CURRENCY_CONVERT(UPDATEDAMOUNT.AMOUNT, ORGANIZATIONEXCHANGERATEID)
else UPDATEDAMOUNT.AMOUNT
end,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CREATIONDATE
from dbo.UFN_SPLITS_PRORATEAMOUNTS(@PAYMENTBASEAMOUNT, @PAYMENTBASEAMOUNT - @DEDUCTBASEAMOUNT, @BASEDECIMALDIGITS, @SOLICITORS) UPDATEDAMOUNT
where REVENUESOLICITOR.ID = UPDATEDAMOUNT.ID;
end
else
begin
--Bug 13617 AdamBu 9/17/2008
--If an unapplied MG payment is being reconciled to more than one MG claim and there is no
-- unapplied/unreconciled revenue left on the payment and none of the claims are applied
-- to the same designation as the unapplied payment, then we need to delete to original
-- payment split because it isn't being modified and reused. See below.
set @DELETEEXISTINGSPLIT = 1;
end
-- Create new splits for claims
update @DESIGNATIONSPAID set
REVENUESPLITID = newid()
where
@INSTALLMENTSPLITPAYMENTIDTONOTUPDATE is null or
INSTALLMENTSPLITPAYMENTID <> @INSTALLMENTSPLITPAYMENTIDTONOTUPDATE;
insert into dbo.REVENUESPLIT (ID, REVENUEID, DESIGNATIONID, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, AMOUNT, BASECURRENCYID, BASEEXCHANGERATEID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID, TYPECODE, APPLICATIONCODE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select
DESIGNATIONSPAID.REVENUESPLITID,
REVENUESPLIT.REVENUEID,
DESIGNATIONSPAID.DESIGNATIONID,
DESIGNATIONSPAID.AMOUNT,
REVENUESPLIT.TRANSACTIONCURRENCYID,
CURRENCYVALUES.BASEAMOUNT,
REVENUESPLIT.BASECURRENCYID,
REVENUESPLIT.BASEEXCHANGERATEID,
CURRENCYVALUES.ORGANIZATIONAMOUNT,
REVENUESPLIT.ORGANIZATIONEXCHANGERATEID,
REVENUESPLIT.TYPECODE,
REVENUESPLIT.APPLICATIONCODE,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CREATIONDATE,
@CREATIONDATE
from dbo.REVENUESPLIT
cross join @DESIGNATIONSPAID as DESIGNATIONSPAID
cross apply dbo.UFN_CURRENCY_GETCURRENCYVALUES_2(
DESIGNATIONSPAID.AMOUNT,
null,
REVENUESPLIT.BASECURRENCYID,
REVENUESPLIT.BASEEXCHANGERATEID,
REVENUESPLIT.TRANSACTIONCURRENCYID,
null,
null,
null,
REVENUESPLIT.ORGANIZATIONEXCHANGERATEID,
0) as CURRENCYVALUES
where
REVENUESPLIT.ID = @REVENUESPLITID and
DESIGNATIONSPAID.REVENUESPLITID <> @REVENUESPLITID;
-- Set the base amounts in the DESIGNATIONSPAID table.
update DP
set BASEAMOUNT = (select AMOUNT
from dbo.REVENUESPLIT
where ID = DP.REVENUESPLITID)
from @DESIGNATIONSPAID as DP;
update dbo.INSTALLMENTSPLITPAYMENT set
PAYMENTID = DESIGNATIONSPAID.REVENUESPLITID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CREATIONDATE
from @DESIGNATIONSPAID as DESIGNATIONSPAID
where
INSTALLMENTSPLITPAYMENT.ID = DESIGNATIONSPAID.INSTALLMENTSPLITPAYMENTID and
DESIGNATIONSPAID.REVENUESPLITID <> @REVENUESPLITID;
-- Copy recognition credits and solicitors to new splits
insert into dbo.REVENUERECOGNITION (REVENUESPLITID, CONSTITUENTID, AMOUNT, BASECURRENCYID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID, EFFECTIVEDATE, REVENUERECOGNITIONTYPECODEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select
DESIGNATIONSPAID.REVENUESPLITID,
REVENUERECOGNITION.CONSTITUENTID,
UPDATEDAMOUNT.AMOUNT,
REVENUERECOGNITION.BASECURRENCYID,
case
when REVENUERECOGNITION.BASECURRENCYID <> @ORGANIZATIONCURRENCYID
then dbo.UFN_CURRENCY_CONVERT(UPDATEDAMOUNT.AMOUNT, REVENUERECOGNITION.ORGANIZATIONEXCHANGERATEID)
else UPDATEDAMOUNT.AMOUNT
end ORGANIZATIONAMOUNT,
REVENUERECOGNITION.ORGANIZATIONEXCHANGERATEID,
REVENUERECOGNITION.EFFECTIVEDATE,
REVENUERECOGNITION.REVENUERECOGNITIONTYPECODEID,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CREATIONDATE,
@CREATIONDATE
from @DESIGNATIONSPAID as DESIGNATIONSPAID
cross apply dbo.UFN_SPLITS_PRORATEAMOUNTS(@PAYMENTBASEAMOUNT, DESIGNATIONSPAID.BASEAMOUNT, @BASEDECIMALDIGITS, @RECOGNITIONS) UPDATEDAMOUNT
inner join dbo.REVENUERECOGNITION on REVENUERECOGNITION.ID = UPDATEDAMOUNT.ID
where DESIGNATIONSPAID.REVENUESPLITID <> @REVENUESPLITID;
insert into dbo.REVENUESOLICITOR (REVENUESPLITID, CONSTITUENTID, AMOUNT, BASECURRENCYID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select
DESIGNATIONSPAID.REVENUESPLITID,
REVENUESOLICITOR.CONSTITUENTID,
UPDATEDAMOUNT.AMOUNT,
REVENUESOLICITOR.BASECURRENCYID,
case
when REVENUESOLICITOR.BASECURRENCYID <> @ORGANIZATIONCURRENCYID
then dbo.UFN_CURRENCY_CONVERT(UPDATEDAMOUNT.AMOUNT, REVENUESOLICITOR.ORGANIZATIONEXCHANGERATEID)
else UPDATEDAMOUNT.AMOUNT
end ORGANIZATIONAMOUNT,
REVENUESOLICITOR.ORGANIZATIONEXCHANGERATEID,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CREATIONDATE,
@CREATIONDATE
from @DESIGNATIONSPAID as DESIGNATIONSPAID
cross apply dbo.UFN_SPLITS_PRORATEAMOUNTS(@PAYMENTBASEAMOUNT, DESIGNATIONSPAID.BASEAMOUNT, @BASEDECIMALDIGITS, @SOLICITORS) UPDATEDAMOUNT
inner join dbo.REVENUESOLICITOR on REVENUESOLICITOR.ID = UPDATEDAMOUNT.ID
where DESIGNATIONSPAID.REVENUESPLITID <> @REVENUESPLITID;
--Bug 13617 AdamBu 9/17/2008
--If an unapplied MG payment is being reconciled to more than one MG claim and there is no
-- unapplied/unreconciled revenue left on the payment and none of the claims are applied
-- to the same designation as the unapplied payment, then we need to delete to original
-- payment split because it isn't being modified and reused. See above.
if @DELETEEXISTINGSPLIT = 1
begin
delete REVENUESPLIT
where ID=@REVENUESPLITID;
end
end
-- Create the adjustment if the revenue has already posted
if exists (select 1 from dbo.REVENUEPOSTED where ID = @REVENUEID)
begin
exec dbo.USP_RECONCILEMATCHINGGIFTPAYMENT_ADJUST @REVENUEID,@CHANGEAGENTID,@CREATIONDATE,@POSTDATE,'Designation adjusted',1,1;
end
else if (select POSTSTATUSCODE from dbo.FINANCIALTRANSACTION where ID = @REVENUEID) <> 2
begin
exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @REVENUEID, @CHANGEAGENTID, @CREATIONDATE;
end
if @DELETEEXISTINGSPLIT = 1
begin
--Re-create Gift Fee's
declare @CONSTITUENTID uniqueidentifier = (select CONSTITUENTID from dbo.REVENUE where ID=@REVENUEID)
exec USP_PAYMENT_ADDGIFTFEES @REVENUEID,@CONSTITUENTID,@CHANGEAGENTID,@CREATIONDATE
end
-- Validate the splits
/* commenting out unnecessary code since USP_REVENUESPLIT_VALIDATESPLITS has been commented out.
declare @SPLITS xml;
select @SPLITS =
(
select
AMOUNT,
DESIGNATIONID,
ID
from dbo.REVENUESPLIT
where REVENUEID = @REVENUEID
for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64
);
declare @REVENUEAMOUNT money;
select @REVENUEAMOUNT = AMOUNT
from dbo.REVENUE
where ID = @REVENUEID;
*/
declare @REVENUEGIVENANONYMOUSLY bit
select @REVENUEGIVENANONYMOUSLY = R.GIVENANONYMOUSLY
from dbo.REVENUE_EXT R
where R.ID = @REVENUEID
--exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS, @REVENUEAMOUNT;
declare @CREATEDSPLITS xml;
declare @SPLITID uniqueidentifier, @APPLIEDAMOUNT money, @APPLICATIONID uniqueidentifier, @DESIGNATIONID uniqueidentifier;
declare MGSCURSOR cursor local fast_forward for
select REVENUESPLITID,
AMOUNT,
APPLICATIONID,
DESIGNATIONID
from @DESIGNATIONSPAID
open MGSCURSOR;
fetch next from MGSCURSOR into @SPLITID, @APPLIEDAMOUNT, @APPLICATIONID, @DESIGNATIONID;
while @@FETCH_STATUS = 0
begin
select @CREATEDSPLITS =
(
select
@SPLITID as ID,
CURRENCYVALUES.BASEAMOUNT as AMOUNT,
@DESIGNATIONID as DESIGNATIONID
from dbo.UFN_CURRENCY_GETCURRENCYVALUES_2(@APPLIEDAMOUNT,
null,
@BASECURRENCYID,
@BASEEXCHANGERATEID,
@TRANSACTIONCURRENCYID,
null,
null,
null,
@ORGANIZATIONEXCHANGERATEID,
0) as CURRENCYVALUES
for xml raw('ITEM'),type,elements,root('SPLITS'),BINARY BASE64
);
exec dbo.USP_RECOGNITIONCREDITS_ADDBASEDONMGCPREFERENCES
@SPLITS = @CREATEDSPLITS,
@APPLICATIONID = @APPLICATIONID,
@CHANGEAGENTID = @CHANGEAGENTID,
@CURRENTDATE = @CREATIONDATE,
@REVENUEGIVENANONYMOUSLY = @REVENUEGIVENANONYMOUSLY
fetch next from MGSCURSOR into @SPLITID, @APPLIEDAMOUNT, @APPLICATIONID, @DESIGNATIONID;
end
--When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long
close MGSCURSOR;
deallocate MGSCURSOR;