diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a4f1c152..9e12a54d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,15 @@ and this project adheres to * AddPersons: remove ul-li html tags from AddPersons (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/419) +* [Person/Household list] when listing other simultaneous members of an household, exclude the members on person, not on members (avoid to show two membersship with the same person) + +## Test releases + +### test release 2022-02-21 + +* [notifications] Word 'un' changed to number '1' for notifications in user menu (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/483) +* [documents] 'gabarit' changed to 'modèle' (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/405) +* [person_resources] Menu name and order changed (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/460) * workflow: fix sending notifications * [thirdparty] Extend the thirdparty search to thirdparty children (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/448) * [person]: AddPersons: allow creation of person or thirdparty only (no users) (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/422) @@ -26,8 +35,10 @@ and this project adheres to * [person_resources]: Renderboxes used to display person/thirdparty info (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/465) * [Household]: Add end date in HouseholdMember form for 'enfant hors menage' (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/434) * [homepage_widget]: If no sender then display as 'notification automatique' (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/435) - -## Test releases +* [parcours]: Order social activities and only display most recent three in parcours resumé (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/481) +* [3party]: 3party: redirect to parent when contact (child) is opened in view page +* [parcours / addresses]: launch an event when a person change address (either through changing household or because the household is associated to a new address). If the person is localising a course, the course location go back to a temporarily address. +* Creation of PickCivilityType, and implementation in PersonType and ThirdpartyType ### test release 2022-02-14 diff --git a/phpstan-critical.neon b/phpstan-critical.neon index 632356aa6..262d3012f 100644 --- a/phpstan-critical.neon +++ b/phpstan-critical.neon @@ -25,11 +25,6 @@ parameters: count: 1 path: src/Bundle/ChillActivityBundle/Repository/ActivityACLAwareRepository.php - - - message: "#^Access to an undefined property Chill\\\\PersonBundle\\\\Household\\\\MembersEditorFactory\\:\\:\\$validator\\.$#" - count: 2 - path: src/Bundle/ChillPersonBundle/Household/MembersEditorFactory.php - - message: "#^Variable variables are not allowed\\.$#" count: 4 diff --git a/phpstan-deprecations.neon b/phpstan-deprecations.neon index 7489d4d80..1e80ab775 100644 --- a/phpstan-deprecations.neon +++ b/phpstan-deprecations.neon @@ -105,15 +105,6 @@ parameters: count: 1 path: src/Bundle/ChillActivityBundle/Export/Export/ListActivity.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\ActivityBundle\\\\Export\\\\Export\\\\ListActivity\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillActivityBundle/Export/Export/ListActivity.php - - message: """ @@ -141,15 +132,6 @@ parameters: count: 1 path: src/Bundle/ChillActivityBundle/Export/Export/StatActivityDuration.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\ActivityBundle\\\\Export\\\\Filter\\\\ActivityDateFilter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillActivityBundle/Export/Filter/ActivityDateFilter.php - - message: """ @@ -195,15 +177,6 @@ parameters: count: 1 path: src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\ActivityBundle\\\\Export\\\\Filter\\\\PersonHavingActivityBetweenDateFilter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillActivityBundle/Export/Filter/PersonHavingActivityBetweenDateFilter.php - - message: """ @@ -213,15 +186,6 @@ parameters: count: 1 path: src/Bundle/ChillActivityBundle/Export/Filter/PersonHavingActivityBetweenDateFilter.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\ActivityBundle\\\\Menu\\\\PersonMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillActivityBundle/Menu/PersonMenuBuilder.php - - message: """ @@ -258,15 +222,6 @@ parameters: count: 1 path: src/Bundle/ChillActivityBundle/Timeline/TimelineActivityProvider.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\AsideActivityBundle\\\\Menu\\\\UserMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillAsideActivityBundle/src/Menu/UserMenuBuilder.php - - message: """ @@ -276,15 +231,6 @@ parameters: count: 1 path: src/Bundle/ChillBudgetBundle/Controller/AbstractElementController.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\AMLI\\\\BudgetBundle\\\\Controller\\\\AbstractElementController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillBudgetBundle/Controller/AbstractElementController.php - - message: """ @@ -294,24 +240,6 @@ parameters: count: 1 path: src/Bundle/ChillBudgetBundle/Controller/ElementController.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\AMLI\\\\BudgetBundle\\\\Controller\\\\ElementController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillBudgetBundle/Controller/ElementController.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\AMLI\\\\BudgetBundle\\\\Menu\\\\UserMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillBudgetBundle/Menu/UserMenuBuilder.php - - message: """ @@ -321,15 +249,6 @@ parameters: count: 1 path: src/Bundle/ChillBudgetBundle/Security/Authorization/BudgetElementVoter.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\CalendarBundle\\\\Menu\\\\UserMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillCalendarBundle/Menu/UserMenuBuilder.php - - message: """ @@ -399,15 +318,6 @@ parameters: count: 1 path: src/Bundle/ChillCustomFieldsBundle/Entity/CustomFieldsGroup.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\CustomFieldsBundle\\\\Form\\\\CustomFieldsGroupType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldsGroupType.php - - message: """ @@ -417,15 +327,6 @@ parameters: count: 6 path: src/Bundle/ChillEventBundle/Controller/EventController.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\EventBundle\\\\Controller\\\\EventController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillEventBundle/Controller/EventController.php - - message: """ @@ -444,42 +345,6 @@ parameters: count: 1 path: src/Bundle/ChillEventBundle/Form/Type/PickEventType.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\EventBundle\\\\Form\\\\Type\\\\PickEventType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillEventBundle/Form/Type/PickEventType.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\EventBundle\\\\Form\\\\Type\\\\PickRoleType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillEventBundle/Form/Type/PickRoleType.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\EventBundle\\\\Form\\\\Type\\\\PickStatusType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillEventBundle/Form/Type/PickStatusType.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\EventBundle\\\\Menu\\\\PersonMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillEventBundle/Menu/PersonMenuBuilder.php - - message: """ @@ -489,24 +354,6 @@ parameters: count: 1 path: src/Bundle/ChillEventBundle/Search/EventSearch.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\AMLI\\\\FamilyMembersBundle\\\\Controller\\\\FamilyMemberController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillFamilyMembersBundle/Controller/FamilyMemberController.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\AMLI\\\\FamilyMembersBundle\\\\Menu\\\\UserMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillFamilyMembersBundle/Menu/UserMenuBuilder.php - - message: """ @@ -516,24 +363,6 @@ parameters: count: 1 path: src/Bundle/ChillFamilyMembersBundle/Security/Voter/FamilyMemberVoter.php - - - message: - """ - #^Fetching class constant class of deprecated class Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php - - - - message: - """ - #^Fetching class constant class of deprecated class Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php - - message: """ @@ -543,15 +372,6 @@ parameters: count: 1 path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php - - - message: - """ - #^Return type of method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\CRUDController\\:\\:getTranslator\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php - - message: """ @@ -570,24 +390,6 @@ parameters: count: 1 path: src/Bundle/ChillMainBundle/Command/LoadCountriesCommand.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\MainBundle\\\\Controller\\\\ExportController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/Controller/ExportController.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\MainBundle\\\\Controller\\\\PasswordController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/Controller/PasswordController.php - - message: """ @@ -660,42 +462,6 @@ parameters: count: 1 path: src/Bundle/ChillMainBundle/Export/ExportManager.php - - - message: - """ - #^Parameter \\$translatorInterface of method Chill\\\\MainBundle\\\\Export\\\\Formatter\\\\CSVListFormatter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/Export/Formatter/CSVListFormatter.php - - - - message: - """ - #^Parameter \\$translatorInterface of method Chill\\\\MainBundle\\\\Export\\\\Formatter\\\\CSVPivotedListFormatter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/Export/Formatter/CSVPivotedListFormatter.php - - - - message: - """ - #^Parameter \\$translatorInterface of method Chill\\\\MainBundle\\\\Export\\\\Formatter\\\\SpreadSheetFormatter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php - - - - message: - """ - #^Parameter \\$translatorInterface of method Chill\\\\MainBundle\\\\Export\\\\Formatter\\\\SpreadsheetListFormatter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/Export/Formatter/SpreadsheetListFormatter.php - - message: """ @@ -714,15 +480,6 @@ parameters: count: 1 path: src/Bundle/ChillMainBundle/Form/Event/CustomizeFormEvent.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\MainBundle\\\\Form\\\\Type\\\\PostalCodeType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/Form/Type/PostalCodeType.php - - message: """ @@ -746,38 +503,11 @@ parameters: count: 1 path: src/Bundle/ChillMainBundle/Form/UserType.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\MainBundle\\\\Notification\\\\Mailer\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/Notification/Mailer.php - - message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" count: 2 path: src/Bundle/ChillMainBundle/Repository/NotificationRepository.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\MainBundle\\\\Routing\\\\MenuBuilder\\\\SectionMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/Routing/MenuBuilder/SectionMenuBuilder.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\MainBundle\\\\Routing\\\\MenuComposer\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/Routing/MenuComposer.php - - message: """ @@ -864,15 +594,6 @@ parameters: count: 1 path: src/Bundle/ChillMainBundle/Templating/Events/DelegatedBlockRenderingEvent.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\MainBundle\\\\Validation\\\\Validator\\\\RoleScopeScopePresence\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillMainBundle/Validation/Validator/RoleScopeScopePresence.php - - message: """ @@ -918,33 +639,6 @@ parameters: count: 1 path: src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodController.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Controller\\\\HouseholdController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillPersonBundle/Controller/HouseholdController.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Controller\\\\HouseholdMemberController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Controller\\\\PersonController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillPersonBundle/Controller/PersonController.php - - message: """ @@ -954,15 +648,6 @@ parameters: count: 1 path: src/Bundle/ChillPersonBundle/Controller/PersonDuplicateController.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Controller\\\\PersonDuplicateController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillPersonBundle/Controller/PersonDuplicateController.php - - message: "#^Access to deprecated property \\$proxyAccompanyingPeriodOpenState of class Chill\\\\PersonBundle\\\\Entity\\\\Person\\.$#" count: 2 @@ -977,15 +662,6 @@ parameters: count: 1 path: src/Bundle/ChillPersonBundle/Export/Aggregator/AgeAggregator.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Export\\\\Aggregator\\\\CountryOfBirthAggregator\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillPersonBundle/Export/Aggregator/CountryOfBirthAggregator.php - - message: """ @@ -995,15 +671,6 @@ parameters: count: 1 path: src/Bundle/ChillPersonBundle/Export/Aggregator/CountryOfBirthAggregator.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Export\\\\Aggregator\\\\GenderAggregator\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillPersonBundle/Export/Aggregator/GenderAggregator.php - - message: """ @@ -1013,15 +680,6 @@ parameters: count: 1 path: src/Bundle/ChillPersonBundle/Export/Aggregator/GenderAggregator.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Export\\\\Aggregator\\\\NationalityAggregator\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillPersonBundle/Export/Aggregator/NationalityAggregator.php - - message: """ @@ -1058,15 +716,6 @@ parameters: count: 1 path: src/Bundle/ChillPersonBundle/Export/Export/ListPerson.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Export\\\\Export\\\\ListPerson\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillPersonBundle/Export/Export/ListPerson.php - - message: """ @@ -1094,15 +743,6 @@ parameters: count: 1 path: src/Bundle/ChillPersonBundle/Export/Export/ListPersonDuplicate.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Export\\\\Export\\\\ListPersonDuplicate\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillPersonBundle/Export/Export/ListPersonDuplicate.php - - message: """ @@ -1148,15 +788,6 @@ parameters: count: 1 path: src/Bundle/ChillPersonBundle/Export/Filter/BirthdateFilter.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Export\\\\Filter\\\\GenderFilter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillPersonBundle/Export/Filter/GenderFilter.php - - message: """ @@ -1198,24 +829,6 @@ parameters: count: 1 path: src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Form\\\\Type\\\\PickPersonType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Menu\\\\SectionMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillPersonBundle/Menu/SectionMenuBuilder.php - - message: """ @@ -1279,15 +892,6 @@ parameters: count: 1 path: src/Bundle/ChillReportBundle/Export/Export/ReportList.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\ReportBundle\\\\Export\\\\Export\\\\ReportList\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillReportBundle/Export/Export/ReportList.php - - message: """ @@ -1297,15 +901,6 @@ parameters: count: 1 path: src/Bundle/ChillReportBundle/Export/Export/ReportList.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\ReportBundle\\\\Export\\\\Export\\\\ReportListProvider\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillReportBundle/Export/Export/ReportListProvider.php - - message: """ @@ -1387,15 +982,6 @@ parameters: count: 1 path: src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\TaskBundle\\\\Controller\\\\TaskController\\:\\:applyTransitionAction\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillTaskBundle/Controller/TaskController.php - - message: """ @@ -1441,33 +1027,6 @@ parameters: count: 1 path: src/Bundle/ChillTaskBundle/Form/SingleTaskType.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\TaskBundle\\\\Menu\\\\MenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillTaskBundle/Menu/MenuBuilder.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\TaskBundle\\\\Menu\\\\SectionMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillTaskBundle/Menu/SectionMenuBuilder.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\TaskBundle\\\\Menu\\\\UserMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillTaskBundle/Menu/UserMenuBuilder.php - - message: """ @@ -1504,33 +1063,6 @@ parameters: count: 3 path: src/Bundle/ChillTaskBundle/Timeline/TaskLifeCycleEventTimelineProvider.php - - - message: - """ - #^Parameter \\$translator of method Chill\\\\ThirdPartyBundle\\\\Controller\\\\ThirdPartyController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillThirdPartyBundle/Controller/ThirdPartyController.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\ThirdPartyBundle\\\\Form\\\\Type\\\\PickThirdPartyType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyType.php - - - - message: - """ - #^Parameter \\$translator of method Chill\\\\ThirdPartyBundle\\\\Menu\\\\MenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\: - since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$# - """ - count: 1 - path: src/Bundle/ChillThirdPartyBundle/Menu/MenuBuilder.php - - message: """ diff --git a/src/Bundle/ChillActivityBundle/Export/Export/ListActivity.php b/src/Bundle/ChillActivityBundle/Export/Export/ListActivity.php index 07153fc2c..a99decc6c 100644 --- a/src/Bundle/ChillActivityBundle/Export/Export/ListActivity.php +++ b/src/Bundle/ChillActivityBundle/Export/Export/ListActivity.php @@ -24,9 +24,9 @@ use Doctrine\ORM\Query; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Security\Core\Role\Role; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Constraints\Callback; use Symfony\Component\Validator\Context\ExecutionContextInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_key_exists; use function count; diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityDateFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityDateFilter.php index 00a9ac382..6048a1cc0 100644 --- a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityDateFilter.php +++ b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityDateFilter.php @@ -21,7 +21,7 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormError; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class ActivityDateFilter implements FilterInterface { diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/PersonHavingActivityBetweenDateFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/PersonHavingActivityBetweenDateFilter.php index f162ed2ef..312486b49 100644 --- a/src/Bundle/ChillActivityBundle/Export/Filter/PersonHavingActivityBetweenDateFilter.php +++ b/src/Bundle/ChillActivityBundle/Export/Filter/PersonHavingActivityBetweenDateFilter.php @@ -29,8 +29,8 @@ use Symfony\Component\Form\FormError; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\FormInterface; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Context\ExecutionContextInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function count; diff --git a/src/Bundle/ChillActivityBundle/Menu/PersonMenuBuilder.php b/src/Bundle/ChillActivityBundle/Menu/PersonMenuBuilder.php index 34b18f078..56c21051f 100644 --- a/src/Bundle/ChillActivityBundle/Menu/PersonMenuBuilder.php +++ b/src/Bundle/ChillActivityBundle/Menu/PersonMenuBuilder.php @@ -15,7 +15,7 @@ use Chill\ActivityBundle\Security\Authorization\ActivityVoter; use Chill\MainBundle\Routing\LocalMenuBuilderInterface; use Knp\Menu\MenuItem; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class PersonMenuBuilder implements LocalMenuBuilderInterface { diff --git a/src/Bundle/ChillAsideActivityBundle/src/Menu/UserMenuBuilder.php b/src/Bundle/ChillAsideActivityBundle/src/Menu/UserMenuBuilder.php index 943aeed4c..ceca055e4 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/Menu/UserMenuBuilder.php +++ b/src/Bundle/ChillAsideActivityBundle/src/Menu/UserMenuBuilder.php @@ -16,7 +16,7 @@ use Chill\TaskBundle\Templating\UI\CountNotificationTask; use Knp\Menu\MenuItem; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class UserMenuBuilder implements LocalMenuBuilderInterface { diff --git a/src/Bundle/ChillBudgetBundle/Controller/AbstractElementController.php b/src/Bundle/ChillBudgetBundle/Controller/AbstractElementController.php index 01315e889..c8652e2e9 100644 --- a/src/Bundle/ChillBudgetBundle/Controller/AbstractElementController.php +++ b/src/Bundle/ChillBudgetBundle/Controller/AbstractElementController.php @@ -20,7 +20,7 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function get_class; diff --git a/src/Bundle/ChillBudgetBundle/Controller/ElementController.php b/src/Bundle/ChillBudgetBundle/Controller/ElementController.php index df1e83081..3a22e321f 100644 --- a/src/Bundle/ChillBudgetBundle/Controller/ElementController.php +++ b/src/Bundle/ChillBudgetBundle/Controller/ElementController.php @@ -21,7 +21,7 @@ use Doctrine\ORM\EntityManagerInterface; use Psr\Log\LoggerInterface; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_merge; use function count; diff --git a/src/Bundle/ChillBudgetBundle/Menu/UserMenuBuilder.php b/src/Bundle/ChillBudgetBundle/Menu/UserMenuBuilder.php index d97080d11..f5dc02266 100644 --- a/src/Bundle/ChillBudgetBundle/Menu/UserMenuBuilder.php +++ b/src/Bundle/ChillBudgetBundle/Menu/UserMenuBuilder.php @@ -15,7 +15,7 @@ use Chill\AMLI\BudgetBundle\Security\Authorization\BudgetElementVoter; use Chill\MainBundle\Routing\LocalMenuBuilderInterface; use Knp\Menu\MenuItem; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class UserMenuBuilder implements LocalMenuBuilderInterface { diff --git a/src/Bundle/ChillBudgetBundle/config/services/menu.yaml b/src/Bundle/ChillBudgetBundle/config/services/menu.yaml index 0b72feb1a..a0fdac61e 100644 --- a/src/Bundle/ChillBudgetBundle/config/services/menu.yaml +++ b/src/Bundle/ChillBudgetBundle/config/services/menu.yaml @@ -2,6 +2,6 @@ services: Chill\AMLI\BudgetBundle\Menu\UserMenuBuilder: arguments: $authorizationChecker: '@Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface' - $translator: '@Symfony\Component\Translation\TranslatorInterface' + $translator: '@Symfony\Contracts\Translation\TranslatorInterface' tags: - { name: 'chill.menu_builder' } diff --git a/src/Bundle/ChillCalendarBundle/Menu/UserMenuBuilder.php b/src/Bundle/ChillCalendarBundle/Menu/UserMenuBuilder.php index 37526c25e..74512eda5 100644 --- a/src/Bundle/ChillCalendarBundle/Menu/UserMenuBuilder.php +++ b/src/Bundle/ChillCalendarBundle/Menu/UserMenuBuilder.php @@ -16,7 +16,7 @@ use Chill\TaskBundle\Templating\UI\CountNotificationTask; use Knp\Menu\MenuItem; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class UserMenuBuilder implements LocalMenuBuilderInterface { diff --git a/src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldsGroupType.php b/src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldsGroupType.php index 7dff8e119..5b6622e48 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldsGroupType.php +++ b/src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldsGroupType.php @@ -19,7 +19,7 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\OptionsResolver\OptionsResolver; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function count; diff --git a/src/Bundle/ChillDocGeneratorBundle/translations/messages.fr.yml b/src/Bundle/ChillDocGeneratorBundle/translations/messages.fr.yml index 214428bd4..a06852b8a 100644 --- a/src/Bundle/ChillDocGeneratorBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillDocGeneratorBundle/translations/messages.fr.yml @@ -2,11 +2,11 @@ docgen: Generate a document: Génerer un document Generate: Génerer Document generation: Génération de documents - Manage templates and document generation: Gestion des documents générés et de leurs gabarits + Manage templates and document generation: Gestion des documents générés et de leurs modèles Pick template context: Choisir un contexte Context: Contexte - New template: Nouveau gabarit - Edit template: Modifier gabarit + New template: Nouveau modèle + Edit template: Modifier modèle test generate: Tester la génération With context: 'Avec le contexte :' diff --git a/src/Bundle/ChillEventBundle/Controller/EventController.php b/src/Bundle/ChillEventBundle/Controller/EventController.php index d87afac09..dae04ec12 100644 --- a/src/Bundle/ChillEventBundle/Controller/EventController.php +++ b/src/Bundle/ChillEventBundle/Controller/EventController.php @@ -38,7 +38,7 @@ use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\Security\Core\Role\Role; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function count; diff --git a/src/Bundle/ChillEventBundle/Form/Type/PickEventType.php b/src/Bundle/ChillEventBundle/Form/Type/PickEventType.php index 881a9645b..6b0b2d1ab 100644 --- a/src/Bundle/ChillEventBundle/Form/Type/PickEventType.php +++ b/src/Bundle/ChillEventBundle/Form/Type/PickEventType.php @@ -28,7 +28,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Role\Role; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function in_array; use function is_array; diff --git a/src/Bundle/ChillEventBundle/Form/Type/PickRoleType.php b/src/Bundle/ChillEventBundle/Form/Type/PickRoleType.php index 2caf95598..928fd4180 100644 --- a/src/Bundle/ChillEventBundle/Form/Type/PickRoleType.php +++ b/src/Bundle/ChillEventBundle/Form/Type/PickRoleType.php @@ -21,7 +21,7 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\OptionsResolver\OptionsResolver; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; /** * Allow to pick a choice amongst different choices. diff --git a/src/Bundle/ChillEventBundle/Form/Type/PickStatusType.php b/src/Bundle/ChillEventBundle/Form/Type/PickStatusType.php index dea302049..a85f4e4c3 100644 --- a/src/Bundle/ChillEventBundle/Form/Type/PickStatusType.php +++ b/src/Bundle/ChillEventBundle/Form/Type/PickStatusType.php @@ -21,7 +21,7 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\OptionsResolver\OptionsResolver; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; /** * Allow to pick amongst type. diff --git a/src/Bundle/ChillEventBundle/Menu/PersonMenuBuilder.php b/src/Bundle/ChillEventBundle/Menu/PersonMenuBuilder.php index f96bed266..e16466b33 100644 --- a/src/Bundle/ChillEventBundle/Menu/PersonMenuBuilder.php +++ b/src/Bundle/ChillEventBundle/Menu/PersonMenuBuilder.php @@ -15,7 +15,7 @@ use Chill\EventBundle\Security\Authorization\EventVoter; use Chill\MainBundle\Routing\LocalMenuBuilderInterface; use Knp\Menu\MenuItem; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class PersonMenuBuilder implements LocalMenuBuilderInterface { diff --git a/src/Bundle/ChillEventBundle/config/services/controller.yaml b/src/Bundle/ChillEventBundle/config/services/controller.yaml index b74764e34..bb4cf7c46 100644 --- a/src/Bundle/ChillEventBundle/config/services/controller.yaml +++ b/src/Bundle/ChillEventBundle/config/services/controller.yaml @@ -5,7 +5,7 @@ services: $eventDispatcher: '@Symfony\Component\EventDispatcher\EventDispatcherInterface' $authorizationHelper: '@Chill\MainBundle\Security\Authorization\AuthorizationHelper' $formFactoryInterface: '@Symfony\Component\Form\FormFactoryInterface' - $translator: '@Symfony\Component\Translation\TranslatorInterface' + $translator: '@Symfony\Contracts\Translation\TranslatorInterface' $paginator: '@chill_main.paginator_factory' public: true tags: ['controller.service_arguments'] diff --git a/src/Bundle/ChillEventBundle/config/services/forms.yaml b/src/Bundle/ChillEventBundle/config/services/forms.yaml index a1c0d925a..6f61531ce 100644 --- a/src/Bundle/ChillEventBundle/config/services/forms.yaml +++ b/src/Bundle/ChillEventBundle/config/services/forms.yaml @@ -44,6 +44,6 @@ services: $tokenStorage: "@security.token_storage" $authorizationHelper: "@chill.main.security.authorization.helper" $urlGenerator: '@Symfony\Component\Routing\Generator\UrlGeneratorInterface' - $translator: '@Symfony\Component\Translation\TranslatorInterface' + $translator: '@Symfony\Contracts\Translation\TranslatorInterface' tags: - { name: form.type } diff --git a/src/Bundle/ChillEventBundle/config/services/menu.yaml b/src/Bundle/ChillEventBundle/config/services/menu.yaml index a2451122f..6f49c02f0 100644 --- a/src/Bundle/ChillEventBundle/config/services/menu.yaml +++ b/src/Bundle/ChillEventBundle/config/services/menu.yaml @@ -2,6 +2,6 @@ services: Chill\EventBundle\Menu\PersonMenuBuilder: arguments: $authorizationChecker: '@Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface' - $translator: '@Symfony\Component\Translation\TranslatorInterface' + $translator: '@Symfony\Contracts\Translation\TranslatorInterface' tags: - { name: 'chill.menu_builder' } \ No newline at end of file diff --git a/src/Bundle/ChillFamilyMembersBundle/Controller/FamilyMemberController.php b/src/Bundle/ChillFamilyMembersBundle/Controller/FamilyMemberController.php index 51dd0cd73..1ec333360 100644 --- a/src/Bundle/ChillFamilyMembersBundle/Controller/FamilyMemberController.php +++ b/src/Bundle/ChillFamilyMembersBundle/Controller/FamilyMemberController.php @@ -24,7 +24,7 @@ use Symfony\Component\Form\FormInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class FamilyMemberController extends AbstractController { diff --git a/src/Bundle/ChillFamilyMembersBundle/Menu/UserMenuBuilder.php b/src/Bundle/ChillFamilyMembersBundle/Menu/UserMenuBuilder.php index 17976b6ef..8b0e85c35 100644 --- a/src/Bundle/ChillFamilyMembersBundle/Menu/UserMenuBuilder.php +++ b/src/Bundle/ChillFamilyMembersBundle/Menu/UserMenuBuilder.php @@ -15,7 +15,7 @@ use Chill\AMLI\FamilyMembersBundle\Security\Voter\FamilyMemberVoter; use Chill\MainBundle\Routing\LocalMenuBuilderInterface; use Knp\Menu\MenuItem; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class UserMenuBuilder implements LocalMenuBuilderInterface { diff --git a/src/Bundle/ChillFamilyMembersBundle/Resources/config/services/menu.yml b/src/Bundle/ChillFamilyMembersBundle/Resources/config/services/menu.yml index 63836badf..9deb3ec16 100644 --- a/src/Bundle/ChillFamilyMembersBundle/Resources/config/services/menu.yml +++ b/src/Bundle/ChillFamilyMembersBundle/Resources/config/services/menu.yml @@ -2,6 +2,6 @@ services: Chill\AMLI\FamilyMembersBundle\Menu\UserMenuBuilder: arguments: $authorizationChecker: '@Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface' - $translator: '@Symfony\Component\Translation\TranslatorInterface' + $translator: '@Symfony\Contracts\Translation\TranslatorInterface' tags: - { name: 'chill.menu_builder' } diff --git a/src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php b/src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php index b1ee4894e..436ee41d3 100644 --- a/src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php +++ b/src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php @@ -20,8 +20,8 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Serializer\SerializerInterface; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_merge; diff --git a/src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php b/src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php index d6e0450e3..62d587ab3 100644 --- a/src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php +++ b/src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php @@ -27,7 +27,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Core\Role\Role; use Symfony\Component\Serializer\SerializerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_key_exists; use function array_merge; diff --git a/src/Bundle/ChillMainBundle/Controller/ExportController.php b/src/Bundle/ChillMainBundle/Controller/ExportController.php index 6921dd284..bc3f994a7 100644 --- a/src/Bundle/ChillMainBundle/Controller/ExportController.php +++ b/src/Bundle/ChillMainBundle/Controller/ExportController.php @@ -24,7 +24,7 @@ use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Session\SessionInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function count; use function serialize; diff --git a/src/Bundle/ChillMainBundle/Controller/PasswordController.php b/src/Bundle/ChillMainBundle/Controller/PasswordController.php index 2dd700a89..4d6a13545 100644 --- a/src/Bundle/ChillMainBundle/Controller/PasswordController.php +++ b/src/Bundle/ChillMainBundle/Controller/PasswordController.php @@ -27,9 +27,9 @@ use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Constraints\Callback; use Symfony\Component\Validator\Context\ExecutionContextInterface; +use Symfony\Contracts\Translation\TranslatorInterface; /** * Class PasswordController. diff --git a/src/Bundle/ChillMainBundle/Entity/Address.php b/src/Bundle/ChillMainBundle/Entity/Address.php index 4ccafa8c2..8eac6668b 100644 --- a/src/Bundle/ChillMainBundle/Entity/Address.php +++ b/src/Bundle/ChillMainBundle/Entity/Address.php @@ -142,7 +142,7 @@ class Address * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\PostalCode") * @Groups({"write"}) */ - private ?PostalCode $postcode; + private ?PostalCode $postcode = null; /** * @var string|null @@ -304,10 +304,8 @@ class Address /** * Get postcode. - * - * @return PostalCode */ - public function getPostcode() + public function getPostcode(): ?PostalCode { return $this->postcode; } diff --git a/src/Bundle/ChillMainBundle/Export/Formatter/CSVListFormatter.php b/src/Bundle/ChillMainBundle/Export/Formatter/CSVListFormatter.php index cb184e250..610b3145a 100644 --- a/src/Bundle/ChillMainBundle/Export/Formatter/CSVListFormatter.php +++ b/src/Bundle/ChillMainBundle/Export/Formatter/CSVListFormatter.php @@ -18,7 +18,7 @@ use OutOfBoundsException; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_key_exists; use function array_keys; diff --git a/src/Bundle/ChillMainBundle/Export/Formatter/CSVPivotedListFormatter.php b/src/Bundle/ChillMainBundle/Export/Formatter/CSVPivotedListFormatter.php index 790a8b540..d523b5b33 100644 --- a/src/Bundle/ChillMainBundle/Export/Formatter/CSVPivotedListFormatter.php +++ b/src/Bundle/ChillMainBundle/Export/Formatter/CSVPivotedListFormatter.php @@ -17,7 +17,7 @@ use LogicException; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_map; use function count; diff --git a/src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php b/src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php index 0c890f009..a2bce1201 100644 --- a/src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php +++ b/src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php @@ -19,7 +19,7 @@ use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_map; use function array_merge; diff --git a/src/Bundle/ChillMainBundle/Export/Formatter/SpreadsheetListFormatter.php b/src/Bundle/ChillMainBundle/Export/Formatter/SpreadsheetListFormatter.php index aaebadd99..4380cd877 100644 --- a/src/Bundle/ChillMainBundle/Export/Formatter/SpreadsheetListFormatter.php +++ b/src/Bundle/ChillMainBundle/Export/Formatter/SpreadsheetListFormatter.php @@ -23,7 +23,7 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_key_exists; use function array_keys; diff --git a/src/Bundle/ChillMainBundle/Form/Type/PickCivilityType.php b/src/Bundle/ChillMainBundle/Form/Type/PickCivilityType.php new file mode 100644 index 000000000..0381bfd0d --- /dev/null +++ b/src/Bundle/ChillMainBundle/Form/Type/PickCivilityType.php @@ -0,0 +1,57 @@ +translatableStringHelper = $translatableStringHelper; + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver + ->setDefault('label', 'Civility') + ->setDefault( + 'choice_label', + function (Civility $civility): string { + return $this->translatableStringHelper->localize($civility->getName()); + } + ) + ->setDefault( + 'query_builder', + static function (EntityRepository $er): QueryBuilder { + return $er->createQueryBuilder('c') + ->where('c.active = true') + ->orderBy('c.order'); + }, + ) + ->setDefault('placeholder', 'choose civility') + ->setDefault('class', Civility::class); + } + + public function getParent() + { + return EntityType::class; + } +} diff --git a/src/Bundle/ChillMainBundle/Form/Type/PostalCodeType.php b/src/Bundle/ChillMainBundle/Form/Type/PostalCodeType.php index debd56ad4..456ff753f 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/PostalCodeType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/PostalCodeType.php @@ -20,7 +20,7 @@ use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormView; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; /** * A form to pick between PostalCode. diff --git a/src/Bundle/ChillMainBundle/Notification/Mailer.php b/src/Bundle/ChillMainBundle/Notification/Mailer.php index 479502060..2607f1ffb 100644 --- a/src/Bundle/ChillMainBundle/Notification/Mailer.php +++ b/src/Bundle/ChillMainBundle/Notification/Mailer.php @@ -16,7 +16,7 @@ use Psr\Log\LoggerInterface; use Swift_Mailer; use Swift_Message; use Symfony\Component\Routing\RouterInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use Twig\Environment; use function call_user_func; diff --git a/src/Bundle/ChillMainBundle/Routing/MenuBuilder/SectionMenuBuilder.php b/src/Bundle/ChillMainBundle/Routing/MenuBuilder/SectionMenuBuilder.php index 9aae86e48..1a5ae9afe 100644 --- a/src/Bundle/ChillMainBundle/Routing/MenuBuilder/SectionMenuBuilder.php +++ b/src/Bundle/ChillMainBundle/Routing/MenuBuilder/SectionMenuBuilder.php @@ -15,7 +15,7 @@ use Chill\MainBundle\Routing\LocalMenuBuilderInterface; use Chill\MainBundle\Security\Authorization\ChillExportVoter; use Knp\Menu\MenuItem; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; /** * Class SectionMenuBuilder. diff --git a/src/Bundle/ChillMainBundle/Routing/MenuComposer.php b/src/Bundle/ChillMainBundle/Routing/MenuComposer.php index 763eab0e5..7c485022b 100644 --- a/src/Bundle/ChillMainBundle/Routing/MenuComposer.php +++ b/src/Bundle/ChillMainBundle/Routing/MenuComposer.php @@ -15,7 +15,7 @@ use Knp\Menu\FactoryInterface; use Knp\Menu\ItemInterface; use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\RouterInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_key_exists; use function array_merge; diff --git a/src/Bundle/ChillMainBundle/Validation/Validator/RoleScopeScopePresence.php b/src/Bundle/ChillMainBundle/Validation/Validator/RoleScopeScopePresence.php index 20abb8907..6f3e810f0 100644 --- a/src/Bundle/ChillMainBundle/Validation/Validator/RoleScopeScopePresence.php +++ b/src/Bundle/ChillMainBundle/Validation/Validator/RoleScopeScopePresence.php @@ -16,9 +16,10 @@ use Chill\MainBundle\Security\RoleProvider; use Chill\MainBundle\Validation\Constraint\RoleScopeScopePresenceConstraint; use Psr\Log\LoggerInterface; use RuntimeException; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\ConstraintValidator; +use Symfony\Contracts\Translation\TranslatorInterface; + use function in_array; class RoleScopeScopePresence extends ConstraintValidator diff --git a/src/Bundle/ChillMainBundle/config/services/export.yaml b/src/Bundle/ChillMainBundle/config/services/export.yaml index ce361677b..d330f30f5 100644 --- a/src/Bundle/ChillMainBundle/config/services/export.yaml +++ b/src/Bundle/ChillMainBundle/config/services/export.yaml @@ -19,7 +19,7 @@ services: chill.main.export.spreadsheet_formatter: class: Chill\MainBundle\Export\Formatter\SpreadSheetFormatter arguments: - $translatorInterface: '@Symfony\Component\Translation\TranslatorInterface' + $translatorInterface: '@Symfony\Contracts\Translation\TranslatorInterface' $exportManager: '@Chill\MainBundle\Export\ExportManager' tags: - { name: chill.export_formatter, alias: 'spreadsheet' } @@ -27,7 +27,7 @@ services: chill.main.export.list_formatter: class: Chill\MainBundle\Export\Formatter\CSVListFormatter arguments: - $translatorInterface: '@Symfony\Component\Translation\TranslatorInterface' + $translatorInterface: '@Symfony\Contracts\Translation\TranslatorInterface' $exportManager: '@Chill\MainBundle\Export\ExportManager' tags: - { name: chill.export_formatter, alias: 'csvlist' } @@ -35,7 +35,7 @@ services: chill.main.export.list_spreadsheet_formatter: class: Chill\MainBundle\Export\Formatter\SpreadsheetListFormatter arguments: - $translatorInterface: '@Symfony\Component\Translation\TranslatorInterface' + $translatorInterface: '@Symfony\Contracts\Translation\TranslatorInterface' $exportManager: '@Chill\MainBundle\Export\ExportManager' tags: - { name: chill.export_formatter, alias: 'spreadlist' } @@ -43,7 +43,7 @@ services: chill.main.export.pivoted_list_formatter: class: Chill\MainBundle\Export\Formatter\CSVPivotedListFormatter arguments: - $translatorInterface: '@Symfony\Component\Translation\TranslatorInterface' + $translatorInterface: '@Symfony\Contracts\Translation\TranslatorInterface' $exportManager: '@Chill\MainBundle\Export\ExportManager' tags: - { name: chill.export_formatter, alias: 'csv_pivoted_list' } diff --git a/src/Bundle/ChillMainBundle/config/services/form.yaml b/src/Bundle/ChillMainBundle/config/services/form.yaml index 7efc9a69f..f2dc7803a 100644 --- a/src/Bundle/ChillMainBundle/config/services/form.yaml +++ b/src/Bundle/ChillMainBundle/config/services/form.yaml @@ -59,7 +59,7 @@ services: - "@chill.main.helper.translatable_string" - '@Symfony\Component\Routing\Generator\UrlGeneratorInterface' - '@Chill\MainBundle\Form\ChoiceLoader\PostalCodeChoiceLoader' - - '@Symfony\Component\Translation\TranslatorInterface' + - '@Symfony\Contracts\Translation\TranslatorInterface' tags: - { name: form.type } diff --git a/src/Bundle/ChillMainBundle/config/services/menu.yaml b/src/Bundle/ChillMainBundle/config/services/menu.yaml index 97a1d5e89..03ed34a92 100644 --- a/src/Bundle/ChillMainBundle/config/services/menu.yaml +++ b/src/Bundle/ChillMainBundle/config/services/menu.yaml @@ -15,7 +15,7 @@ services: Chill\MainBundle\Routing\MenuBuilder\SectionMenuBuilder: arguments: $authorizationChecker: '@Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface' - $translator: '@Symfony\Component\Translation\TranslatorInterface' + $translator: '@Symfony\Contracts\Translation\TranslatorInterface' tags: - { name: 'chill.menu_builder' } diff --git a/src/Bundle/ChillMainBundle/config/services/notification.yaml b/src/Bundle/ChillMainBundle/config/services/notification.yaml index 8bfb41ad7..b972dced7 100644 --- a/src/Bundle/ChillMainBundle/config/services/notification.yaml +++ b/src/Bundle/ChillMainBundle/config/services/notification.yaml @@ -10,7 +10,7 @@ services: $mailer: '@swiftmailer.mailer.default' # $mailerTransporter: '@swiftmailer.transport' $router: '@Symfony\Component\Routing\RouterInterface' - $translator: '@Symfony\Component\Translation\TranslatorInterface' + $translator: '@Symfony\Contracts\Translation\TranslatorInterface' $routeParameters: '%chill_main.notifications%' Chill\MainBundle\Notification\NotificationHandlerManager: diff --git a/src/Bundle/ChillMainBundle/config/services/routing.yaml b/src/Bundle/ChillMainBundle/config/services/routing.yaml index fa8a56696..4363c068f 100644 --- a/src/Bundle/ChillMainBundle/config/services/routing.yaml +++ b/src/Bundle/ChillMainBundle/config/services/routing.yaml @@ -8,7 +8,7 @@ services: arguments: - '@Symfony\Component\Routing\RouterInterface' - '@Knp\Menu\FactoryInterface' - - '@Symfony\Component\Translation\TranslatorInterface' + - '@Symfony\Contracts\Translation\TranslatorInterface' Chill\MainBundle\Routing\MenuComposer: '@chill.main.menu_composer' chill.main.routes_loader: diff --git a/src/Bundle/ChillMainBundle/translations/messages+intl-icu.fr.yaml b/src/Bundle/ChillMainBundle/translations/messages+intl-icu.fr.yaml index 59771529f..4756ff4f7 100644 --- a/src/Bundle/ChillMainBundle/translations/messages+intl-icu.fr.yaml +++ b/src/Bundle/ChillMainBundle/translations/messages+intl-icu.fr.yaml @@ -9,7 +9,7 @@ notification: My notifications with counter: >- {nb, plural, =0 {Mes notifications} - one {Une notification} + one {# notification} few {# notifications} other {# notifications} } @@ -41,7 +41,7 @@ workflow: My workflows with counter: >- {wc, plural, =0 {Mes workflows} - one {Une workflow} + one {# workflow} few {# workflows} other {# workflows} } diff --git a/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Events/PersonAddressMoveEventSubscriber.php b/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Events/PersonAddressMoveEventSubscriber.php new file mode 100644 index 000000000..3eff58dc7 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Events/PersonAddressMoveEventSubscriber.php @@ -0,0 +1,95 @@ +engine = $engine; + $this->entityManager = $entityManager; + $this->security = $security; + $this->translator = $translator; + } + + public static function getSubscribedEvents(): array + { + return [ + PersonAddressMoveEvent::class => 'resetPeriodLocation', + ]; + } + + public function resetPeriodLocation(PersonAddressMoveEvent $event) + { + if ($event->getPreviousAddress() !== $event->getNextAddress() + && null !== $event->getPreviousAddress() + ) { + $person = $event->getPerson(); + + foreach ($person->getCurrentAccompanyingPeriods() as $period) { + if ($period->getStep() === AccompanyingPeriod::STEP_DRAFT) { + continue; + } + + if ( + $period->getPersonLocation() === $person + && ( + $event->getMoveDate() >= $period->getLastLocationHistory()->getStartDate() + || $event->willChangeBeActiveAt(new DateTimeImmutable('now')) + ) + && null !== $period->getUser() + && $period->getUser() !== $this->security->getUser() + ) { + // reset the location, back to an address + $period->setPersonLocation(null); + $period->setAddressLocation(Address::createFromAddress($event->getPreviousAddress())); + + $notification = new Notification(); + $notification + ->addAddressee($period->getUser()) + ->setTitle($this->translator->trans('period_notification.Person locating period has moved')) + ->setRelatedEntityClass(AccompanyingPeriod::class) + ->setRelatedEntityId($period->getId()) + ->setMessage($this->engine->render('@ChillPerson/AccompanyingPeriod/notification_location_user_on_period_has_moved.fr.txt.twig', [ + 'oldPersonLocation' => $person, + 'period' => $period, + ])); + + $this->entityManager->persist($notification); + } + } + } + } +} diff --git a/src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseController.php b/src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseController.php index 7ae5c5f73..aa3c5f512 100644 --- a/src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseController.php +++ b/src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseController.php @@ -32,6 +32,7 @@ use Symfony\Component\Workflow\Registry; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\Translation\TranslatorInterface; +use function array_slice; use function is_array; /** @@ -221,9 +222,11 @@ class AccompanyingCourseController extends Controller $activities = $this->getDoctrine()->getManager()->getRepository(Activity::class)->findBy( ['accompanyingPeriod' => $accompanyingCourse], - ['date' => 'DESC'], + ['date' => 'DESC', 'id' => 'DESC'], ); + $activities = array_slice($activities, 0, 3); + $works = $this->workRepository->findByAccompanyingPeriod( $accompanyingCourse, ['startDate' => 'DESC', 'endDate' => 'DESC'], diff --git a/src/Bundle/ChillPersonBundle/Controller/HouseholdApiController.php b/src/Bundle/ChillPersonBundle/Controller/HouseholdApiController.php index 1ebde2b57..470094507 100644 --- a/src/Bundle/ChillPersonBundle/Controller/HouseholdApiController.php +++ b/src/Bundle/ChillPersonBundle/Controller/HouseholdApiController.php @@ -16,28 +16,37 @@ use Chill\MainBundle\Entity\Address; use Chill\MainBundle\Entity\AddressReference; use Chill\MainBundle\Serializer\Model\Collection; use Chill\PersonBundle\Entity\Household\Household; +use Chill\PersonBundle\Entity\Household\HouseholdMember; use Chill\PersonBundle\Entity\Person; +use Chill\PersonBundle\Event\Person\PersonAddressMoveEvent; use Chill\PersonBundle\Repository\Household\HouseholdACLAwareRepositoryInterface; use Chill\PersonBundle\Repository\Household\HouseholdRepository; +use Chill\PersonBundle\Security\Authorization\HouseholdVoter; +use DateTimeImmutable; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; -use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; +use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use function array_filter; use function array_values; class HouseholdApiController extends ApiController { + private EventDispatcherInterface $eventDispatcher; + private HouseholdACLAwareRepositoryInterface $householdACLAwareRepository; private HouseholdRepository $householdRepository; public function __construct( + EventDispatcherInterface $eventDispatcher, HouseholdRepository $householdRepository, HouseholdACLAwareRepositoryInterface $householdACLAwareRepository ) { + $this->eventDispatcher = $eventDispatcher; $this->householdRepository = $householdRepository; $this->householdACLAwareRepository = $householdACLAwareRepository; } @@ -66,9 +75,51 @@ class HouseholdApiController extends ApiController ]); } - public function householdAddressApi($id, Request $request, string $_format): Response + /** + * Add an address to a household. + * + * @Route("/api/1.0/person/household/{id}/address.{_format}", name="chill_api_single_household_address", + * methods={"POST"}, requirements={"_format": "json"}) + */ + public function householdAddressApi(Household $household, Request $request, string $_format): Response { - return $this->addRemoveSomething('address', $id, $request, $_format, 'address', Address::class, ['groups' => ['read']]); + $this->denyAccessUnlessGranted(HouseholdVoter::EDIT, $household); + + /** @var Address $address */ + $address = $this->getSerializer()->deserialize($request->getContent(), Address::class, $_format, [ + AbstractNormalizer::GROUPS => ['write'], + ]); + + $household->addAddress($address); + + foreach ($household->getMembersOnRange( + DateTimeImmutable::createFromMutable($address->getValidFrom()), + null === $address->getValidTo() ? null : + DateTimeImmutable::createFromMutable($address->getValidTo()) + ) as $member) { + /** @var HouseholdMember $member */ + $event = new PersonAddressMoveEvent($member->getPerson()); + $event + ->setPreviousAddress($household->getPreviousAddressOf($address)) + ->setNextAddress($address); + dump($event); + $this->eventDispatcher->dispatch($event); + } + + $errors = $this->getValidator()->validate($household); + + if ($errors->count() > 0) { + return $this->json($errors, 422); + } + + $this->getDoctrine()->getManager()->flush(); + + return $this->json( + $address, + Response::HTTP_OK, + [], + [AbstractNormalizer::GROUPS => ['read']] + ); } /** diff --git a/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php b/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php index ba4b788d7..07fa34b5a 100644 --- a/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php +++ b/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php @@ -24,7 +24,7 @@ use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Security\Core\Security; use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\SerializerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_key_exists; use function count; diff --git a/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php b/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php index 78234d114..2ec72a786 100644 --- a/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php +++ b/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php @@ -26,7 +26,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Exception; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function count; @@ -180,6 +180,7 @@ class HouseholdMemberController extends ApiController public function move(Request $request, $_format): Response { try { + /** @var MembersEditor $editor */ $editor = $this->getSerializer() ->deserialize( $request->getContent(), @@ -199,6 +200,9 @@ class HouseholdMemberController extends ApiController return $this->json($errors, 422); } + // launch events on post move + $editor->postMove(); + $em = $this->getDoctrine()->getManager(); // if new household, persist it diff --git a/src/Bundle/ChillPersonBundle/Controller/PersonController.php b/src/Bundle/ChillPersonBundle/Controller/PersonController.php index ef06e4d3e..22d3d9388 100644 --- a/src/Bundle/ChillPersonBundle/Controller/PersonController.php +++ b/src/Bundle/ChillPersonBundle/Controller/PersonController.php @@ -30,8 +30,8 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Security\Core\Security; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function count; use function hash; diff --git a/src/Bundle/ChillPersonBundle/Controller/PersonDuplicateController.php b/src/Bundle/ChillPersonBundle/Controller/PersonDuplicateController.php index 182a90d5a..3b5e1da7b 100644 --- a/src/Bundle/ChillPersonBundle/Controller/PersonDuplicateController.php +++ b/src/Bundle/ChillPersonBundle/Controller/PersonDuplicateController.php @@ -28,7 +28,7 @@ use http\Exception\InvalidArgumentException; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function count; diff --git a/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php b/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php index 01df460e3..716ef9ee8 100644 --- a/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php +++ b/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php @@ -527,15 +527,6 @@ class ChillPersonExtension extends Extension implements PrependExtensionInterfac Request::METHOD_HEAD => true, ], ], - 'address' => [ - 'methods' => [ - Request::METHOD_POST => true, - Request::METHOD_DELETE => true, - Request::METHOD_GET => false, - Request::METHOD_HEAD => false, - ], - 'controller_action' => 'householdAddressApi', - ], 'suggestHouseholdByAccompanyingPeriodParticipation' => [ 'path' => '/suggest/by-person/{person_id}/through-accompanying-period-participation.{_format}', 'methods' => [ diff --git a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php index 1e7444af6..0012f341d 100644 --- a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php +++ b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php @@ -21,6 +21,7 @@ use Chill\MainBundle\Entity\Location; use Chill\MainBundle\Entity\Scope; use Chill\MainBundle\Entity\User; use Chill\MainBundle\Entity\UserJob; +use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodLocationHistory; use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork; use Chill\PersonBundle\Entity\AccompanyingPeriod\ClosingMotive; use Chill\PersonBundle\Entity\AccompanyingPeriod\Comment; @@ -37,17 +38,19 @@ use DateTimeImmutable; use DateTimeInterface; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Doctrine\Common\Collections\Criteria; use Doctrine\ORM\Mapping as ORM; +use Iterator; use LogicException; use Symfony\Component\Serializer\Annotation\DiscriminatorMap; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Context\ExecutionContextInterface; use Symfony\Component\Validator\GroupSequenceProviderInterface; + use UnexpectedValueException; use function in_array; - use const SORT_REGULAR; /** @@ -212,6 +215,12 @@ class AccompanyingPeriod implements */ private ?UserJob $job = null; + /** + * @ORM\OneToMany(targetEntity=AccompanyingPeriodLocationHistory::class, + * mappedBy="period", cascade={"persist", "remove"}, orphanRemoval=true) + */ + private Collection $locationHistories; + /** * @var DateTime * @@ -384,6 +393,7 @@ class AccompanyingPeriod implements $this->works = new ArrayCollection(); $this->resources = new ArrayCollection(); $this->userHistories = new ArrayCollection(); + $this->locationHistories = new ArrayCollection(); } /** @@ -434,6 +444,39 @@ class AccompanyingPeriod implements return $this; } + public function addLocationHistory(AccompanyingPeriodLocationHistory $history): self + { + if ($this->getStep() === self::STEP_DRAFT) { + return $this; + } + + if (!$this->locationHistories->contains($history)) { + $this->locationHistories[] = $history; + $history->setPeriod($this); + } + + // ensure continuity of histories + $criteria = new Criteria(); + $criteria->orderBy(['startDate' => Criteria::ASC, 'id' => Criteria::ASC]); + + /** @var Iterator $locations */ + $locations = $this->getLocationHistories()->matching($criteria)->getIterator(); + $locations->rewind(); + + do { + /** @var AccompanyingPeriodLocationHistory $current */ + $current = $locations->current(); + $locations->next(); + + if ($locations->valid()) { + $next = $locations->current(); + $current->setEndDate($next->getStartDate()); + } + } while ($locations->valid()); + + return $this; + } + public function addPerson(?Person $person = null): self { if (null !== $person) { @@ -666,6 +709,17 @@ class AccompanyingPeriod implements return $this->job; } + public function getLastLocationHistory(): ?AccompanyingPeriodLocationHistory + { + foreach ($this->getLocationHistories() as $locationHistory) { + if (null === $locationHistory->getEndDate()) { + return $locationHistory; + } + } + + return null; + } + /** * Get the location, taking precedence into account. * @@ -680,6 +734,14 @@ class AccompanyingPeriod implements return $this->getAddressLocation(); } + /** + * @return Collection|AccompanyingPeriodLocationHistory[] + */ + public function getLocationHistories(): Collection + { + return $this->locationHistories; + } + /** * Get where the location is. * @@ -982,6 +1044,15 @@ class AccompanyingPeriod implements $this->comments->removeElement($comment); } + public function removeLocationHistory(AccompanyingPeriodLocationHistory $history): self + { + if ($this->locationHistories->removeElement($history)) { + $history->setPeriod(null); + } + + return $this; + } + /** * Remove Participation. */ @@ -1036,7 +1107,18 @@ class AccompanyingPeriod implements */ public function setAddressLocation(?Address $addressLocation = null): self { - $this->addressLocation = $addressLocation; + if ($this->addressLocation !== $addressLocation) { + $this->addressLocation = $addressLocation; + + if (null !== $addressLocation) { + $locationHistory = new AccompanyingPeriodLocationHistory(); + $locationHistory + ->setStartDate(new DateTimeImmutable('now')) + ->setAddressLocation($addressLocation); + + $this->addLocationHistory($locationHistory); + } + } return $this; } @@ -1139,7 +1221,18 @@ class AccompanyingPeriod implements */ public function setPersonLocation(?Person $person = null): self { - $this->personLocation = $person; + if ($this->personLocation !== $person) { + $this->personLocation = $person; + + if (null !== $person) { + $locationHistory = new AccompanyingPeriodLocationHistory(); + $locationHistory + ->setStartDate(new DateTimeImmutable('now')) + ->setPersonLocation($person); + + $this->addLocationHistory($locationHistory); + } + } return $this; } @@ -1206,8 +1299,14 @@ class AccompanyingPeriod implements public function setStep(string $step): self { + $previous = $this->step; + $this->step = $step; + if (self::STEP_DRAFT === $previous && self::STEP_DRAFT !== $step) { + $this->bootPeriod(); + } + return $this; } @@ -1246,6 +1345,17 @@ class AccompanyingPeriod implements return $this; } + private function bootPeriod(): void + { + // first location history + $locationHistory = new AccompanyingPeriodLocationHistory(); + $locationHistory + ->setStartDate(new DateTimeImmutable('now')) + ->setPersonLocation($this->getPersonLocation()) + ->setAddressLocation($this->getAddressLocation()); + $this->addLocationHistory($locationHistory); + } + private function setRequestorPerson(?Person $requestorPerson = null): self { $this->requestorPerson = $requestorPerson; diff --git a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodLocationHistory.php b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodLocationHistory.php new file mode 100644 index 000000000..1dcb5a1bf --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodLocationHistory.php @@ -0,0 +1,129 @@ +addressLocation; + } + + public function getEndDate(): ?DateTimeImmutable + { + return $this->endDate; + } + + public function getId(): ?int + { + return $this->id; + } + + public function getPeriod(): AccompanyingPeriod + { + return $this->period; + } + + public function getPersonLocation(): ?Person + { + return $this->personLocation; + } + + public function getStartDate(): ?DateTimeImmutable + { + return $this->startDate; + } + + public function setAddressLocation(?Address $addressLocation): AccompanyingPeriodLocationHistory + { + $this->addressLocation = $addressLocation; + + return $this; + } + + public function setEndDate(?DateTimeImmutable $endDate): AccompanyingPeriodLocationHistory + { + $this->endDate = $endDate; + + return $this; + } + + /** + * @internal use AccompanyingPeriod::addLocationHistory + */ + public function setPeriod(AccompanyingPeriod $period): AccompanyingPeriodLocationHistory + { + $this->period = $period; + + return $this; + } + + public function setPersonLocation(?Person $personLocation): AccompanyingPeriodLocationHistory + { + $this->personLocation = $personLocation; + + return $this; + } + + public function setStartDate(?DateTimeImmutable $startDate): AccompanyingPeriodLocationHistory + { + $this->startDate = $startDate; + + return $this; + } +} diff --git a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriodParticipation.php b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriodParticipation.php index 42e57185e..161f5c316 100644 --- a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriodParticipation.php +++ b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriodParticipation.php @@ -66,6 +66,7 @@ class AccompanyingPeriodParticipation $this->startDate = new DateTime('now'); $this->accompanyingPeriod = $accompanyingPeriod; $this->person = $person; + $person->getAccompanyingPeriodParticipations()->add($this); } public function getAccompanyingPeriod(): ?AccompanyingPeriod diff --git a/src/Bundle/ChillPersonBundle/Entity/Household/Household.php b/src/Bundle/ChillPersonBundle/Entity/Household/Household.php index ef718bc2e..2620ed19a 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Household/Household.php +++ b/src/Bundle/ChillPersonBundle/Entity/Household/Household.php @@ -106,19 +106,13 @@ class Household $this->compositions = new ArrayCollection(); } - /** - * @return $this - */ - public function addAddress(Address $address) + public function addAddress(Address $address): self { - foreach ($this->getAddresses() as $a) { - if ($a->getValidFrom() <= $address->getValidFrom() && $a->getValidTo() === null) { - $a->setValidTo($address->getValidFrom()); - } + if (!$this->addresses->contains($address)) { + $this->addresses[] = $address; + $this->makeAddressConsistent(); } - $this->addresses[] = $address; - return $this; } @@ -157,6 +151,31 @@ class Household return $this->addresses; } + public function getAddressesOrdered(): array + { + $addresses = $this->getAddresses()->toArray(); + usort($addresses, static function (Address $a, Address $b) { + $validFromA = $a->getValidFrom()->format('Y-m-d'); + $validFromB = $b->getValidFrom()->format('Y-m-d'); + + if ($a === $b) { + if (null === $a->getId()) { + return 1; + } + + if (null === $b->getId()) { + return -1; + } + + return $a->getId() <=> $b->getId(); + } + + return $validFromA <=> $validFromB; + }); + + return $addresses; + } + public function getCommentMembers(): CommentEmbeddable { return $this->commentMembers; @@ -339,7 +358,7 @@ class Household $membership->getEndDate() )->filter( static function (HouseholdMember $m) use ($membership) { - return $m !== $membership; + return $m->getPerson() !== $membership->getPerson(); } ); } @@ -358,24 +377,25 @@ class Household public function getMembersOnRange(DateTimeImmutable $from, ?DateTimeImmutable $to): Collection { - $criteria = new Criteria(); - $expr = Criteria::expr(); + return $this->getMembers()->filter(static function (HouseholdMember $m) use ($from, $to) { + if (null === $m->getEndDate() && null !== $to) { + return $m->getStartDate() <= $to; + } - $criteria->where( - $expr->gte('startDate', $from) - ); + if (null === $to) { + return $m->getStartDate() >= $from || null === $m->getEndDate(); + } - if (null !== $to) { - $criteria->andWhere( - $expr->orX( - $expr->lte('endDate', $to), - $expr->eq('endDate', null) - ), - ); - } + if (null !== $m->getEndDate() && $m->getEndDate() < $from) { + return false; + } - return $this->getMembers() - ->matching($criteria); + if ($m->getStartDate() <= $to) { + return true; + } + + return false; + }); } public function getNonCurrentMembers(?DateTimeImmutable $now = null): Collection @@ -418,6 +438,25 @@ class Household return $this->getNonCurrentMembers($now)->matching($criteria); } + public function getPreviousAddressOf(Address $address): ?Address + { + $iterator = new ArrayIterator($this->getAddressesOrdered()); + $iterator->rewind(); + + while ($iterator->valid()) { + $current = $iterator->current(); + $iterator->next(); + + if ($iterator->valid()) { + if ($iterator->current() === $address) { + return $current; + } + } + } + + return null; + } + public function getWaitingForBirth(): bool { return $this->waitingForBirth; @@ -462,6 +501,23 @@ class Household } while ($iterator->valid()); } + public function makeAddressConsistent(): void + { + $iterator = new ArrayIterator($this->getAddressesOrdered()); + + $iterator->rewind(); + + while ($iterator->valid()) { + $current = $iterator->current(); + + $iterator->next(); + + if ($iterator->valid()) { + $current->setValidTo($iterator->current()->getValidFrom()); + } + } + } + public function removeAddress(Address $address) { $this->addresses->removeElement($address); diff --git a/src/Bundle/ChillPersonBundle/Entity/Person.php b/src/Bundle/ChillPersonBundle/Entity/Person.php index e908dc489..49f7ae297 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person.php @@ -930,6 +930,8 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI /** * Get current accompanyingPeriods array. + * + * @return AccompanyingPeriod[]|array */ public function getCurrentAccompanyingPeriods(): array { diff --git a/src/Bundle/ChillPersonBundle/Event/Person/PersonAddressMoveEvent.php b/src/Bundle/ChillPersonBundle/Event/Person/PersonAddressMoveEvent.php new file mode 100644 index 000000000..2f4a1a92e --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Event/Person/PersonAddressMoveEvent.php @@ -0,0 +1,209 @@ +person = $person; + } + + /** + * Get the date of the move. + * + * It might be either: + * + * * the date of the new membership; + * * or the date of the move + * * or the date when the household leaving take place (the end date of the previous membership) + */ + public function getMoveDate(): DateTimeImmutable + { + if ($this->personLeaveWithoutHousehold()) { + return $this->getPreviousMembership()->getEndDate(); + } + + if ($this->personChangeHousehold()) { + return $this->getNextMembership()->getStartDate(); + } + + // person is changing address without household + return DateTimeImmutable::createFromMutable($this->getNextAddress()->getValidFrom()); + } + + public function getNextAddress(): ?Address + { + if (null !== $this->getNextMembership()) { + return $this->getNextMembership()->getHousehold() + ->getCurrentAddress( + $this->getMoveDate() === null ? null : + DateTime::createFromImmutable($this->getMoveDate()) + ); + } + + return $this->nextAddress; + } + + public function getNextHousehold(): ?Household + { + if (null !== $nextMembership = $this->getNextMembership()) { + return $nextMembership->getHousehold(); + } + + return null; + } + + public function getNextMembership(): ?HouseholdMember + { + return $this->nextMembership; + } + + public function getPerson(): Person + { + return $this->person; + } + + public function getPreviousAddress(): ?Address + { + if (null !== $this->getPreviousMembership()) { + return $this->getPreviousMembership()->getHousehold() + ->getCurrentAddress( + null === $this->getMoveDate() ? null : + DateTime::createFromImmutable($this->getMoveDate()) + ); + } + + return $this->previousAddress; + } + + public function getPreviousHousehold(): ?Household + { + if (null !== $previousMembership = $this->getPreviousMembership()) { + return $previousMembership->getHousehold(); + } + + return null; + } + + public function getPreviousMembership(): ?HouseholdMember + { + return $this->previousMembership; + } + + public function personChangeAddress(): bool + { + return $this->getPreviousAddress() !== $this->getNextAddress(); + } + + /** + * Return true if the user change household (this include the fact that a person + * leave household without a new one). + */ + public function personChangeHousehold(): bool + { + return $this->getPreviousHousehold() !== $this->getNextHousehold(); + } + + public function personLeaveWithoutHousehold(): bool + { + return null === $this->getNextMembership() + && null === $this->getNextAddress(); + } + + public function setNextAddress(?Address $nextAddress): PersonAddressMoveEvent + { + $this->nextAddress = $nextAddress; + + return $this; + } + + public function setNextMembership(?HouseholdMember $nextMembership): PersonAddressMoveEvent + { + $this->nextMembership = $nextMembership; + + return $this; + } + + public function setPreviousAddress(?Address $previousAddress): PersonAddressMoveEvent + { + $this->previousAddress = $previousAddress; + + return $this; + } + + public function setPreviousMembership(?HouseholdMember $previousMembership): PersonAddressMoveEvent + { + $this->previousMembership = $previousMembership; + + return $this; + } + + /** + * Will the change affect this date ? + */ + public function willChangeBeActiveAt(DateTimeImmutable $date): bool + { + if ($this->getMoveDate() < $date && $this->personLeaveWithoutHousehold()) { + return true; + } + + if ($this->personChangeHousehold()) { + if ($this->getMoveDate() > $date) { + return false; + } + + if (null === $this->getNextMembership()->getEndDate()) { + return true; + } + + if ($this->getNextMembership()->getEndDate() > $date) { + return true; + } + } else { + if ($this->getNextAddress()->getValidFrom() > $date) { + return false; + } + + if (null === $this->getNextAddress()->getValidTo()) { + return true; + } + + if ($this->getNextAddress()->getValidTo() > $date) { + return true; + } + } + + return false; + } +} diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/CountryOfBirthAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/CountryOfBirthAggregator.php index 9126542ad..69cb05882 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/CountryOfBirthAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/CountryOfBirthAggregator.php @@ -20,8 +20,8 @@ use Doctrine\ORM\QueryBuilder; use LogicException; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Context\ExecutionContextInterface; +use Symfony\Contracts\Translation\TranslatorInterface; final class CountryOfBirthAggregator implements AggregatorInterface, ExportElementValidatedInterface { diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/GenderAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/GenderAggregator.php index d40f0e739..fc8da07da 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/GenderAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/GenderAggregator.php @@ -17,7 +17,7 @@ use Chill\PersonBundle\Export\Declarations; use Doctrine\ORM\QueryBuilder; use LogicException; use Symfony\Component\Form\FormBuilderInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; final class GenderAggregator implements AggregatorInterface { diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/NationalityAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/NationalityAggregator.php index 05a0baa05..312416367 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/NationalityAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/NationalityAggregator.php @@ -20,8 +20,8 @@ use Doctrine\ORM\QueryBuilder; use LogicException; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Context\ExecutionContextInterface; +use Symfony\Contracts\Translation\TranslatorInterface; final class NationalityAggregator implements AggregatorInterface, ExportElementValidatedInterface { diff --git a/src/Bundle/ChillPersonBundle/Export/Export/ListPerson.php b/src/Bundle/ChillPersonBundle/Export/Export/ListPerson.php index 4528f1c92..9f9c90da0 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/ListPerson.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/ListPerson.php @@ -29,9 +29,9 @@ use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\DateType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Security\Core\Role\Role; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Constraints\Callback; use Symfony\Component\Validator\Context\ExecutionContextInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function addcslashes; use function array_key_exists; diff --git a/src/Bundle/ChillPersonBundle/Export/Export/ListPersonDuplicate.php b/src/Bundle/ChillPersonBundle/Export/Export/ListPersonDuplicate.php index d82c8b0aa..bbc0dd220 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/ListPersonDuplicate.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/ListPersonDuplicate.php @@ -24,8 +24,8 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\ResponseHeaderBag; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Role\Role; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Context\ExecutionContextInterface; +use Symfony\Contracts\Translation\TranslatorInterface; /** * Render a list of duplicate peoples. @@ -67,7 +67,7 @@ class ListPersonDuplicate implements DirectExportInterface, ExportElementValidat $this->translator = $translator; $this->router = $router; $this->baseUrl = $routeParameters['scheme'] . - '://' . $routeParameters['host']; + '://' . $routeParameters['host']; } public function buildForm(FormBuilderInterface $builder) diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/GenderFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/GenderFilter.php index a1adee826..edc2e3bb5 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/GenderFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/GenderFilter.php @@ -18,8 +18,8 @@ use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Context\ExecutionContextInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_filter; use function count; diff --git a/src/Bundle/ChillPersonBundle/Form/PersonType.php b/src/Bundle/ChillPersonBundle/Form/PersonType.php index bafe21277..3e809ad49 100644 --- a/src/Bundle/ChillPersonBundle/Form/PersonType.php +++ b/src/Bundle/ChillPersonBundle/Form/PersonType.php @@ -12,11 +12,11 @@ declare(strict_types=1); namespace Chill\PersonBundle\Form; use Chill\CustomFieldsBundle\Form\Type\CustomFieldType; -use Chill\MainBundle\Entity\Civility; use Chill\MainBundle\Form\Type\ChillCollectionType; use Chill\MainBundle\Form\Type\ChillDateType; use Chill\MainBundle\Form\Type\ChillTextareaType; use Chill\MainBundle\Form\Type\CommentType; +use Chill\MainBundle\Form\Type\PickCivilityType; use Chill\MainBundle\Form\Type\Select2CountryType; use Chill\MainBundle\Form\Type\Select2LanguageType; use Chill\MainBundle\Templating\TranslatableStringHelper; @@ -27,9 +27,6 @@ use Chill\PersonBundle\Form\Type\GenderType; use Chill\PersonBundle\Form\Type\PersonAltNameType; use Chill\PersonBundle\Form\Type\PersonPhoneType; use Chill\PersonBundle\Form\Type\Select2MaritalStatusType; -use Doctrine\ORM\EntityRepository; -use Doctrine\ORM\QueryBuilder; -use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\CallbackTransformer; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; @@ -190,19 +187,10 @@ class PersonType extends AbstractType if ('visible' === $this->config['civility']) { $builder - ->add('civility', EntityType::class, [ - 'label' => 'Civility', - 'class' => Civility::class, - 'choice_label' => function (Civility $civility): string { - return $this->translatableStringHelper->localize($civility->getName()); - }, - 'query_builder' => static function (EntityRepository $er): QueryBuilder { - return $er->createQueryBuilder('c') - ->where('c.active = true') - ->orderBy('c.order'); - }, - 'placeholder' => 'choose civility', + ->add('civility', PickCivilityType::class, [ 'required' => false, + 'label' => 'Civility', + 'placeholder' => 'choose civility', ]); } diff --git a/src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php b/src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php index 55d242f2d..1bc2d5e14 100644 --- a/src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php +++ b/src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php @@ -27,7 +27,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Exception\AccessDeniedException; use Symfony\Component\Security\Core\Role\Role; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function in_array; use function is_array; diff --git a/src/Bundle/ChillPersonBundle/Household/MembersEditor.php b/src/Bundle/ChillPersonBundle/Household/MembersEditor.php index adc97a4ac..e327efbab 100644 --- a/src/Bundle/ChillPersonBundle/Household/MembersEditor.php +++ b/src/Bundle/ChillPersonBundle/Household/MembersEditor.php @@ -15,13 +15,14 @@ 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; use DateTimeImmutable; use Doctrine\Common\Collections\Criteria; use LogicException; use Symfony\Component\Validator\ConstraintViolationList; use Symfony\Component\Validator\ConstraintViolationListInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; - +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use function in_array; use function spl_object_hash; @@ -33,6 +34,10 @@ class MembersEditor public const VALIDATION_GROUP_CREATED = 'household_memberships_created'; + private EventDispatcherInterface $eventDispatcher; + + private array $events = []; + private ?Household $household = null; private array $membershipsAffected = []; @@ -43,10 +48,11 @@ class MembersEditor private ValidatorInterface $validator; - public function __construct(ValidatorInterface $validator, ?Household $household) + public function __construct(ValidatorInterface $validator, ?Household $household, EventDispatcherInterface $eventDispatcher) { $this->validator = $validator; $this->household = $household; + $this->eventDispatcher = $eventDispatcher; } public function addMovement(DateTimeImmutable $date, Person $person, Position $position, ?bool $holder = false, ?string $comment = null): self @@ -55,6 +61,8 @@ class MembersEditor throw new LogicException('You must define a household first'); } + $event = new PersonAddressMoveEvent($person); + $membership = (new HouseholdMember()) ->setStartDate($date) ->setPerson($person) @@ -62,6 +70,7 @@ class MembersEditor ->setHolder($holder) ->setComment($comment); $this->household->addMember($membership); + $event->setNextMembership($membership); if ($position->getShareHousehold()) { foreach ($person->getHouseholdParticipationsShareHousehold() as $participation) { @@ -74,6 +83,7 @@ class MembersEditor } if ($participation->getEndDate() === null || $participation->getEndDate() > $date) { + $event->setPreviousMembership($participation); $participation->setEndDate($date); $this->membershipsAffected[] = $participation; $this->oldMembershipsHashes[] = spl_object_hash($participation); @@ -92,6 +102,7 @@ class MembersEditor $this->membershipsAffected[] = $membership; $this->persistables[] = $membership; + $this->events[] = $event; return $this; } @@ -129,6 +140,8 @@ class MembersEditor ->matching($criteria); foreach ($participations as $participation) { + $this->events[] = $event = new PersonAddressMoveEvent($person); + $event->setPreviousMembership($participation); $participation->setEndDate($date); $this->membershipsAffected[] = $participation; } @@ -136,6 +149,13 @@ class MembersEditor return $this; } + public function postMove(): void + { + foreach ($this->events as $event) { + $this->eventDispatcher->dispatch($event); + } + } + public function validate(): ConstraintViolationListInterface { if ($this->hasHousehold()) { diff --git a/src/Bundle/ChillPersonBundle/Household/MembersEditorFactory.php b/src/Bundle/ChillPersonBundle/Household/MembersEditorFactory.php index a26841064..7d1b19d51 100644 --- a/src/Bundle/ChillPersonBundle/Household/MembersEditorFactory.php +++ b/src/Bundle/ChillPersonBundle/Household/MembersEditorFactory.php @@ -13,16 +13,24 @@ namespace Chill\PersonBundle\Household; use Chill\PersonBundle\Entity\Household\Household; use Symfony\Component\Validator\Validator\ValidatorInterface; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; class MembersEditorFactory { - public function __construct(ValidatorInterface $validator) - { + private EventDispatcherInterface $eventDispatcher; + + private ValidatorInterface $validator; + + public function __construct( + EventDispatcherInterface $eventDispatcher, + ValidatorInterface $validator + ) { $this->validator = $validator; + $this->eventDispatcher = $eventDispatcher; } public function createEditor(?Household $household = null): MembersEditor { - return new MembersEditor($this->validator, $household); + return new MembersEditor($this->validator, $household, $this->eventDispatcher); } } diff --git a/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php b/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php index 16422f47c..c540c133c 100644 --- a/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php +++ b/src/Bundle/ChillPersonBundle/Menu/PersonMenuBuilder.php @@ -72,6 +72,16 @@ class PersonMenuBuilder implements LocalMenuBuilderInterface 'order' => 60, ]); + $menu->addChild($this->translator->trans('person_resources_menu'), [ + 'route' => 'chill_person_resource_list', + 'routeParameters' => [ + 'person_id' => $parameters['person']->getId(), + ], + ]) + ->setExtras([ + 'order' => 70, + ]); + $menu->addChild($this->translator->trans('household.person history'), [ 'route' => 'chill_person_household_person_history', 'routeParameters' => [ @@ -106,16 +116,6 @@ class PersonMenuBuilder implements LocalMenuBuilderInterface 'order' => 100, ]); } - - $menu->addChild($this->translator->trans('person_resources_menu'), [ - 'route' => 'chill_person_resource_list', - 'routeParameters' => [ - 'person_id' => $parameters['person']->getId(), - ], - ]) - ->setExtras([ - 'order' => 99999, - ]); } public static function getMenuIds(): array diff --git a/src/Bundle/ChillPersonBundle/Menu/SectionMenuBuilder.php b/src/Bundle/ChillPersonBundle/Menu/SectionMenuBuilder.php index eff2e7a3a..04f989d84 100644 --- a/src/Bundle/ChillPersonBundle/Menu/SectionMenuBuilder.php +++ b/src/Bundle/ChillPersonBundle/Menu/SectionMenuBuilder.php @@ -15,7 +15,7 @@ use Chill\MainBundle\Routing\LocalMenuBuilderInterface; use Chill\PersonBundle\Security\Authorization\PersonVoter; use Knp\Menu\MenuItem; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; /** * Class SectionMenuBuilder. diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Resources/ResourceItem.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Resources/ResourceItem.vue index ffaa3b92f..35b7fcbd6 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Resources/ResourceItem.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Resources/ResourceItem.vue @@ -167,6 +167,7 @@ export default { }) } else if (payload.type === 'thirdparty') { + console.log('data', payload.data) body.name = payload.data.text; body.email = payload.data.email; body.telephone = payload.data.phonenumber; diff --git a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriod/notification_location_user_on_period_has_moved.fr.txt.twig b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriod/notification_location_user_on_period_has_moved.fr.txt.twig new file mode 100644 index 000000000..e4509d78a --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriod/notification_location_user_on_period_has_moved.fr.txt.twig @@ -0,0 +1,22 @@ +{# + content of the notification if the person move and the person "localize" the period +#}{{ period.user.label }}, + +L'usager {{ oldPersonLocation|chill_entity_render_string }} a déménagé. + +Son adresse était utilisée pour localiser le parcours n°{{ period.id }}, dont vous êtes +le référent. + +En conséquence de ce déménage, le parcours est toujours localisé à cette adresse, mais à l'aide d'une +adresse temporaire. + +Si vous continuez à suivre le parcours, vous pouvez le localiser à nouveau auprès de l'adresse de +l'usager {{ oldPersonLocation|chill_entity_render_string }}. + +Sinon, veillez à vous assurer de la continuité du suivi par vos collègues. + +Pour visualiser le parcours, cliquez ici: + +{{ absolute_url(path('chill_person_accompanying_course_index', {'accompanying_period_id': period.id})) }} + +Cordialement, diff --git a/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/Events/PersonMoveEventSubscriberTest.php b/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/Events/PersonMoveEventSubscriberTest.php new file mode 100644 index 000000000..321d69aac --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/Events/PersonMoveEventSubscriberTest.php @@ -0,0 +1,290 @@ +setStep(AccompanyingPeriod::STEP_CONFIRMED) + ->setPersonLocation($person) + ->addPerson($person); + $this->forceIdToPeriod($period); + + $previousHousehold = (new Household())->addAddress( + (new Address())->setValidFrom(new DateTime('1 year ago')) + ); + $previousMembership = new HouseholdMember(); + $previousMembership + ->setPerson($person) + ->setHousehold($previousHousehold) + ->setStartDate(new DateTimeImmutable('1 year ago')) + ->setEndDate(new DateTimeImmutable('tomorrow')); + + $nextHousehold = (new Household())->addAddress( + (new Address())->setValidFrom(new DateTime('tomorrow')) + ); + $nextMembership = new HouseholdMember(); + $nextMembership + ->setPerson($person) + ->setHousehold($nextHousehold) + ->setStartDate(new DateTimeImmutable('tomorrow')); + + $event = new PersonAddressMoveEvent($person); + $event + ->setPreviousMembership($previousMembership) + ->setNextMembership($nextMembership); + + $em = $this->prophesize(EntityManagerInterface::class); + $em->persist(Argument::type(Notification::class))->shouldNotBeCalled(); + $eventSubscriber = $this->buildSubscriber(null, $em->reveal(), null, null); + + $eventSubscriber->resetPeriodLocation($event); + } + + public function testEventChangeHouseholdNotification() + { + $person = new Person(); + $period = new AccompanyingPeriod(); + $period + ->setStep(AccompanyingPeriod::STEP_CONFIRMED) + ->setPersonLocation($person) + ->addPerson($person) + ->setUser(new User()); + $this->forceIdToPeriod($period); + + $previousHousehold = (new Household())->addAddress( + ($previousAddress = new Address())->setValidFrom(new DateTime('1 year ago')) + ); + $previousMembership = new HouseholdMember(); + $previousMembership + ->setPerson($person) + ->setHousehold($previousHousehold) + ->setStartDate(new DateTimeImmutable('1 year ago')) + ->setEndDate(new DateTimeImmutable('tomorrow')); + + $nextHousehold = (new Household())->addAddress( + (new Address())->setValidFrom(new DateTime('tomorrow')) + ); + $nextMembership = new HouseholdMember(); + $nextMembership + ->setPerson($person) + ->setHousehold($nextHousehold) + ->setStartDate(new DateTimeImmutable('tomorrow')); + + $event = new PersonAddressMoveEvent($person); + $event + ->setPreviousMembership($previousMembership) + ->setNextMembership($nextMembership); + + $em = $this->prophesize(EntityManagerInterface::class); + $em->persist(Argument::type(Notification::class))->shouldBeCalledTimes(1); + $eventSubscriber = $this->buildSubscriber(null, $em->reveal(), null, null); + + $eventSubscriber->resetPeriodLocation($event); + + $this->assertNotNull($period->getAddressLocation()); + $this->assertNull($period->getPersonLocation()); + } + + public function testEventChangeHouseholdNotificationForPeriodChangeLocationOfPersonAnteriorToCurrentLocationHistory() + { + $person = new Person(); + $period = new AccompanyingPeriod(); + $period + ->setStep(AccompanyingPeriod::STEP_CONFIRMED) + ->setPersonLocation($person) + ->setUser(new User()) + ->addPerson($person); + $this->forceIdToPeriod($period); + + $previousHousehold = (new Household())->addAddress( + ($previousAddress = new Address())->setValidFrom(new DateTime('1 year ago')) + ); + $previousMembership = new HouseholdMember(); + $previousMembership + ->setPerson($person) + ->setHousehold($previousHousehold) + ->setStartDate(new DateTimeImmutable('1 year ago')) + ->setEndDate(new DateTimeImmutable('tomorrow')); + + $nextHousehold = (new Household())->addAddress( + (new Address())->setValidFrom(new DateTime('1 month ago')) + ); + $nextMembership = new HouseholdMember(); + $nextMembership + ->setPerson($person) + ->setHousehold($nextHousehold) + ->setStartDate(new DateTimeImmutable('1 month ago')); + + $event = new PersonAddressMoveEvent($person); + $event + ->setPreviousMembership($previousMembership) + ->setNextMembership($nextMembership); + + $em = $this->prophesize(EntityManagerInterface::class); + $em->persist(Argument::type(Notification::class))->shouldBeCalled(1); + $eventSubscriber = $this->buildSubscriber(null, $em->reveal(), null, null); + + $eventSubscriber->resetPeriodLocation($event); + + $this->assertNotNull($period->getAddressLocation()); + $this->assertNull($period->getPersonLocation()); + } + + public function testEventLeaveNotification() + { + $person = new Person(); + $period = new AccompanyingPeriod(); + $period + ->setStep(AccompanyingPeriod::STEP_CONFIRMED) + ->setPersonLocation($person) + ->addPerson($person) + ->setUser(new User()); + $this->forceIdToPeriod($period); + + $previousHousehold = (new Household())->addAddress( + ($previousAddress = new Address())->setValidFrom(new DateTime('1 year ago')) + ); + $previousMembership = new HouseholdMember(); + $previousMembership + ->setPerson($person) + ->setHousehold($previousHousehold) + ->setStartDate(new DateTimeImmutable('1 year ago')) + ->setEndDate(new DateTimeImmutable('tomorrow')); + + $event = new PersonAddressMoveEvent($person); + $event + ->setPreviousMembership($previousMembership); + + $em = $this->prophesize(EntityManagerInterface::class); + $em->persist(Argument::type(Notification::class))->shouldBeCalledTimes(1); + $eventSubscriber = $this->buildSubscriber(null, $em->reveal(), null, null); + + $eventSubscriber->resetPeriodLocation($event); + + $this->assertNotNull($period->getAddressLocation()); + $this->assertNull($period->getPersonLocation()); + } + + public function testEventPersonChangeAddressInThePast() + { + $person = new Person(); + $period = new AccompanyingPeriod(); + $period + ->setStep(AccompanyingPeriod::STEP_CONFIRMED) + ->setPersonLocation($person) + ->addPerson($person) + ->setUser(new User()); + $this->forceIdToPeriod($period); + + $membership = new HouseholdMember(); + $membership + ->setPerson($person) + ->setHousehold($household = new Household()) + ->setStartDate(new DateTimeImmutable('1 year ago')); + + $previousAddress = new Address(); + $previousAddress->setValidFrom(new DateTime('6 months ago')); + $household->addAddress($previousAddress); + + $newAddress = new Address(); + $newAddress->setValidFrom(new DateTime('tomorrow')); + $household->addAddress($newAddress); + + $event = new PersonAddressMoveEvent($person); + $event + ->setPreviousAddress($household->getPreviousAddressOf($newAddress)) + ->setNextAddress($newAddress); + + $em = $this->prophesize(EntityManagerInterface::class); + $em->persist(Argument::type(Notification::class))->shouldBeCalledTimes(1); + $eventSubscriber = $this->buildSubscriber(null, $em->reveal(), null, null); + + $eventSubscriber->resetPeriodLocation($event); + + $this->assertNotNull($period->getAddressLocation()); + $this->assertNull($period->getPersonLocation()); + } + + private function buildSubscriber( + ?EngineInterface $engine = null, + ?EntityManagerInterface $entityManager = null, + ?Security $security = null, + ?TranslatorInterface $translator = null + ): PersonAddressMoveEventSubscriber { + if (null === $translator) { + $double = $this->prophesize(TranslatorInterface::class); + $translator = $double->reveal(); + } + + if (null === $security) { + $double = $this->prophesize(Security::class); + $double->getUser()->willReturn(new User()); + $security = $double->reveal(); + } + + if (null === $engine) { + $double = $this->prophesize(EngineInterface::class); + $engine = $double->reveal(); + } + + if (null === $entityManager) { + $double = $this->prophesize(EntityManagerInterface::class); + $entityManager = $double->reveal(); + } + + return new PersonAddressMoveEventSubscriber( + $engine, + $entityManager, + $security, + $translator + ); + } + + private function forceIdToPeriod(AccompanyingPeriod $period): void + { + $reflectionClass = new ReflectionClass($period); + $property = $reflectionClass->getProperty('id'); + $property->setAccessible(true); + $property->setValue($period, 0); + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php b/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php index 6c78d817d..1db356018 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php @@ -11,6 +11,8 @@ declare(strict_types=1); namespace Chill\PersonBundle\Tests\Entity; +use ArrayIterator; +use Chill\MainBundle\Entity\Address; use Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\PersonBundle\Entity\AccompanyingPeriod\Comment; use Chill\PersonBundle\Entity\AccompanyingPeriodParticipation; @@ -60,6 +62,62 @@ final class AccompanyingPeriodTest extends \PHPUnit\Framework\TestCase $this->assertFalse($period->isClosingAfterOpening()); } + public function testHistoryLocation() + { + $period = new AccompanyingPeriod(); + $person = new Person(); + $address = new Address(); + + $period->setPersonLocation($person); + + $this->assertCount(0, $period->getLocationHistories()); + + $period->setAddressLocation($address); + $period->setPersonLocation(null); + + $this->assertCount(0, $period->getLocationHistories()); + + $period->setStep(AccompanyingPeriod::STEP_CONFIRMED); + + $this->assertCount(1, $period->getLocationHistories()); + + $this->assertSame($address, $period->getLocationHistories()->first()->getAddressLocation()); + + $period->setPersonLocation($person); + $period->setAddressLocation(null); + + $this->assertCount(2, $period->getLocationHistories()); + $this->assertSame($person, $period->getLocationHistories()->last()->getPersonLocation()); + + $period->setAddressLocation($address); + $period->setPersonLocation(null); + + $this->assertCount(3, $period->getLocationHistories()); + + $locations = $period->getLocationHistories()->toArray(); + + usort($locations, static function (AccompanyingPeriod\AccompanyingPeriodLocationHistory $a, AccompanyingPeriod\AccompanyingPeriodLocationHistory $b) { + return $a->getStartDate() <=> $b->getStartDate(); + }); + + $iterator = new ArrayIterator($locations); + $iterator->rewind(); + + do { + $current = $iterator->current(); + + $iterator->next(); + + if ($iterator->valid()) { + $next = $iterator->current(); + $this->assertNotNull($current->getEndDate()); + $this->assertEquals($current->getEndDate(), $next->getStartDate()); + } else { + $this->assertNull($current->getEndDate()); + } + } while ($iterator->valid()); + } + public function testIsClosed() { $period = new AccompanyingPeriod(new DateTime()); diff --git a/src/Bundle/ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php b/src/Bundle/ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php index f63c12a2c..6799f882b 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Entity/Household/HouseholdTest.php @@ -11,8 +11,12 @@ declare(strict_types=1); namespace Entity\Household; +use Chill\MainBundle\Entity\Address; use Chill\PersonBundle\Entity\Household\Household; use Chill\PersonBundle\Entity\Household\HouseholdComposition; +use Chill\PersonBundle\Entity\Household\HouseholdMember; +use Chill\PersonBundle\Entity\Person; +use DateTime; use DateTimeImmutable; use PHPUnit\Framework\TestCase; @@ -22,6 +26,90 @@ use PHPUnit\Framework\TestCase; */ final class HouseholdTest extends TestCase { + public function testGetMembersOnRange() + { + $household = new Household(); + + $household->addMember($householdMemberA = (new HouseholdMember()) + ->setStartDate(new DateTimeImmutable('2020-01-01')) + ->setEndDate(new DateTimeImmutable('2020-12-31')) + ->setPerson(new Person())); + $household->addMember($householdMemberB = (new HouseholdMember()) + ->setStartDate(new DateTimeImmutable('2020-06-01')) + ->setEndDate(new DateTimeImmutable('2021-06-31')) + ->setPerson(new Person())); + $household->addMember($householdMemberC = (new HouseholdMember()) + ->setStartDate(new DateTimeImmutable('2021-01-01')) + ->setEndDate(null) + ->setPerson(new Person())); + + $members = $household->getMembersOnRange(new DateTimeImmutable('2019-01-01'), null); + + $this->assertCount(3, $members); + $this->assertContains($householdMemberA, $members); + $this->assertContains($householdMemberB, $members); + $this->assertContains($householdMemberC, $members); + + $members = $household->getMembersOnRange(new DateTimeImmutable('2020-01-01'), new DateTimeImmutable('2020-07-01')); + $this->assertCount(2, $members); + $this->assertContains($householdMemberA, $members); + $this->assertContains($householdMemberB, $members); + $this->assertNotContains($householdMemberC, $members); + + $members = $household->getMembersOnRange(new DateTimeImmutable('2020-01-01'), new DateTimeImmutable('2022-12-31')); + $this->assertCount(3, $members); + $this->assertContains($householdMemberA, $members); + $this->assertContains($householdMemberB, $members); + $this->assertContains($householdMemberC, $members); + + $members = $household->getMembersOnRange(new DateTimeImmutable('2021-01-01'), new DateTimeImmutable('2022-12-31')); + $this->assertCount(2, $members); + $this->assertNotContains($householdMemberA, $members); + $this->assertContains($householdMemberB, $members); + $this->assertContains($householdMemberC, $members); + } + + public function testHouseholdAddressConsistent() + { + $household = new Household(); + + $lastAddress = new Address(); + $lastAddress->setValidFrom($yesterday = new DateTime('yesterday')); + $household->addAddress($lastAddress); + + $this->assertNull($lastAddress->getValidTo()); + $this->assertEquals($yesterday, $lastAddress->getValidFrom()); + + $previousAddress = new Address(); + $previousAddress->setValidFrom($oneMonthAgo = new DateTime('1 month ago')); + $household->addAddress($previousAddress); + + $addresses = $household->getAddressesOrdered(); + $this->assertSame($previousAddress, $addresses[0]); + $this->assertSame($lastAddress, $addresses[1]); + + $this->assertEquals($oneMonthAgo, $previousAddress->getValidFrom()); + $this->assertEquals($yesterday, $previousAddress->getValidTo()); + $this->assertEquals($yesterday, $lastAddress->getValidFrom()); + $this->assertNull($lastAddress->getValidTo()); + + $futureAddress = new Address(); + $futureAddress->setValidFrom($tomorrow = new DateTime('tomorrow')); + $household->addAddress($futureAddress); + + $addresses = $household->getAddressesOrdered(); + $this->assertSame($previousAddress, $addresses[0]); + $this->assertSame($lastAddress, $addresses[1]); + $this->assertSame($futureAddress, $addresses[2]); + + $this->assertEquals($oneMonthAgo, $previousAddress->getValidFrom()); + $this->assertEquals($yesterday, $previousAddress->getValidTo()); + $this->assertEquals($yesterday, $lastAddress->getValidFrom()); + $this->assertEquals($tomorrow, $lastAddress->getValidTo()); + $this->assertEquals($tomorrow, $futureAddress->getValidFrom()); + $this->assertNull($futureAddress->getValidTo()); + } + public function testHouseholdComposition() { $household = new Household(); diff --git a/src/Bundle/ChillPersonBundle/Tests/Event/Person/PersonAddressMoveEventTest.php b/src/Bundle/ChillPersonBundle/Tests/Event/Person/PersonAddressMoveEventTest.php new file mode 100644 index 000000000..65d10f68a --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Event/Person/PersonAddressMoveEventTest.php @@ -0,0 +1,118 @@ +addAddress( + ($previousAddress = new Address())->setValidFrom(new DateTime('1 year ago')) + ); + $household->addAddress( + ($nextAddress = new Address())->setValidFrom(new DateTime('1 month ago')) + ); + $member = new HouseholdMember(); + $member + ->setPerson($person) + ->setHousehold($household) + ->setStartDate(new DateTimeImmutable('1 year ago')) + ->setEndDate(new DateTimeImmutable('tomorrow')); + + $event = new PersonAddressMoveEvent($person); + $event + ->setPreviousAddress($previousAddress) + ->setNextAddress($nextAddress); + + $this->assertSame($previousAddress, $event->getPreviousAddress()); + $this->assertSame($nextAddress, $event->getNextAddress()); + $this->assertEquals((new DateTime('1 month ago'))->format('Y-m-d'), $nextAddress->getValidFrom()->format('Y-m-d')); + $this->assertEquals((new DateTime('1 month ago'))->format('Y-m-d'), $event->getMoveDate()->format('Y-m-d')); + } + + public function testPersonChangeHousehold() + { + $person = new Person(); + + $previousHousehold = (new Household())->addAddress( + ($previousAddress = new Address())->setValidFrom(new DateTime('1 year ago')) + ); + $previousMembership = new HouseholdMember(); + $previousMembership + ->setPerson($person) + ->setHousehold($previousHousehold) + ->setStartDate(new DateTimeImmutable('1 year ago')) + ->setEndDate(new DateTimeImmutable('tomorrow')); + + $nextHousehold = (new Household())->addAddress( + ($nextAddress = new Address())->setValidFrom(new DateTime('tomorrow')) + ); + $nextMembership = new HouseholdMember(); + $nextMembership + ->setPerson($person) + ->setHousehold($nextHousehold) + ->setStartDate(new DateTimeImmutable('tomorrow')); + + $event = new PersonAddressMoveEvent($person); + $event + ->setPreviousMembership($previousMembership) + ->setNextMembership($nextMembership); + + $this->assertTrue($event->personChangeHousehold()); + $this->assertSame($previousAddress, $event->getPreviousAddress()); + $this->assertSame($nextAddress, $event->getNextAddress()); + $this->assertTrue($event->personChangeAddress()); + $this->assertFalse($event->personLeaveWithoutHousehold()); + $this->assertEquals(new DateTimeImmutable('tomorrow'), $event->getMoveDate()); + } + + public function testPersonLeaveHousehold() + { + $person = new Person(); + + $previousHousehold = (new Household())->addAddress( + ($previousAddress = new Address())->setValidFrom(new DateTime('1 year ago')) + ); + $previousMembership = new HouseholdMember(); + $previousMembership + ->setPerson($person) + ->setHousehold($previousHousehold) + ->setStartDate(new DateTimeImmutable('1 year ago')) + ->setEndDate(new DateTimeImmutable('tomorrow')); + + $event = new PersonAddressMoveEvent($person); + $event + ->setPreviousMembership($previousMembership); + + $this->assertTrue($event->personChangeHousehold()); + $this->assertSame($previousAddress, $event->getPreviousAddress()); + $this->assertNull($event->getNextAddress()); + $this->assertTrue($event->personChangeAddress()); + $this->assertTrue($event->personLeaveWithoutHousehold()); + $this->assertEquals(new DateTimeImmutable('tomorrow'), $event->getMoveDate()); + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php index f3e1424fb..65199dabf 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php @@ -14,10 +14,14 @@ namespace Chill\PersonBundle\Tests\Household; use Chill\PersonBundle\Entity\Household\Household; use Chill\PersonBundle\Entity\Household\Position; use Chill\PersonBundle\Entity\Person; +use Chill\PersonBundle\Event\Person\PersonAddressMoveEvent; use Chill\PersonBundle\Household\MembersEditorFactory; use DateTimeImmutable; use PHPUnit\Framework\TestCase; +use Prophecy\Argument; +use Prophecy\PhpUnit\ProphecyTrait; use Symfony\Component\Validator\Validator\ValidatorInterface; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use function count; /** @@ -26,13 +30,13 @@ use function count; */ final class MembersEditorTest extends TestCase { + use ProphecyTrait; + private MembersEditorFactory $factory; protected function setUp(): void { - $validator = $this->createMock(ValidatorInterface::class); - - $this->factory = new MembersEditorFactory($validator); + $this->factory = $this->buildMembersEditorFactory(); } public function testMovePersonWithoutSharedHousehold() @@ -121,4 +125,49 @@ final class MembersEditorTest extends TestCase ); $this->assertEquals($date, $membership1->getEndDate()); } + + public function testPostMove() + { + $person = new Person(); + $position = (new Position()) + ->setShareHousehold(false); + $household1 = new Household(); + $household2 = new Household(); + $eventDispatcher = $this->prophesize(EventDispatcherInterface::class); + $eventDispatcher + ->dispatch(Argument::type(PersonAddressMoveEvent::class)) + ->shouldBeCalled(); + $factory = $this->buildMembersEditorFactory( + $eventDispatcher->reveal(), + null + ); + $editor = $factory->createEditor($household1); + + $editor->addMovement(new DateTimeImmutable('now'), $person, $position); + + $editor->postMove(); + } + + private function buildMembersEditorFactory( + ?EventDispatcherInterface $eventDispatcher = null, + ?ValidatorInterface $validator = null + ) { + if (null === $eventDispatcher) { + $double = $this->getProphet()->prophesize(); + $double->willImplement(EventDispatcherInterface::class); + $double->dispatch(Argument::type(PersonAddressMoveEvent::class)); + $eventDispatcher = $double->reveal(); + } + + if (null === $validator) { + $double = $this->getProphet()->prophesize(); + $double->willImplement(ValidatorInterface::class); + $validator = $double->reveal(); + } + + return new MembersEditorFactory( + $eventDispatcher, + $validator + ); + } } diff --git a/src/Bundle/ChillPersonBundle/config/services/controller.yaml b/src/Bundle/ChillPersonBundle/config/services/controller.yaml index f5ead52f7..421e13e93 100644 --- a/src/Bundle/ChillPersonBundle/config/services/controller.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/controller.yaml @@ -25,7 +25,7 @@ services: Chill\PersonBundle\Controller\PersonDuplicateController: arguments: $similarPersonMatcher: '@Chill\PersonBundle\Search\SimilarPersonMatcher' - $translator: '@Symfony\Component\Translation\TranslatorInterface' + $translator: '@Symfony\Contracts\Translation\TranslatorInterface' $personRepository: '@Chill\PersonBundle\Repository\PersonRepository' $personMove: '@Chill\PersonBundle\Actions\Remove\PersonMove' $eventDispatcher: '@Symfony\Component\EventDispatcher\EventDispatcherInterface' diff --git a/src/Bundle/ChillPersonBundle/config/services/fixtures.yaml b/src/Bundle/ChillPersonBundle/config/services/fixtures.yaml index 753521ad7..d4cdcd957 100644 --- a/src/Bundle/ChillPersonBundle/config/services/fixtures.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/fixtures.yaml @@ -8,5 +8,5 @@ services: Chill\PersonBundle\DataFixtures\ORM\LoadCustomFields: arguments: $translatableStringHelper: '@Chill\MainBundle\Templating\TranslatableStringHelper' - $translator: '@Symfony\Component\Translation\TranslatorInterface' + $translator: '@Symfony\Contracts\Translation\TranslatorInterface' tags: [ 'doctrine.fixture.orm' ] diff --git a/src/Bundle/ChillPersonBundle/migrations/Version20220214200327.php b/src/Bundle/ChillPersonBundle/migrations/Version20220214200327.php new file mode 100644 index 000000000..995cb30c7 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/migrations/Version20220214200327.php @@ -0,0 +1,49 @@ +addSql('DROP SEQUENCE chill_person_accompanying_period_location_history_id_seq CASCADE'); + $this->addSql('DROP TABLE chill_person_accompanying_period_location_history'); + } + + public function getDescription(): string + { + return 'Add location history to period'; + } + + public function up(Schema $schema): void + { + $this->addSql('CREATE SEQUENCE chill_person_accompanying_period_location_history_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE chill_person_accompanying_period_location_history (id INT NOT NULL, period_id INT DEFAULT NULL, startDate DATE NOT NULL, endDate DATE DEFAULT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, personLocation_id INT DEFAULT NULL, addressLocation_id INT DEFAULT NULL, createdBy_id INT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_61E4E688EC8B7ADE ON chill_person_accompanying_period_location_history (period_id)'); + $this->addSql('CREATE INDEX IDX_61E4E688D5213D34 ON chill_person_accompanying_period_location_history (personLocation_id)'); + $this->addSql('CREATE INDEX IDX_61E4E6889B07D6BF ON chill_person_accompanying_period_location_history (addressLocation_id)'); + $this->addSql('CREATE INDEX IDX_61E4E6883174800F ON chill_person_accompanying_period_location_history (createdBy_id)'); + $this->addSql('COMMENT ON COLUMN chill_person_accompanying_period_location_history.startDate IS \'(DC2Type:date_immutable)\''); + $this->addSql('COMMENT ON COLUMN chill_person_accompanying_period_location_history.endDate IS \'(DC2Type:date_immutable)\''); + $this->addSql('COMMENT ON COLUMN chill_person_accompanying_period_location_history.createdAt IS \'(DC2Type:datetime_immutable)\''); + $this->addSql('ALTER TABLE chill_person_accompanying_period_location_history ADD CONSTRAINT FK_61E4E688EC8B7ADE FOREIGN KEY (period_id) REFERENCES chill_person_accompanying_period (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE chill_person_accompanying_period_location_history ADD CONSTRAINT FK_61E4E688D5213D34 FOREIGN KEY (personLocation_id) REFERENCES chill_person_person (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE chill_person_accompanying_period_location_history ADD CONSTRAINT FK_61E4E6889B07D6BF FOREIGN KEY (addressLocation_id) REFERENCES chill_main_address (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE chill_person_accompanying_period_location_history ADD CONSTRAINT FK_61E4E6883174800F FOREIGN KEY (createdBy_id) REFERENCES users (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('INSERT INTO chill_person_accompanying_period_location_history (id, period_id, startDate, createdAt, personLocation_id, addresslocation_id) + SELECT nextval(\'chill_person_accompanying_period_location_history_id_seq\'), id, NOW(), NOW(), personlocation_id, addresslocation_id FROM chill_person_accompanying_period WHERE step != \'DRAFT\' + '); + } +} diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 1098729ca..c4d163a16 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -226,7 +226,7 @@ Concerned scopes: Services concernés # person resource -person_resources_menu: "Ressources" +person_resources_menu: "Personnes ressources" Person resources: "Ressources de la personne" Add a person resource: "Ajouter une ressource" edit resource: "Modifier ressource" @@ -548,6 +548,7 @@ period_notification: Persons are: Les usagers concernés sont les suivants Social issues are: Les problématiques sociales renseignées sont les suivantes See it online: Visualisez le parcours en ligne + Person locating period has moved: L'usager qui localise un parcours a déménagé You are getting a notification for a period which does not exists any more: Cette notification ne correspond pas à une période d'accompagnement valide. You are getting a notification for a period you are not allowed to see: La notification fait référence à une période d'accompagnement à laquelle vous n'avez pas accès. diff --git a/src/Bundle/ChillReportBundle/Export/Export/ReportList.php b/src/Bundle/ChillReportBundle/Export/Export/ReportList.php index 1d21fb26f..61224bb39 100644 --- a/src/Bundle/ChillReportBundle/Export/Export/ReportList.php +++ b/src/Bundle/ChillReportBundle/Export/Export/ReportList.php @@ -34,9 +34,9 @@ use LogicException; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Security\Core\Role\Role; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Validator\Constraints\Callback; use Symfony\Component\Validator\Context\ExecutionContextInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_key_exists; use function array_keys; diff --git a/src/Bundle/ChillReportBundle/Export/Export/ReportListProvider.php b/src/Bundle/ChillReportBundle/Export/Export/ReportListProvider.php index f3b829548..ab9726c23 100644 --- a/src/Bundle/ChillReportBundle/Export/Export/ReportListProvider.php +++ b/src/Bundle/ChillReportBundle/Export/Export/ReportListProvider.php @@ -17,7 +17,7 @@ use Chill\MainBundle\Export\ExportElementsProviderInterface; use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\ReportBundle\Entity\Report; use Doctrine\ORM\EntityManagerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class ReportListProvider implements ExportElementsProviderInterface { diff --git a/src/Bundle/ChillReportBundle/config/services/export.yaml b/src/Bundle/ChillReportBundle/config/services/export.yaml index 4b9d7a7e7..1ae624118 100644 --- a/src/Bundle/ChillReportBundle/config/services/export.yaml +++ b/src/Bundle/ChillReportBundle/config/services/export.yaml @@ -3,7 +3,7 @@ services: arguments: $em: '@Doctrine\ORM\EntityManagerInterface' $translatableStringHelper: '@Chill\MainBundle\Templating\TranslatableStringHelper' - $translator: '@Symfony\Component\Translation\TranslatorInterface' + $translator: '@Symfony\Contracts\Translation\TranslatorInterface' $customFieldProvider: '@Chill\CustomFieldsBundle\Service\CustomFieldProvider' tags: - { name: chill.export_elements_provider, prefix: 'report' } diff --git a/src/Bundle/ChillTaskBundle/Controller/TaskController.php b/src/Bundle/ChillTaskBundle/Controller/TaskController.php index 82fe507a2..2acd63bc1 100644 --- a/src/Bundle/ChillTaskBundle/Controller/TaskController.php +++ b/src/Bundle/ChillTaskBundle/Controller/TaskController.php @@ -22,9 +22,9 @@ use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; -use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Workflow\Registry; use Symfony\Component\Workflow\Transition; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_filter; use function array_values; diff --git a/src/Bundle/ChillTaskBundle/Menu/MenuBuilder.php b/src/Bundle/ChillTaskBundle/Menu/MenuBuilder.php index 0ed5125a5..170f3eb54 100644 --- a/src/Bundle/ChillTaskBundle/Menu/MenuBuilder.php +++ b/src/Bundle/ChillTaskBundle/Menu/MenuBuilder.php @@ -16,7 +16,7 @@ use Chill\TaskBundle\Security\Authorization\TaskVoter; use Knp\Menu\MenuItem; use LogicException; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class MenuBuilder implements LocalMenuBuilderInterface { diff --git a/src/Bundle/ChillTaskBundle/Menu/SectionMenuBuilder.php b/src/Bundle/ChillTaskBundle/Menu/SectionMenuBuilder.php index 98d90f75a..69cb6afb6 100644 --- a/src/Bundle/ChillTaskBundle/Menu/SectionMenuBuilder.php +++ b/src/Bundle/ChillTaskBundle/Menu/SectionMenuBuilder.php @@ -15,7 +15,7 @@ use Chill\MainBundle\Routing\LocalMenuBuilderInterface; use Chill\TaskBundle\Security\Authorization\TaskVoter; use Knp\Menu\MenuItem; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class SectionMenuBuilder implements LocalMenuBuilderInterface { diff --git a/src/Bundle/ChillTaskBundle/Menu/UserMenuBuilder.php b/src/Bundle/ChillTaskBundle/Menu/UserMenuBuilder.php index 4296301c9..cdc849d8a 100644 --- a/src/Bundle/ChillTaskBundle/Menu/UserMenuBuilder.php +++ b/src/Bundle/ChillTaskBundle/Menu/UserMenuBuilder.php @@ -17,7 +17,7 @@ use Chill\TaskBundle\Templating\UI\CountNotificationTask; use Knp\Menu\MenuItem; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class UserMenuBuilder implements LocalMenuBuilderInterface { diff --git a/src/Bundle/ChillTaskBundle/config/services/menu.yaml b/src/Bundle/ChillTaskBundle/config/services/menu.yaml index a9e1948d6..52322d553 100644 --- a/src/Bundle/ChillTaskBundle/config/services/menu.yaml +++ b/src/Bundle/ChillTaskBundle/config/services/menu.yaml @@ -3,7 +3,7 @@ services: arguments: $tokenStorage: '@Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface' $counter: '@Chill\TaskBundle\Templating\UI\CountNotificationTask' - $translator: '@Symfony\Component\Translation\TranslatorInterface' + $translator: '@Symfony\Contracts\Translation\TranslatorInterface' $authorizationChecker: '@Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface' tags: - { name: "chill.menu_builder" } @@ -17,6 +17,6 @@ services: Chill\TaskBundle\Menu\SectionMenuBuilder: arguments: $authorizationChecker: '@Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface' - $translator: '@Symfony\Component\Translation\TranslatorInterface' + $translator: '@Symfony\Contracts\Translation\TranslatorInterface' tags: - { name: "chill.menu_builder" } diff --git a/src/Bundle/ChillThirdPartyBundle/Controller/ThirdPartyController.php b/src/Bundle/ChillThirdPartyBundle/Controller/ThirdPartyController.php index 6da33bd52..61797a22c 100644 --- a/src/Bundle/ChillThirdPartyBundle/Controller/ThirdPartyController.php +++ b/src/Bundle/ChillThirdPartyBundle/Controller/ThirdPartyController.php @@ -25,7 +25,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_merge; @@ -140,4 +140,29 @@ final class ThirdPartyController extends CRUDController return null; } + + /** + * @param $action + * @param ThirdParty $entity + */ + protected function onPostFetchEntity($action, Request $request, $entity): ?Response + { + if ('view' === $action && $entity->getParent() instanceof ThirdParty) { + $params = [ + 'id' => $entity->getParent()->getId(), + ]; + + if ($request->query->has('returnPath')) { + $params['returnPath'] = $request->query->get('returnPath'); + } + + if ($request->query->has('returnLabel')) { + $params['returnLabel'] = $request->query->get('returnLabel'); + } + + return $this->redirectToRoute('chill_crud_3party_3party_view', $params); + } + + return null; + } } diff --git a/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php b/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php index ebdad3570..3524a659a 100644 --- a/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php +++ b/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php @@ -45,6 +45,41 @@ use function spl_object_hash; * all users with the right 'CHILL_3PARTY_3PARTY_SEE', 'CHILL_3PARTY_3 to see, select and edit parties for this * center. * + * A ThirdParty may have: + * + * * 0, one or more categories; + * * 0, one or more type + * * 1 kind. + * + * ## Kind + * + * The kind indicate if a thirdparty is a: + * + * * company ("personne morale"); + * * a contact ("personne morale") + * * a child inside a company ("contact" in French). Only companies may have childs + * + * **take care** the french translation may lead to misinterpretation, as the string "contact" is the translation of + * kind "child". + * + * ## Categories and types + * + * ThirdParty may have zero, one or more categories and/or type. + * + * Categories are managed in the database. The Chill administrator may create or desactivate categories. + * + * Types are also a way to categorize the thirdparties, but this is done **into the code**, through + * + * @see{Chill\ThirdPartyBundle\ThirdPartyType\ThirdPartyTypeProviderInterface}. The type is stored into the + * database by a Php array, mapped by a jsonb into the database. This has one advantage: it is easily searchable. + * + * As the list of type is hardcoded into database, it is more easily searchable. (for chill 2.0, the + * @see{Chill\ThirdPartyBundle\Form\Type\PickThirdPartyDynamicType} does not support it yet, but + * the legacy @see{Chill\ThirdPartyBundle\Form\Type\PickThirdPartyType} does. + * + * The difference between categories and types is transparent for user: they choose the same fields into the UI, without + * noticing a difference. + * * @ORM\Entity * @ORM\Table(name="chill_3party.third_party") * @DiscriminatorMap(typeProperty="type", mapping={ diff --git a/src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php b/src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php index b4ab8655d..7ca5188b1 100644 --- a/src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php +++ b/src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php @@ -11,11 +11,11 @@ declare(strict_types=1); namespace Chill\ThirdPartyBundle\Form; -use Chill\MainBundle\Entity\Civility; use Chill\MainBundle\Form\Type\ChillCollectionType; use Chill\MainBundle\Form\Type\ChillTextareaType; use Chill\MainBundle\Form\Type\PickAddressType; use Chill\MainBundle\Form\Type\PickCenterType; +use Chill\MainBundle\Form\Type\PickCivilityType; use Chill\MainBundle\Security\Authorization\AuthorizationHelper; use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\ThirdPartyBundle\Entity\ThirdParty; @@ -101,16 +101,8 @@ class ThirdPartyType extends AbstractType // Contact Person ThirdParty (child) if (ThirdParty::KIND_CONTACT === $options['kind'] || ThirdParty::KIND_CHILD === $options['kind']) { $builder - ->add('civility', EntityType::class, [ + ->add('civility', PickCivilityType::class, [ 'label' => 'thirdparty.Civility', - 'class' => Civility::class, - 'choice_label' => function (Civility $civility): string { - return $this->translatableStringHelper->localize($civility->getName()); - }, - 'query_builder' => static function (EntityRepository $er): QueryBuilder { - return $er->createQueryBuilder('c') - ->where('c.active = true'); - }, 'placeholder' => 'thirdparty.choose civility', 'required' => false, ]) diff --git a/src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyType.php b/src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyType.php index f3e53cacf..e7fb11c74 100644 --- a/src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyType.php +++ b/src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyType.php @@ -22,7 +22,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function array_diff; use function array_merge; diff --git a/src/Bundle/ChillThirdPartyBundle/Menu/MenuBuilder.php b/src/Bundle/ChillThirdPartyBundle/Menu/MenuBuilder.php index aec5ffb3f..f50610439 100644 --- a/src/Bundle/ChillThirdPartyBundle/Menu/MenuBuilder.php +++ b/src/Bundle/ChillThirdPartyBundle/Menu/MenuBuilder.php @@ -15,7 +15,7 @@ use Chill\MainBundle\Routing\LocalMenuBuilderInterface; use Chill\ThirdPartyBundle\Security\Voter\ThirdPartyVoter; use Knp\Menu\MenuItem; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; -use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; /** * Add an entry in section to go to third party index page. diff --git a/src/Bundle/ChillThirdPartyBundle/Resources/public/vuejs/_components/OnTheFly/ThirdParty.vue b/src/Bundle/ChillThirdPartyBundle/Resources/public/vuejs/_components/OnTheFly/ThirdParty.vue index 390d12286..27d02c3ec 100644 --- a/src/Bundle/ChillThirdPartyBundle/Resources/public/vuejs/_components/OnTheFly/ThirdParty.vue +++ b/src/Bundle/ChillThirdPartyBundle/Resources/public/vuejs/_components/OnTheFly/ThirdParty.vue @@ -40,16 +40,16 @@