USP_MERGETASK_CONSTITUENTVOLUNTEERS
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SOURCEID | uniqueidentifier | IN | |
@TARGETID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_MERGETASK_CONSTITUENTVOLUNTEERS
(
@SOURCEID uniqueidentifier,
@TARGETID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier
)
as
set nocount on;
declare @CHANGEDATE datetime = getdate();
-- If the source does not have a volunteer record,
-- then there is no need to continue
if exists
(
select top(1) ID
from dbo.VOLUNTEER
where ID = @SOURCEID
)
begin
-- Next we must determine if the target already has a
-- volunteer record
if exists
(
select top(1) ID
from dbo.VOLUNTEER
where ID = @TARGETID
)
begin
-- If the Target has a volunteer record, then we will
-- merge the fields of the source and target records
-- using the rule that a target field's value will
-- be kept unless it is null or holds a default value,
-- in which case the source field's value will be copied
-- to the target's field.
declare @SPONSORID uniqueidentifier;
declare @EMERGENCYCONTACTNAME nvarchar(255);
declare @EMERGENCYCONTACTPHONE nvarchar(100);
declare @AVAILABILITYCOMMENT nvarchar(4000);
declare @UNAVAILABLEFROM datetime;
declare @UNAVAILABLETO datetime;
-- Cache the source volunteer record's field values
select
@SPONSORID = SPONSORID,
@EMERGENCYCONTACTNAME = EMERGENCYCONTACTNAME,
@EMERGENCYCONTACTPHONE = EMERGENCYCONTACTPHONE,
@AVAILABILITYCOMMENT = AVAILABILITYCOMMENT,
@UNAVAILABLEFROM = UNAVAILABLEFROM,
@UNAVAILABLETO = UNAVAILABLETO
from
dbo.VOLUNTEER
where
ID = @SOURCEID;
-- Update the target's volunteer record
update dbo.VOLUNTEER
set
SPONSORID = case when(SPONSORID is null) then @SPONSORID else SPONSORID end,
-- Evaluate emergency contact name & phone together - update both or neither
EMERGENCYCONTACTNAME = case when(EMERGENCYCONTACTNAME = '' and EMERGENCYCONTACTPHONE = '') then @EMERGENCYCONTACTNAME else EMERGENCYCONTACTNAME end,
EMERGENCYCONTACTPHONE = case when(EMERGENCYCONTACTNAME = '' and EMERGENCYCONTACTPHONE = '') then @EMERGENCYCONTACTPHONE else EMERGENCYCONTACTPHONE end,
AVAILABILITYCOMMENT = case when(AVAILABILITYCOMMENT = '') then @AVAILABILITYCOMMENT else AVAILABILITYCOMMENT end,
-- Evaluate unavailability from & to dates together - update both or neither
UNAVAILABLEFROM = case when(UNAVAILABLEFROM is null and UNAVAILABLETO is null) then @UNAVAILABLEFROM else UNAVAILABLEFROM end,
UNAVAILABLETO = case when(UNAVAILABLEFROM is null and UNAVAILABLETO is null) then @UNAVAILABLETO else UNAVAILABLETO end,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CHANGEDATE
where
ID = @TARGETID;
-- Merge volunteer date range records for the target and source constituents
--Bring over any source volunteer date range records that don't have date ranges
--that overlap with existing volunteer date range records on the target
update dbo.VOLUNTEERDATERANGE
set CONSTITUENTID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where CONSTITUENTID = @SOURCEID
and ID not in
(
select source.ID
from dbo.VOLUNTEERDATERANGE source
cross apply dbo.VOLUNTEERDATERANGE target
where target.CONSTITUENTID = @TARGETID
and source.CONSTITUENTID = @SOURCEID
and
(
(target.DATETO between source.DATEFROM and source.DATETO) or
(source.DATETO between target.DATEFROM and target.DATETO) or
(target.DATEFROM between source.DATEFROM and source.DATETO) or
(source.DATEFROM between target.DATEFROM and target.DATETO) or
(target.DATEFROM is null and source.DATEFROM <= target.DATETO) or
(source.DATEFROM is null and target.DATEFROM <= source.DATETO) or
(target.DATETO is null and source.DATETO >= target.DATEFROM) or
(source.DATETO is null and target.DATETO >= source.DATEFROM) or
(source.DATEFROM is null and target.DATEFROM is null) or
(source.DATETO is null and target.DATETO is null) or
(source.DATEFROM is null and source.DATETO is null) or
(target.DATEFROM is null and target.DATETO is null)
)
)
--If there is still a volunteer date range record on the source that is "open"
--(i.e. it's DATETO field is null) then make sure the most
--recent volunteer date range record on the target is open. This is done
--to prevent "open" volunteer date range status of being lost due to
--overlapping date ranges.
if exists
(
select top(1) ID
from dbo.VOLUNTEERDATERANGE
where CONSTITUENTID = @SOURCEID
and DATETO is null
)
begin
-- Order By clause evaluates NULL as less than any value.
-- Since we prefer NULL to any actual date when looking for
-- the most recent record, we have to look for NULL as a
-- separate search.
declare @openVDRID uniqueidentifier;
select @openVDRID = ID
from dbo.VOLUNTEERDATERANGE
where CONSTITUENTID = @TARGETID
and DATETO is null;
if @openVDRID is null
begin
-- If no open volunteer was found for the Target,
-- then "open" the record with the most recent DATETO field
update dbo.VOLUNTEERDATERANGE
set DATETO = null, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where ID in
(
select top(1) ID
from dbo.VOLUNTEERDATERANGE
where CONSTITUENTID = @TARGETID
order by DATEFROM desc
)
end
end
-- Now delete the source's lingering date range records
declare @contextCache varbinary(128);
set @contextCache = CONTEXT_INFO();
if not @CHANGEAGENTID is null
set CONTEXT_INFO @CHANGEAGENTID;
delete from dbo.VOLUNTEERDATERANGE where CONSTITUENTID = @SOURCEID;
if not @contextCache is null
set CONTEXT_INFO @contextCache
end
else
begin
-- Otherwise, the target does not have a volunteer record
-- so we will create one by cloning the source's record.
insert into dbo.VOLUNTEER
(ID, SPONSORID, EMERGENCYCONTACTNAME, EMERGENCYCONTACTPHONE, AVAILABILITYCOMMENT, UNAVAILABLEFROM, UNAVAILABLETO, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select
@TARGETID, SPONSORID, EMERGENCYCONTACTNAME, EMERGENCYCONTACTPHONE, AVAILABILITYCOMMENT, UNAVAILABLEFROM, UNAVAILABLETO, ADDEDBYID, @CHANGEAGENTID, DATEADDED, @CHANGEDATE
from
dbo.VOLUNTEER
where
ID = @SOURCEID;
-- update the source's volunteer date range records to
-- point to the target
update dbo.VOLUNTEERDATERANGE
set CONSTITUENTID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where CONSTITUENTID = @SOURCEID;
end
-- Migrate the source's availability records to the target
update dbo.VOLUNTEERAVAILABILITY
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID;
-- Migrate volunteer administrative records from the source
-- volunteer record to the target volunteer record
update dbo.VOLUNTEERADMINISTRATIVE
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
and ID not in
(
select a.ID
from dbo.VOLUNTEERADMINISTRATIVE a
cross apply dbo.VOLUNTEERADMINISTRATIVE b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.ADMINISTRATIVECODEID = b.ADMINISTRATIVECODEID
);
-- For redundant volunteer administrative records,
-- make sure the target record keeps the latest
-- expiration date
with ADMINUPDATEXPIRESON as
(
select b.ID, a.EXPIRESON
from dbo.VOLUNTEERADMINISTRATIVE a
cross apply dbo.VOLUNTEERADMINISTRATIVE b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.ADMINISTRATIVECODEID = b.ADMINISTRATIVECODEID
and a.EXPIRESON > b.EXPIRESON
)
update dbo.VOLUNTEERADMINISTRATIVE
set
EXPIRESON = ADMINUPDATEXPIRESON.EXPIRESON,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CHANGEDATE
from
dbo.VOLUNTEERADMINISTRATIVE
inner join ADMINUPDATEXPIRESON
on VOLUNTEERADMINISTRATIVE.ID = ADMINUPDATEXPIRESON.ID;
-- Migrate volunteer certification records from the source
-- volunteer record to the target volunteer record
update dbo.VOLUNTEERCERTIFICATION
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
and ID not in
(
select a.ID
from dbo.VOLUNTEERCERTIFICATION a
cross apply dbo.VOLUNTEERCERTIFICATION b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.CERTIFICATIONCODEID = b.CERTIFICATIONCODEID
);
-- For redundant volunteer certification records,
-- make sure the target record keeps the latest
-- expiration date
with CERTUPDATEXPIRESON as
(
select b.ID, a.EXPIRESON
from dbo.VOLUNTEERCERTIFICATION a
cross apply dbo.VOLUNTEERCERTIFICATION b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.CERTIFICATIONCODEID = b.CERTIFICATIONCODEID
and a.EXPIRESON > b.EXPIRESON
)
update dbo.VOLUNTEERCERTIFICATION
set
EXPIRESON = CERTUPDATEXPIRESON.EXPIRESON,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CHANGEDATE
from
dbo.VOLUNTEERCERTIFICATION
inner join CERTUPDATEXPIRESON
on VOLUNTEERCERTIFICATION.ID = CERTUPDATEXPIRESON.ID;
-- Migrate volunteer course records from the source
-- volunteer record to the target volunteer record
update dbo.VOLUNTEERCOURSE
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
and ID not in
(
select a.ID
from dbo.VOLUNTEERCOURSE a
cross apply dbo.VOLUNTEERCOURSE b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.COURSECODEID = b.COURSECODEID
);
-- For redundant volunteer course records,
-- make sure the target record keeps the latest
-- expiration date
with COURSEUPDATEXPIRESON as
(
select b.ID, a.EXPIRESON
from dbo.VOLUNTEERCOURSE a
cross apply dbo.VOLUNTEERCOURSE b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.COURSECODEID = b.COURSECODEID
and a.EXPIRESON > b.EXPIRESON
)
update dbo.VOLUNTEERCOURSE
set
EXPIRESON = COURSEUPDATEXPIRESON.EXPIRESON,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CHANGEDATE
from
dbo.VOLUNTEERCOURSE
inner join COURSEUPDATEXPIRESON
on VOLUNTEERCOURSE.ID = COURSEUPDATEXPIRESON.ID;
-- Migrate volunteer interest records from the source
-- volunteer record to the target volunteer record
update dbo.VOLUNTEERINTEREST
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
and ID not in
(
select a.ID
from dbo.VOLUNTEERINTEREST a
cross apply dbo.VOLUNTEERINTEREST b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.VOLUNTEERINTERESTCODEID = b.VOLUNTEERINTERESTCODEID
);
-- Migrate volunteer license records from the source
-- volunteer record to the target volunteer record
update dbo.VOLUNTEERLICENSE
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
and ID not in
(
select a.ID
from dbo.VOLUNTEERLICENSE a
cross apply dbo.VOLUNTEERLICENSE b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.LICENSECODEID = b.LICENSECODEID
);
-- For redundant volunteer license records,
-- make sure the target record keeps the latest
-- expiration date
with LICUPDATEXPIRESON as
(
select b.ID, a.EXPIRESON
from dbo.VOLUNTEERLICENSE a
cross apply dbo.VOLUNTEERLICENSE b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.LICENSECODEID = b.LICENSECODEID
and a.EXPIRESON > b.EXPIRESON
)
update dbo.VOLUNTEERLICENSE
set
EXPIRESON = LICUPDATEXPIRESON.EXPIRESON,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CHANGEDATE
from
dbo.VOLUNTEERLICENSE
inner join LICUPDATEXPIRESON
on VOLUNTEERLICENSE.ID = LICUPDATEXPIRESON.ID;
-- Migrate volunteer medical records from the source
-- volunteer record to the target volunteer record
update dbo.VOLUNTEERMEDICAL
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
and ID not in
(
select a.ID
from dbo.VOLUNTEERMEDICAL a
cross apply dbo.VOLUNTEERMEDICAL b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.MEDICALCODEID = b.MEDICALCODEID
);
-- For redundant volunteer medical records,
-- make sure the target record keeps the latest
-- expiration date
with MEDUPDATEXPIRESON as
(
select b.ID, a.EXPIRESON
from dbo.VOLUNTEERMEDICAL a
cross apply dbo.VOLUNTEERMEDICAL b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.MEDICALCODEID = b.MEDICALCODEID
and a.EXPIRESON > b.EXPIRESON
)
update dbo.VOLUNTEERMEDICAL
set
EXPIRESON = MEDUPDATEXPIRESON.EXPIRESON,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CHANGEDATE
from
dbo.VOLUNTEERMEDICAL
inner join MEDUPDATEXPIRESON
on VOLUNTEERMEDICAL.ID = MEDUPDATEXPIRESON.ID;
-- Migrate volunteer special need records from the source
-- volunteer record to the target volunteer record
update dbo.VOLUNTEERSPECIALNEED
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
and ID not in
(
select a.ID
from dbo.VOLUNTEERSPECIALNEED a
cross apply dbo.VOLUNTEERSPECIALNEED b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.SPECIALNEEDCODEID = b.SPECIALNEEDCODEID
);
-- Migrate volunteer skill records from the source
-- volunteer record to the target volunteer record
update dbo.VOLUNTEERSKILL
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
and ID not in
(
select a.ID
from dbo.VOLUNTEERSKILL a
cross apply dbo.VOLUNTEERSKILL b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.SKILLCODEID = b.SKILLCODEID
);
-- For redundant volunteer skill records,
-- make sure the target skill record reflects
-- the highest skill level of the target and source
-- records
with UPDATSKILLLEVEL as
(
select b.ID, a.SKILLLEVELID
from dbo.VOLUNTEERSKILL a
inner join dbo.VOLUNTEERSKILLLEVEL asl
on a.SKILLLEVELID = asl.ID
cross apply dbo.VOLUNTEERSKILL b
inner join dbo.VOLUNTEERSKILLLEVEL bsl
on b.SKILLLEVELID = bsl.ID
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.SKILLCODEID = b.SKILLCODEID
and asl.SEQUENCE > bsl.SEQUENCE
)
update dbo.VOLUNTEERSKILL
set
SKILLLEVELID = UPDATSKILLLEVEL.SKILLLEVELID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CHANGEDATE
from
dbo.VOLUNTEERSKILL
inner join UPDATSKILLLEVEL
on UPDATSKILLLEVEL.ID = VOLUNTEERSKILL.ID;
-- Migrate volunteer assignment records from the source
-- volunteer record to the target volunteer record
update dbo.VOLUNTEERASSIGNMENT
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
and ID not in
(
select a.ID
from dbo.VOLUNTEERASSIGNMENT a
cross apply dbo.VOLUNTEERASSIGNMENT b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.JOBOCCURRENCEID = b.JOBOCCURRENCEID
and a.DATE = b.DATE
);
-- Merge documentation records for the source and target
-- volunteer records
update dbo.VOLUNTEERNOTE
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
update dbo.VOLUNTEERNOTE
set AUTHORID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where AUTHORID = @SOURCEID
update dbo.VOLUNTEERMEDIALINK
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
update dbo.VOLUNTEERMEDIALINK
set AUTHORID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where AUTHORID = @SOURCEID
update dbo.VOLUNTEERATTACHMENT
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
update dbo.VOLUNTEERATTACHMENT
set AUTHORID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where AUTHORID = @SOURCEID
-- Migrate volunteer screen plan records from the source
-- volunteer record to the target volunteer record
update dbo.VOLUNTEERSCREENPLAN
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
and ID not in
(
select a.ID
from dbo.VOLUNTEERSCREENPLAN a
cross apply dbo.VOLUNTEERSCREENPLAN b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.SCREENPLANID = b.SCREENPLANID
);
-- Update volunteer screen plan links for shared volunteer types
update a
set a.VOLUNTEERSCREENPLANID = b.VOLUNTEERSCREENPLANID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
from dbo.VOLUNTEERVOLUNTEERTYPE a
inner join dbo.VOLUNTEERVOLUNTEERTYPE b on a.VOLUNTEERTYPEID = b.VOLUNTEERTYPEID
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.VOLUNTEERSCREENPLANID is not null
and a.VOLUNTEERSCREENPLANID <> b.VOLUNTEERSCREENPLANID
--save the information for later use in screen plan link conflict check
declare @TMP_VOLUNTEERSCREENPLANLINK table(
ID uniqueidentifier,
VOLUNTEERTYPEID uniqueidentifier,
VOLUNTEERSCREENPLANID uniqueidentifier,
VOLUNTEERID uniqueidentifier,
SCREENPLANID uniqueidentifier);
insert into @TMP_VOLUNTEERSCREENPLANLINK
select
V.ID,
V.VOLUNTEERTYPEID,
V.VOLUNTEERSCREENPLANID,
V.VOLUNTEERID,
S.SCREENPLANID
from dbo.VOLUNTEERVOLUNTEERTYPE V
inner join dbo.VOLUNTEERSCREENPLAN S on v.VOLUNTEERSCREENPLANID = S.ID
and V.VOLUNTEERID = @SOURCEID
and V.VOLUNTEERSCREENPLANID not in
(select VOLUNTEERSCREENPLANID
from dbo.VOLUNTEERVOLUNTEERTYPE
where VOLUNTEERID = @TARGETID);
-- Migrate timesheet records from the source volunteer
-- to the target volunteer
update dbo.TIMESHEET
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID;
-- Migrate volunteer type records from the source
-- volunteer record to the target volunteer record
update dbo.VOLUNTEERVOLUNTEERTYPE
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
and ID not in
(
select a.ID
from dbo.VOLUNTEERVOLUNTEERTYPE a
cross apply dbo.VOLUNTEERVOLUNTEERTYPE b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.VOLUNTEERTYPEID = b.VOLUNTEERTYPEID
and a.STARTDATE = b.STARTDATE
and a.ENDDATE = b.ENDDATE
);
-- Update volunteer screen plan links for new volunteer types which share their screen plans with the existing ones
update a
set a.VOLUNTEERSCREENPLANID = b.VOLUNTEERSCREENPLANID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
from dbo.VOLUNTEERVOLUNTEERTYPE a
inner join @TMP_VOLUNTEERSCREENPLANLINK T on t.ID = a.ID
inner join
(select V.VOLUNTEERSCREENPLANID, S.SCREENPLANID
from dbo.VOLUNTEERVOLUNTEERTYPE V
inner join VOLUNTEERSCREENPLAN S on v.VOLUNTEERSCREENPLANID = S.ID
and V.VOLUNTEERID = @TARGETID)
b on t.SCREENPLANID = b.SCREENPLANID
and a.VOLUNTEERSCREENPLANID <> b.VOLUNTEERSCREENPLANID
-- Migrate volunteer location records from the source
-- volunteer record to the target volunteer record
update dbo.VOLUNTEERVOLUNTEERLOCATION
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID
and ID not in
(
select a.ID
from dbo.VOLUNTEERVOLUNTEERLOCATION a
cross apply dbo.VOLUNTEERVOLUNTEERLOCATION b
where a.VOLUNTEERID = @SOURCEID
and b.VOLUNTEERID = @TARGETID
and a.VOLUNTEERLOCATIONCODEID = b.VOLUNTEERLOCATIONCODEID
);
-- don't leave orphaned award assignment records (duplicates between source and target)
delete from dbo.VOLUNTEERAWARDASSIGNMENT where ID in
(
select source.ID
from dbo.VOLUNTEERAWARDASSIGNMENT source
inner join dbo.VOLUNTEERAWARDASSIGNMENT target
on source.VOLUNTEERID = @SOURCEID
and target.VOLUNTEERID = @TARGETID
and source.AWARDID = target.AWARDID
and source.DATEAWARDED = target.DATEAWARDED
);
-- Migrate volunteer award assignments
update dbo.VOLUNTEERAWARDASSIGNMENT
set VOLUNTEERID = @TARGETID, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE
where VOLUNTEERID = @SOURCEID;
-- Now that all the child records have been migrated to
-- the target, remove the source's redundant volunteer record
exec dbo.USP_VOLUNTEER_DELETEBYID_WITHCHANGEAGENTID @SOURCEID, @CHANGEAGENTID;
end
return 0;