diff --git a/src/Bundle/ChillPersonBundle/PersonIdentifier/Validator/UniqueIdentifierConstraintValidator.php b/src/Bundle/ChillPersonBundle/PersonIdentifier/Validator/UniqueIdentifierConstraintValidator.php index 76364538b..929fba2e4 100644 --- a/src/Bundle/ChillPersonBundle/PersonIdentifier/Validator/UniqueIdentifierConstraintValidator.php +++ b/src/Bundle/ChillPersonBundle/PersonIdentifier/Validator/UniqueIdentifierConstraintValidator.php @@ -39,12 +39,15 @@ class UniqueIdentifierConstraintValidator extends ConstraintValidator $identifiers = $this->personIdentifierRepository->findByDefinitionAndCanonical($value->getDefinition(), $value->getValue()); if (count($identifiers) > 0) { - $persons = array_map(fn (PersonIdentifier $idf): string => $this->personRender->renderString($idf->getPerson(), []), $identifiers); + if (count($identifiers) > 1 || $identifiers[0]->getPerson() !== $value->getPerson()) { + $persons = array_map(fn (PersonIdentifier $idf): string => $this->personRender->renderString($idf->getPerson(), []), $identifiers); - $this->context->buildViolation($constraint->message) - ->setParameter('{{ persons }}', implode(', ', $persons)) - ->setParameter('definition_id', (string) $value->getDefinition()->getId()) - ->addViolation(); + $this->context->buildViolation($constraint->message) + ->setParameter('{{ persons }}', implode(', ', $persons)) + ->setParameter('definition_id', (string) $value->getDefinition()->getId()) + ->addViolation(); + + } } } } diff --git a/src/Bundle/ChillPersonBundle/Tests/PersonIdentifier/Validator/UniqueIdentifierConstraintValidatorTest.php b/src/Bundle/ChillPersonBundle/Tests/PersonIdentifier/Validator/UniqueIdentifierConstraintValidatorTest.php index 6356178cf..d872bfc56 100644 --- a/src/Bundle/ChillPersonBundle/Tests/PersonIdentifier/Validator/UniqueIdentifierConstraintValidatorTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/PersonIdentifier/Validator/UniqueIdentifierConstraintValidatorTest.php @@ -127,4 +127,32 @@ final class UniqueIdentifierConstraintValidatorTest extends ConstraintValidatorT ->setParameter('definition_id', '1') ->assertRaised(); } + + public function testViolationWhenDuplicateFoundButForSamePerson(): void + { + $definition = new PersonIdentifierDefinition(['en' => 'SSN'], 'string'); + $reflectionClass = new \ReflectionClass($definition); + $reflectionId = $reflectionClass->getProperty('id'); + $reflectionId->setValue($definition, 1); + + $personA = new Person(); + $personA->setFirstName('Alice')->setLastName('Anderson'); + + $dup1 = new PersonIdentifier($definition); + $dup1->setPerson($personA); + $dup1->setValue(['value' => '123']); + + // Repository returns duplicates + $this->repository->findByDefinitionAndCanonical($definition, ['value' => '123'])->willReturn([$dup1]); + + $identifier = new PersonIdentifier($definition); + $identifier->setPerson($personA); + $identifier->setValue(['value' => '123']); + + $constraint = new UniqueIdentifierConstraint(); + + $this->validator->validate($identifier, $constraint); + + $this->assertNoViolation(); + } }