USP_ADDPROSPECTPLANSPROCESS
Creates prospect plans for a selection of constituents.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@NUMBERPROCESSED | int | INOUT | |
@NUMBEREXCEPTIONS | int | INOUT | |
@CONSTITUENTTABLENAME | nvarchar(128) | IN | |
@CURRENTAPPUSERID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_ADDPROSPECTPLANSPROCESS (
@ID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier,
@NUMBERPROCESSED int output,
@NUMBEREXCEPTIONS int output,
@CONSTITUENTTABLENAME nvarchar(128),
@CURRENTAPPUSERID uniqueidentifier = null
)
as
begin
set @NUMBERPROCESSED = 0;
set @NUMBEREXCEPTIONS = 0;
declare @PROCESSDATE date;
set @PROCESSDATE = getdate();
declare @IDSETREGISTERID uniqueidentifier;
declare @PROSPECTMANAGERFUNDRAISERID uniqueidentifier;
declare @PROSPECTPLANNAME nvarchar(100);
declare @PROSPECTPLANTYPECODEID uniqueidentifier;
declare @NARRATIVE nvarchar(1000);
declare @PLANOUTLINEID uniqueidentifier;
declare @STARTDATE date;
declare @PRIMARYMANAGERFUNDRAISERID uniqueidentifier;
declare @SECONDARYMANAGERFUNDRAISERID uniqueidentifier;
declare @SECONDARYFUNDRAISERS table (FUNDRAISERID uniqueidentifier,
SOLICITORROLECODEID uniqueidentifier,
SEQUENCE int);
declare @SITES table (SITEID uniqueidentifier);
declare @CREATEOPPORTUNITIES bit;
declare @OPPORTUNITYTYPECODEID uniqueidentifier;
declare @OPPORTUNITYSTATUSCODE tinyint;
declare @EXPECTEDASKAMOUNT money;
declare @ASKAMOUNT money;
declare @OPPORTUNITYDESIGNATIONS table (DESIGNATIONID uniqueidentifier,
AMOUNT money,
SEQUENCE int,
FUNDINGMETHODCODEID uniqueidentifier,
CATEGORYCODEID uniqueidentifier,
TYPECODEID uniqueidentifier,
USECODEID uniqueidentifier);
declare @PROSPECTPLANCURRENCYSETID uniqueidentifier;
declare @OPPORTUNITYTRANSACTIONCURRENCYID uniqueidentifier;
declare @PROSPECTPLANBASECURRENCYID uniqueidentifier;
declare @PLANSTEPS xml;
declare @NEWPLANSTEPS xml;
declare @SQL nvarchar(250);
set @SQL = N'insert into dbo.' + @CONSTITUENTTABLENAME + ' (CONSTITUENTID, NEWPROSPECT, RESULTCODE) values (@CID, @NP, @RC)';
declare @PARAMDEF nvarchar(50);
set @PARAMDEF = N'@CID uniqueidentifier, @NP bit, @RC tinyint';
---------------------------------------------------------------------
-- get parameters
select
@IDSETREGISTERID = IDSETREGISTERID,
@PROSPECTPLANNAME = PROSPECTPLANNAME,
@PROSPECTPLANTYPECODEID = PROSPECTPLANTYPECODEID,
@NARRATIVE = NARRATIVE,
@PLANOUTLINEID = PLANOUTLINEID,
@STARTDATE = case STARTDATETYPECODE
when 0 then @PROCESSDATE
when 1 then STARTDATE
when 2 then dateadd(d,DAYSBEFOREORAFTER,@PROCESSDATE)
when 3 then dateadd(d,-DAYSBEFOREORAFTER,@PROCESSDATE)
end,
@PRIMARYMANAGERFUNDRAISERID = PRIMARYMANAGERFUNDRAISERID,
@SECONDARYMANAGERFUNDRAISERID = SECONDARYMANAGERFUNDRAISERID,
@PROSPECTMANAGERFUNDRAISERID = PROSPECTMANAGERFUNDRAISERID,
@CREATEOPPORTUNITIES = CREATEOPPORTUNITIES,
@OPPORTUNITYTYPECODEID = OPPORTUNITYTYPECODEID,
@OPPORTUNITYSTATUSCODE = OPPORTUNITYSTATUSCODE,
@EXPECTEDASKAMOUNT = EXPECTEDASKAMOUNT,
@ASKAMOUNT = case OPPORTUNITYSTATUSCODE when 0 then 0 else EXPECTEDASKAMOUNT end,
@PROSPECTPLANCURRENCYSETID = PROSPECTPLANCURRENCYSETID,
@OPPORTUNITYTRANSACTIONCURRENCYID = OPPORTUNITYTRANSACTIONCURRENCYID,
@PLANSTEPS = (select PLANSTEPS.query('/PLANSTEPS/node()') for xml raw('STEPS'),type)
from dbo.ADDPROSPECTPLANSPROCESS
where ID = @ID;
declare @ISADMIN bit = 0;
declare @ADDAMAJORGIVINGPROSPECTTASKID uniqueidentifier = 'F3D5EC46-C463-4873-923A-B392F1F3C472';
declare @PROSPECTMANAGEREDITDATAFORMINSTANCEID uniqueidentifier = 'C69768CC-D4DF-42A7-A1E0-185419D14854'
declare @ERROR_DUPLICATEPLAN nvarchar(max) = 'UIX_PROSPECTPLAN_PROSPECTID_PROSPECTPLANTYPECODEID_NAME';
declare @ERROR_INSUFFICIENTRIGHTS_ADDMAJORGIVINGPROSPECTTASK nvarchar(max) = 'Insufficient rights: Add a major giving prospect task';
declare @ERROR_INSUFFICIENTRIGHTS_PROSPECTMANAGEREDITFORM nvarchar(max) = 'Insufficient rights: Prospect manager edit form';
declare @ISADDAMAJORGIVINGPROSPECTTASKALLOWED bit = 0;
declare @ISPROSPECTMANAGEREDITDATAFORMINSTANCEALLOWED bit = 0;
set @ISADMIN = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);
set @ISADDAMAJORGIVINGPROSPECTTASKALLOWED = dbo.UFN_SECURITY_APPUSER_GRANTED_TASK_IN_SYSTEMROLE(@CURRENTAPPUSERID,@ADDAMAJORGIVINGPROSPECTTASKID);
set @ISPROSPECTMANAGEREDITDATAFORMINSTANCEALLOWED = dbo.UFN_SECURITY_APPUSER_GRANTED_FORM_IN_SYSTEMROLE(@CURRENTAPPUSERID,@PROSPECTMANAGEREDITDATAFORMINSTANCEID);
select @PROSPECTPLANBASECURRENCYID = BASECURRENCYID
from dbo.CURRENCYSET
where ID = @PROSPECTPLANCURRENCYSETID
insert into @SECONDARYFUNDRAISERS (FUNDRAISERID, SOLICITORROLECODEID, SEQUENCE)
select FUNDRAISERID, SOLICITORROLECODEID, SEQUENCE
from dbo.UFN_ADDPROSPECTPLANSPROCESS_SECONDARYFUNDRAISERS(@ID);
insert into @SITES (SITEID)
select SITEID
from dbo.UFN_ADDPROSPECTPLANSPROCESS_SITES(@ID);
if @CREATEOPPORTUNITIES = 1
insert into @OPPORTUNITYDESIGNATIONS (DESIGNATIONID, AMOUNT, SEQUENCE, FUNDINGMETHODCODEID, CATEGORYCODEID, TYPECODEID, USECODEID)
select DESIGNATIONID, AMOUNT, SEQUENCE, FUNDINGMETHODCODEID, CATEGORYCODEID, TYPECODEID, USECODEID
from dbo.UFN_ADDPROSPECTPLANSPROCESS_OPPORTUNITYDESIGNATIONS(@ID);
---------------------------------------------------------------------
-- get constituents
declare @CONSTITUENTID uniqueidentifier;
if @ISADMIN = 1
declare CONSTITUENTCURSOR cursor local fast_forward for
select ID from dbo.UFN_IDSETREADER_GETRESULTS(@IDSETREGISTERID)
else
begin
declare CONSTITUENTCURSOR cursor local fast_forward for
with [CONSTITUENT_RACS] as
(select ID as ConstituentID from dbo.[CONSTITUENT]
where (
((
(select count(*) from dbo.UFN_SITEID_MAPFROM_CONSTITUENTID(CONSTITUENT.ID) as SITES where
dbo.UFN_SECURITY_APPUSER_GRANTED_BUSINESSPROCESS_FORSITE(
/*userid*/ @CURRENTAPPUSERID,
/*businessprocesscatalogid*/ '59ba0c29-3410-4c65-adf8-25242a005ebc',
/*siteid*/ SITEID
) = 1
) > 0)
)
))
select ID from dbo.UFN_IDSETREADER_GETRESULTS(@IDSETREGISTERID)
inner join [CONSTITUENT_RACS] on [CONSTITUENT_RACS].ConstituentID = ID
end
open CONSTITUENTCURSOR;
begin try
begin transaction;
fetch next from CONSTITUENTCURSOR into @CONSTITUENTID;
while (@@FETCH_STATUS = 0)
begin
begin try
save transaction PROSPECTTX;
declare @NEWPROSPECTMANAGERFUNDRAISERID uniqueidentifier = @PROSPECTMANAGERFUNDRAISERID;
---------------------------------------------------------------------
-- track if this is a new prospect
declare @NEWPROSPECT bit;
if (exists(select 1 from dbo.PROSPECT where ID=@CONSTITUENTID))
set @NEWPROSPECT = 0;
else
begin
set @NEWPROSPECT = 1;
if not(
@ISADMIN = 1 or (
@ISADDAMAJORGIVINGPROSPECTTASKALLOWED = 1
and dbo.UFN_SECURITY_APPUSER_GRANTED_TASK_FORCONSTIT(@CURRENTAPPUSERID,@ADDAMAJORGIVINGPROSPECTTASKID,@CONSTITUENTID) = 1
)
)
raiserror(@ERROR_INSUFFICIENTRIGHTS_ADDMAJORGIVINGPROSPECTTASK,13,1);
if @NEWPROSPECTMANAGERFUNDRAISERID is not null
if not(
@ISADMIN = 1 or (
@ISPROSPECTMANAGEREDITDATAFORMINSTANCEALLOWED = 1
and dbo.UFN_SECURITY_APPUSER_GRANTED_FORM_FORCONSTIT(@CURRENTAPPUSERID,@PROSPECTMANAGEREDITDATAFORMINSTANCEID,@CONSTITUENTID) = 1
)
)
set @NEWPROSPECTMANAGERFUNDRAISERID = null;
end
---------------------------------------------------------------------
-- create prospect plans, and prospects as needed
declare @PROSPECTMANAGERDATEFROM date;
declare @PRIMARYMANAGERDATEFROM date;
declare @SECONDARYMANAGERDATEFROM date;
declare @SECONDARYFUNDRAISERSXML xml;
declare @SITESXML xml;
if @NEWPROSPECTMANAGERFUNDRAISERID is not null
set @PROSPECTMANAGERDATEFROM = @STARTDATE;
if @PRIMARYMANAGERFUNDRAISERID is not null
set @PRIMARYMANAGERDATEFROM = @STARTDATE;
if @SECONDARYMANAGERFUNDRAISERID is not null
set @SECONDARYMANAGERDATEFROM = @STARTDATE;
-- reassign IDs for secondary fundraisers
set @SECONDARYFUNDRAISERSXML = (select newid(), FUNDRAISERID, SOLICITORROLECODEID, SEQUENCE
from @SECONDARYFUNDRAISERS
for xml raw('ITEM'),type,elements,root('SECONDARYFUNDRAISERS'),BINARY BASE64);
-- reassign IDs for sites
set @SITESXML = (select newid(), SITEID
from @SITES
for xml raw('ITEM'),type,elements,root('SITES'),BINARY BASE64);
declare @PROSPECTPLANID uniqueidentifier;
set @PROSPECTPLANID = newid();
exec dbo.USP_PROSPECT_ADD
null,
@CHANGEAGENTID,
@CONSTITUENTID,
@NEWPROSPECTMANAGERFUNDRAISERID,
@PROSPECTPLANTYPECODEID,
--the PLANOUTLINEID steps are no longer created automatically here; this is now done on the plan steps tab
null,
@PRIMARYMANAGERFUNDRAISERID,
@SECONDARYMANAGERFUNDRAISERID,
@SECONDARYFUNDRAISERSXML,
@PROSPECTPLANNAME,
null,
@SITESXML,
null,
@PRIMARYMANAGERDATEFROM,
@SECONDARYMANAGERDATEFROM,
@PROSPECTMANAGERDATEFROM,
@NARRATIVE,
@STARTDATE,
0, --don't override existing prospect manager
@PROSPECTPLANID,
@PROSPECTPLANBASECURRENCYID,
@STARTDATE
---------------------------------------------------------------------
-- create opportunities
if @CREATEOPPORTUNITIES = 1
begin
declare @OPPORTUNITYDESIGNATIONSXML xml;
-- reassign IDs for designations
set @OPPORTUNITYDESIGNATIONSXML =
(select newid(), DESIGNATIONID, AMOUNT, SEQUENCE, FUNDINGMETHODCODEID, CATEGORYCODEID, TYPECODEID, USECODEID
from @OPPORTUNITYDESIGNATIONS
for xml raw('ITEM'),type,elements,root('DESIGNATION'),BINARY BASE64);
exec dbo.USP_DATAFORMTEMPLATE_OPPORTUNITY_ADD
@CHANGEAGENTID = @CHANGEAGENTID,
@PROSPECTPLANID = @PROSPECTPLANID,
@EXPECTEDASKAMOUNT = @EXPECTEDASKAMOUNT,
@ASKAMOUNT = @ASKAMOUNT,
@DESIGNATION = @OPPORTUNITYDESIGNATIONSXML,
@OPPORTUNITYTYPECODEID = @OPPORTUNITYTYPECODEID,
@STATUSCODE = @OPPORTUNITYSTATUSCODE,
@TRANSACTIONCURRENCYID = @OPPORTUNITYTRANSACTIONCURRENCYID
end
---------------------------------------------------------------------
-- plan steps
-- calculate expected date
set @NEWPLANSTEPS = (select * from
dbo.UFN_ADDPROSPECTPLANPROCESS_STEPS_FROMITEMLISTXML(@PLANSTEPS, @STARTDATE)
for xml raw('ITEM'), type, elements, root('STEPS'), binary base64
)
exec dbo.USP_PROSPECTPLAN_STEPSWITHCHILDREN_UPDATEFROMXML @PROSPECTPLANID, @NEWPLANSTEPS, @CHANGEAGENTID;
---------------------------------------------------------------------
-- reporting
if @PROSPECTMANAGERFUNDRAISERID is not null and @NEWPROSPECTMANAGERFUNDRAISERID is null
begin
exec sp_executesql @SQL, @PARAMDEF, @CONSTITUENTID, @NEWPROSPECT, 3
set @NUMBEREXCEPTIONS = @NUMBEREXCEPTIONS + 1;
end
else
begin
exec sp_executesql @SQL, @PARAMDEF, @CONSTITUENTID, @NEWPROSPECT, 0
set @NUMBERPROCESSED = @NUMBERPROCESSED + 1;
end
end try
begin catch
rollback transaction PROSPECTTX;
declare @RESULTCODE tinyint = 255;
/*
@RESULTCODE
255 - Unknown
0 - Success
1 - Failed - duplicate plan
2 - Failed - Insufficient rights: Add a major giving prospect task
3 - Partial Success - Insufficient rights: Prospect manager edit dataform
*/
if charindex(@ERROR_DUPLICATEPLAN, error_message()) > 0
set @RESULTCODE = 1
else if error_message() = @ERROR_INSUFFICIENTRIGHTS_ADDMAJORGIVINGPROSPECTTASK
set @RESULTCODE = 2
if @RESULTCODE <> 255
begin
exec sp_executesql @SQL, @PARAMDEF, @CONSTITUENTID, @NEWPROSPECT, @RESULTCODE
set @NUMBEREXCEPTIONS = @NUMBEREXCEPTIONS + 1;
end
else
exec dbo.USP_RAISE_ERROR;
end catch
fetch next from CONSTITUENTCURSOR into @CONSTITUENTID;
end
close CONSTITUENTCURSOR;
deallocate CONSTITUENTCURSOR;
commit transaction;
end try
begin catch
close CONSTITUENTCURSOR;
deallocate CONSTITUENTCURSOR;
rollback transaction;
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
end