USP_MERGETASK_CONSTITUENTMEMBERSHIP
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SOURCEID | uniqueidentifier | IN | |
@TARGETID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@DELETEDUPES | bit | IN |
Definition
Copy
CREATE procedure dbo.USP_MERGETASK_CONSTITUENTMEMBERSHIP
(
@SOURCEID uniqueidentifier,
@TARGETID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier,
@DELETEDUPES bit = 0
)
as
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
declare @CURRENTDATE datetime = getdate();
declare @CONTEXTCACHE varbinary(128) = context_info();
begin try
-- Update given by and donor ID fields on memberships
update dbo.MEMBERSHIP set
GIVENBYID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
GIVENBYID = @SOURCEID;
update dbo.MEMBERSHIPTRANSACTION set
DONORID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
DONORID = @SOURCEID;
-- Updating all the source's member records that are dropped
-- to point to the target. Since they are dropped, we shouldn't
-- be violating any constraints.
update dbo.MEMBER set
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
CONSTITUENTID = @SOURCEID
and ISDROPPED = 1;
-- Update authors on membership notes
update dbo.MEMBERNOTE set
AUTHORID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
AUTHORID = @SOURCEID;
-- Update authors on membership media links
update dbo.MEMBERMEDIALINK set
AUTHORID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
AUTHORID = @SOURCEID;
-- Update authors on membership attachments
update dbo.MEMBERATTACHMENT set
AUTHORID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
AUTHORID = @SOURCEID;
-- Update given by field for sales order item membership records
update dbo.SALESORDERITEMMEMBERSHIP set
GIVENBYID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
GIVENBYID = @SOURCEID;
-- Delete any SALESORDERITEMMEMBERSHIP records on incomplete sales orders that contain either the source or target
declare SALESORDERITEMMEMBERSHIP_CURSOR cursor local fast_forward for
select distinct
SALESORDERITEM.ID
from
dbo.SALESORDER
inner join
dbo.SALESORDERITEM on SALESORDERITEM.SALESORDERID = SALESORDER.ID
inner join
dbo.SALESORDERITEMMEMBERSHIP on SALESORDERITEMMEMBERSHIP.ID = SALESORDERITEM.ID
inner join
dbo.SALESORDERITEMMEMBER on SALESORDERITEMMEMBER.SALESORDERITEMMEMBERSHIPID = SALESORDERITEMMEMBERSHIP.ID
where
SALESORDER.STATUSCODE <> 1 -- Complete
and SALESORDERITEMMEMBER.CONSTITUENTID in (@SOURCEID, @TARGETID);
open SALESORDERITEMMEMBERSHIP_CURSOR;
declare @SALESORDERITEMID uniqueidentifier;
fetch next from SALESORDERITEMMEMBERSHIP_CURSOR into @SALESORDERITEMID;
while @@fetch_status = 0
begin
exec dbo.USP_SALESORDERITEM_DELETE @SALESORDERITEMID, @CHANGEAGENTID;
fetch next from SALESORDERITEMMEMBERSHIP_CURSOR into @SALESORDERITEMID;
end
close SALESORDERITEMMEMBERSHIP_CURSOR;
deallocate SALESORDERITEMMEMBERSHIP_CURSOR;
-- There's a chance that sales orders exist where the source and target
-- where both members of the same membership. Update primary record accordingly
-- and delete the source sales order item member records.
declare @SHAREDORDERMEMBERSHIPS table (
SALESORDERITEMMEMBERSHIPID uniqueidentifier,
SOURCESALESORDERITEMMEMBERID uniqueidentifier,
TARGETSALESORDERITEMMEMBERID uniqueidentifier,
SOURCEISPRIMARY bit
);
insert into @SHAREDORDERMEMBERSHIPS (
SALESORDERITEMMEMBERSHIPID,
SOURCESALESORDERITEMMEMBERID,
TARGETSALESORDERITEMMEMBERID,
SOURCEISPRIMARY
)
select
SALESORDERITEMMEMBERSHIP.ID,
SOURCEMEMBER.ID,
TARGETMEMBER.ID,
SOURCEMEMBER.ISPRIMARY
from
dbo.SALESORDERITEMMEMBERSHIP
inner join
dbo.SALESORDERITEMMEMBER as SOURCEMEMBER on SOURCEMEMBER.SALESORDERITEMMEMBERSHIPID = SALESORDERITEMMEMBERSHIP.ID and SOURCEMEMBER.CONSTITUENTID = @SOURCEID
inner join
dbo.SALESORDERITEMMEMBER as TARGETMEMBER on TARGETMEMBER.SALESORDERITEMMEMBERSHIPID = SALESORDERITEMMEMBERSHIP.ID and TARGETMEMBER.CONSTITUENTID = @TARGETID
if @@rowcount > 0
begin
-- Move sales order membership cards over from the source to the target
update dbo.SALESORDERITEMMEMBERSHIPCARD set
SALESORDERITEMMEMBERID = SHAREDORDERMEMBERSHIPS.TARGETSALESORDERITEMMEMBERID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from
dbo.SALESORDERITEMMEMBERSHIPCARD
inner join
@SHAREDORDERMEMBERSHIPS as SHAREDORDERMEMBERSHIPS on SHAREDORDERMEMBERSHIPS.SOURCESALESORDERITEMMEMBERID = SALESORDERITEMMEMBERSHIPCARD.SALESORDERITEMMEMBERID;
set context_info @CHANGEAGENTID;
-- Delete source sales order item member records
delete from dbo.SALESORDERITEMMEMBER
where ID in (select SOURCESALESORDERITEMMEMBERID from @SHAREDORDERMEMBERSHIPS);
if @CONTEXTCACHE is not null
set context_info @CONTEXTCACHE;
-- Turn on the ISPRIMARY flag for the target if source was primary
update dbo.SALESORDERITEMMEMBER set
ISPRIMARY = 1,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from
dbo.SALESORDERITEMMEMBER
inner join
@SHAREDORDERMEMBERSHIPS as SHAREDORDERMEMBERSHIPS on SHAREDORDERMEMBERSHIPS.TARGETSALESORDERITEMMEMBERID = SALESORDERITEMMEMBER.ID
where
SHAREDORDERMEMBERSHIPS.SOURCEISPRIMARY = 1;
end
-- At this point, we should be ok to update sales order item member records
-- to point from the source to the target. The MEMBERID field will be updated
-- in USP_MEMBERSHIP_MERGE if two memberships are merged into one.
update dbo.SALESORDERITEMMEMBER set
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from
dbo.SALESORDERITEMMEMBER
inner join
dbo.SALESORDERITEMMEMBERSHIP on SALESORDERITEMMEMBERSHIP.ID = SALESORDERITEMMEMBER.SALESORDERITEMMEMBERSHIPID
where
SALESORDERITEMMEMBER.CONSTITUENTID = @SOURCEID;
-- Update membership dues batch information records to point to the new constituent
update dbo.BATCHMEMBERSHIPDUES set
BILLTOCONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
BILLTOCONSTITUENTID = @SOURCEID;
update dbo.BATCHMEMBERSHIPDUES set
MEMBERSHIPRECIPIENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
MEMBERSHIPRECIPIENTID = @SOURCEID;
update dbo.BATCHMEMBERSHIPDUESMEMBER set
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
CONSTITUENTID = @SOURCEID;
update dbo.BATCHMEMBERSHIPDUESMEMBERSHIPCARD set
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
CONSTITUENTID = @SOURCEID;
update dbo.BATCHMEMBERSHIPDUESDONATIONRECOGNITION set
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
CONSTITUENTID = @SOURCEID;
update dbo.BATCHMEMBERSHIPDUESDONATIONSOLICITOR set
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
CONSTITUENTID = @SOURCEID;
update dbo.BATCHMEMBERSHIPDUESMEMBERSHIPRECOGNITION set
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
CONSTITUENTID = @SOURCEID;
-- Loop through source memberships and move them over to the target
declare @MEMBERSHIPID uniqueidentifier;
declare MEMBERSHIP_CURSOR cursor local fast_forward for
select distinct MEMBER.MEMBERSHIPID
from dbo.MEMBER
where CONSTITUENTID = @SOURCEID;
open MEMBERSHIP_CURSOR;
fetch next from MEMBERSHIP_CURSOR into @MEMBERSHIPID;
while @@fetch_status = 0
begin
exec dbo.USP_MEMBERSHIP_MERGE @MEMBERSHIPID, @SOURCEID, @TARGETID, @DELETEDUPES, @CHANGEAGENTID, @CURRENTDATE;
fetch next from MEMBERSHIP_CURSOR into @MEMBERSHIPID;
end
close MEMBERSHIP_CURSOR;
deallocate MEMBERSHIP_CURSOR;
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;