USP_MERGETASK_CONSTITUENTSOLICITCODES
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SOURCEID | uniqueidentifier | IN | |
@TARGETID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@PRIMARYCRITERIA | int | IN | |
@DELETEDUPES | bit | IN |
Definition
Copy
CREATE procedure dbo.USP_MERGETASK_CONSTITUENTSOLICITCODES
(
@SOURCEID uniqueidentifier,
@TARGETID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier,
@PRIMARYCRITERIA int = 0,
@DELETEDUPES bit = 0
)
as
set nocount on;
-- This code is similar to what USP_CONSTITUENCY_MERGE builds but the table does not follow the same structure
-- so I've broken it out here.
-- Source has no codes
if not exists(select top 1 1 from dbo.CONSTITUENTSOLICITCODE where CONSTITUENTID = @SOURCEID)
return 0;
declare @CURRENTDATE datetime = getdate();
-- Target has no codes, move source's over
if not exists(select top 1 1 from dbo.CONSTITUENTSOLICITCODE where CONSTITUENTID = @TARGETID)
begin
update dbo.CONSTITUENTSOLICITCODE
set
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where CONSTITUENTID = @SOURCEID;
return 0;
end
-- @MERGE_RECORDSET will hold the end result of our operations
-- We will use this table to do the final updates back to the record table
declare @MERGE_RECORDSET table
(
ID uniqueidentifier,
SOLICITCODEID uniqueidentifier,
STARTDATE datetime,
ENDDATE datetime,
COMMENTS nvarchar(100),
CONSENTCODE tinyint,
HASDATECONFLICT bit -- Only used for consent-based codes
);
declare @ID uniqueidentifier;
declare @SOLICITCODEID uniqueidentifier;
declare @STARTDATE datetime;
declare @ENDDATE datetime;
declare @COMMENTS nvarchar(100);
declare @ISFROMTARGET bit;
declare @CONSENTCODE tinyint;
declare RECORD_CURSOR cursor for
select
CONSTITUENTSOLICITCODE.ID,
CONSTITUENTSOLICITCODE.SOLICITCODEID,
CONSTITUENTSOLICITCODE.STARTDATE,
CONSTITUENTSOLICITCODE.ENDDATE,
CONSTITUENTSOLICITCODE.COMMENTS,
case
when CONSTITUENTSOLICITCODE.CONSTITUENTID = @SOURCEID then 0
else 1
end as ISFROMTARGET,
SOLICITCODE.CONSENTCODE
from dbo.CONSTITUENTSOLICITCODE
inner join dbo.SOLICITCODE on CONSTITUENTSOLICITCODE.SOLICITCODEID = SOLICITCODE.ID
where CONSTITUENTSOLICITCODE.CONSTITUENTID in (@SOURCEID, @TARGETID)
order by
CONSTITUENTSOLICITCODE.SOLICITCODEID,
CONSTITUENTSOLICITCODE.STARTDATE,
CONSTITUENTSOLICITCODE.ENDDATE;
open RECORD_CURSOR;
fetch next from RECORD_CURSOR
into @ID, @SOLICITCODEID, @STARTDATE, @ENDDATE, @COMMENTS, @ISFROMTARGET, @CONSENTCODE;
while @@FETCH_STATUS = 0
begin
declare @OVERLAPPINGID uniqueidentifier = null;
select @OVERLAPPINGID = ID
from @MERGE_RECORDSET RECORDSET
where
RECORDSET.SOLICITCODEID = @SOLICITCODEID and
dbo.UFN_DATES_AREDATESOVERLAPPING(@STARTDATE, @ENDDATE, RECORDSET.STARTDATE, RECORDSET.ENDDATE) = 1;
if @OVERLAPPINGID is not null
begin
if @CONSENTCODE = 0 -- None
begin
update RECORDSET set
-- Preserve data (i.e. specified date over null)
STARTDATE =
case
when RECORDSET.STARTDATE is null then @STARTDATE
when @STARTDATE is null then RECORDSET.STARTDATE
when RECORDSET.STARTDATE < @STARTDATE then RECORDSET.STARTDATE
else @STARTDATE
end,
-- Preserve status (i.e. currently a member over specified date)
ENDDATE =
case
when RECORDSET.ENDDATE is null or @ENDDATE is null then null
when RECORDSET.ENDDATE > @ENDDATE then RECORDSET.ENDDATE
else @ENDDATE
end,
COMMENTS =
case
when ((@ISFROMTARGET = 1 and @COMMENTS <> '') or RECORDSET.COMMENTS = '') then @COMMENTS
else RECORDSET.COMMENTS
end,
HASDATECONFLICT = 1
from @MERGE_RECORDSET RECORDSET
where RECORDSET.ID = @OVERLAPPINGID;
end
else -- GDPR or Advanced Consent
begin
-- Mark existing record as conflicting
update RECORDSET set
HASDATECONFLICT = 1
from @MERGE_RECORDSET RECORDSET
where ID = @OVERLAPPINGID;
-- Add newly found code, since we don't fuse the date ranges here like standard codes
-- We need to track all conflicting codes so they are not deleted later or if
-- later codes conflict with this one
insert into @MERGE_RECORDSET
(ID, SOLICITCODEID, STARTDATE, ENDDATE, COMMENTS, CONSENTCODE, HASDATECONFLICT)
values
(@ID, @SOLICITCODEID, @STARTDATE, @ENDDATE, @COMMENTS, @CONSENTCODE, 1);
end
end
else
begin
insert into @MERGE_RECORDSET
(ID, SOLICITCODEID, STARTDATE, ENDDATE, COMMENTS, CONSENTCODE, HASDATECONFLICT)
values
(@ID, @SOLICITCODEID, @STARTDATE, @ENDDATE, @COMMENTS, @CONSENTCODE, 0);
end
fetch next from RECORD_CURSOR
into @ID, @SOLICITCODEID, @STARTDATE, @ENDDATE, @COMMENTS, @ISFROMTARGET, @CONSENTCODE;
end
close RECORD_CURSOR;
deallocate RECORD_CURSOR;
declare @CONTEXTCACHE varbinary(128);
set @CONTEXTCACHE = context_info();
if not @CHANGEAGENTID is null
set context_info @CHANGEAGENTID;
-- Delete any records that aren't in our final table (since they may have overlapped with the source)
delete from CONSTITUENTSOLICITCODE
from dbo.CONSTITUENTSOLICITCODE
inner join dbo.SOLICITCODE on CONSTITUENTSOLICITCODE.SOLICITCODEID = SOLICITCODE.ID
where
SOLICITCODE.CONSENTCODE = 0 -- Standard only
and CONSTITUENTSOLICITCODE.CONSTITUENTID = @TARGETID
and CONSTITUENTSOLICITCODE.ID not in (select ID from @MERGE_RECORDSET);
if not @CONTEXTCACHE is null
set context_info @CONTEXTCACHE;
-- Update the records in our final set with the new dates and to point to the target
update CONSTITUENTSOLICITCODE
set
CONSTITUENTID = @TARGETID,
STARTDATE = RECORDSET.STARTDATE,
ENDDATE = RECORDSET.ENDDATE,
COMMENTS = RECORDSET.COMMENTS,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from dbo.CONSTITUENTSOLICITCODE
inner join @MERGE_RECORDSET RECORDSET on RECORDSET.ID = CONSTITUENTSOLICITCODE.ID
where RECORDSET.CONSENTCODE = 0 -- Standard only;
-- Update consent-based records with no date conflict by just changing the constituent
update CONSTITUENTSOLICITCODE
set
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from dbo.CONSTITUENTSOLICITCODE
inner join @MERGE_RECORDSET RECORDSET on RECORDSET.ID = CONSTITUENTSOLICITCODE.ID
where
RECORDSET.CONSENTCODE in (1, 2) -- Consent-based
and RECORDSET.HASDATECONFLICT = 0 -- No date conflicts;
return 0;