From 3d6745e535cd0e8708f3dde4f7df66c99e3529e4 Mon Sep 17 00:00:00 2001 From: Julie Lenaerts Date: Mon, 28 Mar 2022 12:00:13 +0200 Subject: [PATCH 01/29] display of interlocuteurs changed to flex-table to prevent cut-off of information --- CHANGELOG.md | 1 + .../public/vuejs/AccompanyingCourse/components/Resources.vue | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56b958bb6..739a4a1f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -77,6 +77,7 @@ and this project adheres to * [parcours] Create document buttons made sticky (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/532) * [person] Trailing guillemet removed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/530) * [notification] Display of social action within workflow notification set to display block (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/537) +* [parcours] Display of interlocuteurs changed to flex-table in parcours edit page to prevent cut-off of information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/535) ## Test releases diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Resources.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Resources.vue index e9b9695ab..7287437a3 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Resources.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Resources.vue @@ -10,7 +10,7 @@ -
+
Date: Mon, 28 Mar 2022 14:30:49 +0200 Subject: [PATCH 02/29] activity: add spacing between buttons + better alignment --- .../Resources/public/page/edit_activity/index.scss | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Bundle/ChillActivityBundle/Resources/public/page/edit_activity/index.scss b/src/Bundle/ChillActivityBundle/Resources/public/page/edit_activity/index.scss index 16e66eadb..5d1ccf976 100644 --- a/src/Bundle/ChillActivityBundle/Resources/public/page/edit_activity/index.scss +++ b/src/Bundle/ChillActivityBundle/Resources/public/page/edit_activity/index.scss @@ -4,6 +4,13 @@ div.chill-dropzone__below-zone { } } +ul[data-collection-name="documents"] { + button.remove-entry { + margin: 0.5rem 0!important; + } +} + + // do it in js does not work // document.addEventListener('DOMContentLoaded', e => { // const dropzoneBelow = document.querySelectorAll('div.chill-dropzone__below-zone'); From 10fcd4f7329d543b65dc53b3468cffd3f623de92 Mon Sep 17 00:00:00 2001 From: nobohan Date: Mon, 28 Mar 2022 15:12:16 +0200 Subject: [PATCH 03/29] accompanying course: evaluation documents: align buttons --- .../components/FormEvaluation.vue | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/components/FormEvaluation.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/components/FormEvaluation.vue index eff62bbbb..5f4fdedec 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/components/FormEvaluation.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/components/FormEvaluation.vue @@ -138,12 +138,12 @@ @go-to-generate-document="submitBeforeGenerate" >
- -
    + +
    • From df24d085ca9c4ca43c663d0f9a7858195d1240af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 11:53:06 +0200 Subject: [PATCH 04/29] Household members editor: leave household when repositionning to same household, not sharing household --- .../Household/MembersEditor.php | 6 +++ .../Tests/Household/MembersEditorTest.php | 41 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/Bundle/ChillPersonBundle/Household/MembersEditor.php b/src/Bundle/ChillPersonBundle/Household/MembersEditor.php index e327efbab..5ecf1c0bd 100644 --- a/src/Bundle/ChillPersonBundle/Household/MembersEditor.php +++ b/src/Bundle/ChillPersonBundle/Household/MembersEditor.php @@ -98,6 +98,12 @@ class MembersEditor $participation->setEndDate($membership->getStartDate()); } } + } else { + // if a members is moved to the same household than the one he belongs to, + // we should make it leave the household + if ($person->getCurrentHousehold($date) === $this->household) { + $this->leaveMovement($date, $person); + } } $this->membershipsAffected[] = $membership; diff --git a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php index 65199dabf..f1a622f5f 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\PersonBundle\Tests\Household; use Chill\PersonBundle\Entity\Household\Household; +use Chill\PersonBundle\Entity\Household\HouseholdMember; use Chill\PersonBundle\Entity\Household\Position; use Chill\PersonBundle\Entity\Person; use Chill\PersonBundle\Event\Person\PersonAddressMoveEvent; @@ -39,6 +40,46 @@ final class MembersEditorTest extends TestCase $this->factory = $this->buildMembersEditorFactory(); } + /** + * We test here a move for a person:. + * + * * which was in a position "sharing household" + * * which move to the same household, in a position "not sharing household" + */ + public function testMoveFromSharingHouseholdToNotSharingHousehouldInSamehousehold() + { + $person = new Person(); + $household = new Household(); + $positionSharing = (new Position())->setShareHousehold(true); + $positionNotSharing = (new Position())->setShareHousehold(false); + $factory = $this->buildMembersEditorFactory(); + $editor = $factory->createEditor($household); + + // we add the member to the household + $editor->addMovement(new DateTimeImmutable('1 month ago'), $person, $positionSharing); + + // double check that the person is in the household + $this->assertContains($person, $household->getCurrentPersons()); + + // we do the move to the position not sharing household + $editor = $factory->createEditor($household); + $editor->addMovement(new DateTimeImmutable('yesterday'), $person, $positionNotSharing); + + $sharings = $household->getCurrentMembers()->filter(static function (HouseholdMember $m) { + return $m->getShareHousehold(); + }); + $notSharing = $household->getCurrentMembers()->filter(static function (HouseholdMember $m) { + return !$m->getShareHousehold(); + }); + + $this->assertCount(1, $notSharing); + $this->assertCount(0, $sharings); + + $getPerson = static function (HouseholdMember $m) { return $m->getPerson(); }; + + $this->assertContains($person, $notSharing->map($getPerson)); + } + public function testMovePersonWithoutSharedHousehold() { $person = new Person(); From e433b6a42be89bf0b019055281f5296e3de934f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 11:57:43 +0200 Subject: [PATCH 05/29] Do not dispatch PersonMoveEvent if moving to a position not sharing household --- .../Household/MembersEditor.php | 9 +++---- .../Tests/Household/MembersEditorTest.php | 24 ++++++++++++++++++- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Household/MembersEditor.php b/src/Bundle/ChillPersonBundle/Household/MembersEditor.php index 5ecf1c0bd..fd2fcfbb2 100644 --- a/src/Bundle/ChillPersonBundle/Household/MembersEditor.php +++ b/src/Bundle/ChillPersonBundle/Household/MembersEditor.php @@ -61,8 +61,6 @@ class MembersEditor throw new LogicException('You must define a household first'); } - $event = new PersonAddressMoveEvent($person); - $membership = (new HouseholdMember()) ->setStartDate($date) ->setPerson($person) @@ -70,9 +68,13 @@ class MembersEditor ->setHolder($holder) ->setComment($comment); $this->household->addMember($membership); - $event->setNextMembership($membership); if ($position->getShareHousehold()) { + // launch event only if moving to a "share household" position + $event = new PersonAddressMoveEvent($person); + $event->setNextMembership($membership); + $this->events[] = $event; + foreach ($person->getHouseholdParticipationsShareHousehold() as $participation) { if ($participation === $membership) { continue; @@ -108,7 +110,6 @@ class MembersEditor $this->membershipsAffected[] = $membership; $this->persistables[] = $membership; - $this->events[] = $event; return $this; } diff --git a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php index f1a622f5f..84ca9f32e 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php @@ -167,7 +167,7 @@ final class MembersEditorTest extends TestCase $this->assertEquals($date, $membership1->getEndDate()); } - public function testPostMove() + public function testPostMoveToAPositionNotSharingHousehold() { $person = new Person(); $position = (new Position()) @@ -175,6 +175,28 @@ final class MembersEditorTest extends TestCase $household1 = new Household(); $household2 = new Household(); $eventDispatcher = $this->prophesize(EventDispatcherInterface::class); + $eventDispatcher + ->dispatch(Argument::type(PersonAddressMoveEvent::class)) + ->shouldNotBeCalled(); + $factory = $this->buildMembersEditorFactory( + $eventDispatcher->reveal(), + null + ); + $editor = $factory->createEditor($household1); + + $editor->addMovement(new DateTimeImmutable('now'), $person, $position); + + $editor->postMove(); + } + + public function testPostMoveToAPositionSharingHousehold() + { + $person = new Person(); + $position = (new Position()) + ->setShareHousehold(true); + $household1 = new Household(); + $household2 = new Household(); + $eventDispatcher = $this->prophesize(EventDispatcherInterface::class); $eventDispatcher ->dispatch(Argument::type(PersonAddressMoveEvent::class)) ->shouldBeCalled(); From 38e92ee981ee71de479058aab5ef8adb2212a8f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 11:58:17 +0200 Subject: [PATCH 06/29] fix cs --- src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php b/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php index c5ab27440..d4b59ab37 100644 --- a/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php +++ b/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php @@ -109,7 +109,7 @@ class ThirdPartyApiSearch implements SearchApiInterface } $query - ->setSelectPertinence(implode(' + ', $pertinence).' + 1', array_merge( + ->setSelectPertinence(implode(' + ', $pertinence) . ' + 1', array_merge( [], ...$pertinenceArgs )) From 1b567327b7a2f1aa6a918e744b10c63186b0d845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 12:37:18 +0200 Subject: [PATCH 07/29] fix normalisation for phonenumber in person entity --- .../ChillMainBundle/CRUD/Controller/ApiController.php | 6 +++--- .../Serializer/Normalizer/PersonJsonNormalizer.php | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php b/src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php index cfbe811fa..10c530794 100644 --- a/src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php +++ b/src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php @@ -33,11 +33,11 @@ class ApiController extends AbstractCRUDController * Base method for handling api action. * * @param mixed $id - * @param mixed $_format + * @param string $_format * * @return void */ - public function entityApi(Request $request, $id, $_format): Response + public function entityApi(Request $request, $id, ?string $_format = 'json'): Response { switch ($request->getMethod()) { case Request::METHOD_GET: @@ -49,7 +49,7 @@ class ApiController extends AbstractCRUDController return $this->entityPut('_entity', $request, $id, $_format); case Request::METHOD_POST: - return $this->entityPostAction('_entity', $request, $id); + return $this->entityPostAction('_entity', $request, $id, $_format); case Request::METHOD_DELETE: return $this->entityDelete('_entity', $request, $id, $_format); diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php index ae95c9321..41c06e9ec 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php @@ -208,8 +208,8 @@ class PersonJsonNormalizer implements DenormalizerAwareInterface, NormalizerAwar 'birthdate' => $this->normalizer->normalize($person->getBirthdate(), $format, $context), 'deathdate' => $this->normalizer->normalize($person->getDeathdate(), $format, $context), 'age' => $this->normalizer->normalize($person->getAge(), $format, $context), - 'phonenumber' => $this->normalizer->normalize($person->getPhonenumber()), - 'mobilenumber' => $this->normalizer->normalize($person->getMobilenumber()), + 'phonenumber' => $this->normalizer->normalize($person->getPhonenumber(), $format, $context), + 'mobilenumber' => $this->normalizer->normalize($person->getMobilenumber(), $format, $context), 'email' => $person->getEmail(), 'gender' => $person->getGender(), ]; From 3b083c31e7463a6432c12356cb906d434ba67737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 12:57:16 +0200 Subject: [PATCH 08/29] add tests for moving to not share position in another household --- .../Tests/Household/MembersEditorTest.php | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php index 84ca9f32e..a5d34b1dc 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php @@ -40,6 +40,48 @@ final class MembersEditorTest extends TestCase $this->factory = $this->buildMembersEditorFactory(); } + /** + * We test here a move for a person:. + * + * * which was in a position "sharing household" + * * which move to the another household, in a position "not sharing household" + * + * The person should stays in the two households + */ + public function testMoveFromSharingHouseholdToNotSharingHousehouldInDifferentHousehold() + { + $person = new Person(); + $household = new Household(); + $positionSharing = (new Position())->setShareHousehold(true); + $positionNotSharing = (new Position())->setShareHousehold(false); + $factory = $this->buildMembersEditorFactory(); + $editor = $factory->createEditor($household); + + // we add the member to the household + $editor->addMovement(new DateTimeImmutable('1 month ago'), $person, $positionSharing); + + // double check that the person is in the household + $this->assertContains($person, $household->getCurrentPersons()); + + // we do the move to the position not sharing household + $editor = $factory->createEditor($household2 = new Household()); + $editor->addMovement(new DateTimeImmutable('yesterday'), $person, $positionNotSharing); + + $sharings = $household->getCurrentMembers()->filter(static function (HouseholdMember $m) { + return $m->getShareHousehold(); + }); + $notSharing = $household2->getCurrentMembers()->filter(static function (HouseholdMember $m) { + return !$m->getShareHousehold(); + }); + + $this->assertCount(1, $notSharing); + $this->assertCount(1, $sharings); + + $getPerson = static function (HouseholdMember $m) { return $m->getPerson(); }; + + $this->assertContains($person, $notSharing->map($getPerson)); + } + /** * We test here a move for a person:. * From 9812710cd0fde9fce782f845e8735d67e58310e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 15:08:34 +0200 Subject: [PATCH 09/29] do not show duplicate menu entry temporarily --- src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php b/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php index 80da956c4..ed54e948c 100644 --- a/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php +++ b/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php @@ -88,7 +88,7 @@ class PersonMenuBuilder implements LocalMenuBuilderInterface ->setExtras([ 'order' => 99999, ]); - + /* $menu->addChild($this->translator->trans('Person duplicate'), [ 'route' => 'chill_person_duplicate_view', 'routeParameters' => [ @@ -98,7 +98,7 @@ class PersonMenuBuilder implements LocalMenuBuilderInterface ->setExtras([ 'order' => 99999, ]); - + */ if ( 'visible' === $this->showAccompanyingPeriod && $this->security->isGranted(AccompanyingPeriodVoter::SEE, $parameters['person']) From dae9d485748dd6b11477eb82f8b8c70af9e8e147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 15:26:45 +0200 Subject: [PATCH 10/29] really do not show thirdparty which are not active --- .../Repository/ThirdPartyACLAwareRepository.php | 6 ++++++ .../ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Bundle/ChillThirdPartyBundle/Repository/ThirdPartyACLAwareRepository.php b/src/Bundle/ChillThirdPartyBundle/Repository/ThirdPartyACLAwareRepository.php index 2a57a2f55..f67417767 100644 --- a/src/Bundle/ChillThirdPartyBundle/Repository/ThirdPartyACLAwareRepository.php +++ b/src/Bundle/ChillThirdPartyBundle/Repository/ThirdPartyACLAwareRepository.php @@ -34,6 +34,12 @@ final class ThirdPartyACLAwareRepository implements ThirdPartyACLAwareRepository { $qb = $this->thirdPartyRepository->createQueryBuilder('tp'); + $qb->leftJoin('tp.parent', 'parent') + ->andWhere($qb->expr()->andX( + 'tp.active = \'TRUE\'', + $qb->expr()->orX($qb->expr()->isNull('parent'), 'parent.active = \'TRUE\'') + )); + if (null !== $filterString) { $qb->andWhere($qb->expr()->like('tp.canonicalized', 'LOWER(UNACCENT(:filterString))')) ->setParameter('filterString', '%' . $filterString . '%'); diff --git a/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php b/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php index d4b59ab37..3c03b7f8a 100644 --- a/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php +++ b/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php @@ -113,7 +113,8 @@ class ThirdPartyApiSearch implements SearchApiInterface [], ...$pertinenceArgs )) - ->andWhereClause(implode(' AND ', $wheres), array_merge( + ->andWhereClause(implode(' AND ', $wheres) + .' AND tparty.active IS TRUE and (parent.active IS TRUE OR parent IS NULL)', array_merge( [], ...$whereArgs )); From 36b1f05524a327513a2843bdbd87dd9824f3a645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 16:42:57 +0200 Subject: [PATCH 11/29] do not launch PersonMoveEvent when moving to the same household --- .../ChillPersonBundle/Entity/Person.php | 9 +++ .../Household/MembersEditor.php | 19 +++++- .../Tests/Household/MembersEditorTest.php | 60 ++++++++++++++++++- 3 files changed, 84 insertions(+), 4 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Entity/Person.php b/src/Bundle/ChillPersonBundle/Entity/Person.php index 880c2bd11..59570f956 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person.php @@ -328,6 +328,8 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI * targetEntity=HouseholdMember::class, * mappedBy="person" * ) + * + * @var Collection|HouseholdMember[] */ private Collection $householdParticipations; @@ -1117,6 +1119,9 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI return $this->householdAddresses; } + /** + * @return Collection|HouseholdMember[] + */ public function getHouseholdParticipations(): Collection { return $this->householdParticipations; @@ -1126,6 +1131,8 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI * Get participation where the person does not share the household. * * Order by startDate, desc + * + * @return HouseholdMember[] */ public function getHouseholdParticipationsNotShareHousehold(): Collection { @@ -1146,6 +1153,8 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI * Get participation where the person does share the household. * * Order by startDate, desc + * + * @return Collection|HouseholdMember[] */ public function getHouseholdParticipationsShareHousehold(): Collection { diff --git a/src/Bundle/ChillPersonBundle/Household/MembersEditor.php b/src/Bundle/ChillPersonBundle/Household/MembersEditor.php index fd2fcfbb2..812307a14 100644 --- a/src/Bundle/ChillPersonBundle/Household/MembersEditor.php +++ b/src/Bundle/ChillPersonBundle/Household/MembersEditor.php @@ -70,10 +70,12 @@ class MembersEditor $this->household->addMember($membership); if ($position->getShareHousehold()) { - // launch event only if moving to a "share household" position + // launch event only if moving to a "share household" position, + // and if the destination household is different than the previous one $event = new PersonAddressMoveEvent($person); $event->setNextMembership($membership); - $this->events[] = $event; + + $counter = 0; foreach ($person->getHouseholdParticipationsShareHousehold() as $participation) { if ($participation === $membership) { @@ -84,14 +86,25 @@ class MembersEditor continue; } + ++$counter; + if ($participation->getEndDate() === null || $participation->getEndDate() > $date) { - $event->setPreviousMembership($participation); $participation->setEndDate($date); $this->membershipsAffected[] = $participation; $this->oldMembershipsHashes[] = spl_object_hash($participation); + + if ($participation->getHousehold() !== $this->household) { + $event->setPreviousMembership($participation); + $this->events[] = $event; + } } } + // send also the event if there was no participation before + if (0 === $counter) { + $this->events[] = $event; + } + foreach ($person->getHouseholdParticipationsNotShareHousehold() as $participation) { if ($participation->getHousehold() === $this->household && $participation->getEndDate() === null || $participation->getEndDate() > $membership->getStartDate() diff --git a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php index a5d34b1dc..69603031a 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php @@ -231,13 +231,71 @@ final class MembersEditorTest extends TestCase $editor->postMove(); } - public function testPostMoveToAPositionSharingHousehold() + public function testPostMoveToAPositionSharingHouseholdAndSameHousehold() + { + $person = new Person(); + $position = (new Position()) + ->setShareHousehold(true); + $position2 = (new Position()) + ->setShareHousehold(true); + $household1 = new Household(); + + // set into the first household + $editor = $this->buildMembersEditorFactory() + ->createEditor($household1); + $editor->addMovement(new DateTimeImmutable('1 year ago'), $person, $position); + + // prepare for next move + $eventDispatcher = $this->prophesize(EventDispatcherInterface::class); + $eventDispatcher + ->dispatch(Argument::type(PersonAddressMoveEvent::class)) + ->shouldNotBeCalled(); + $factory = $this->buildMembersEditorFactory( + $eventDispatcher->reveal(), + null + ); + $editor = $factory->createEditor($household1); + + $editor->addMovement(new DateTimeImmutable('now'), $person, $position2); + + $editor->postMove(); + } + + public function testPostMoveToAPositionSharingHouseholdFromDifferentHousehold() { $person = new Person(); $position = (new Position()) ->setShareHousehold(true); $household1 = new Household(); $household2 = new Household(); + + // set into the first household + $editor = $this->buildMembersEditorFactory() + ->createEditor($household1); + $editor->addMovement(new DateTimeImmutable('1 year ago'), $person, $position); + + // perform now the movement + $eventDispatcher = $this->prophesize(EventDispatcherInterface::class); + $eventDispatcher + ->dispatch(Argument::type(PersonAddressMoveEvent::class)) + ->shouldBeCalled(); + $factory = $this->buildMembersEditorFactory( + $eventDispatcher->reveal(), + null + ); + $editor = $factory->createEditor($household2); + + $editor->addMovement(new DateTimeImmutable('now'), $person, $position); + + $editor->postMove(); + } + + public function testPostMoveToAPositionSharingHouseholdFromNoHousehold() + { + $person = new Person(); + $position = (new Position()) + ->setShareHousehold(true); + $household1 = new Household(); $eventDispatcher = $this->prophesize(EventDispatcherInterface::class); $eventDispatcher ->dispatch(Argument::type(PersonAddressMoveEvent::class)) From c477996acf485cadf0238677752c27e1eb618e4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 16:43:16 +0200 Subject: [PATCH 12/29] fix cs --- src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php | 2 +- .../ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php b/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php index ed54e948c..103fd2b88 100644 --- a/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php +++ b/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php @@ -98,7 +98,7 @@ class PersonMenuBuilder implements LocalMenuBuilderInterface ->setExtras([ 'order' => 99999, ]); - */ + */ if ( 'visible' === $this->showAccompanyingPeriod && $this->security->isGranted(AccompanyingPeriodVoter::SEE, $parameters['person']) diff --git a/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php b/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php index 3c03b7f8a..f43a6eda2 100644 --- a/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php +++ b/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php @@ -114,10 +114,10 @@ class ThirdPartyApiSearch implements SearchApiInterface ...$pertinenceArgs )) ->andWhereClause(implode(' AND ', $wheres) - .' AND tparty.active IS TRUE and (parent.active IS TRUE OR parent IS NULL)', array_merge( - [], - ...$whereArgs - )); + . ' AND tparty.active IS TRUE and (parent.active IS TRUE OR parent IS NULL)', array_merge( + [], + ...$whereArgs + )); return $query; } From 83dfe530e912a23628516ae3816287ce9953d812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 17:00:07 +0200 Subject: [PATCH 13/29] household editor: handle case when the person is repositionned in the same household, and the person is already in a position "without household" --- .../Household/MembersEditor.php | 14 ++++++++ .../Tests/Household/MembersEditorTest.php | 34 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/Bundle/ChillPersonBundle/Household/MembersEditor.php b/src/Bundle/ChillPersonBundle/Household/MembersEditor.php index 812307a14..1c7cbb538 100644 --- a/src/Bundle/ChillPersonBundle/Household/MembersEditor.php +++ b/src/Bundle/ChillPersonBundle/Household/MembersEditor.php @@ -119,6 +119,20 @@ class MembersEditor if ($person->getCurrentHousehold($date) === $this->household) { $this->leaveMovement($date, $person); } + + // if there are multiple belongings not sharing household, close the others + foreach ($person->getHouseholdParticipationsNotShareHousehold() as $participation) { + if ($participation === $membership) { + continue; + } + + if ($participation->getHousehold() === $this->household + && ($participation->getEndDate() === null || $participation->getEndDate() > $membership->getStartDate()) + && $participation->getStartDate() <= $membership->getStartDate() + ) { + $participation->setEndDate($membership->getStartDate()); + } + } } $this->membershipsAffected[] = $membership; diff --git a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php index 69603031a..77eeed387 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php @@ -40,6 +40,40 @@ final class MembersEditorTest extends TestCase $this->factory = $this->buildMembersEditorFactory(); } + public function testAddingParticipationNotSharingHouseholdCloseTheOldOnes() + { + $person = new Person(); + $position = (new Position())->setShareHousehold(false); + $household = new Household(); + + // set a first time the person in position + $factory = $this->buildMembersEditorFactory(); + $editor = $factory->createEditor($household); + + $editor->addMovement($aMonthAgo = new DateTimeImmutable('1 month ago'), $person, $position); + + // set a second time the person in position + $factory = $this->buildMembersEditorFactory(); + $editor = $factory->createEditor($household); + + $editor->addMovement($yesterday = new DateTimeImmutable('yesterday'), $person, $position); + + $this->assertCount(2, $person->getHouseholdParticipationsNotShareHousehold()); + + $startDates = []; + $endDates = []; + + foreach ($person->getHouseholdParticipationsNotShareHousehold() as $participation) { + $startDates[] = $participation->getStartDate(); + $endDates[] = $participation->getEndDate(); + } + + $this->assertContains($aMonthAgo, $startDates); + $this->assertContains($yesterday, $startDates); + $this->assertContains($yesterday, $endDates); + $this->assertContains(null, $endDates); + } + /** * We test here a move for a person:. * From bc43d8bae56e2cf2bf3b4c3ed4bcf0647f4ac2bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 21:01:17 +0200 Subject: [PATCH 14/29] force type on Person entity --- src/Bundle/ChillPersonBundle/Entity/Person.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Entity/Person.php b/src/Bundle/ChillPersonBundle/Entity/Person.php index 59570f956..4680581cd 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person.php @@ -284,7 +284,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI * max=255, * ) */ - private $firstName; + private string $firstName = ''; /** * fullname canonical. Read-only field, which is calculated by @@ -294,7 +294,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI * * @ORM\Column(type="text", nullable=true) */ - private $fullnameCanonical; + private string $fullnameCanonical = ''; /** * The person's gender. @@ -353,7 +353,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI * max=255, * ) */ - private $lastName; + private string $lastName = ''; /** * The marital status of the person. @@ -1583,9 +1583,9 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI return $this; } - public function setFirstName(string $firstName): self + public function setFirstName(?string $firstName): self { - $this->firstName = $firstName; + $this->firstName = (string) $firstName; return $this; } @@ -1611,9 +1611,9 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI return $this; } - public function setLastName(string $lastName): self + public function setLastName(?string $lastName): self { - $this->lastName = $lastName; + $this->lastName = (string) $lastName; return $this; } From eb2bad0f4705245e38b2bfefb36c0d5fe2a010e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 21:35:02 +0200 Subject: [PATCH 15/29] docgen normalization budget: fix budget when person is null --- .../Service/Summary/SummaryBudget.php | 51 +++++++------- .../Summary/SummaryBudgetInterface.php | 25 +++++++ .../ChillPersonBundle/Entity/Person.php | 6 -- .../Normalizer/PersonDocGenNormalizer.php | 14 +++- .../Normalizer/PersonDocGenNormalizerTest.php | 66 +++++++++++++++---- 5 files changed, 120 insertions(+), 42 deletions(-) create mode 100644 src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudgetInterface.php diff --git a/src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudget.php b/src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudget.php index 08a0fec77..8e46feb7b 100644 --- a/src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudget.php +++ b/src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudget.php @@ -23,7 +23,7 @@ use function count; /** * Helps to find a summary of the budget: the sum of resources and charges. */ -class SummaryBudget +class SummaryBudget implements SummaryBudgetInterface { private const QUERY_CHARGE_BY_HOUSEHOLD = 'select SUM(amount) AS sum, type FROM chill_budget.charge WHERE (person_id IN (_ids_) OR household_id = ?) AND NOW() BETWEEN startdate AND COALESCE(enddate, \'infinity\'::timestamp) GROUP BY type'; @@ -52,26 +52,6 @@ class SummaryBudget $this->translatableStringHelper = $translatableStringHelper; } - public function getEmptyChargeArray(): array - { - $keys = $this->configRepository->getChargesKeys(); - $labels = $this->chargeLabels; - - return array_combine($keys, array_map(function ($i) use ($labels) { - return ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($labels[$i])]; - }, $keys)); - } - - public function getEmptyResourceArray(): array - { - $keys = $this->configRepository->getResourcesKeys(); - $labels = $this->resourcesLabels; - - return array_combine($keys, array_map(function ($i) use ($labels) { - return ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($labels[$i])]; - }, $keys)); - } - public function getSummaryForHousehold(?Household $household): array { if (null === $household) { @@ -101,8 +81,15 @@ class SummaryBudget ]; } - public function getSummaryForPerson(Person $person): array + public function getSummaryForPerson(?Person $person): array { + if (null === $person) { + return [ + 'resources' => $this->getEmptyResourceArray(), + 'charges' => $this->getEmptyChargeArray(), + ]; + } + $rsm = $this->buildRsm(); $resources = $this->em->createNativeQuery(self::QUERY_RESOURCE_BY_PERSON, $rsm) @@ -128,6 +115,26 @@ class SummaryBudget return $rsm; } + private function getEmptyChargeArray(): array + { + $keys = $this->configRepository->getChargesKeys(); + $labels = $this->chargeLabels; + + return array_combine($keys, array_map(function ($i) use ($labels) { + return ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($labels[$i])]; + }, $keys)); + } + + private function getEmptyResourceArray(): array + { + $keys = $this->configRepository->getResourcesKeys(); + $labels = $this->resourcesLabels; + + return array_combine($keys, array_map(function ($i) use ($labels) { + return ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($labels[$i])]; + }, $keys)); + } + private function rowToArray(array $rows, string $kind): array { switch ($kind) { diff --git a/src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudgetInterface.php b/src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudgetInterface.php new file mode 100644 index 000000000..528c4626e --- /dev/null +++ b/src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudgetInterface.php @@ -0,0 +1,25 @@ +personRender = $personRender; $this->relationshipRepository = $relationshipRepository; @@ -214,6 +214,14 @@ class PersonDocGenNormalizer implements $data['relations'] = []; } + if ($context['docgen:person:with-budget'] ?? false) { + $data['budget']['person'] = $this->summaryBudget->getSummaryForPerson(null); + + if ($context['docgen:person:with-household'] ?? false) { + $data['budget']['household'] = $this->summaryBudget->getSummaryForHousehold(null); + } + } + return $data; } } diff --git a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php index c19533e08..deef94525 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Serializer\Normalizer; +use Chill\BudgetBundle\Service\Summary\SummaryBudgetInterface; use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\PersonBundle\Entity\Household\Household; @@ -72,6 +73,17 @@ final class PersonDocGenNormalizerTest extends KernelTestCase $this->normalizer = self::$container->get(NormalizerInterface::class); } + public function dataGeneratorNormalizationNullOrNotNullHaveSameKeys(): iterable + { + yield [['docgen:expects' => Person::class, 'groups' => ['docgen:read']]]; + + yield [['docgen:expects' => Person::class, 'groups' => ['docgen:read'], 'docgen:person:with-household' => true]]; + + yield [['docgen:expects' => Person::class, 'groups' => ['docgen:read'], 'docgen:person:with-relations' => true]]; + + yield [['docgen:expects' => Person::class, 'groups' => ['docgen:read'], 'docgen:person:with-budget' => true]]; + } + public function generateData() { $person = new Person(); @@ -90,12 +102,16 @@ final class PersonDocGenNormalizerTest extends KernelTestCase yield [null, self::BLANK, 'normalization for a null person']; } - public function testNormalizationNullOrNotNullHaveSameKeys() + /** + * @dataProvider dataGeneratorNormalizationNullOrNotNullHaveSameKeys + * + * @param mixed $context + */ + public function testNormalizationNullOrNotNullHaveSameKeys($context) { - $this->markTestSkipped(); $period = new Person(); - $notNullData = $this->buildPersonNormalizer()->normalize($period, 'docgen', ['docgen:expects' => Person::class]); - $nullData = $this->buildPersonNormalizer()->normalize(null, 'docgen', ['docgen:expects' => Person::class]); + $notNullData = $this->buildPersonNormalizer()->normalize($period, 'docgen', $context); + $nullData = $this->buildPersonNormalizer()->normalize(null, 'docgen', $context); $this->assertEqualsCanonicalizing( array_keys($notNullData), @@ -131,7 +147,6 @@ final class PersonDocGenNormalizerTest extends KernelTestCase public function testNormalizePersonWithHousehold() { - $this->markTestSkipped(); $household = new Household(); $person = new Person(); $person @@ -172,7 +187,6 @@ final class PersonDocGenNormalizerTest extends KernelTestCase public function testNormalizePersonWithRelationships() { - $this->markTestSkipped(); $person = (new Person())->setFirstName('Renaud')->setLastName('megane'); $father = (new Person())->setFirstName('ClĂ©ment')->setLastName('megane'); $mother = (new Person())->setFirstName('Mireille')->setLastName('Mathieu'); @@ -235,13 +249,25 @@ final class PersonDocGenNormalizerTest extends KernelTestCase ?RelationshipRepository $relationshipRepository = null, ?TranslatorInterface $translator = null, ?TranslatableStringHelper $translatableStringHelper = null, - ?NormalizerInterface $normalizer = null + ?NormalizerInterface $normalizer = null, + ?SummaryBudgetInterface $summaryBudget = null ): PersonDocGenNormalizer { + if (null === $summaryBudget) { + $summaryBudget = $this->prophesize(SummaryBudgetInterface::class); + $summaryBudget->getSummaryForHousehold(Argument::any())->willReturn( + ['resources' => [], 'charges' => []] + ); + $summaryBudget->getSummaryForPerson(Argument::any())->willReturn( + ['resources' => [], 'charges' => []] + ); + } + $personDocGenNormalizer = new PersonDocGenNormalizer( $personRender ?? self::$container->get(PersonRender::class), $relationshipRepository ?? self::$container->get(RelationshipRepository::class), $translator ?? self::$container->get(TranslatorInterface::class), - $translatableStringHelper ?? self::$container->get(TranslatableStringHelperInterface::class) + $translatableStringHelper ?? self::$container->get(TranslatableStringHelperInterface::class), + $summaryBudget->reveal(), ); if (null === $normalizer) { @@ -259,13 +285,31 @@ final class PersonDocGenNormalizerTest extends KernelTestCase ?PersonRender $personRender = null, ?RelationshipRepository $relationshipRepository = null, ?TranslatorInterface $translator = null, - ?TranslatableStringHelper $translatableStringHelper = null + ?TranslatableStringHelper $translatableStringHelper = null, + ?SummaryBudgetInterface $summaryBudget = null ): PersonDocGenNormalizer { + if (null === $relationshipRepository) { + $relationshipRepository = $this->prophesize(RelationshipRepository::class); + $relationshipRepository->findByPerson(Argument::type(Person::class))->willReturn([]); + $relationshipRepository = $relationshipRepository->reveal(); + } + + if (null === $summaryBudget) { + $summaryBudget = $this->prophesize(SummaryBudgetInterface::class); + $summaryBudget->getSummaryForHousehold(Argument::any())->willReturn( + ['resources' => [], 'charges' => []] + ); + $summaryBudget->getSummaryForPerson(Argument::any())->willReturn( + ['resources' => [], 'charges' => []] + ); + } + $normalizer = new PersonDocGenNormalizer( $personRender ?? self::$container->get(PersonRender::class), - $relationshipRepository ?? self::$container->get(RelationshipRepository::class), + $relationshipRepository, $translator ?? self::$container->get(TranslatorInterface::class), - $translatableStringHelper ?? self::$container->get(TranslatableStringHelperInterface::class) + $translatableStringHelper ?? self::$container->get(TranslatableStringHelperInterface::class), + $summaryBudget->reveal() ); $normalizerManager = $this->prophesize(NormalizerInterface::class); $normalizerManager->supportsNormalization(Argument::any(), 'docgen', Argument::any())->willReturn(true); From ae10a8bd1c309edbe64a3ad2c64325a0a35ae6b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 21:51:39 +0200 Subject: [PATCH 16/29] fix post action on api controller: too many argument --- src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php b/src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php index 10c530794..a780af78a 100644 --- a/src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php +++ b/src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php @@ -49,7 +49,7 @@ class ApiController extends AbstractCRUDController return $this->entityPut('_entity', $request, $id, $_format); case Request::METHOD_POST: - return $this->entityPostAction('_entity', $request, $id, $_format); + return $this->entityPostAction('_entity', $request, $id); case Request::METHOD_DELETE: return $this->entityDelete('_entity', $request, $id, $_format); From 63cdc97c47d561926cd487923d91052131551e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 21:52:43 +0200 Subject: [PATCH 17/29] fix phpstan errors on ThirdPartyRender --- phpstan-types.neon | 5 ----- src/Bundle/ChillPersonBundle/Form/PersonResourceType.php | 4 ++++ .../Templating/Entity/ThirdPartyRender.php | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/phpstan-types.neon b/phpstan-types.neon index 9671c05a5..d43fd8944 100644 --- a/phpstan-types.neon +++ b/phpstan-types.neon @@ -460,8 +460,3 @@ parameters: count: 1 path: src/Bundle/ChillThirdPartyBundle/Search/ThirdPartySearch.php - - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" - count: 1 - path: src/Bundle/ChillThirdPartyBundle/Templating/Entity/ThirdPartyRender.php - diff --git a/src/Bundle/ChillPersonBundle/Form/PersonResourceType.php b/src/Bundle/ChillPersonBundle/Form/PersonResourceType.php index aeab09fea..31af0a649 100644 --- a/src/Bundle/ChillPersonBundle/Form/PersonResourceType.php +++ b/src/Bundle/ChillPersonBundle/Form/PersonResourceType.php @@ -29,8 +29,12 @@ use Symfony\Contracts\Translation\TranslatorInterface; final class PersonResourceType extends AbstractType { + private PersonRenderInterface $personRender; + private ResourceKindRender $resourceKindRender; + private ThirdPartyRender $thirdPartyRender; + private TranslatorInterface $translator; public function __construct(ResourceKindRender $resourceKindRender, PersonRenderInterface $personRender, ThirdPartyRender $thirdPartyRender, TranslatorInterface $translator) diff --git a/src/Bundle/ChillThirdPartyBundle/Templating/Entity/ThirdPartyRender.php b/src/Bundle/ChillThirdPartyBundle/Templating/Entity/ThirdPartyRender.php index cec9dee7d..4fe3da927 100644 --- a/src/Bundle/ChillThirdPartyBundle/Templating/Entity/ThirdPartyRender.php +++ b/src/Bundle/ChillThirdPartyBundle/Templating/Entity/ThirdPartyRender.php @@ -71,13 +71,13 @@ class ThirdPartyRender extends AbstractChillEntityRender $civility = ''; } - if (!empty($entity->getAcronym())) { + if ('' !== (string) $entity->getAcronym()) { $acronym = ' (' . $entity->getAcronym() . ')'; } else { $acronym = ''; } - $firstname = empty($entity->getFirstname()) ? '' : $entity->getFirstname(); + $firstname = ('' === $entity->getFirstname()) ? '' : $entity->getFirstname(); return $civility . $firstname . ' ' . $entity->getName() . $acronym; } From 034a41661229e79f8f9b1c98cbc2ad42a232a7f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 30 Mar 2022 22:02:45 +0200 Subject: [PATCH 18/29] fix test which fails randomly --- .../Tests/Controller/HouseholdApiControllerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php index 08034978e..94a0ac243 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php @@ -65,7 +65,7 @@ final class HouseholdApiControllerTest extends WebTestCase } $reference = $em->createQueryBuilder()->select('ar')->from(AddressReference::class, 'ar') - ->setFirstResult(random_int(0, $nbReference)) + ->setFirstResult(random_int(0, $nbReference - 1)) ->setMaxResults(1) ->getQuery()->getSingleResult(); From dcddf4b3f1d2c678eee24553d4cc0e5adcda298f Mon Sep 17 00:00:00 2001 From: Julie Lenaerts Date: Thu, 31 Mar 2022 10:24:58 +0200 Subject: [PATCH 19/29] trim email --- CHANGELOG.md | 1 + src/Bundle/ChillPersonBundle/Entity/Person.php | 2 ++ src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php | 1 + 3 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56b958bb6..94489398e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -77,6 +77,7 @@ and this project adheres to * [parcours] Create document buttons made sticky (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/532) * [person] Trailing guillemet removed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/530) * [notification] Display of social action within workflow notification set to display block (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/537) +* [onthefly] trim trailing whitespace in email of person and thirdparty (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/542) ## Test releases diff --git a/src/Bundle/ChillPersonBundle/Entity/Person.php b/src/Bundle/ChillPersonBundle/Entity/Person.php index 7bde8a524..de7946ad3 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person.php @@ -1572,6 +1572,8 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI $email = ''; } + $email = trim($email); + $this->email = $email; return $this; diff --git a/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php b/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php index 16260ec97..9c3d6fd7e 100644 --- a/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php +++ b/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php @@ -762,6 +762,7 @@ class ThirdParty implements TrackCreationInterface, TrackUpdateInterface */ public function setEmail($email = null) { + $email = trim($email); $this->email = $email; return $this; From 6ddbb791571732b88b56203f5cc7d624ec9202c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 31 Mar 2022 12:43:16 +0200 Subject: [PATCH 20/29] format phonenumber in third party normalization --- .../Serializer/Normalizer/ThirdPartyNormalizer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bundle/ChillThirdPartyBundle/Serializer/Normalizer/ThirdPartyNormalizer.php b/src/Bundle/ChillThirdPartyBundle/Serializer/Normalizer/ThirdPartyNormalizer.php index 87bfb6995..5eb8895b3 100644 --- a/src/Bundle/ChillThirdPartyBundle/Serializer/Normalizer/ThirdPartyNormalizer.php +++ b/src/Bundle/ChillThirdPartyBundle/Serializer/Normalizer/ThirdPartyNormalizer.php @@ -63,7 +63,7 @@ class ThirdPartyNormalizer implements NormalizerAwareInterface, NormalizerInterf }, $thirdParty->getTypesAndCategories()), 'profession' => $this->normalizer->normalize($thirdParty->getProfession(), $format, $context), 'address' => $this->normalizer->normalize($thirdParty->getAddress(), $format, ['address_rendering' => 'short']), - 'telephone' => $this->normalizer->normalize($thirdParty->getTelephone()), + 'telephone' => $this->normalizer->normalize($thirdParty->getTelephone(), $format, $context), 'email' => $thirdParty->getEmail(), 'isChild' => $thirdParty->isChild(), 'parent' => $this->normalizer->normalize($thirdParty->getParent(), $format, $context), From 51dc255be5f583c8dbc30867561ccc3b0b323ca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 31 Mar 2022 12:45:52 +0200 Subject: [PATCH 21/29] fix phonenumber denormalization when null value is given --- .../Serializer/Normalizer/PhonenumberNormalizer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Bundle/ChillMainBundle/Serializer/Normalizer/PhonenumberNormalizer.php b/src/Bundle/ChillMainBundle/Serializer/Normalizer/PhonenumberNormalizer.php index 7eb323754..f76b1e5c8 100644 --- a/src/Bundle/ChillMainBundle/Serializer/Normalizer/PhonenumberNormalizer.php +++ b/src/Bundle/ChillMainBundle/Serializer/Normalizer/PhonenumberNormalizer.php @@ -32,7 +32,7 @@ class PhonenumberNormalizer implements ContextAwareNormalizerInterface, Denormal } /** - * @param mixed $data + * @param string|null $data * @param mixed $type * @param null|mixed $format * @@ -40,7 +40,7 @@ class PhonenumberNormalizer implements ContextAwareNormalizerInterface, Denormal */ public function denormalize($data, $type, $format = null, array $context = []) { - if ('' === trim($data)) { + if ('' === trim((string) $data)) { return null; } From f47fb17b8d4bd07f2fba604d6ef3e9407f14103e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 31 Mar 2022 12:46:13 +0200 Subject: [PATCH 22/29] fix denormalization of invalid dates --- .../Serializer/Normalizer/DateNormalizer.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Bundle/ChillMainBundle/Serializer/Normalizer/DateNormalizer.php b/src/Bundle/ChillMainBundle/Serializer/Normalizer/DateNormalizer.php index 70958d5a9..81e953267 100644 --- a/src/Bundle/ChillMainBundle/Serializer/Normalizer/DateNormalizer.php +++ b/src/Bundle/ChillMainBundle/Serializer/Normalizer/DateNormalizer.php @@ -44,13 +44,21 @@ class DateNormalizer implements ContextAwareNormalizerInterface, DenormalizerInt switch ($type) { case DateTime::class: - return DateTime::createFromFormat(DateTimeInterface::ISO8601, $data['datetime']); + $result = DateTime::createFromFormat(DateTimeInterface::ISO8601, $data['datetime']); + break; case DateTimeInterface::class: case DateTimeImmutable::class: - return DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, $data['datetime']); + $result = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, $data['datetime']); + break; } + if (false === $result) { + return null; + } + + return $result; + throw new UnexpectedValueException(); } From c7762dd6d27b2239aa0cd73d23ce71877c0cb939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 31 Mar 2022 12:51:53 +0200 Subject: [PATCH 23/29] fix trimming for email in person / thirdparty --- src/Bundle/ChillPersonBundle/Entity/Person.php | 8 +------- src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php | 3 +-- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Entity/Person.php b/src/Bundle/ChillPersonBundle/Entity/Person.php index de7946ad3..ef522f068 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person.php @@ -1568,13 +1568,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI public function setEmail(?string $email): self { - if (null === $email) { - $email = ''; - } - - $email = trim($email); - - $this->email = $email; + $this->email = trim((string) $email); return $this; } diff --git a/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php b/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php index 9c3d6fd7e..f060c4bfb 100644 --- a/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php +++ b/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php @@ -762,8 +762,7 @@ class ThirdParty implements TrackCreationInterface, TrackUpdateInterface */ public function setEmail($email = null) { - $email = trim($email); - $this->email = $email; + $this->email = trim((string) $email); return $this; } From a4ece21f2b5ec4312298af7b56fee67e1e916329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Fri, 1 Apr 2022 15:06:00 +0200 Subject: [PATCH 24/29] in household, force validTo of address to be NULL --- src/Bundle/ChillPersonBundle/Entity/Household/Household.php | 2 ++ .../ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/Bundle/ChillPersonBundle/Entity/Household/Household.php b/src/Bundle/ChillPersonBundle/Entity/Household/Household.php index 2620ed19a..fed9f0af0 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Household/Household.php +++ b/src/Bundle/ChillPersonBundle/Entity/Household/Household.php @@ -514,6 +514,8 @@ class Household if ($iterator->valid()) { $current->setValidTo($iterator->current()->getValidFrom()); + } else { + $current->setValidTo(null); } } } diff --git a/src/Bundle/ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php b/src/Bundle/ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php index 6799f882b..7cf8af3e5 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php @@ -75,6 +75,7 @@ final class HouseholdTest extends TestCase $lastAddress = new Address(); $lastAddress->setValidFrom($yesterday = new DateTime('yesterday')); + $lastAddress->setValidTo(new DateTime('tomorrow')); $household->addAddress($lastAddress); $this->assertNull($lastAddress->getValidTo()); @@ -82,6 +83,7 @@ final class HouseholdTest extends TestCase $previousAddress = new Address(); $previousAddress->setValidFrom($oneMonthAgo = new DateTime('1 month ago')); + $previousAddress->setValidTo(new DateTime('now')); $household->addAddress($previousAddress); $addresses = $household->getAddressesOrdered(); @@ -95,6 +97,7 @@ final class HouseholdTest extends TestCase $futureAddress = new Address(); $futureAddress->setValidFrom($tomorrow = new DateTime('tomorrow')); + $futureAddress->setValidTo(new DateTime('2150-01-01')); $household->addAddress($futureAddress); $addresses = $household->getAddressesOrdered(); From f2744fba43668698607d849a722fc0b91c8b47bd Mon Sep 17 00:00:00 2001 From: nobohan Date: Tue, 5 Apr 2022 22:28:35 +0200 Subject: [PATCH 25/29] notification toggle read: correct js syntax --- .../public/module/notification/toggle_read.js | 23 ++++++++++--------- .../Notification/NotificationReadToggle.vue | 2 +- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/Bundle/ChillMainBundle/Resources/public/module/notification/toggle_read.js b/src/Bundle/ChillMainBundle/Resources/public/module/notification/toggle_read.js index 68b06b76a..6308f2f11 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/module/notification/toggle_read.js +++ b/src/Bundle/ChillMainBundle/Resources/public/module/notification/toggle_read.js @@ -8,30 +8,31 @@ window.addEventListener('DOMContentLoaded', function (e) { document.querySelectorAll('.notification_toggle_read_status') .forEach(function (el, i) { createApp({ - template: '', + template: ` + `, components: { NotificationReadToggle, }, data() { return { - notificationId: +el.dataset.notificationId, + notificationId: el.dataset.notificationId, buttonClass: el.dataset.buttonClass, buttonNoText: 'false' === el.dataset.buttonText, showUrl: el.dataset.showButtonUrl, - isRead: 1 === +el.dataset.notificationCurrentIsRead, + isRead: 1 === el.dataset.notificationCurrentIsRead, container: el.dataset.container } }, computed: { getContainer() { - return document.querySelectorAll('div.' + this.container); + return document.querySelectorAll(`div.${this.container}`); } }, methods: { diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/Notification/NotificationReadToggle.vue b/src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/Notification/NotificationReadToggle.vue index c60124592..f9c60fa29 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/Notification/NotificationReadToggle.vue +++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/Notification/NotificationReadToggle.vue @@ -81,7 +81,7 @@ export default { /// [Option] showUrl is href for show page second button. // When passed, the component return a button-group with 2 buttons. isButtonGroup() { - return !!this.showUrl + return !this.showUrl; } }, methods: { From d6deaeb324ffd7f5e198a5502703c2f79614ecbf Mon Sep 17 00:00:00 2001 From: nobohan Date: Wed, 6 Apr 2022 09:26:14 +0200 Subject: [PATCH 26/29] notification unread: correct class --- .../vuejs/_components/Notification/NotificationReadToggle.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/Notification/NotificationReadToggle.vue b/src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/Notification/NotificationReadToggle.vue index f9c60fa29..892e905b6 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/Notification/NotificationReadToggle.vue +++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/Notification/NotificationReadToggle.vue @@ -81,7 +81,7 @@ export default { /// [Option] showUrl is href for show page second button. // When passed, the component return a button-group with 2 buttons. isButtonGroup() { - return !this.showUrl; + return this.showUrl; } }, methods: { From 88f377778cf0d551dee2cdbe6ade9e6538cc7aae Mon Sep 17 00:00:00 2001 From: nobohan Date: Wed, 6 Apr 2022 09:28:57 +0200 Subject: [PATCH 27/29] upd CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94489398e..6f67e3247 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,9 @@ and this project adheres to ## Unreleased +* [main] notification toggle read: correct js syntax for compilation in production (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/548) + + * [person] Accompanying course evaluation documents: disable the WOPI edit link if mimetype not supported and if no keyInfos (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/585) From 37c04d3f125b2663477dac16168340432293bb25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 6 Apr 2022 12:00:49 +0200 Subject: [PATCH 28/29] update changelog --- CHANGELOG.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 603feecc7..d80038b97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,9 +11,15 @@ and this project adheres to ## Unreleased +* [parcours] Display of interlocuteurs changed to flex-table in parcours edit page to prevent cut-off of information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/535) + +## Test releases + +### continuous release in February and March + +* Creation of PickCivilityType, and implementation in PersonType and ThirdpartyType * [person] Accompanying course evaluation documents: disable the WOPI edit link if mimetype not supported and if no keyInfos (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/585) - * [activity] display error messages above the form in creating a new location (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/481) * [activity] show required field in activity edit/new by an asterix in the vuejs fields (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/494) * [ACL] fix allow to see the course, event if the scope'course does not contains the scope's user @@ -78,9 +84,6 @@ and this project adheres to * [person] Trailing guillemet removed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/530) * [notification] Display of social action within workflow notification set to display block (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/537) * [onthefly] trim trailing whitespace in email of person and thirdparty (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/542) -* [parcours] Display of interlocuteurs changed to flex-table in parcours edit page to prevent cut-off of information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/535) - -## Test releases ### test release 2022-02-21 @@ -108,8 +111,6 @@ and this project adheres to * [bug]: fix confidential toggle of address in thirdpartyrenderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/460) -## Test releases -* Creation of PickCivilityType, and implementation in PersonType and ThirdpartyType ### test release 2022-02-14 From 066afc07a8e09a1f98ea8c5d6b8df9b4ce06ac65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 6 Apr 2022 12:08:44 +0200 Subject: [PATCH 29/29] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d80038b97..0aa10a5c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to * [parcours] Display of interlocuteurs changed to flex-table in parcours edit page to prevent cut-off of information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/535) +* [activity] espace entre les boutons pour supprimer les documents ## Test releases