Skip to content

Remove Parent's Phone From Child's Record

Credit: Daniel Hazelbaker

Finds all child records that have the same mobile phone as a parent, and removes the email from the child. It also records the change to person history for tracking purposes.

Query

DECLARE @MobilePhoneTypeId int = (SELECT [Id] FROM [DefinedValue] WHERE [Guid] = '407E7E45-7B2E-4FCD-9605-ECB1339F2453');
DECLARE @FamilyTypeId int = (SELECT [Id] FROM [GroupType] WHERE [Guid] = '790E3215-3B10-442B-AF69-616C0DCB998E');
DECLARE @ChildPhonePersonIds TABLE ([Id] int);

-- Find all < 18 people that have the same mobile number as a family member that is > 18
INSERT INTO @ChildPhonePersonIds
SELECT DISTINCT P.[Id]
FROM
    [PhoneNumber] AS PN
    INNER JOIN [PhoneNumber] AS PN2 ON PN2.[Number] = PN.[Number] AND PN2.[Id] != PN.[Id]
    INNER JOIN [Person] AS P ON P.[Id] = PN.[PersonId]
    INNER JOIN [Person] AS P2 ON P2.[Id] = PN2.[PersonId]
    INNER JOIN [GroupMember] AS FM ON FM.[PersonId] = P.[Id]
    INNER JOIN [Group] AS F ON F.[Id] = FM.[GroupId]
    INNER JOIN [GroupMember] AS FM2 ON FM2.[PersonId] = P2.[Id]
    INNER JOIN [Group] AS F2 ON F2.[Id] = FM2.[GroupId]
WHERE
    PN.[NumberTypeValueId] = @MobilePhoneTypeId
    AND F.[GroupTypeId] = @FamilyTypeId
    AND F2.[GroupTypeId] = @FamilyTypeId
    AND F.[Id] = F2.[Id]
    AND dbo.ufnCrm_GetAge(P.[BirthDate]) < 18
    AND dbo.ufnCrm_GetAge(P2.[BirthDate]) >= 18
;
-- Find all child relationship Person records that have the same mobile phone as their parent.
DECLARE @KnownRelationshipTypeId int = (SELECT [Id] FROM [GroupType] WHERE [Guid] = 'E0C5A0E2-B7B3-4EF4-820D-BBF7F9A374EF');
DECLARE @OwnerRelationshipId int = (SELECT [Id] FROM [GroupTypeRole] WHERE [Guid] = '7BC6C12E-0CD1-4DFD-8D5B-1B35AE714C42');
DECLARE @ChildRelationshipId int = (SELECT [Id] FROM [GroupTypeRole] WHERE [Guid] = 'F87DF00F-E86D-4771-A3AE-DBF79B78CF5D');
DECLARE @StepChildRelationshipId int = (SELECT [Id] FROM [GroupTypeRole] WHERE [Guid] = 'EFD2D6D1-A407-4EFB-9086-5DF1F19B7D93');
DECLARE @ChildRelationshipPhonePersonIds TABLE ([Id] int);

INSERT INTO @ChildRelationshipPhonePersonIds
SELECT DISTINCT P2.[Id]
FROM
    [Person] AS P
    INNER JOIN [GroupMember] AS FM ON FM.[PersonId] = P.[Id]
    INNER JOIN [Group] AS KR ON KR.[Id] = FM.[GroupId]
    INNER JOIN [PhoneNumber] AS PN ON PN.[PersonId] = P.[Id]
    INNER JOIN [Group] AS KR2 ON KR2.[Id] = KR.[Id]
    INNER JOIN [GroupMember] AS FM2 ON FM2.[GroupId] = KR2.[Id]
    INNER JOIN [Person] AS P2 ON P2.[Id] = FM2.[PersonId]
    INNER JOIN [PhoneNumber] AS PN2 ON PN2.[PersonId] = P2.[Id]
WHERE
    KR.[GroupTypeId] = @KnownRelationshipTypeId
    AND KR2.[GroupTypeId] = @KnownRelationshipTypeId
    AND KR.[Id] = KR2.[Id]
    AND P.[Id] != P2.[Id]
    AND FM.[GroupRoleId] = @OwnerRelationshipId
    AND ( FM2.[GroupRoleId] = @ChildRelationshipId OR FM2.[GroupRoleId] = @StepChildRelationshipId )
    AND PN.[NumberTypeValueId] = @MobilePhoneTypeId
    AND PN2.[NumberTypeValueId] = @MobilePhoneTypeId
    AND PN.[Number] = PN2.[Number]
;
-- Combine both lists into one.
DECLARE @PersonIds TABLE ([Id] int, [OldValue] varchar(100))
INSERT INTO @PersonIds
SELECT DISTINCT IQ.[Id], NULL
FROM (
    SELECT [Id] FROM @ChildPhonePersonIds
    UNION
    SELECT [Id] FROM @ChildRelationshipPhonePersonIds
) AS IQ
ORDER BY IQ.[Id]
;
-- Add the current (old) number to the list of people.
UPDATE P
SET P.[OldValue] = PN.[NumberFormatted]
FROM @PersonIds AS P
INNER JOIN [PhoneNumber] AS PN ON PN.[PersonId] = P.[Id] AND PN.[NumberTypeValueId] = @MobilePhoneTypeId
;
-- Add History records showing that we are removing the phone number.
INSERT INTO [History] (
    [IsSystem]
    ,[CategoryId]
    ,[EntityTypeId]
    ,[EntityId]
    ,[Guid]
    ,[CreatedDateTime]
    ,[ModifiedDateTime]
    ,[Verb]
    ,[ChangeType]
    ,[ValueName]
    ,[OldValue]
    ,[IsSensitive]
)
SELECT
    0
    ,133
    ,15
    ,P.[Id]
    ,NEWID()
    ,GETDATE()
    ,GETDATE()
    ,'MODIFY'
    ,'Property'
    ,'Mobile Phone'
    ,P.OldValue
    ,0
FROM @PersonIds AS P
;
-- Remove the phone numbers.
DELETE FROM [PhoneNumber] WHERE [PersonId] IN (SELECT [Id] FROM @PersonIds) AND [NumberTypeValueId] = @MobilePhoneTypeId;