diff --git a/src/Bundle/ChillPersonBundle/Entity/Household/Household.php b/src/Bundle/ChillPersonBundle/Entity/Household/Household.php index 19bda3785..91d9cea57 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Household/Household.php +++ b/src/Bundle/ChillPersonBundle/Entity/Household/Household.php @@ -14,6 +14,7 @@ namespace Chill\PersonBundle\Entity\Household; use ArrayIterator; use Chill\MainBundle\Entity\Address; use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable; +use Chill\PersonBundle\Entity\Person; use Chill\PersonBundle\Validator\Constraints\Household\MaxHolder; use DateTime; use DateTimeImmutable; @@ -354,7 +355,12 @@ class Household return $this->members; } - public function getMembersDuringMembership(HouseholdMember $membership) + /** + * get all the members during a given membership. + * + * @return Collection|HouseholdMember[] + */ + public function getMembersDuringMembership(HouseholdMember $membership): Collection { return $this->getMembersOnRange( $membership->getStartDate(), @@ -441,6 +447,28 @@ class Household return $this->getNonCurrentMembers($now)->matching($criteria); } + /** + * get all the unique persons during a given membership. + * + * same as @see(self::getMembersDuringMembership}, except that the collection is filtered to + * return unique members. + * + * @return Collection|Person[] + */ + public function getPersonsDuringMembership(HouseholdMember $member): Collection + { + // make list unique + $membersByHash = []; + + foreach ($this->getMembersDuringMembership($member) as $m) { + if (null !== $m && null !== $m->getPerson()) { + $membersByHash[spl_object_hash($m->getPerson())] = $m->getPerson(); + } + } + + return new ArrayCollection(array_values($membersByHash)); + } + public function getPreviousAddressOf(Address $address): ?Address { $iterator = new ArrayIterator($this->getAddressesOrdered()); diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Person/household_history.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Person/household_history.html.twig index 6f7ce0a06..6cacbdf96 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/Person/household_history.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/Person/household_history.html.twig @@ -65,18 +65,18 @@
{{ 'household.Any simultaneous members'|trans }}
{% else %} - {% for m in simultaneous -%} + {% for person in simultaneous -%} {% include '@ChillMain/OnTheFly/_insert_vue_onthefly.html.twig' with { action: 'show', displayBadge: true, - targetEntity: { name: 'person', id: m.person.id }, - buttonText: m.person|chill_entity_render_string, - isDead: m.person.deathdate is not null + targetEntity: { name: 'person', id: person.id }, + buttonText: person|chill_entity_render_string, + isDead: person.deathdate is not null } %} {%- endfor -%} {% endif %} diff --git a/src/Bundle/ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php b/src/Bundle/ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php index 7cf8af3e5..b7b805be8 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php @@ -135,4 +135,51 @@ final class HouseholdTest extends TestCase $this->assertEquals(new DateTimeImmutable('2021-12-31'), $second->getStartDate()); $this->assertEquals(new DateTimeImmutable('2021-12-31'), $inside->getEndDate()); } + + public function testHouseholdGetPersonsDuringMembership() + { + $household = new Household(); + $person1 = new Person(); + $person2 = new Person(); + $personOut = new Person(); + + $household->addMember( + $member1 = (new HouseholdMember()) + ->setStartDate(new DateTimeImmutable('2021-01-01')) + ->setEndDate(new DateTimeImmutable('2021-12-01')) + ->setPerson($person1) + ); + + $household->addMember( + $member2a = (new HouseholdMember()) + ->setStartDate(new DateTimeImmutable('2021-01-01')) + ->setEndDate(new DateTimeImmutable('2021-05-01')) + ->setPerson($person2) + ); + + $household->addMember( + $member2b = (new HouseholdMember()) + ->setStartDate(new DateTimeImmutable('2021-11-01')) + ->setEndDate(new DateTimeImmutable('2022-06-01')) + ->setPerson($person2) + ); + + $household->addMember( + $memberOut = (new HouseholdMember()) + ->setStartDate(new DateTimeImmutable('2019-01-01')) + ->setEndDate(new DateTimeImmutable('2019-12-01')) + ->setPerson($personOut) + ); + + $this->assertCount(0, $household->getPersonsDuringMembership($memberOut)); + + $this->assertCount(1, $household->getPersonsDuringMembership($member1)); + $this->assertContains($person2, $household->getPersonsDuringMembership($member1)); + + $this->assertCount(1, $household->getPersonsDuringMembership($member2a)); + $this->assertContains($person1, $household->getPersonsDuringMembership($member2a)); + + $this->assertCount(1, $household->getPersonsDuringMembership($member2b)); + $this->assertContains($person1, $household->getPersonsDuringMembership($member2b)); + } }