diff --git a/src/Bundle/ChillPersonBundle/Actions/Upsert/Handler/PersonUpsertHandler.php b/src/Bundle/ChillPersonBundle/Actions/Upsert/Handler/PersonUpsertHandler.php index fa099cff9..669248ae0 100644 --- a/src/Bundle/ChillPersonBundle/Actions/Upsert/Handler/PersonUpsertHandler.php +++ b/src/Bundle/ChillPersonBundle/Actions/Upsert/Handler/PersonUpsertHandler.php @@ -12,6 +12,8 @@ declare(strict_types=1); namespace Chill\PersonBundle\Actions\Upsert\Handler; use Chill\MainBundle\Entity\Address; +use Chill\MainBundle\Entity\Center; +use Chill\MainBundle\Entity\Gender; use Chill\MainBundle\Entity\GenderEnum; use Chill\MainBundle\Repository\CenterRepository; use Chill\MainBundle\Repository\GenderRepository; @@ -62,23 +64,51 @@ readonly class PersonUpsertHandler $newAddress->setValidFrom(\DateTime::createFromImmutable($this->clock->now())); return $newAddress; - } - private function messageAddressExistsAddresses(array $currentAddresses, UpsertMessage $message): bool + private function isMessageAddressMatch(Address $existingAddress, UpsertMessage $message): bool { - foreach ($currentAddresses as $existingAddress) { - $streetMatches = $message->address === $existingAddress->getStreet(); - $streetNumberMatches = $message->streetNumber === $existingAddress->getStreetNumber(); - $postcodeMatches = null !== $existingAddress->getPostcode() - && $message->postcode === $existingAddress->getPostcode()->getCode(); + $streetMatches = $message->address === $existingAddress->getStreet(); + $streetNumberMatches = $message->streetNumber === $existingAddress->getStreetNumber(); + $postcodeMatches = null !== $existingAddress->getPostcode() + && $message->postcode === $existingAddress->getPostcode()->getCode(); - if ($streetMatches && $streetNumberMatches && $postcodeMatches) { - return true; + return $streetMatches && $streetNumberMatches && $postcodeMatches; + } + + private function findGenderByValue(?string $genderValue): ?Gender + { + if (null === $genderValue) { + return null; + } + + foreach (GenderEnum::cases() as $case) { + if ($case->value === $genderValue) { + $genders = $this->genderRepository->findByGenderTranslation($case); + + return count($genders) > 0 ? $genders[0] : null; } } - return false; + return null; + } + + private function findNeutralGender(): ?Gender + { + $genders = $this->genderRepository->findByGenderTranslation(GenderEnum::NEUTRAL); + + return count($genders) > 0 ? $genders[0] : null; + } + + private function findCenterByName(?string $centerName): ?Center + { + if (null === $centerName) { + return null; + } + + $centers = $this->centerRepository->findBy(['name' => $centerName]); + + return count($centers) > 0 ? $centers[0] : null; } private function handlePersonMessage(UpsertMessage $message, Person $person): Person @@ -91,11 +121,14 @@ readonly class PersonUpsertHandler if (null !== $currentHousehold && $hasAddressInfo) { $currentAddresses = $currentHousehold->getAddresses()->toArray(); - $addressMatches = $this->messageAddressExistsAddresses($currentAddresses, $message); + $lastCurrentAddress = end($currentAddresses); - if (!$addressMatches) { - $newAddress = $this->createAddressWithMessage($message); - $currentHousehold->addAddress($newAddress); + if (false !== $lastCurrentAddress) { + $messageAddressMatch = $this->isMessageAddressMatch($lastCurrentAddress, $message); + if (!$messageAddressMatch) { + $newAddress = $this->createAddressWithMessage($message); + $currentHousehold->addAddress($newAddress); + } } } elseif (null === $currentHousehold && $hasAddressInfo) { // Create a new household with a new address @@ -135,33 +168,19 @@ readonly class PersonUpsertHandler } // Handle gender - $gender = null; - if (null !== $message->gender) { - // Try to find gender by the provided value - foreach (GenderEnum::cases() as $case) { - if ($case->value === $message->gender) { - $genders = $this->genderRepository->findByGenderTranslation($case); - $gender = count($genders) > 0 ? $genders[0] : null; - break; - } - } - } - - // If no gender found or provided, use neutral as default + $gender = $this->findGenderByValue($message->gender); if (null === $gender) { - $genders = $this->genderRepository->findByGenderTranslation(GenderEnum::NEUTRAL); - $gender = count($genders) > 0 ? $genders[0] : null; - } else { + // If no gender found or provided, use neutral as default + $gender = $this->findNeutralGender(); + } + if (null !== $gender) { $person->setGender($gender); } // Handle center - if (null !== $message->center) { - $centers = $this->centerRepository->findBy(['name' => $message->center]); - $center = count($centers) > 0 ? $centers[0] : null; - if (null !== $center) { - $person->setCenter($center); - } + $center = $this->findCenterByName($message->center); + if (null !== $center) { + $person->setCenter($center); } return $person; @@ -198,7 +217,7 @@ readonly class PersonUpsertHandler /** @var PersonIdentifier $identifier */ $identifier = $identifiers[0]; $person = $identifier->getPerson(); - $person = $this->handlePersonMessage($message, $person); + $this->handlePersonMessage($message, $person); } $this->entityManager->flush();