USP_DATAFORMTEMPLATE_EDIT_PLEDGE_8
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@DATE | datetime | IN | |
@AMOUNT | money | IN | |
@POSTSTATUSCODE | tinyint | IN | |
@POSTDATE | datetime | IN | |
@SENDPLEDGEREMINDER | bit | IN | |
@SPLITS | xml | IN | |
@FREQUENCYCODE | tinyint | IN | |
@NUMBEROFINSTALLMENTS | int | IN | |
@NEXTTRANSACTIONDATE | datetime | IN | |
@INSTALLMENTS | xml | IN | |
@SOURCECODE | nvarchar(50) | IN | |
@APPEALID | uniqueidentifier | IN | |
@BENEFITS | xml | IN | |
@BENEFITSWAIVED | bit | IN | |
@GIVENANONYMOUSLY | bit | IN | |
@MAILINGID | uniqueidentifier | IN | |
@CHANNELCODEID | uniqueidentifier | IN | |
@DONOTACKNOWLEDGE | bit | IN | |
@PLEDGESUBTYPEID | uniqueidentifier | IN | |
@OPPORTUNITYID | uniqueidentifier | IN | |
@REFERENCE | nvarchar(255) | IN | |
@CATEGORYCODEID | uniqueidentifier | IN | |
@ADJPAYMENT_DATE | datetime | IN | |
@ADJPAYMENT_POSTDATE | datetime | IN | |
@ADJPAYMENT_REASONCODEID | uniqueidentifier | IN | |
@ADJPAYMENT_DETAILS | nvarchar(255) | IN | |
@PERCENTAGEBENEFITS | xml | IN | |
@BASECURRENCYID | uniqueidentifier | IN | |
@TRANSACTIONCURRENCYID | uniqueidentifier | IN | |
@BASEEXCHANGERATEID | uniqueidentifier | IN | |
@EXCHANGERATE | decimal(20, 8) | IN | |
@HADSPOTRATE | bit | IN | |
@RATECHANGED | bit | IN | |
@UPDATERECOGNITIONOPTION | tinyint | IN | |
@CURRENTAPPUSERID | uniqueidentifier | IN | |
@UPDATETRIBUTEOPTION | tinyint | IN | |
@VALIDATETRIBUTES | bit | IN | |
@ISMEMBERSHIPPLEDGE | bit | IN | |
@INSTALLMENTAMOUNT | money | IN |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_PLEDGE_8 (
@ID uniqueidentifier
,@CHANGEAGENTID uniqueidentifier = null
,@DATE datetime
,@AMOUNT money
,@POSTSTATUSCODE tinyint
,@POSTDATE datetime
,@SENDPLEDGEREMINDER bit
,@SPLITS xml
,@FREQUENCYCODE tinyint
,@NUMBEROFINSTALLMENTS int
,@NEXTTRANSACTIONDATE datetime
,@INSTALLMENTS xml
,@SOURCECODE nvarchar(50)
,@APPEALID uniqueidentifier
,@BENEFITS xml
,@BENEFITSWAIVED bit
,@GIVENANONYMOUSLY bit
,@MAILINGID uniqueidentifier
,@CHANNELCODEID uniqueidentifier
,@DONOTACKNOWLEDGE bit
,@PLEDGESUBTYPEID uniqueidentifier
,@OPPORTUNITYID uniqueidentifier
,@REFERENCE nvarchar(255)
,@CATEGORYCODEID uniqueidentifier
,@ADJPAYMENT_DATE datetime
,@ADJPAYMENT_POSTDATE datetime
,@ADJPAYMENT_REASONCODEID uniqueidentifier
,@ADJPAYMENT_DETAILS nvarchar(255)
,@PERCENTAGEBENEFITS xml
,@BASECURRENCYID uniqueidentifier
,@TRANSACTIONCURRENCYID uniqueidentifier
,@BASEEXCHANGERATEID uniqueidentifier
,@EXCHANGERATE decimal(20, 8)
,@HADSPOTRATE bit
,@RATECHANGED bit
,@UPDATERECOGNITIONOPTION tinyint
,@CURRENTAPPUSERID uniqueidentifier = null
,@UPDATETRIBUTEOPTION tinyint
,@VALIDATETRIBUTES bit
,@ISMEMBERSHIPPLEDGE bit
,@INSTALLMENTAMOUNT money
)
as
begin
set nocount on;
declare @CURRENTDATE datetime;
declare @SUM money;
declare @COUNT int;
declare @contextCache varbinary(128);
declare @EMPTYGUID uniqueidentifier = '00000000-0000-0000-0000-000000000000';
begin try
-- Check GL business rule for this account system and set to 'Do not post' if needed.
-- ****
declare @PDACCOUNTSYSTEMID uniqueidentifier;
select @PDACCOUNTSYSTEMID = PDACCOUNTSYSTEMID
from dbo.FINANCIALTRANSACTION
where ID = @ID;
if @FREQUENCYCODE = 4
exec dbo.USP_REVENUEINSTALLMENT_VALIDATEINSTALLMENTS @INSTALLMENTS, @DATE, @AMOUNT,@ISMEMBERSHIPPLEDGE;
declare @ALLOWGLDISTRIBUTIONS bit;
set @ALLOWGLDISTRIBUTIONS = dbo.UFN_PDACCOUNTSYSTEM_ALLOWGLDISTRIBUTIONS(@PDACCOUNTSYSTEMID);
if @ALLOWGLDISTRIBUTIONS = 0
begin
set @POSTSTATUSCODE = 2 -- posted
set @POSTDATE = null
end
-- ****
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
set @CURRENTDATE = GetDate();
--JamesWill 2010-01-14 This needs to be AFTER the check for @CHANGEAGENTID is null. Otherwise, it will fail
--when @CHANGEAGENTID is null.
--cache current context information
set @contextCache = CONTEXT_INFO();
--set CONTEXT_INFO to @CHANGEAGENTID
set CONTEXT_INFO @CHANGEAGENTID;
--Business units - AdiSa 6/13/10 - Calculate and store business unit ratios for all new splits given
--the old splits.
declare @BUSINESSUNITSRATIO table (
DESIGNATIONID uniqueidentifier
,OVERRIDEBUSINESSUNITS bit
,REASON uniqueidentifier
,BUSINESSUNITCODEID uniqueidentifier
,RATIO float
)
insert into @BUSINESSUNITSRATIO
select REVENUESPLIT_EXT.DESIGNATIONID
,REVENUESPLIT_EXT.OVERRIDEBUSINESSUNITS
,REVENUESPLIT_EXT.REVENUESPLITBUSINESSUNITOVERRIDECODEID as REASON
,REVENUESPLITBUSINESSUNIT.BUSINESSUNITCODEID
,isnull(REVENUESPLITBUSINESSUNIT.AMOUNT / nullif(FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT, 0), 0) as RATIO
from dbo.FINANCIALTRANSACTIONLINEITEM
inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
inner join dbo.REVENUESPLITBUSINESSUNIT on REVENUESPLITBUSINESSUNIT.REVENUESPLITID = FINANCIALTRANSACTIONLINEITEM.ID
where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID
--Transaction currency cannot be changed, make sure it is the same as the revenue
select @TRANSACTIONCURRENCYID = FINANCIALTRANSACTION.TRANSACTIONCURRENCYID
from dbo.FINANCIALTRANSACTION
where FINANCIALTRANSACTION.ID = @ID;
--Multicurrency - AdamBu 4/8/10 - If the revenue previously used a spot rate, but
-- its rate has changed, store the old rate's ID, so we can remove it later.
declare @OLDSPOTRATEID uniqueidentifier
if @HADSPOTRATE = 1
and @RATECHANGED = 1
begin
select @OLDSPOTRATEID = BASEEXCHANGERATEID
from dbo.FINANCIALTRANSACTION
where ID = @ID
end
--If the record uses a new spot rate, create it and set the rate ID.
if @BASEEXCHANGERATEID = '00000000-0000-0000-0000-000000000001'
begin
set @BASEEXCHANGERATEID = newid()
--Replace with call to USP_CURRENCYEXCHANGERATE_ENSURESPOTRATEEXISTS for PBI 102747 in the future
/*if not dbo.UFN_SECURITY_APPUSER_GRANTED_SYSTEMPRIVILEGE_IN_SYSTEMROLE(@CURRENTAPPUSERID,'911f104d-ba5f-4469-b0ae-184c879aea99') = 1
and not dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) = 1
begin
raiserror('User does not have the right to add a new spot rate.', 13, 1);
return 1;
end*/
insert into dbo.CURRENCYEXCHANGERATE (
ID
,FROMCURRENCYID
,TOCURRENCYID
,RATE
,ASOFDATE
,TYPECODE
,SOURCECODEID
,ADDEDBYID
,CHANGEDBYID
,DATEADDED
,DATECHANGED
)
values (
@BASEEXCHANGERATEID
,@TRANSACTIONCURRENCYID
,@BASECURRENCYID
,@EXCHANGERATE
,@DATE
,2
,null
,@CHANGEAGENTID
,@CHANGEAGENTID
,@CURRENTDATE
,@CURRENTDATE
);
end
if @ISMEMBERSHIPPLEDGE = 1
begin
exec dbo.USP_MEMBERSHIPPLEDGE_VALIDATESPLITS @SPLITS = @SPLITS
,@REVENUEAMOUNT = @AMOUNT
,@REVENUEID = @ID
,@TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID;
end
else
begin
exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS = @SPLITS
,@REVENUEAMOUNT = @AMOUNT
,@REVENUEID = @ID
,@TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID;
end
select @SUM = sum(AMOUNT)
,@COUNT = count(AMOUNT)
from dbo.UFN_INSTALLMENT_GETINSTALLMENTS_2_FROMITEMLISTXML(@INSTALLMENTS);
if @COUNT = 0
raiserror (
'INSTALLMENTCOUNT'
,13
,1
);
if @SUM <> @AMOUNT
begin
if @ISMEMBERSHIPPLEDGE = 0
raiserror('INSTALLMENTSUM',13,1);
else
raiserror('BBERR_MEMBERSHIPPLEDGE_INSTALLMENT_SUM',13,1);
end
if @NUMBEROFINSTALLMENTS > 150
raiserror (
'BBERR_NUMINSTALLMENTS'
,13
,1
);
/* You can only edit unposted pledges here */
if exists (
select 1
from dbo.REVENUEPOSTED
where REVENUEPOSTED.ID = @ID
)
begin
if @ISMEMBERSHIPPLEDGE = 0
raiserror('You cannot edit a posted pledge.',13,1);
else
raiserror('You cannot edit a posted membership installment plan.',13,1);
end
if dbo.UFN_INSTALLMENT_DATESOVERLAP(@INSTALLMENTS) = 1
raiserror (
'Installment dates are out of sequence.'
,13
,1
);
if exists (
select 1
from dbo.INSTALLMENT
inner join dbo.UFN_INSTALLMENT_GETINSTALLMENTS_2_FROMITEMLISTXML(@INSTALLMENTS) XMLINST on INSTALLMENT.ID = XMLINST.ID
where XMLINST.AMOUNT < XMLINST.APPLIED
)
raiserror (
'PLEDGEPAYMENT_INSTALLMENTAPPLIED'
,13
,1
);
if exists (
select 1
from dbo.INSTALLMENT
inner join dbo.UFN_INSTALLMENT_GETINSTALLMENTS_2_FROMITEMLISTXML(@INSTALLMENTS) XMLINST on INSTALLMENT.ID = XMLINST.ID
where XMLINST.Date < @DATE
)
begin
if @ISMEMBERSHIPPLEDGE = 0
raiserror ('CK_INSTALLMENT_STARTDATEVALID',13,1);
else
raiserror ('BBERR_INSTALLMENT_MEMBERSHIPPLEDGE_STARTDATEVALID',13,1);
end
--Multicurrency - Retrieve and calculate the necessary multicurrency values.
declare @BASEAMOUNT money;
declare @ORGANIZATIONCURRENCYID uniqueidentifier;
declare @ORGANIZATIONAMOUNT money;
declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
exec dbo.USP_CURRENCY_GETCURRENCYVALUES @AMOUNT
,@DATE
,@BASECURRENCYID
,@BASEEXCHANGERATEID
,@TRANSACTIONCURRENCYID output
,@BASEAMOUNT output
,@ORGANIZATIONCURRENCYID output
,@ORGANIZATIONAMOUNT output
,@ORGANIZATIONEXCHANGERATEID output
,1;
declare @TRIBUTEAMOUNT money;
select @TRIBUTEAMOUNT = sum(AMOUNT)
from dbo.REVENUETRIBUTE
where REVENUEID = @ID;
-- do not allow the gift amount to be adjusted less than the applied tribute amount
if (@TRIBUTEAMOUNT is not null)
and (@BASEAMOUNT < @TRIBUTEAMOUNT)
and (@UPDATETRIBUTEOPTION = 0)
and (@VALIDATETRIBUTES = 1)
begin
raiserror (
'The pledge amount cannot be less than the sum of the tribute amounts applied to this pledge.'
,13
,1
)
end
declare @DONOTPOST bit;
set @DONOTPOST = case @POSTSTATUSCODE
when 2
then 1
else 0
end;
declare @REACKNOWLEDGEFIELDCHANGED bit;
declare @CLEARGLDISTRIBUTION bit;
declare @CLEARWRITEOFFGLDISTRIBUTION bit;
declare @CLEARBENEFITSGLDISTRIBUTION bit;
set @REACKNOWLEDGEFIELDCHANGED = 0;
set @CLEARGLDISTRIBUTION = 0;
set @CLEARWRITEOFFGLDISTRIBUTION = 0;
set @CLEARBENEFITSGLDISTRIBUTION = 0;
-- check to see if designations have changed (this compares both the DESIGNATIONID AND the AMOUNT)
if dbo.UFN_CHECKDETAIL_SPLITSCHANGED(@ID, @SPLITS) = 1
begin
set @CLEARGLDISTRIBUTION = 1;
set @CLEARWRITEOFFGLDISTRIBUTION = 1;
set @REACKNOWLEDGEFIELDCHANGED = 1;
end
-- check to see if installments have changed
if @CLEARGLDISTRIBUTION = 0
begin
if dbo.UFN_CHECKDETAIL_INSTALLMENTSCHANGED(@ID, @INSTALLMENTS) = 1
begin
set @CLEARGLDISTRIBUTION = 1;
set @CLEARWRITEOFFGLDISTRIBUTION = 1;
end
end
if (@SPLITS.exist('(/SPLITS/ITEM/CATEGORYCODEID)') = 0)
begin
if (
exists (
select REVENUECATEGORY.ID
from dbo.REVENUECATEGORY
left join dbo.UFN_REVENUE_GETSPLITS_2_FROMITEMLISTXML(@SPLITS) as SPLITS on REVENUECATEGORY.ID = SPLITS.ID
where (
(REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID <> SPLITS.CATEGORYCODEID)
or (
(REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID is null)
and (SPLITS.CATEGORYCODEID is not null)
)
or (
(REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID is not null)
and (SPLITS.CATEGORYCODEID is null)
)
)
)
)
begin
set @CLEARGLDISTRIBUTION = 1;
set @CLEARWRITEOFFGLDISTRIBUTION = 1;
end
end
else
if (
exists (
select REVENUECATEGORY.ID
from dbo.REVENUECATEGORY
inner join dbo.FINANCIALTRANSACTIONLINEITEM on REVENUECATEGORY.ID = FINANCIALTRANSACTIONLINEITEM.ID
where (FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID)
and (
(REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID <> @CATEGORYCODEID)
or (
(REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID is null)
and (@CATEGORYCODEID is not null)
)
or (
(REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID is not null)
and (@CATEGORYCODEID is null)
)
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1
)
)
)
begin
set @CLEARGLDISTRIBUTION = 1;
set @CLEARWRITEOFFGLDISTRIBUTION = 1;
end
-- check to see if amounts, postdate, post status, or exchange rates have changed
-- changing AppealID can change the calculated account number
if @CLEARGLDISTRIBUTION = 0
and @CLEARWRITEOFFGLDISTRIBUTION = 0
if not exists (
select 1
from dbo.FINANCIALTRANSACTION
where FINANCIALTRANSACTION.ID = @ID
and (
(BASEEXCHANGERATEID = @BASEEXCHANGERATEID)
or (
BASEEXCHANGERATEID is null
and @BASEEXCHANGERATEID is null
)
)
and (
(ORGEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID)
or (
ORGEXCHANGERATEID is null
and @ORGANIZATIONEXCHANGERATEID is null
)
)
and DELETEDON is null
)
begin
set @CLEARGLDISTRIBUTION = 1;
set @CLEARWRITEOFFGLDISTRIBUTION = 1;
end
if @CLEARGLDISTRIBUTION = 0
begin
if (
(@POSTSTATUSCODE <> 3)
and (@POSTSTATUSCODE <> 1)
)
begin
set @CLEARGLDISTRIBUTION = 1;
end
else
if not exists (
select 1
from dbo.FINANCIALTRANSACTION
inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
inner join dbo.PDACCOUNTSYSTEM on FINANCIALTRANSACTION.PDACCOUNTSYSTEMID = PDACCOUNTSYSTEM.ID
inner join dbo.CURRENCYSET on PDACCOUNTSYSTEM.CURRENCYSETID = CURRENCYSET.ID
where FINANCIALTRANSACTION.ID = @ID
and FINANCIALTRANSACTION.TRANSACTIONAMOUNT = @AMOUNT
and FINANCIALTRANSACTION.POSTDATE = @POSTDATE
and isnull(REVENUE_EXT.APPEALID, @EMPTYGUID) = isnull(@APPEALID, @EMPTYGUID)
and isnull(REVENUE_EXT.CHANNELCODEID, @EMPTYGUID) = isnull(@CHANNELCODEID, @EMPTYGUID)
and FINANCIALTRANSACTION.BASEAMOUNT = @BASEAMOUNT
and FINANCIALTRANSACTION.ORGAMOUNT = @ORGANIZATIONAMOUNT
and FINANCIALTRANSACTION.TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID
and CURRENCYSET.BASECURRENCYID = @BASECURRENCYID
)
begin
set @CLEARGLDISTRIBUTION = 1;
end
end
if dbo.UFN_CHECKDETAIL_BENEFITSCHANGEDFORGL(@ID, @BENEFITS) = 1
and dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('0E85C527-E6E9-4C5F-A8E8-105FD0E18FE7') = 1
set @CLEARBENEFITSGLDISTRIBUTION = 1;
-- check to see if the revenue record needs to be re-acknowledged
if (
coalesce((
select top 1 REACKNOWLEDGEREVENUE
from dbo.ACKNOWLEDGEMENTPREFERENCE
), 0)
) = 1
begin
-- check to see if amount have changed
if @REACKNOWLEDGEFIELDCHANGED = 0
if not exists (
select 1
from dbo.FINANCIALTRANSACTION
where FINANCIALTRANSACTION.ID = @ID
and TRANSACTIONAMOUNT = @AMOUNT
)
set @REACKNOWLEDGEFIELDCHANGED = 1;
-- if a field has changed, mark the revenue letters for this record out of date, if necessary
if @REACKNOWLEDGEFIELDCHANGED = 1
exec dbo.USP_REVENUELETTER_SETREACKNOWLEDGEMENTS @ID
,@CHANGEAGENTID;
end
declare @ORIGINALOPPORTUNITYID uniqueidentifier;
declare @ORIGINALDATE date;
select top 1 @ORIGINALOPPORTUNITYID = RO.OPPORTUNITYID
from dbo.FINANCIALTRANSACTIONLINEITEM
left join dbo.REVENUEOPPORTUNITY RO on RO.ID = FINANCIALTRANSACTIONLINEITEM.ID
where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID;
--get initial value of given anonymously to determine how to handle recognitions
declare @INITIALGIVENANONYMOUSLY bit;
select @INITIALGIVENANONYMOUSLY = REVENUE_EXT.GIVENANONYMOUSLY
,@ORIGINALDATE = [DATE]
from dbo.FINANCIALTRANSACTION
inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
where FINANCIALTRANSACTION.ID = @ID;
if @UPDATETRIBUTEOPTION = 1
begin
declare @TRIBUTES table (
TRIBUTEID uniqueidentifier
,AMOUNT money
,DESIGNATIONID uniqueidentifier
,SEQUENCE int
,REVENUETRIBUTEID uniqueidentifier
,BASECURRENCYID uniqueidentifier
,ORGANIZATIONAMOUNT money
,ORGANIZATIONEXCHANGERATEID uniqueidentifier
);
insert into @TRIBUTES
select TRIBUTEID
,AMOUNT
,DESIGNATIONID
,SEQUENCE
,REVENUETRIBUTEID
,BASECURRENCYID
,ORGANIZATIONAMOUNT
,ORGANIZATIONEXCHANGERATEID
from dbo.UFN_REVENUE_GETTRIBUTESFORAMOUNT(@ID, @AMOUNT, @BASEEXCHANGERATEID, @EXCHANGERATE)
update dbo.REVENUETRIBUTE
set REVENUETRIBUTE.AMOUNT = TRIBUTES.AMOUNT
,REVENUETRIBUTE.ORGANIZATIONAMOUNT = TRIBUTES.ORGANIZATIONAMOUNT
,REVENUETRIBUTE.ORGANIZATIONEXCHANGERATEID = TRIBUTES.ORGANIZATIONEXCHANGERATEID
,REVENUETRIBUTE.CHANGEDBYID = @CHANGEAGENTID
,REVENUETRIBUTE.DATECHANGED = @CURRENTDATE
from dbo.REVENUETRIBUTE
inner join @TRIBUTES TRIBUTES on TRIBUTES.REVENUETRIBUTEID = REVENUETRIBUTE.ID
end
update dbo.FINANCIALTRANSACTION
set [DATE] = @DATE
,POSTSTATUSCODE = case @POSTSTATUSCODE
when 0
then 2
when 1
then 1
when 2
then 3
end
,POSTDATE = @POSTDATE
,BASEAMOUNT = @BASEAMOUNT
,CHANGEDBYID = @CHANGEAGENTID
,DATECHANGED = @CURRENTDATE
,ORGAMOUNT = @ORGANIZATIONAMOUNT
,TRANSACTIONAMOUNT = @AMOUNT
,BASEEXCHANGERATEID = @BASEEXCHANGERATEID
,ORGEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID
where ID = @ID
update dbo.FINANCIALTRANSACTIONLINEITEM
set POSTSTATUSCODE = case @POSTSTATUSCODE
when 0
then 2
when 1
then 1
when 2
then 3
end
,POSTDATE = @POSTDATE
,CHANGEDBYID = @CHANGEAGENTID
,DATECHANGED = @CURRENTDATE
where POSTSTATUSCODE != 2
and FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID
update dbo.REVENUE_EXT
set SOURCECODE = @SOURCECODE
,APPEALID = @APPEALID
,BENEFITSWAIVED = @BENEFITSWAIVED
,GIVENANONYMOUSLY = @GIVENANONYMOUSLY
,MAILINGID = @MAILINGID
,CHANNELCODEID = @CHANNELCODEID
,DONOTACKNOWLEDGE = @DONOTACKNOWLEDGE
,CHANGEDBYID = @CHANGEAGENTID
,DATECHANGED = @CURRENTDATE
,RECEIPTAMOUNT = 0
where ID = @ID
declare @REFERENCECHANGED bit = 0
exec dbo.USP_REVENUEREFERENCE_EDIT @ID
,@REFERENCE
,@CHANGEAGENTID
,@REFERENCECHANGED output;
--Set GL to clear if reference is updated
if @REFERENCECHANGED = 1
set @CLEARGLDISTRIBUTION = 1
--Changing PledgeSubType can change the calculated account number
if @CLEARGLDISTRIBUTION = 0
begin
if (
select isnull(PLEDGESUBTYPEID, @EMPTYGUID)
from dbo.REVENUESCHEDULE
where REVENUESCHEDULE.ID = @ID
) != isnull(@PLEDGESUBTYPEID, @EMPTYGUID)
set @CLEARGLDISTRIBUTION = 1
end
update dbo.REVENUESCHEDULE
set FREQUENCYCODE = @FREQUENCYCODE
,NUMBEROFINSTALLMENTS = @COUNT
--,NEXTTRANSACTIONDATE = @NEXTTRANSACTIONDATE --Pledges do not use NEXTTRANSACTIONDATE, STARTDATE surfaces in the UI as next transaction date
,PLEDGESUBTYPEID = @PLEDGESUBTYPEID
,SENDPLEDGEREMINDER = @SENDPLEDGEREMINDER
,CHANGEDBYID = @CHANGEAGENTID
,DATECHANGED = @CURRENTDATE
from dbo.REVENUESCHEDULE
where REVENUESCHEDULE.ID = @ID;
declare @SPLITSCHANGED bit = dbo.UFN_CHECKDETAIL_SPLITSCHANGED(@ID, @SPLITS);
declare @DESIGNATIONCHANGED bit = dbo.UFN_CHECKDETAIL_DESIGNATIONSCHANGED(@ID, @SPLITS);
-- Set the IDs for any blank entries in the splits XML so that it can associate the declines with gift aid
-- flag with the generated splits. Also, pull in the existing value for declines gift aid if it wasn't passed
-- in the xml.
set @SPLITS = (
select case
when SPLITS.[ID] is null
or SPLITS.[ID] = @EMPTYGUID
then newid()
else SPLITS.[ID]
end [ID]
,SPLITS.[AMOUNT]
,SPLITS.[APPLICATIONCODE]
,SPLITS.[DESIGNATIONID]
,SPLITS.[TYPECODE]
,case
when (@SPLITS.exist('(/SPLITS/ITEM/CATEGORYCODEID)') = 0)
then @CATEGORYCODEID
else SPLITS.[CATEGORYCODEID]
end as [CATEGORYCODEID]
,case
when SPLITS.[DECLINESGIFTAID] is null
then REVENUESPLITGIFTAID.DECLINESGIFTAID
else SPLITS.DECLINESGIFTAID
end DECLINESGIFTAID
from dbo.UFN_REVENUE_GETSPLITS_2_FROMITEMLISTXML(@SPLITS) SPLITS
left join dbo.REVENUESPLITGIFTAID on SPLITS.ID = REVENUESPLITGIFTAID.ID
for xml raw('ITEM')
,type
,elements
,root('SPLITS')
,binary BASE64
);
declare @SPLITSAMOUNTMODIFIED table (ID uniqueidentifier);
insert into @SPLITSAMOUNTMODIFIED (ID)
select SPLITS.ID
from dbo.UFN_REVENUE_GETSPLITS_2_FROMITEMLISTXML(@SPLITS) SPLITS
where not exists (
select 1
from dbo.FINANCIALTRANSACTIONLINEITEM
where FINANCIALTRANSACTIONLINEITEM.ID = SPLITS.ID
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1
and FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT = SPLITS.AMOUNT
);
-- Cache the old split and recognition values for recognition updates
declare @OLDSPLITS xml = dbo.UFN_REVENUE_GETSPLITS_2_TOITEMLISTXML(@ID);
declare @OLDRECOGNITIONS xml = dbo.UFN_REVENUE_GETRECOGNITIONS_FORREVENUE_TOITEMLISTXML(@ID);
--Multicurrency - AdamBu 4/8/10 - Process the splits xml to calculate the base and organization amounts and place them in proper nodes.
set @SPLITS = dbo.UFN_REVENUESPLIT_CONVERTAMOUNTSINXML(@SPLITS, @BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASEEXCHANGERATEID)
exec dbo.USP_REVENUE_GETSPLITS_2_CUSTOMUPDATEFROMXML @ID
,@SPLITS
,@CHANGEAGENTID
,@CURRENTDATE;
-- Update recognition credits based on user selected option
exec dbo.USP_REVENUE_UPDATERECOGNITION @ID
,@OLDSPLITS
,@UPDATERECOGNITIONOPTION
,@CHANGEAGENTID
,@CURRENTDATE
,@OLDRECOGNITIONS;
-- update campaigns before updating installments so installments will pull the proper campaigns
-- bug 676001: only update campaigns if designation or opportunity are changed. This conflicts with change made in bug 224396
if @DESIGNATIONCHANGED = 1
or isnull(@ORIGINALOPPORTUNITYID, @EMPTYGUID) <> isnull(@OPPORTUNITYID, @EMPTYGUID)
begin
exec dbo.USP_PLEDGE_CLEARANDADDCAMPAIGNS @REVENUEID = @ID
,@OPPORTUNITYID = @OPPORTUNITYID
,@CHANGEAGENTID = @CHANGEAGENTID
,@CHANGEDATE = @CURRENTDATE
end
-- bug 137802: Moving solicitor updates to be here b/c USP_PLEDGE_UPDATEINSTALLMENT3 uses the revenuesolicitors table
-- so it's important to have the records here updated first, esp when amount has changed on the pledge.
exec dbo.USP_REVENUE_UPDATESOLICITORS_2 @ID, @OPPORTUNITYID, @CHANGEAGENTID, @CURRENTDATE, @OLDSPLITS;
--declare @ORIGINALWRITEOFFAMOUNTS table (WRITEOFFID uniqueidentifier, TOTAL money);
--insert into @ORIGINALWRITEOFFAMOUNTS (WRITEOFFID, TOTAL) select FT.ID,sum(IWO.TRANSACTIONAMOUNT)
--from dbo.FINANCIALTRANSACTION FT inner join dbo.INSTALLMENTWRITEOFF IWO on FT.ID=IWO.WRITEOFFID
--where FT.PARENTID = @ID and FT.TYPECODE = 20 and FT.DELETEDON is null GROUP BY FT.ID;
--Multicurrency - AdamBu 4/8/10 - Pass in multicurrency information so we can convert the amount in the xml
-- once installment splits are pulled out of their installments.
exec dbo.USP_PLEDGE_UPDATEINSTALLMENT3 @ID
,@INSTALLMENTS
,@CHANGEAGENTID
,@CURRENTDATE
,@ADJPAYMENT_DATE
,@ADJPAYMENT_POSTDATE
,@ADJPAYMENT_REASONCODEID
,@ADJPAYMENT_DETAILS
,@BASECURRENCYID
,@ORGANIZATIONEXCHANGERATEID
,@TRANSACTIONCURRENCYID
,@BASEEXCHANGERATEID
,@SPLITS;
--MMR not sure we still need this?
--exec dbo.USP_PLEDGE_FIXDEPENDENTSPLITS @ID, @CHANGEAGENTID, @CURRENTDATE;
if (@BENEFITSWAIVED = 0)
begin
-- update benefits
declare @TOTALBENEFITS xml;
set @TOTALBENEFITS = dbo.UFN_REVENUEDETAIL_JOINBENEFITS(@BENEFITS, @PERCENTAGEBENEFITS);
--Update the organization total value, transaction total value, and exchange rates in the @TOTALBENEFITS XML.
set @TOTALBENEFITS = dbo.UFN_REVENUEBENEFIT_CONVERTAMOUNTSINXML_2(@TOTALBENEFITS, @TRANSACTIONCURRENCYID, @BASECURRENCYID);
end
else
begin
set @TOTALBENEFITS = null;
end
exec dbo.USP_REVENUE_GETBENEFITS_4_UPDATEFROMXML @ID
,@TOTALBENEFITS
,@CHANGEAGENTID
,@CURRENTDATE;
exec dbo.USP_PLEDGE_VALIDATE_2 @ID, @ISMEMBERSHIPPLEDGE;
/* USP_PLEDGE_UPDATEINSTALLMENT3 has to update the writeoffs, so USP_REVENUE_UPDATEWRITEOFFS should not be called
exec dbo.USP_REVENUE_UPDATEWRITEOFFS @ID
,@CHANGEAGENTID
,@CURRENTDATE
,@ADJPAYMENT_DATE
,@ADJPAYMENT_POSTDATE
,@ADJPAYMENT_REASONCODEID
,@ADJPAYMENT_DETAILS
,@CLEARWRITEOFFGLDISTRIBUTION
*/
-- clear the user-defined gl distributions
if @CLEARGLDISTRIBUTION = 1
begin
-- Clear GL
--delete from dbo.REVENUEGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;
delete JOURNALENTRY
from dbo.JOURNALENTRY
inner join dbo.FINANCIALTRANSACTIONLINEITEM on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
inner join dbo.JOURNALENTRY_EXT on JOURNALENTRY.ID = JOURNALENTRY_EXT.ID
where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID
and FINANCIALTRANSACTIONLINEITEM.POSTSTATUSCODE != 2
and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1
and JOURNALENTRY_EXT.OUTDATED = 0
and JOURNALENTRY_EXT.TABLENAMECODE = 1;
if (dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('0E85C527-E6E9-4C5F-A8E8-105FD0E18FE7') = 1)
delete JOURNALENTRY
from dbo.JOURNALENTRY
inner join dbo.FINANCIALTRANSACTIONLINEITEM on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
inner join dbo.JOURNALENTRY_EXT on JOURNALENTRY.ID = JOURNALENTRY_EXT.ID
where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID
and FINANCIALTRANSACTIONLINEITEM.POSTSTATUSCODE != 2
and JOURNALENTRY_EXT.OUTDATED = 0
and JOURNALENTRY_EXT.TABLENAMECODE = 5;
-- Add new GL distributions
if @POSTSTATUSCODE <> 2
begin
exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @ID
,@CHANGEAGENTID
,@CURRENTDATE;
if (dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('0E85C527-E6E9-4C5F-A8E8-105FD0E18FE7') = 1) and @ISMEMBERSHIPPLEDGE = 0
begin
exec dbo.USP_REVENUEDETAIL_SETSENDBENEFITCODE @ID
,0
exec USP_SAVE_BENEFITGLDISTRIBUTION_FINANCIALTRANSACTION @ID
,@CHANGEAGENTID
,@CURRENTDATE
end
end
end
else
if @CLEARBENEFITSGLDISTRIBUTION = 1
begin
delete JOURNALENTRY
from dbo.JOURNALENTRY
inner join dbo.JOURNALENTRY_EXT on JOURNALENTRY.ID = JOURNALENTRY_EXT.ID
and JOURNALENTRY_EXT.TABLENAMECODE = 5
inner join dbo.FINANCIALTRANSACTIONLINEITEM on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
where JOURNALENTRY_EXT.LOGICALREVENUEID = @ID
and JOURNALENTRY_EXT.OUTDATED = 0
and FINANCIALTRANSACTIONLINEITEM.POSTSTATUSCODE != 2
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
if @POSTSTATUSCODE <> 2
begin
exec dbo.USP_REVENUEDETAIL_SETSENDBENEFITCODE @ID
,0
exec USP_SAVE_BENEFITGLDISTRIBUTION_FINANCIALTRANSACTION @ID
,@CHANGEAGENTID
,@CURRENTDATE
end
end
--Remove all existing links to the opportunity, including payments.
if @OPPORTUNITYID is null
begin
exec USP_RECORDOPERATION_REVENUEOPPORTUNITYUNLINK @ID, @CHANGEAGENTID;
end
else
begin
exec dbo.USP_REVENUE_PULLSOLICITORSFROMOPPORTUNITY @ID
,@OPPORTUNITYID
,@CHANGEAGENTID
,@CURRENTDATE
--No existing opportunity, Add links to opportunity for pledge and all payments.
if @ORIGINALOPPORTUNITYID is null
begin
declare @REVENUEID uniqueidentifier;
declare ADDSOLICITORS cursor local fast_forward for
select
FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
from dbo.FINANCIALTRANSACTIONLINEITEM
left join dbo.FINANCIALTRANSACTIONLINEITEM SOURCE on SOURCE.ID = FINANCIALTRANSACTIONLINEITEM.SOURCELINEITEMID
where FINANCIALTRANSACTIONLINEITEM.SOURCELINEITEMID = SOURCE.ID
and SOURCE.FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null;
open ADDSOLICITORS;
begin try
fetch next from ADDSOLICITORS into @REVENUEID;
while (@@FETCH_STATUS = 0)
begin
exec dbo.USP_REVENUE_PULLSOLICITORSFROMOPPORTUNITY @REVENUEID, @OPPORTUNITYID, @CHANGEAGENTID, @CURRENTDATE
fetch next from ADDSOLICITORS into @REVENUEID;
end
close ADDSOLICITORS;
deallocate ADDSOLICITORS;
end try
begin catch
close ADDSOLICITORS;
deallocate ADDSOLICITORS;
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
exec dbo.USP_DATAFORMTEMPLATE_ADD_REVENUEOPPORTUNITYLINK @REVENUEID = @ID, @OPPORTUNITYID = @OPPORTUNITYID;
end
else
--Opportunity is swapping, update all splits link to new opportunity ID
begin
exec USP_REVENUEOPPORTUNITY_UPDATEOPPORTUNITY @ID,@OPPORTUNITYID,@CHANGEAGENTID;
end
exec dbo.USP_OPPORTUNITY_UPDATEACCEPTEDSTATUS @OPPORTUNITYID
,@DATE
,@CHANGEAGENTID
,@CURRENTDATE
end
--Default Recognition credits based on Givenanonymous flag
exec USP_PLEDGE_RECOGNITIONCREDIT_DEFAULT @ID, @GIVENANONYMOUSLY,@INITIALGIVENANONYMOUSLY, @CHANGEAGENTID, @CURRENTDATE
--Gift Aid is for UK only
if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D') = 1
begin
declare @PAYMENTMETHODCODE tinyint;
declare @CREDITTYPECODEID uniqueidentifier;
select @PAYMENTMETHODCODE = PAYMENTMETHODCODE
from dbo.REVENUEPAYMENTMETHOD
where REVENUEID = @ID;
if @PAYMENTMETHODCODE = 2
begin
select @CREDITTYPECODEID = CREDITCARD.CREDITTYPECODEID
from dbo.FINANCIALTRANSACTION
inner join dbo.REVENUEPAYMENTMETHOD on FINANCIALTRANSACTION.ID = REVENUEPAYMENTMETHOD.REVENUEID
left join dbo.REVENUESCHEDULE on FINANCIALTRANSACTION.ID = REVENUESCHEDULE.ID
left join dbo.CREDITCARD on CREDITCARD.ID = REVENUESCHEDULE.CREDITCARDID
where FINANCIALTRANSACTION.ID = @ID
and FINANCIALTRANSACTION.DELETEDON is null;
end
else
if @PAYMENTMETHODCODE = 3
and dbo.UFN_PAPERLESSMANDATES_DAYSADVANCEDNOTICE_FORREVENUE(@ID) = - 1
begin
--Bug 138736 - AdamBu 2/2/11 - Error on invalid paperless mandate setup.
raiserror (
'BBERR_MULTIPLE_PAPERLESSMANDATECONFIGS'
,13
,1
);
return 1;
end
declare @SPLITSDECLININGGIFTAID xml
set @SPLITSDECLININGGIFTAID = (
select ID as REVENUESPLITID
from dbo.UFN_REVENUE_GETSPLITS_2_FROMITEMLISTXML(@SPLITS)
where DECLINESGIFTAID = 1
for xml raw('ITEM')
,type
,elements
,root('SPLITSDECLININGGIFTAID')
,binary BASE64
)
exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @ID
,@APPEALID
,@PAYMENTMETHODCODE
,@CREDITTYPECODEID
,@CHANGEAGENTID
,@DATE
,1
,@SPLITSDECLININGGIFTAID;--revenue transaction type code of pledge is 1
end
--Multicurrency - AdamBu 4/12/10 - If we stored an old spot rate earlier, now is the time to
-- remove it.
if @OLDSPOTRATEID is not null
and not exists (
select 1
from dbo.PLEDGEORIGINALAMOUNT
where ID = @ID
and BASEEXCHANGERATEID = @OLDSPOTRATEID
)
begin
exec dbo.USP_CURRENCYEXCHANGERATE_DELETEBYID_WITHCHANGEAGENTID @OLDSPOTRATEID
,@CHANGEAGENTID;
end
--Business units - AdiSa 8/12/10 - add adjusted splits back.
declare @REVENUESPLITBUSINESSUNITID uniqueidentifier;
declare BUSINESSUNITS cursor local fast_forward
for
select REVENUESPLITBUSINESSUNIT.ID
from dbo.REVENUESPLITBUSINESSUNIT
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLITBUSINESSUNIT.REVENUESPLITID
where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID
open BUSINESSUNITS;
begin try
fetch next
from BUSINESSUNITS
into @REVENUESPLITBUSINESSUNITID
while (@@FETCH_STATUS = 0)
begin
exec dbo.USP_REVENUESPLITBUSINESSUNIT_DELETEBYID_WITHCHANGEAGENTID @REVENUESPLITBUSINESSUNITID
,@CHANGEAGENTID;
fetch next
from BUSINESSUNITS
into @REVENUESPLITBUSINESSUNITID
end
close BUSINESSUNITS;
deallocate BUSINESSUNITS;
end try
begin catch
close BUSINESSUNITS;
deallocate BUSINESSUNITS;
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
update REVENUESPLIT_EXT
set OVERRIDEBUSINESSUNITS = BUR.OVERRIDEBUSINESSUNITS
,REVENUESPLITBUSINESSUNITOVERRIDECODEID = BUR.REASON
,CHANGEDBYID = @CHANGEAGENTID
,DATECHANGED = @CURRENTDATE
from dbo.REVENUESPLIT_EXT
inner join dbo.FINANCIALTRANSACTIONLINEITEM on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
inner join @BUSINESSUNITSRATIO as BUR on REVENUESPLIT_EXT.DESIGNATIONID = BUR.DESIGNATIONID
where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID
and BUR.OVERRIDEBUSINESSUNITS = 1
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1
insert into dbo.REVENUESPLITBUSINESSUNIT (
ID
,REVENUESPLITID
,BUSINESSUNITCODEID
,AMOUNT
,BASECURRENCYID
,ADDEDBYID
,CHANGEDBYID
,DATEADDED
,DATECHANGED
)
select newid()
,FINANCIALTRANSACTIONLINEITEM.ID
,BUR.BUSINESSUNITCODEID
,FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT * BUR.RATIO
,CURRENCYSET.BASECURRENCYID
,@CHANGEAGENTID
,@CHANGEAGENTID
,@CURRENTDATE
,@CURRENTDATE
from dbo.FINANCIALTRANSACTIONLINEITEM
inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
inner join dbo.PDACCOUNTSYSTEM on FINANCIALTRANSACTION.PDACCOUNTSYSTEMID = PDACCOUNTSYSTEM.ID
inner join dbo.CURRENCYSET on PDACCOUNTSYSTEM.CURRENCYSETID = CURRENCYSET.ID
inner join @BUSINESSUNITSRATIO BUR on BUR.DESIGNATIONID = REVENUESPLIT_EXT.DESIGNATIONID
where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID
and REVENUESPLIT_EXT.OVERRIDEBUSINESSUNITS = 1
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1
--$0 business units are not allowed, so don't create them
and BUR.RATIO != 0
and FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT != 0
exec dbo.USP_REVENUESPLIT_APPLYBUSINESSUNITS @ID
,@CHANGEAGENTID
,@CURRENTDATE;
merge into dbo.PLEDGEINSTALLMENTOPTION as Target
using (select ID from dbo.PLEDGEINSTALLMENTOPTION where ID = @ID) as Source
on (Target.ID = Source.ID)
when matched then
update set Target.INSTALLMENTAMOUNT = @INSTALLMENTAMOUNT,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
when not matched by Target then
insert
(ID
,INSTALLMENTAMOUNT
,SPLITSCHEDULEOPTIONCODE
,ADDEDBYID
,CHANGEDBYID
,DATEADDED
,DATECHANGED)
values (@ID
,case @FREQUENCYCODE when 4 then null else @INSTALLMENTAMOUNT end
,0 --@INSTALLMENTSPLITSCHEDULEOPTIONCODE
,@CHANGEAGENTID
,@CHANGEAGENTID
,@CURRENTDATE
,@CURRENTDATE);
end try
begin catch
--reset CONTEXT_INFO to previous value
if not @contextCache is null
set CONTEXT_INFO @contextCache;
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
--reset CONTEXT_INFO to previous value
if not @contextCache is null
set CONTEXT_INFO @contextCache;
return 0;
end