USP_REVENUESPLIT_UPDATESOLICITORS
Updates solicitor amounts so that they remain valid when a revenue split amount changes.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUESPLITID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CHANGEDATE | datetime | IN | |
@UPDATEOPTION | tinyint | IN |
Definition
Copy
CREATE procedure dbo.USP_REVENUESPLIT_UPDATESOLICITORS
(
@REVENUESPLITID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier,
@CHANGEDATE datetime,
@UPDATEOPTION tinyint = 0 -- 0=No update, 1=Update based on defaults
)
as
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
if @CHANGEDATE is null
set @CHANGEDATE = GETDATE();
declare @ORGANIZATIONCURRENCYID uniqueidentifier=dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
declare @BASECURRENCYID uniqueidentifier=null;
declare @BASETOORGANIZATIONEXCHANGERATEID uniqueidentifier=null;
declare @AMOUNT money;
declare @DATE datetime;
declare @APPLICATIONTYPE tinyint
declare @CONTEXT_CACHE varbinary(128);
select
@APPLICATIONTYPE = REVENUESPLIT_EXT.APPLICATIONCODE,
@DATE = cast(REVENUE.DATE as datetime),
@BASECURRENCYID = CS.BASECURRENCYID
from
dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT
inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = REVENUESPLIT.ID
inner join dbo.FINANCIALTRANSACTION REVENUE on REVENUESPLIT.FINANCIALTRANSACTIONID = REVENUE.ID
inner join dbo.PDACCOUNTSYSTEM PD on PD.ID = REVENUE.PDACCOUNTSYSTEMID
inner join dbo.CURRENCYSET CS on CS.ID = PD.CURRENCYSETID
where
REVENUESPLIT.ID = @REVENUESPLITID;
exec dbo.USP_CURRENCY_GETCURRENCYVALUES
@AMOUNT=null,
@DATE=@DATE,
@BASECURRENCYID=@BASECURRENCYID,
@BASEEXCHANGERATEID=null,
@TRANSACTIONCURRENCYID=null,
@BASEAMOUNT=null,
@ORGANIZATIONCURRENCYID=@ORGANIZATIONCURRENCYID,
@ORGANIZATIONAMOUNT=null,
@ORGANIZATIONEXCHANGERATEID=null,
@LOOKUPORGANIZATIONEXCHANGERATE=0,
@BASETOORGANIZATIONEXCHANGERATEID=@BASETOORGANIZATIONEXCHANGERATEID output
/* Store the updated amounts in a temp table for bulk merge */
declare @SOLICITORAMOUNTS table
(SOLICITORID uniqueidentifier, AMOUNT money, ORGANIZATIONAMOUNT money, SEQUENCE integer)
if @UPDATEOPTION = 1
begin
if @APPLICATIONTYPE in (
2, -- Pledge
7, -- MG Pledge
6, -- Planned Gift
8, -- Grant award
13 -- Donor challenge
)
begin
/* Calculate the default amounts for solicitors tied to the original pledge */
insert @SOLICITORAMOUNTS (SOLICITORID, AMOUNT, ORGANIZATIONAMOUNT, SEQUENCE)
select
SOURCESOLICITOR.CONSTITUENTID,
(SOURCESOLICITOR.AMOUNT*
dbo.UFN_INSTALLMENTSPLITPAYMENT_GETAMOUNTINCURRENCY(ISP.ID, @BASECURRENCYID)/
SOURCESPLIT.BASEAMOUNT) AMOUNT,
case
when @BASECURRENCYID <> @ORGANIZATIONCURRENCYID
then dbo.UFN_CURRENCY_CONVERT(
(SOURCESOLICITOR.AMOUNT*
dbo.UFN_INSTALLMENTSPLITPAYMENT_GETAMOUNTINCURRENCY(ISP.ID, @BASECURRENCYID)/
SOURCESPLIT.BASEAMOUNT), @BASETOORGANIZATIONEXCHANGERATEID)
else (SOURCESOLICITOR.AMOUNT*
dbo.UFN_INSTALLMENTSPLITPAYMENT_GETAMOUNTINCURRENCY(ISP.ID, @BASECURRENCYID)/
SOURCESPLIT.BASEAMOUNT)
end ORGANIZATIONAMOUNT,
SOURCESOLICITOR.SEQUENCE
from
dbo.INSTALLMENTSPLITPAYMENT ISP
inner join INSTALLMENTSPLIT on ISP.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
inner join dbo.FINANCIALTRANSACTIONLINEITEM SOURCESPLIT on SOURCESPLIT.FINANCIALTRANSACTIONID = ISP.PLEDGEID
inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = SOURCESPLIT.ID and REVENUESPLIT_EXT.DESIGNATIONID = INSTALLMENTSPLIT.DESIGNATIONID
inner join dbo.REVENUESOLICITOR SOURCESOLICITOR on SOURCESPLIT.ID = SOURCESOLICITOR.REVENUESPLITID
where ISP.PAYMENTID = @REVENUESPLITID
and SOURCESPLIT.BASEAMOUNT <> 0
and SOURCESPLIT.DELETEDON is null and SOURCESPLIT.TYPECODE != 1;
--Temporary table to store Solicitors.
declare @TEMPSOLICITOR table
(SOLICITORID uniqueidentifier, AMOUNT money, ORGANIZATIONAMOUNT money, SEQUENCE integer)
--Combine amount in case of paying more amount than pledge.
insert @TEMPSOLICITOR (SOLICITORID, AMOUNT, ORGANIZATIONAMOUNT, SEQUENCE)
select SOLICITORAMOUNT.SOLICITORID, sum(SOLICITORAMOUNT.AMOUNT), sum(SOLICITORAMOUNT.ORGANIZATIONAMOUNT), max(SOLICITORAMOUNT.SEQUENCE)
from @SOLICITORAMOUNTS SOLICITORAMOUNT
group by SOLICITORAMOUNT.SOLICITORID
delete from @SOLICITORAMOUNTS where SOLICITORID in (select SOLICITORID from @TEMPSOLICITOR)
insert @SOLICITORAMOUNTS (SOLICITORID, AMOUNT, ORGANIZATIONAMOUNT, SEQUENCE)
select TEMPSOLICITOR.SOLICITORID, TEMPSOLICITOR.AMOUNT, TEMPSOLICITOR.ORGANIZATIONAMOUNT, TEMPSOLICITOR.SEQUENCE
from @TEMPSOLICITOR TEMPSOLICITOR
end
else if @APPLICATIONTYPE = 3
begin
insert @SOLICITORAMOUNTS (SOLICITORID, AMOUNT, ORGANIZATIONAMOUNT, SEQUENCE)
select
SOURCESOLICITOR.CONSTITUENTID,
SOURCESOLICITOR.AMOUNT*PAYMENTSPLIT.BASEAMOUNT/SOURCESPLIT.BASEAMOUNT,
case
when @BASECURRENCYID <> @ORGANIZATIONCURRENCYID
then dbo.UFN_CURRENCY_CONVERT(SOURCESOLICITOR.AMOUNT*PAYMENTSPLIT.BASEAMOUNT/SOURCESPLIT.BASEAMOUNT, @BASETOORGANIZATIONEXCHANGERATEID)
else SOURCESOLICITOR.AMOUNT*PAYMENTSPLIT.BASEAMOUNT/SOURCESPLIT.BASEAMOUNT
end,
SOURCESOLICITOR.SEQUENCE
from
dbo.RECURRINGGIFTACTIVITY RGA
inner join dbo.FINANCIALTRANSACTIONLINEITEM PAYMENTSPLIT on RGA.PAYMENTREVENUEID = PAYMENTSPLIT.ID
inner join dbo.REVENUESPLIT_EXT PX on PX.ID = PAYMENTSPLIT.ID
inner join dbo.FINANCIALTRANSACTIONLINEITEM SOURCESPLIT on SOURCESPLIT.FINANCIALTRANSACTIONID = RGA.SOURCEREVENUEID
inner join dbo.REVENUESPLIT_EXT SX on SX.ID = SOURCESPLIT.ID
inner join dbo.REVENUESOLICITOR SOURCESOLICITOR on SOURCESPLIT.ID = SOURCESOLICITOR.REVENUESPLITID
where RGA.PAYMENTREVENUEID = @REVENUESPLITID
and SOURCESPLIT.BASEAMOUNT <> 0
and SOURCESPLIT.DELETEDON is null and SOURCESPLIT.TYPECODE != 1
and PAYMENTSPLIT.DELETEDON is null and PAYMENTSPLIT.TYPECODE != 1;
end
else if @APPLICATIONTYPE in (1,5)
begin
set @CONTEXT_CACHE = CONTEXT_INFO();
set context_info @CHANGEAGENTID;
delete from dbo.REVENUESOLICITOR where REVENUESPLITID = @REVENUESPLITID
if @CONTEXT_CACHE is not null
set context_info @CONTEXT_CACHE;
end
end
else -- Previous functionality: ensure the solicitor credit is valid by reducing it if it exceeds the application amount
begin
insert @SOLICITORAMOUNTS (SOLICITORID, AMOUNT, ORGANIZATIONAMOUNT, SEQUENCE)
select
REVENUESOLICITOR.CONSTITUENTID,
case
when REVENUESOLICITOR.AMOUNT > REVENUESPLIT.BASEAMOUNT
then REVENUESPLIT.BASEAMOUNT
else REVENUESOLICITOR.AMOUNT
end,
case
when REVENUESOLICITOR.AMOUNT > REVENUESPLIT.BASEAMOUNT
then REVENUESPLIT.ORGAMOUNT
else REVENUESOLICITOR.ORGANIZATIONAMOUNT end,
REVENUESOLICITOR.SEQUENCE
from
dbo.REVENUESOLICITOR
inner join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on REVENUESOLICITOR.REVENUESPLITID = REVENUESPLIT.ID
where
REVENUESPLIT.ID = @REVENUESPLITID
end
set @CONTEXT_CACHE = CONTEXT_INFO();
set context_info @CHANGEAGENTID;
merge dbo.REVENUESOLICITOR as [TARGET]
using @SOLICITORAMOUNTS as [SOURCE]
on [SOURCE].SOLICITORID = [TARGET].CONSTITUENTID
and [TARGET].REVENUESPLITID = @REVENUESPLITID
when matched then
update set
AMOUNT = [SOURCE].AMOUNT,
ORGANIZATIONAMOUNT=[SOURCE].ORGANIZATIONAMOUNT,
CHANGEDBYID=@CHANGEAGENTID, DATECHANGED=@CHANGEDATE
when not matched by target then
insert (ID, REVENUESPLITID, CONSTITUENTID, AMOUNT, SEQUENCE,
BASECURRENCYID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID,
ADDEDBYID, DATEADDED, CHANGEDBYID, DATECHANGED)
values (newid(), @REVENUESPLITID, [SOURCE].SOLICITORID, [SOURCE].AMOUNT, [SOURCE].SEQUENCE,
@BASECURRENCYID, [SOURCE].ORGANIZATIONAMOUNT, @BASETOORGANIZATIONEXCHANGERATEID,
@CHANGEAGENTID, @CHANGEDATE, @CHANGEAGENTID, @CHANGEDATE);
merge dbo.REVENUESOLICITOR as [TARGET]
using @SOLICITORAMOUNTS as [SOURCE]
on [SOURCE].SOLICITORID = [TARGET].CONSTITUENTID
and [TARGET].REVENUESPLITID = @REVENUESPLITID
when not matched by source and [TARGET].REVENUESPLITID = @REVENUESPLITID
then delete;
if @CONTEXT_CACHE is not null
set context_info @CONTEXT_CACHE;
return 0;