diff --git a/src/Bundle/ChillPersonBundle/Repository/ResidentialAddressRepository.php b/src/Bundle/ChillPersonBundle/Repository/ResidentialAddressRepository.php index fedbe8824..4807fb65e 100644 --- a/src/Bundle/ChillPersonBundle/Repository/ResidentialAddressRepository.php +++ b/src/Bundle/ChillPersonBundle/Repository/ResidentialAddressRepository.php @@ -11,10 +11,14 @@ declare(strict_types=1); namespace Chill\PersonBundle\Repository; +use Chill\PersonBundle\Entity\Person; use Chill\PersonBundle\Entity\Person\ResidentialAddress; +use DateTimeImmutable; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; +use function Symfony\Component\DependencyInjection\Loader\Configurator\ref; + /** * @method ResidentialAddress|null find($id, $lockMode = null, $lockVersion = null) * @method ResidentialAddress|null findOneBy(array $criteria, array $orderBy = null) @@ -28,6 +32,19 @@ class ResidentialAddressRepository extends ServiceEntityRepository parent::__construct($registry, ResidentialAddress::class); } + public function findCurrentResidentialAddressByPerson(Person $person, ?DateTimeImmutable $at = null): ?ResidentialAddress + { + $addresses = $this->findBy(['person' => $person], ['startDate' => 'DESC']); + $date = null === $at ? new DateTimeImmutable('today') : $at; + + foreach ($addresses as $a) { + if($a->getStartDate() < $date && $a->getEndDate() > $date) { + return $a; + } + } + return null; + } + // /** // * @return ResidentialAddress[] Returns an array of ResidentialAddress objects // */ diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php index e91748de8..492575b81 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php @@ -17,6 +17,7 @@ use Chill\MainBundle\Templating\Entity\ChillEntityRenderExtension; use Chill\PersonBundle\Entity\Person; use Chill\PersonBundle\Entity\PersonAltName; use Chill\PersonBundle\Repository\PersonRepository; +use Chill\PersonBundle\Repository\ResidentialAddressRepository; use DateTime; use DateTimeImmutable; use Doctrine\Common\Collections\Collection; @@ -51,14 +52,18 @@ class PersonJsonNormalizer implements private PersonRepository $repository; + private ResidentialAddressRepository $residentialAddressRepository; + public function __construct( ChillEntityRenderExtension $render, PersonRepository $repository, - CenterResolverManagerInterface $centerResolverManager + CenterResolverManagerInterface $centerResolverManager, + ResidentialAddressRepository $residentialAddressRepository ) { $this->render = $render; $this->repository = $repository; $this->centerResolverManager = $centerResolverManager; + $this->residentialAddressRepository = $residentialAddressRepository; } public function denormalize($data, $type, $format = null, array $context = []) @@ -181,6 +186,7 @@ class PersonJsonNormalizer implements public function normalize($person, $format = null, array $context = []) { $household = $person->getCurrentHousehold(); + $currentResidentialAddress = $this->residentialAddressRepository->findCurrentResidentialAddressByPerson($person); return [ 'type' => 'person', @@ -200,6 +206,7 @@ class PersonJsonNormalizer implements 'gender' => $person->getGender(), 'current_household_address' => $this->normalizer->normalize($person->getCurrentHouseholdAddress(), $format, $context), 'current_household_id' => $household ? $this->normalizer->normalize($household->getId(), $format, $context) : null, + 'current_residential_address' => $currentResidentialAddress ? $this->normalizer->normalize($currentResidentialAddress->getAddress()): null ]; }