USP_SPONSORSHIP_BULKTRANSFER
Perform a set of transfers.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SUCCESSTABLE | nvarchar(128) | IN | |
@EXCEPTIONTABLE | nvarchar(128) | IN | |
@TRANSFERTYPE | tinyint | IN | |
@MATCHRULE | tinyint | IN | |
@SPONSORSHIPREASONID | uniqueidentifier | IN | |
@COMPLETEPENDINGTRANSFERS | bit | IN | |
@OVERRIDEPENDINGTRANSFERLOCATION | uniqueidentifier | IN | |
@UPDATEOPPORTUNITYAVAILABILITY | bit | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@SUCCESSCOUNT | int | INOUT | |
@EXCEPTIONCOUNT | int | INOUT | |
@SPONSORPREFERENCEOPTION | tinyint | IN | |
@MAINTAINLOCKONTARGETOPPORTUNITY | bit | IN |
Definition
Copy
CREATE procedure dbo.USP_SPONSORSHIP_BULKTRANSFER (
@SUCCESSTABLE nvarchar(128),
@EXCEPTIONTABLE nvarchar(128),
@TRANSFERTYPE tinyint = 0, -- 0=Full, 1=Pending
@MATCHRULE tinyint = 0, -- 0=Standard, 1=Nearest location
@SPONSORSHIPREASONID uniqueidentifier = null,
@COMPLETEPENDINGTRANSFERS bit = 0,
@OVERRIDEPENDINGTRANSFERLOCATION uniqueidentifier = null,
@UPDATEOPPORTUNITYAVAILABILITY bit = 1,
@CHANGEAGENTID uniqueidentifier = null,
@SUCCESSCOUNT int = 0 output,
@EXCEPTIONCOUNT int = 0 output,
@SPONSORPREFERENCEOPTION tinyint = 1, -- 0=Clear conflicts, 1=Overwrite specified, 2=Overwrite all
@MAINTAINLOCKONTARGETOPPORTUNITY bit = 0
)
as
begin
set nocount on;
declare @CURRENTDATE datetime
set @CURRENTDATE = getdate()
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
set @SUCCESSCOUNT = 0
set @EXCEPTIONCOUNT = 0
declare @OVERRIDEHIERARCHYPATH hierarchyid
if @COMPLETEPENDINGTRANSFERS = 1 and
@OVERRIDEPENDINGTRANSFERLOCATION is not null
select @OVERRIDEHIERARCHYPATH = HIERARCHYPATH
from dbo.SPONSORSHIPLOCATION
where ID = @OVERRIDEPENDINGTRANSFERLOCATION
begin try
declare @FROMSPONSORSHIPID uniqueidentifier;
declare @SPONSORSHIPOPPORTUNITYID uniqueidentifier;
declare @SPONSORSHIPPROGRAMID uniqueidentifier;
declare @SPONSORSHIPLOCATIONID uniqueidentifier;
declare @FIXSPONSORSHIPLOCATION bit;
declare @FIXSPONSORSHIPLOCATIONID uniqueidentifier;
declare @GENDERCODE tinyint;
declare @FIXGENDERCODE bit;
declare @SPONSORSHIPOPPORTUNITYAGERANGEID uniqueidentifier;
declare @FIXSPONSORSHIPOPPORTUNITYAGERANGEID bit;
declare @ISHIVPOSITIVECODE tinyint;
declare @FIXISHIVPOSITIVECODE bit;
declare @HASCONDITIONCODE tinyint;
declare @FIXHASCONDITIONCODE bit;
declare @ISORPHANEDCODE tinyint;
declare @FIXISORPHANEDCODE bit;
declare @SPROPPPROJECTCATEGORYCODEID uniqueidentifier;
declare @FIXSPROPPPROJECTCATEGORYCODEID bit;
declare @ISSOLESPONSORSHIP bit;
declare @STATUSCODE tinyint;
declare @PENDINGSPONSORSHIPID uniqueidentifier;
declare @OVERRIDE bit;
declare @TOSPONSORSHIPID uniqueidentifier;
declare @LOGSUCCESSSQL nvarchar(200);
declare @LOGSUCCESSPARAMS nvarchar(75);
declare @LOGEXCEPTIONSQL nvarchar(200);
declare @LOGEXCEPTIONPARAMS nvarchar(75);
declare @PLANNEDENDDATE datetime;
declare @EXPIRATIONREASONID uniqueidentifier;
set @LOGSUCCESSSQL = N'insert into dbo.' + @SUCCESSTABLE + N' (FROMSPONSORSHIPID, TOSPONSORSHIPID) ' +
N'values (@FROMSPONSORSHIPID,@TOSPONSORSHIPID)';
set @LOGSUCCESSPARAMS = N'@FROMSPONSORSHIPID uniqueidentifier,' +
N'@TOSPONSORSHIPID uniqueidentifier';
set @LOGEXCEPTIONSQL = N'insert into dbo.' + @EXCEPTIONTABLE + N' (FROMSPONSORSHIPID, ERRORMESSAGE) ' +
N'values (@FROMSPONSORSHIPID,@ERRORMESSAGE)';
set @LOGEXCEPTIONPARAMS = N'@FROMSPONSORSHIPID uniqueidentifier,' +
N'@ERRORMESSAGE nvarchar(255)';
declare @PROGRAMOPPORTUNITYCONSISTENT bit;
declare @SOLESPONSORSHIPEXCEPTION bit;
declare @UNLOCKTARGETOPPORTUNITY bit;
set @UNLOCKTARGETOPPORTUNITY = 1 - @MAINTAINLOCKONTARGETOPPORTUNITY;
declare SPONSORSHIP_CURSOR cursor local fast_forward for
select
TRANSFERS.FROMSPONSORSHIPID,
TRANSFERS.NEWSPONSORSHIPOPPORTUNITYID,
isnull(TRANSFERS.NEWSPONSORSHIPPROGRAMID,SPONSORSHIP.SPONSORSHIPPROGRAMID),
-------------------------
-- Location
isnull(TRANSFERS.NEWSPONSORSHIPLOCATIONID,
case @SPONSORPREFERENCEOPTION when 2 then null else SPONSORSHIP.SPONSORSHIPLOCATIONID end),
-- fix location preference?
case @SPONSORPREFERENCEOPTION
when 0 then case
-- when original preference is blank and transfer setting is not, retain no preference
when SPONSORSHIP.SPONSORSHIPLOCATIONID is null and TRANSFERS.NEWSPONSORSHIPLOCATIONID is not null then 1
-- when transferring to a more specific location, retain the less specific location
-- when transferring to a conflicting location, set to no preference
when SPONSORSHIP.SPONSORSHIPLOCATIONID <> TRANSFERS.NEWSPONSORSHIPLOCATIONID and
(TRANSFERLOCATION.HIERARCHYPATH.IsDescendantOf(OLDPREFERREDLOCATION.HIERARCHYPATH) = 1 or
OLDPREFERREDLOCATION.HIERARCHYPATH.IsDescendantOf(TRANSFERLOCATION.HIERARCHYPATH) = 0) then 1
else 0
end
else 0
end,
-- value to set the location preference to, if fixing (see above)
case
when @SPONSORPREFERENCEOPTION = 0 and
SPONSORSHIP.SPONSORSHIPLOCATIONID <> TRANSFERS.NEWSPONSORSHIPLOCATIONID and
TRANSFERLOCATION.HIERARCHYPATH.IsDescendantOf(OLDPREFERREDLOCATION.HIERARCHYPATH) = 1 then OLDPREFERREDLOCATION.ID
end,
-------------------------
-- Gender
isnull(TRANSFERS.NEWCHILDGENDERCODE,
case @SPONSORPREFERENCEOPTION when 2 then 0 else SPONSORSHIP.CHILDGENDERCODE end),
-- when no original preference or preferences conflict, set to no preference
case
when @SPONSORPREFERENCEOPTION = 0 and
((SPONSORSHIP.CHILDGENDERCODE = 0 and TRANSFERS.NEWCHILDGENDERCODE is not null) or
(SPONSORSHIP.CHILDGENDERCODE > 0 and SPONSORSHIP.CHILDGENDERCODE <> TRANSFERS.NEWCHILDGENDERCODE)) then 1
else 0
end,
-------------------------
-- Age range
isnull(TRANSFERS.NEWSPONSORSHIPOPPORTUNITYAGERANGEID,
case @SPONSORPREFERENCEOPTION when 2 then null else SPONSORSHIP.SPONSORSHIPOPPORTUNITYAGERANGEID end),
case
when @SPONSORPREFERENCEOPTION = 0 and
isnull(SPONSORSHIP.SPONSORSHIPOPPORTUNITYAGERANGEID,'00000000-0000-0000-0000-000000000000') <> TRANSFERS.NEWSPONSORSHIPOPPORTUNITYAGERANGEID then 1
else 0
end,
-------------------------
-- HIV+
isnull(TRANSFERS.NEWISHIVPOSITIVECODE,
case @SPONSORPREFERENCEOPTION when 2 then 0 else SPONSORSHIP.ISHIVPOSITIVECODE end),
case
when @SPONSORPREFERENCEOPTION = 0 and
((SPONSORSHIP.ISHIVPOSITIVECODE = 0 and TRANSFERS.NEWISHIVPOSITIVECODE is not null) or
(SPONSORSHIP.ISHIVPOSITIVECODE > 0 and SPONSORSHIP.ISHIVPOSITIVECODE <> TRANSFERS.NEWISHIVPOSITIVECODE)) then 1
else 0
end,
-------------------------
-- Condition
isnull(TRANSFERS.NEWHASCONDITIONCODE,
case @SPONSORPREFERENCEOPTION when 2 then 0 else SPONSORSHIP.HASCONDITIONCODE end),
case
when @SPONSORPREFERENCEOPTION = 0 and
((SPONSORSHIP.HASCONDITIONCODE = 0 and TRANSFERS.NEWHASCONDITIONCODE is not null) or
(SPONSORSHIP.HASCONDITIONCODE > 0 and SPONSORSHIP.HASCONDITIONCODE <> TRANSFERS.NEWHASCONDITIONCODE)) then 1
else 0
end,
-------------------------
-- Orphaned
isnull(TRANSFERS.NEWISORPHANEDCODE,
case @SPONSORPREFERENCEOPTION when 2 then 0 else SPONSORSHIP.ISORPHANEDCODE end),
case
when @SPONSORPREFERENCEOPTION = 0 and
((SPONSORSHIP.ISORPHANEDCODE = 0 and TRANSFERS.NEWISORPHANEDCODE is not null) or
(SPONSORSHIP.ISORPHANEDCODE > 0 and SPONSORSHIP.ISORPHANEDCODE <> TRANSFERS.NEWISORPHANEDCODE)) then 1
else 0
end,
-------------------------
-- Project category
isnull(TRANSFERS.NEWSPROPPPROJECTCATEGORYCODEID,
case @SPONSORPREFERENCEOPTION when 2 then null else SPONSORSHIP.SPROPPPROJECTCATEGORYCODEID end),
case
when @SPONSORPREFERENCEOPTION = 0 and
isnull(SPONSORSHIP.SPROPPPROJECTCATEGORYCODEID,'00000000-0000-0000-0000-000000000000') <> TRANSFERS.NEWSPROPPPROJECTCATEGORYCODEID then 1
else 0
end,
-------------------------
SPONSORSHIP.ISSOLESPONSORSHIP,
SPONSORSHIP.STATUSCODE,
SPONSORSHIP.PLANNEDENDDATE,
PENDINGSPONSORSHIP.ID,
PENDINGLOCATION.HIERARCHYPATH.IsDescendantOf(@OVERRIDEHIERARCHYPATH),
SPONSORSHIP.EXPIRATIONREASONID
from #TRANSFERS TRANSFERS
inner join dbo.SPONSORSHIP on SPONSORSHIP.ID = TRANSFERS.FROMSPONSORSHIPID
inner join dbo.SPONSORSHIPOPPORTUNITY on SPONSORSHIPOPPORTUNITY.ID = SPONSORSHIP.SPONSORSHIPOPPORTUNITYID
left outer join dbo.SPONSORSHIPTRANSACTION INITIATETRANSFERTRANSACTION on INITIATETRANSFERTRANSACTION.CONTEXTSPONSORSHIPID = SPONSORSHIP.ID and INITIATETRANSFERTRANSACTION.ACTIONCODE = 6
left outer join dbo.SPONSORSHIP PENDINGSPONSORSHIP on PENDINGSPONSORSHIP.ID = INITIATETRANSFERTRANSACTION.TARGETSPONSORSHIPID and PENDINGSPONSORSHIP.STATUSCODE = 0
left outer join dbo.SPONSORSHIPOPPORTUNITY PENDINGOPPORTUNITY on PENDINGOPPORTUNITY.ID = PENDINGSPONSORSHIP.SPONSORSHIPOPPORTUNITYID
left outer join dbo.SPONSORSHIPLOCATION PENDINGLOCATION on PENDINGLOCATION.ID = PENDINGOPPORTUNITY.SPONSORSHIPLOCATIONID
left outer join dbo.SPONSORSHIPLOCATION OLDPREFERREDLOCATION on OLDPREFERREDLOCATION.ID = SPONSORSHIP.SPONSORSHIPLOCATIONID
left outer join dbo.SPONSORSHIPLOCATION TRANSFERLOCATION on TRANSFERLOCATION.ID = TRANSFERS.NEWSPONSORSHIPLOCATIONID
order by
-- settings that will be least likely to find matches should be first
-- (best guess as to which settings those are)
-- highest number of requests for HIV+, w/ Condition, or Orphaned child first
case when SPONSORSHIP.ISHIVPOSITIVECODE = 1 then 1 else 2 end +
case when SPONSORSHIP.HASCONDITIONCODE = 1 then 1 else 2 end +
case when SPONSORSHIP.ISORPHANEDCODE = 1 then 1 else 2 end,
-- specific location first
case when isnull(TRANSFERS.NEWSPONSORSHIPLOCATIONID,SPONSORSHIP.SPONSORSHIPLOCATIONID) is not null then 1 else 2 end,
-- age range specified first
case when SPONSORSHIP.SPONSORSHIPOPPORTUNITYAGERANGEID is not null then 1 else 2 end,
-- project category specified first
case when SPONSORSHIP.SPROPPPROJECTCATEGORYCODEID is not null then 1 else 2 end,
-- sole sponsorships first
SPONSORSHIP.ISSOLESPONSORSHIP desc
open SPONSORSHIP_CURSOR;
fetch next from SPONSORSHIP_CURSOR into
@FROMSPONSORSHIPID,
@SPONSORSHIPOPPORTUNITYID,
@SPONSORSHIPPROGRAMID,
@SPONSORSHIPLOCATIONID,
@FIXSPONSORSHIPLOCATION,
@FIXSPONSORSHIPLOCATIONID,
@GENDERCODE,
@FIXGENDERCODE,
@SPONSORSHIPOPPORTUNITYAGERANGEID,
@FIXSPONSORSHIPOPPORTUNITYAGERANGEID,
@ISHIVPOSITIVECODE,
@FIXISHIVPOSITIVECODE,
@HASCONDITIONCODE,
@FIXHASCONDITIONCODE,
@ISORPHANEDCODE,
@FIXISORPHANEDCODE,
@SPROPPPROJECTCATEGORYCODEID,
@FIXSPROPPPROJECTCATEGORYCODEID,
@ISSOLESPONSORSHIP,
@STATUSCODE,
@PLANNEDENDDATE,
@PENDINGSPONSORSHIPID,
@OVERRIDE,
@EXPIRATIONREASONID;
while (@@FETCH_STATUS = 0)
begin
set @TOSPONSORSHIPID = null
set @PROGRAMOPPORTUNITYCONSISTENT = case when @SPONSORSHIPOPPORTUNITYID is null then 1 else dbo.UFN_SPONSORSHIP_PROGRAMANDOPPORTUNITYCONSISTENT(@SPONSORSHIPPROGRAMID,@SPONSORSHIPOPPORTUNITYID) end;
begin try
save transaction TRANSFER;
if @PROGRAMOPPORTUNITYCONSISTENT = 1
begin
if @STATUSCODE = 1
begin
if @PENDINGSPONSORSHIPID is null
begin
if @TRANSFERTYPE = 0
begin
exec dbo.USP_SPONSORSHIP_FULLTRANSFER
@TOSPONSORSHIPID output,
@FROMSPONSORSHIPID,
@SPONSORSHIPREASONID,
@MATCHRULE,
@SPONSORSHIPPROGRAMID,
@SPONSORSHIPLOCATIONID,
@GENDERCODE,
@SPONSORSHIPOPPORTUNITYAGERANGEID,
@ISHIVPOSITIVECODE,
@HASCONDITIONCODE,
@ISORPHANEDCODE,
@SPROPPPROJECTCATEGORYCODEID,
@SPONSORSHIPOPPORTUNITYID,
@ISSOLESPONSORSHIP,
@UPDATEOPPORTUNITYAVAILABILITY,
@CHANGEAGENTID,
@PLANNEDENDDATE,
@EXPIRATIONREASONID,
@UNLOCKTARGETOPPORTUNITY
end
else
begin
exec dbo.USP_SPONSORSHIP_CREATETRANSFER
@TOSPONSORSHIPID output,
@FROMSPONSORSHIPID,
6,
@SPONSORSHIPREASONID,
null,
@MATCHRULE,
@SPONSORSHIPOPPORTUNITYID,
@SPONSORSHIPPROGRAMID,
@SPONSORSHIPLOCATIONID,
@GENDERCODE,
@SPONSORSHIPOPPORTUNITYAGERANGEID,
@ISHIVPOSITIVECODE,
@HASCONDITIONCODE,
@ISORPHANEDCODE,
@SPROPPPROJECTCATEGORYCODEID,
@ISSOLESPONSORSHIP,
null,
@CHANGEAGENTID,
null,
@PLANNEDENDDATE,
@EXPIRATIONREASONID,
@UNLOCKTARGETOPPORTUNITY
end
end
else
begin
-- pending transfer
if @COMPLETEPENDINGTRANSFERS = 1
begin
if @OVERRIDE = 1
exec dbo.USP_SPONSORSHIP_OVERRIDETRANSFER
@TOSPONSORSHIPID output,
@FROMSPONSORSHIPID,
@PENDINGSPONSORSHIPID,
@SPONSORSHIPREASONID,
@MATCHRULE,
@SPONSORSHIPPROGRAMID,
@SPONSORSHIPLOCATIONID,
@GENDERCODE,
@SPONSORSHIPOPPORTUNITYAGERANGEID,
@ISHIVPOSITIVECODE,
@HASCONDITIONCODE,
@ISORPHANEDCODE,
@SPROPPPROJECTCATEGORYCODEID,
@SPONSORSHIPOPPORTUNITYID,
@ISSOLESPONSORSHIP,
@UPDATEOPPORTUNITYAVAILABILITY,
@CHANGEAGENTID,
@PLANNEDENDDATE,
@EXPIRATIONREASONID,
@UNLOCKTARGETOPPORTUNITY
else
begin
exec dbo.USP_SPONSORSHIP_COMPLETETRANSFER
@PENDINGSPONSORSHIPID,
@FROMSPONSORSHIPID,
@UPDATEOPPORTUNITYAVAILABILITY,
@CHANGEAGENTID
set @TOSPONSORSHIPID = @PENDINGSPONSORSHIPID
end
end
else
begin
-- pending transfer found, but not completing pending transfers
raiserror('BBERR_NOTCOMPLETINGPENDINGTRANSFERS',13,1)
end
end
end
else
begin
if @STATUSCODE = 0
raiserror('BBERR_PENDINGTRANSFERFOUND',13,1)
else
raiserror('BBERR_INACTIVESPONSORSHIPFOUND',13,1)
end
end
else
raiserror('BBERR_PROGRAMOPPORTUNITYNOTCONSISTENT',13,1)
-- fix preferences if necessary
if @SPONSORPREFERENCEOPTION = 0 and
(@FIXSPONSORSHIPLOCATION = 1 or
@FIXGENDERCODE = 1 or
@FIXSPONSORSHIPOPPORTUNITYAGERANGEID = 1 or
@FIXISHIVPOSITIVECODE = 1 or
@FIXHASCONDITIONCODE = 1 or
@FIXISORPHANEDCODE = 1 or
@FIXSPROPPPROJECTCATEGORYCODEID = 1)
begin
update dbo.SPONSORSHIP
set SPONSORSHIPLOCATIONID = case @FIXSPONSORSHIPLOCATION when 1 then @FIXSPONSORSHIPLOCATIONID else SPONSORSHIPLOCATIONID end,
CHILDGENDERCODE = case @FIXGENDERCODE when 1 then 0 else CHILDGENDERCODE end,
SPONSORSHIPOPPORTUNITYAGERANGEID = case @FIXSPONSORSHIPOPPORTUNITYAGERANGEID when 1 then null else SPONSORSHIPOPPORTUNITYAGERANGEID end,
ISHIVPOSITIVECODE = case @FIXISHIVPOSITIVECODE when 1 then 0 else ISHIVPOSITIVECODE end,
HASCONDITIONCODE = case @FIXHASCONDITIONCODE when 1 then 0 else HASCONDITIONCODE end,
ISORPHANEDCODE = case @FIXISORPHANEDCODE when 1 then 0 else ISORPHANEDCODE end,
SPROPPPROJECTCATEGORYCODEID = case @FIXSPROPPPROJECTCATEGORYCODEID when 1 then null else SPROPPPROJECTCATEGORYCODEID end,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where ID = @TOSPONSORSHIPID;
end
-- log the successful transfer
exec sp_executesql @LOGSUCCESSSQL,
@LOGSUCCESSPARAMS,
@FROMSPONSORSHIPID,
@TOSPONSORSHIPID
set @SUCCESSCOUNT = @SUCCESSCOUNT + 1
end try
begin catch
rollback transaction TRANSFER
declare @MSG nvarchar(255)
set @MSG = ERROR_MESSAGE()
exec sp_executesql @LOGEXCEPTIONSQL,
@LOGEXCEPTIONPARAMS,
@FROMSPONSORSHIPID,
@MSG
set @EXCEPTIONCOUNT = @EXCEPTIONCOUNT + 1
end catch
fetch next from SPONSORSHIP_CURSOR into
@FROMSPONSORSHIPID,
@SPONSORSHIPOPPORTUNITYID,
@SPONSORSHIPPROGRAMID,
@SPONSORSHIPLOCATIONID,
@FIXSPONSORSHIPLOCATION,
@FIXSPONSORSHIPLOCATIONID,
@GENDERCODE,
@FIXGENDERCODE,
@SPONSORSHIPOPPORTUNITYAGERANGEID,
@FIXSPONSORSHIPOPPORTUNITYAGERANGEID,
@ISHIVPOSITIVECODE,
@FIXISHIVPOSITIVECODE,
@HASCONDITIONCODE,
@FIXHASCONDITIONCODE,
@ISORPHANEDCODE,
@FIXISORPHANEDCODE,
@SPROPPPROJECTCATEGORYCODEID,
@FIXSPROPPPROJECTCATEGORYCODEID,
@ISSOLESPONSORSHIP,
@STATUSCODE,
@PLANNEDENDDATE,
@PENDINGSPONSORSHIPID,
@OVERRIDE,
@EXPIRATIONREASONID;
end
close SPONSORSHIP_CURSOR;
deallocate SPONSORSHIP_CURSOR;
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;
end