USP_MERGETASK_CONSTITUENTWEALTHANDRATINGS
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SOURCEID | uniqueidentifier | IN | |
@TARGETID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN |
Definition
Copy
-- Named SP and file Wealth and Ratings since eventually this will merge all wealth and rating data.
CREATE procedure dbo.USP_MERGETASK_CONSTITUENTWEALTHANDRATINGS
(
@SOURCEID uniqueidentifier,
@TARGETID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier
)
as
set nocount on;
declare @DATECHANGED datetime = getdate();
/* Batch - do batch before score merge so source scores can be compared in update batch */
-- If the source record exists in any Model Scores and Ratings Batches or Model Scores and Ratings Update Batches, change the batch row to have the target constituent instead.
update
dbo.BATCHMODELINGANDPROPENSITY
set
CONSTITUENTID = @TARGETID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @DATECHANGED
where
CONSTITUENTID = @SOURCEID;
-- For the modeling and propensity update batch, compare the score values for built-in models to the score values from the source constituent record.
-- If any of the batch score values are the same as the source score values, then update the batch to instead have the current score value of the target constituent.
-- These score value represent data that has not been updated by the batch data entry user, so we make this adjustment to keep that intention the same.
-- This does not apply to attribute values since those are added by the batch rather than updated.
-- This does not apply to the non-update Model Scores and Ratings Batch since committing those scores would overwrite any values as intended by the behavior of that batch type.
update
dbo.BATCHMODELINGANDPROPENSITYUPDATE
set
BATCHMODELINGANDPROPENSITYUPDATE.PRIMARYRECORDID = @TARGETID,
BATCHMODELINGANDPROPENSITYUPDATE.LOOKUP_ID = CONSTITUENT.LOOKUPID,
BATCHMODELINGANDPROPENSITYUPDATE.KEYNAME = CONSTITUENT.KEYNAME,
BATCHMODELINGANDPROPENSITYUPDATE.FIRSTNAME = CONSTITUENT.FIRSTNAME,
BATCHMODELINGANDPROPENSITYUPDATE.ANNUALGIFTLIKELIHOOD =
case
when BATCHMODELINGANDPROPENSITYUPDATE.ANNUALGIFTLIKELIHOOD = coalesce(CURRENTMODELINGANDPROPENSITY.ANNUALGIFTLIKELIHOOD, -1)
then coalesce(nullif(TARGETMODELINGANDPROPENSITY.ANNUALGIFTLIKELIHOOD, -1), SOURCEMODELINGANDPROPENSITY.ANNUALGIFTLIKELIHOOD, -1)
else
BATCHMODELINGANDPROPENSITYUPDATE.ANNUALGIFTLIKELIHOOD
end,
BATCHMODELINGANDPROPENSITYUPDATE.ANNUITYLIKELIHOOD =
case
when BATCHMODELINGANDPROPENSITYUPDATE.ANNUITYLIKELIHOOD = coalesce(CURRENTMODELINGANDPROPENSITY.ANNUITYLIKELIHOOD, -1)
then coalesce(nullif(TARGETMODELINGANDPROPENSITY.ANNUITYLIKELIHOOD, -1), SOURCEMODELINGANDPROPENSITY.ANNUITYLIKELIHOOD, -1)
else
BATCHMODELINGANDPROPENSITYUPDATE.ANNUITYLIKELIHOOD
end,
BATCHMODELINGANDPROPENSITYUPDATE.BEQUESTLIKELIHOOD =
case
when BATCHMODELINGANDPROPENSITYUPDATE.BEQUESTLIKELIHOOD = coalesce(CURRENTMODELINGANDPROPENSITY.BEQUESTLIKELIHOOD, -1)
then coalesce(nullif(TARGETMODELINGANDPROPENSITY.BEQUESTLIKELIHOOD, -1), SOURCEMODELINGANDPROPENSITY.BEQUESTLIKELIHOOD, -1)
else
BATCHMODELINGANDPROPENSITYUPDATE.BEQUESTLIKELIHOOD
end,
BATCHMODELINGANDPROPENSITYUPDATE.CRTLIKELIHOOD =
case
when BATCHMODELINGANDPROPENSITYUPDATE.CRTLIKELIHOOD = coalesce(CURRENTMODELINGANDPROPENSITY.CRTLIKELIHOOD, -1)
then coalesce(nullif(TARGETMODELINGANDPROPENSITY.CRTLIKELIHOOD, -1), SOURCEMODELINGANDPROPENSITY.CRTLIKELIHOOD, -1)
else
BATCHMODELINGANDPROPENSITYUPDATE.CRTLIKELIHOOD
end,
BATCHMODELINGANDPROPENSITYUPDATE.MAJORGIVINGLIKELIHOOD =
case
when BATCHMODELINGANDPROPENSITYUPDATE.MAJORGIVINGLIKELIHOOD = coalesce(CURRENTMODELINGANDPROPENSITY.MAJORGIVINGLIKELIHOOD, -1)
then coalesce(nullif(TARGETMODELINGANDPROPENSITY.MAJORGIVINGLIKELIHOOD, -1), SOURCEMODELINGANDPROPENSITY.MAJORGIVINGLIKELIHOOD, -1)
else
BATCHMODELINGANDPROPENSITYUPDATE.MAJORGIVINGLIKELIHOOD
end,
BATCHMODELINGANDPROPENSITYUPDATE.MEMBERSHIPLIKELIHOOD =
case
when BATCHMODELINGANDPROPENSITYUPDATE.MEMBERSHIPLIKELIHOOD = coalesce(CURRENTMODELINGANDPROPENSITY.MEMBERSHIPLIKELIHOOD, -1)
then coalesce(nullif(TARGETMODELINGANDPROPENSITY.MEMBERSHIPLIKELIHOOD, -1), SOURCEMODELINGANDPROPENSITY.MEMBERSHIPLIKELIHOOD, -1)
else
BATCHMODELINGANDPROPENSITYUPDATE.MEMBERSHIPLIKELIHOOD
end,
BATCHMODELINGANDPROPENSITYUPDATE.ONLINEGIVINGLIKELIHOOD =
case
when BATCHMODELINGANDPROPENSITYUPDATE.ONLINEGIVINGLIKELIHOOD = coalesce(CURRENTMODELINGANDPROPENSITY.ONLINEGIVINGLIKELIHOOD, -1)
then coalesce(nullif(TARGETMODELINGANDPROPENSITY.ONLINEGIVINGLIKELIHOOD, -1), SOURCEMODELINGANDPROPENSITY.ONLINEGIVINGLIKELIHOOD, -1)
else
BATCHMODELINGANDPROPENSITYUPDATE.ONLINEGIVINGLIKELIHOOD
end,
BATCHMODELINGANDPROPENSITYUPDATE.PATIENTRESPONSELIKELIHOOD =
case
when BATCHMODELINGANDPROPENSITYUPDATE.PATIENTRESPONSELIKELIHOOD = coalesce(CURRENTMODELINGANDPROPENSITY.PATIENTRESPONSELIKELIHOOD, -1)
then coalesce(nullif(TARGETMODELINGANDPROPENSITY.PATIENTRESPONSELIKELIHOOD, -1), SOURCEMODELINGANDPROPENSITY.PATIENTRESPONSELIKELIHOOD, -1)
else
BATCHMODELINGANDPROPENSITYUPDATE.PATIENTRESPONSELIKELIHOOD
end,
BATCHMODELINGANDPROPENSITYUPDATE.PLANNEDGIFTLIKELIHOOD =
case
when BATCHMODELINGANDPROPENSITYUPDATE.PLANNEDGIFTLIKELIHOOD = coalesce(CURRENTMODELINGANDPROPENSITY.PLANNEDGIFTLIKELIHOOD, -1)
then coalesce(nullif(TARGETMODELINGANDPROPENSITY.PLANNEDGIFTLIKELIHOOD, -1), SOURCEMODELINGANDPROPENSITY.PLANNEDGIFTLIKELIHOOD, -1)
else
BATCHMODELINGANDPROPENSITYUPDATE.PLANNEDGIFTLIKELIHOOD
end,
BATCHMODELINGANDPROPENSITYUPDATE.SUGGESTEDMEMBERSHIPLEVELID =
case
when BATCHMODELINGANDPROPENSITYUPDATE.SUGGESTEDMEMBERSHIPLEVELID = CURRENTMODELINGANDPROPENSITY.SUGGESTEDMEMBERSHIPLEVELID
or BATCHMODELINGANDPROPENSITYUPDATE.SUGGESTEDMEMBERSHIPLEVELID is null and CURRENTMODELINGANDPROPENSITY.SUGGESTEDMEMBERSHIPLEVELID is null
then coalesce(TARGETMODELINGANDPROPENSITY.SUGGESTEDMEMBERSHIPLEVELID, SOURCEMODELINGANDPROPENSITY.SUGGESTEDMEMBERSHIPLEVELID)
else
BATCHMODELINGANDPROPENSITYUPDATE.SUGGESTEDMEMBERSHIPLEVELID
end,
BATCHMODELINGANDPROPENSITYUPDATE.SUGGESTEDMEMBERSHIPLEVELSCOREID =
case
when BATCHMODELINGANDPROPENSITYUPDATE.SUGGESTEDMEMBERSHIPLEVELSCOREID = CURRENTMODELINGANDPROPENSITY.SUGGESTEDMEMBERSHIPLEVELID
or BATCHMODELINGANDPROPENSITYUPDATE.SUGGESTEDMEMBERSHIPLEVELSCOREID is null and CURRENTMODELINGANDPROPENSITY.SUGGESTEDMEMBERSHIPLEVELID is null
then coalesce(TARGETMODELINGANDPROPENSITY.SUGGESTEDMEMBERSHIPLEVELID, SOURCEMODELINGANDPROPENSITY.SUGGESTEDMEMBERSHIPLEVELID)
else
BATCHMODELINGANDPROPENSITYUPDATE.SUGGESTEDMEMBERSHIPLEVELSCOREID
end,
BATCHMODELINGANDPROPENSITYUPDATE.TARGETGIFTRANGEID =
case
when BATCHMODELINGANDPROPENSITYUPDATE.TARGETGIFTRANGEID = CURRENTMODELINGANDPROPENSITY.TARGETGIFTRANGEID
or BATCHMODELINGANDPROPENSITYUPDATE.TARGETGIFTRANGEID is null and CURRENTMODELINGANDPROPENSITY.TARGETGIFTRANGEID is null
then coalesce(TARGETMODELINGANDPROPENSITY.TARGETGIFTRANGEID, SOURCEMODELINGANDPROPENSITY.TARGETGIFTRANGEID)
else
BATCHMODELINGANDPROPENSITYUPDATE.TARGETGIFTRANGEID
end,
BATCHMODELINGANDPROPENSITYUPDATE.TARGETGIFTRANGESCOREID =
case
when BATCHMODELINGANDPROPENSITYUPDATE.TARGETGIFTRANGESCOREID = CURRENTMODELINGANDPROPENSITY.TARGETGIFTRANGEID
or BATCHMODELINGANDPROPENSITYUPDATE.TARGETGIFTRANGESCOREID is null and CURRENTMODELINGANDPROPENSITY.TARGETGIFTRANGEID is null
then coalesce(TARGETMODELINGANDPROPENSITY.TARGETGIFTRANGEID, SOURCEMODELINGANDPROPENSITY.TARGETGIFTRANGEID)
else
BATCHMODELINGANDPROPENSITYUPDATE.TARGETGIFTRANGESCOREID
end,
BATCHMODELINGANDPROPENSITYUPDATE.CHANGEDBYID = @CHANGEAGENTID,
BATCHMODELINGANDPROPENSITYUPDATE.DATECHANGED = @DATECHANGED
from
dbo.BATCHMODELINGANDPROPENSITYUPDATE
inner join dbo.CONSTITUENT on CONSTITUENT.ID = @TARGETID
left join dbo.MODELINGANDPROPENSITY as CURRENTMODELINGANDPROPENSITY on CURRENTMODELINGANDPROPENSITY.ID = BATCHMODELINGANDPROPENSITYUPDATE.PRIMARYRECORDID
left join dbo.MODELINGANDPROPENSITY as SOURCEMODELINGANDPROPENSITY on SOURCEMODELINGANDPROPENSITY.ID = @SOURCEID
left join dbo.MODELINGANDPROPENSITY as TARGETMODELINGANDPROPENSITY on TARGETMODELINGANDPROPENSITY.ID = @TARGETID
where
BATCHMODELINGANDPROPENSITYUPDATE.PRIMARYRECORDID = @SOURCEID
or BATCHMODELINGANDPROPENSITYUPDATE.PRIMARYRECORDID = @TARGETID;
/* Built-in scores */
if exists (select 1 from dbo.MODELINGANDPROPENSITY where ID = @SOURCEID)
and not exists (select 1 from dbo.MODELINGANDPROPENSITY where ID = @TARGETID)
begin
-- When standard Blackbaud model scores exist on only the source record, retain this information on the merged, target record
-- Do an insert instead of an update to avoid foreign key issues
insert into dbo.MODELINGANDPROPENSITY
(
ID,
ANNUALGIFTLIKELIHOOD,
ANNUITYLIKELIHOOD,
BEQUESTLIKELIHOOD,
CRTLIKELIHOOD,
MAJORGIVINGLIKELIHOOD,
MEMBERSHIPLIKELIHOOD,
ONLINEGIVINGLIKELIHOOD,
PATIENTRESPONSELIKELIHOOD,
PLANNEDGIFTLIKELIHOOD,
SUGGESTEDMEMBERSHIPLEVELID,
NCOAMOVEDINDICATOR,
TARGETGIFTRANGEID,
WPSCREENINGINDICATOR,
WEALTHESTIMATORRATINGID,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
select
@TARGETID,
SOURCE.ANNUALGIFTLIKELIHOOD,
SOURCE.ANNUITYLIKELIHOOD,
SOURCE.BEQUESTLIKELIHOOD,
SOURCE.CRTLIKELIHOOD,
SOURCE.MAJORGIVINGLIKELIHOOD,
SOURCE.MEMBERSHIPLIKELIHOOD,
SOURCE.ONLINEGIVINGLIKELIHOOD,
SOURCE.PATIENTRESPONSELIKELIHOOD,
SOURCE.PLANNEDGIFTLIKELIHOOD,
SOURCE.SUGGESTEDMEMBERSHIPLEVELID,
SOURCE.NCOAMOVEDINDICATOR,
SOURCE.TARGETGIFTRANGEID,
SOURCE.WPSCREENINGINDICATOR,
SOURCE.WEALTHESTIMATORRATINGID,
@CHANGEAGENTID,
@CHANGEAGENTID,
SOURCE.DATEADDED,
SOURCE.DATECHANGED
from
dbo.MODELINGANDPROPENSITY as SOURCE
where
SOURCE.ID = @SOURCEID;
update
dbo.MODELINGANDPROPENSITYDELIVERY
set
MODELINGANDPROPENSITYID = @TARGETID
--no audit data
where
MODELINGANDPROPENSITYID = @SOURCEID;
end
else if exists (select 1 from dbo.MODELINGANDPROPENSITY where ID = @SOURCEID)
begin
-- When standard Blackbaud scores exist on both the source and the target records, retain all on the merged, target record as long as they are not duplicates of the same score
-- When scores for the same model exist on both the source and target records, keep only the Target record score.
update
dbo.MODELINGANDPROPENSITYDELIVERY
set
MODELINGANDPROPENSITYID = @TARGETID
where
MODELINGANDPROPENSITYID = @SOURCEID
and
-- Target has no delivery for that model
not exists
(
select
1
from
dbo.MODELINGANDPROPENSITYDELIVERY as TARGETDELIVERY
where
TARGETDELIVERY.MODELINGANDPROPENSITYID = @TARGETID
and
TARGETDELIVERY.ANALYTICSMODELID = MODELINGANDPROPENSITYDELIVERY.ANALYTICSMODELID
)
and
-- Target has no score for that model
(
select
case ANALYTICSMODELID
when '3CF4EC5A-63FE-42EA-B70B-7F6CAAE286F1' then case when ANNUALGIFTLIKELIHOOD <> -1 then 1 else 0 end
when '3788BA7E-E7DC-4A6E-93C9-F2245B26A13B' then case when ANNUITYLIKELIHOOD <> -1 then 1 else 0 end
when 'DEF85E09-E51A-4EED-B8AF-0763272A5593' then case when BEQUESTLIKELIHOOD <> -1 then 1 else 0 end
when 'FEB5BE0E-3B4F-45E1-A3E2-26F4372DEE96' then case when CRTLIKELIHOOD <> -1 then 1 else 0 end
when 'CE8C3F19-6B9A-4852-AB3C-3765F48578F7' then case when MAJORGIVINGLIKELIHOOD <> -1 then 1 else 0 end
when 'B2C12F11-3C63-4077-ADD0-C976A905B07C' then case when MEMBERSHIPLIKELIHOOD <> -1 then 1 else 0 end
when '06776DBB-E33A-45A2-B1DE-972B626169DC' then case when ONLINEGIVINGLIKELIHOOD <> -1 then 1 else 0 end
when '64111AFB-850D-4407-B403-948F0CD8BE25' then case when PATIENTRESPONSELIKELIHOOD <> -1 then 1 else 0 end
when '2018E9DB-F837-4CC0-BFC9-E72E5E63ACB5' then case when PLANNEDGIFTLIKELIHOOD <> -1 then 1 else 0 end
when 'A4BACAA3-8EE4-4476-B359-428E582C42AE' then case when SUGGESTEDMEMBERSHIPLEVELID is not null then 1 else 0 end
when 'CA0A6B61-2201-482F-AE8D-C6AE6852C318' then case when TARGETGIFTRANGEID is not null then 1 else 0 end
when '4D03C579-7461-42AE-8445-442D510B6151' then case when WEALTHESTIMATORRATINGID is not null then 1 else 0 end
else 0
end
from
dbo.MODELINGANDPROPENSITY
where
ID = @TARGETID
) = 0;
update
TARGET
set
TARGET.ANNUALGIFTLIKELIHOOD = case when TARGET.ANNUALGIFTLIKELIHOOD = -1 then SOURCE.ANNUALGIFTLIKELIHOOD else TARGET.ANNUALGIFTLIKELIHOOD end,
TARGET.ANNUITYLIKELIHOOD = case when TARGET.ANNUITYLIKELIHOOD = -1 then SOURCE.ANNUITYLIKELIHOOD else TARGET.ANNUITYLIKELIHOOD end,
TARGET.BEQUESTLIKELIHOOD = case when TARGET.BEQUESTLIKELIHOOD = -1 then SOURCE.BEQUESTLIKELIHOOD else TARGET.BEQUESTLIKELIHOOD end,
TARGET.CRTLIKELIHOOD = case when TARGET.CRTLIKELIHOOD = -1 then SOURCE.CRTLIKELIHOOD else TARGET.CRTLIKELIHOOD end,
TARGET.MAJORGIVINGLIKELIHOOD = case when TARGET.MAJORGIVINGLIKELIHOOD = -1 then SOURCE.MAJORGIVINGLIKELIHOOD else TARGET.MAJORGIVINGLIKELIHOOD end,
TARGET.MEMBERSHIPLIKELIHOOD = case when TARGET.MEMBERSHIPLIKELIHOOD = -1 then SOURCE.MEMBERSHIPLIKELIHOOD else TARGET.MEMBERSHIPLIKELIHOOD end,
TARGET.ONLINEGIVINGLIKELIHOOD = case when TARGET.ONLINEGIVINGLIKELIHOOD = -1 then SOURCE.ONLINEGIVINGLIKELIHOOD else TARGET.ONLINEGIVINGLIKELIHOOD end,
TARGET.PATIENTRESPONSELIKELIHOOD = case when TARGET.PATIENTRESPONSELIKELIHOOD = -1 then SOURCE.PATIENTRESPONSELIKELIHOOD else TARGET.PATIENTRESPONSELIKELIHOOD end,
TARGET.PLANNEDGIFTLIKELIHOOD = case when TARGET.PLANNEDGIFTLIKELIHOOD = -1 then SOURCE.PLANNEDGIFTLIKELIHOOD else TARGET.PLANNEDGIFTLIKELIHOOD end,
TARGET.SUGGESTEDMEMBERSHIPLEVELID = coalesce(TARGET.SUGGESTEDMEMBERSHIPLEVELID, SOURCE.SUGGESTEDMEMBERSHIPLEVELID),
--TARGET.NCOAMOVEDINDICATOR -- bit, no null
TARGET.TARGETGIFTRANGEID = coalesce(TARGET.TARGETGIFTRANGEID, SOURCE.TARGETGIFTRANGEID),
TARGET.WPSCREENINGINDICATOR = coalesce(nullif(TARGET.WPSCREENINGINDICATOR,''), SOURCE.WPSCREENINGINDICATOR),
TARGET.WEALTHESTIMATORRATINGID = coalesce(TARGET.WEALTHESTIMATORRATINGID, SOURCE.WEALTHESTIMATORRATINGID),
TARGET.CHANGEDBYID = @CHANGEAGENTID,
TARGET.DATECHANGED = case when @DATECHANGED is null or @DATECHANGED < TARGET.DATECHANGED then TARGET.DATECHANGED else @DATECHANGED end
from
dbo.MODELINGANDPROPENSITY as TARGET
left join dbo.MODELINGANDPROPENSITY as SOURCE on SOURCE.ID = @SOURCEID
where
TARGET.ID = @TARGETID;
exec dbo.USP_MODELINGANDPROPENSITY_DELETEBYID_WITHCHANGEAGENTID @SOURCEID, @CHANGEAGENTID;
end
/* Custom scores (attributes) */
-- When custom attribute ratings exist on only the source record, retain this information on the merged, target record
-- When custom attribute ratings exist on both the source and the target records for an attribute category that allows more than one value per record, retain all values on the merged, target record. Values are copied from the source to the target even if they create duplicate entries.
-- When scores for the same model exist on both the source and target records, keep only the Target record score.
exec dbo.USP_ATTRIBUTECATEGORY_MODELINGANDPROPENSITY_CONSTITUENTMERGE_AUTOGEN @SOURCEID, @TARGETID, @CHANGEAGENTID;
return 0;