diff --git a/composer.json b/composer.json index b47856954..f6d3eb27a 100644 --- a/composer.json +++ b/composer.json @@ -34,6 +34,7 @@ "sensio/framework-extra-bundle": "^5.5", "spomky-labs/base64url": "^2.0", "symfony/browser-kit": "^4.4", + "symfony/clock": "^6.2", "symfony/css-selector": "^4.4", "symfony/expression-language": "^4.4", "symfony/form": "^4.4", diff --git a/docs/source/_static/code/exports/CountPerson.php b/docs/source/_static/code/exports/CountPerson.php index 48eab8a55..afe19c73b 100644 --- a/docs/source/_static/code/exports/CountPerson.php +++ b/docs/source/_static/code/exports/CountPerson.php @@ -90,9 +90,7 @@ class CountPerson implements ExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { // we gather all center the user choose. - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn($el) => $el['center'], $acl); $qb = $this->entityManager->createQueryBuilder(); diff --git a/docs/source/development/entity-info.rst b/docs/source/development/entity-info.rst new file mode 100644 index 000000000..72d8b70ea --- /dev/null +++ b/docs/source/development/entity-info.rst @@ -0,0 +1,203 @@ + +.. Copyright (C) 2014 Champs Libres Cooperative SCRLFS +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 +or any later version published by the Free Software Foundation; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the section entitled "GNU +Free Documentation License". + +.. _entity-info: + +Stats about event on entity in php world +######################################## + +It is necessary to be able to gather information about events for some entities: + +- when the event has been done; +- who did it; +- ... + +Those "infos" are not linked with right management, like describe in :ref:`timelines`. + + +“infos” for some stats and info about an entity +----------------------------------------------- + +Building an info means: + +- create an Entity, and map this entity to a SQL view (not a regular table); +- use the framework to build this entity dynamically. + +A framework api is built to be able to build multiple “infos” entities +through “union” views: + +- use a command ``bin/console chill:db:sync-views`` to synchronize view (create view if it does not exists, or update + views when new SQL parts are added in the UNION query. Internally, this command call a new ``ViewEntityInfoManager``, + which iterate over available views to build the SQL; +- one can create a new “view entity info” by implementing a + ``ViewEntityInfoProviderInterface`` +- this implementation of the interface is free to create another + interface for building each part of the UNION query. This interface + is created for AccompanyingPeriodInfo: + ``Chill\PersonBundle\Service\EntityInfo\AccompanyingPeriodInfoUnionQueryPartInterface`` + +So, converting new “events” into rows for ``AccompanyingPeriodInfo`` is +just implementing this interface! + +Implementation for AccompanyingPeriod (``AccompanyingPeriod/AccompanyingPeriodInfo``) +------------------------------------------------------------------------------------- + +A class is created for computing some statistical info for an +AccompanyingPeriod: ``AccompanyingPeriod/AccompanyingPeriodInfo``. This +contains information about “something happens”, who did it and when. + +Having those info in table answer some questions like: + +- when is the last and the first action (AccompanyingPeriodWork, + Activity, AccompanyingPeriodWorkEvaluation, …) on the period; +- who is “acting” on the period, and when is the last “action” for each + user. + +The AccompanyingPeriod info is mapped to a SQL view, not a table. The +sql view is built dynamically (see below), and gather infos from +ActivityBundle, PersonBundle, CalendarBundle, … It is possible to create +custom bundle and add info on this view. + +.. code:: php + + /** + * + * @ORM\Entity() + * @ORM\Table(name="view_chill_person_accompanying_period_info") <==== THIS IS A VIEW, NOT A TABLE + */ + class AccompanyingPeriodInfo + { + // ... + } + +Why do we need this ? +~~~~~~~~~~~~~~~~~~~~~ + +For multiple jobs in PHP world: + +- moving the accompanying period to another steps when inactive, + automatically; +- listing all the users which are intervening on the action on a new + “Liste des intervenants” page; +- filtering on exports + +Later, we will launch automatic anonymise for accompanying period and +all related entities through this information. + +How is built the SQL views which is mapped to “info” entities ? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The AccompanyingPeriodInfo entity is mapped by a SQL view (not a regular +table). + +The sql view is built dynamically, it is a SQL view like this, for now (April 2023): + +.. code:: sql + + create view view_chill_person_accompanying_period_info + (accompanyingperiod_id, relatedentity, relatedentityid, user_id, infodate, discriminator, metadata) as + SELECT w.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork'::text AS relatedentity, + w.id AS relatedentityid, + cpapwr.user_id, + w.enddate AS infodate, + 'accompanying_period_work_end'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work w + LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON w.id = cpapwr.accompanyingperiodwork_id + WHERE w.enddate IS NOT NULL + UNION + SELECT cpapw.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation'::text AS relatedentity, + e.id AS relatedentityid, + e.updatedby_id AS user_id, + e.updatedat AS infodate, + 'accompanying_period_work_evaluation_updated_at'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work_evaluation e + JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id + WHERE e.updatedat IS NOT NULL + UNION + SELECT cpapw.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation'::text AS relatedentity, + e.id AS relatedentityid, + cpapwr.user_id, + e.maxdate AS infodate, + 'accompanying_period_work_evaluation_start'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work_evaluation e + JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id + LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON cpapw.id = cpapwr.accompanyingperiodwork_id + WHERE e.maxdate IS NOT NULL + UNION + SELECT cpapw.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation'::text AS relatedentity, + e.id AS relatedentityid, + cpapwr.user_id, + e.startdate AS infodate, + 'accompanying_period_work_evaluation_start'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work_evaluation e + JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id + LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON cpapw.id = cpapwr.accompanyingperiodwork_id + UNION + SELECT cpapw.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocument'::text AS relatedentity, + doc.id AS relatedentityid, + doc.updatedby_id AS user_id, + doc.updatedat AS infodate, + 'accompanying_period_work_evaluation_document_updated_at'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work_evaluation_document doc + JOIN chill_person_accompanying_period_work_evaluation e ON doc.accompanyingperiodworkevaluation_id = e.id + JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id + WHERE doc.updatedat IS NOT NULL + UNION + SELECT cpapw.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation'::text AS relatedentity, + e.id AS relatedentityid, + cpapwr.user_id, + e.maxdate AS infodate, + 'accompanying_period_work_evaluation_max'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work_evaluation e + JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id + LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON cpapw.id = cpapwr.accompanyingperiodwork_id + WHERE e.maxdate IS NOT NULL + UNION + SELECT w.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork'::text AS relatedentity, + w.id AS relatedentityid, + cpapwr.user_id, + w.startdate AS infodate, + 'accompanying_period_work_start'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work w + LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON w.id = cpapwr.accompanyingperiodwork_id + UNION + SELECT activity.accompanyingperiod_id, + 'Chill\ActivityBundle\Entity\Activity'::text AS relatedentity, + activity.id AS relatedentityid, + au.user_id, + activity.date AS infodate, + 'activity_date'::text AS discriminator, + '{}'::jsonb AS metadata + FROM activity + LEFT JOIN activity_user au ON activity.id = au.activity_id + WHERE activity.accompanyingperiod_id IS NOT NULL; + +As you can see, the view gather multiple SELECT queries and bind them +with UNION. + +Each SELECT query is built dynamically, through a class implementing an +interface: ``Chill\PersonBundle\Service\EntityInfo\AccompanyingPeriodInfoUnionQueryPartInterface``, `like +here `__ + +To add new `SELECT` query in different `UNION` parts in the sql view, create a +service and implements this interface: ``Chill\PersonBundle\Service\EntityInfo\AccompanyingPeriodInfoUnionQueryPartInterface``. diff --git a/docs/source/development/index.rst b/docs/source/development/index.rst index 52c541c8e..fd9ae43ba 100644 --- a/docs/source/development/index.rst +++ b/docs/source/development/index.rst @@ -35,6 +35,7 @@ As Chill rely on the `symfony `_ framework, reading the fram manual/index.rst Assets Cron Jobs + Info about entities Layout and UI ************** diff --git a/docs/source/development/timelines.rst b/docs/source/development/timelines.rst index afabdb398..51c0a1bad 100644 --- a/docs/source/development/timelines.rst +++ b/docs/source/development/timelines.rst @@ -6,6 +6,8 @@ A copy of the license is included in the section entitled "GNU Free Documentation License". +.. _timelines: + Timelines ********* @@ -18,24 +20,24 @@ Concept From an user point of view -------------------------- -Chill has two objectives : +Chill has two objectives : * make the administrative tasks more lightweight ; * help social workers to have all information they need to work To reach this second objective, Chill provides a special view: **timeline**. On a timeline view, information is gathered and shown on a single page, from the most recent event to the oldest one. -The information gathered is linked to a *context*. This *context* may be, for instance : +The information gathered is linked to a *context*. This *context* may be, for instance : * a person : events linked to this person are shown on the page ; * a center: events linked to a center are shown. They may concern different peoples ; -* ... +* ... In other word, the *context* is the kind of argument that will be used in the event's query. Let us recall that only the data the user has allowed to see should be shown. -.. seealso:: +.. seealso:: `The issue where the subject was first discussed `_ @@ -43,30 +45,30 @@ Let us recall that only the data the user has allowed to see should be shown. For developers -------------- -The `Main` bundle provides interfaces and services to help to build timelines. +The `Main` bundle provides interfaces and services to help to build timelines. If a bundle wants to *push* information in a timeline, it should be create a service which implements `Chill\MainBundle\Timeline\TimelineProviderInterface`, and tag is with `chill.timeline` and arguments defining the supported context (you may use multiple `chill.timeline` tags in order to support multiple context with a single service/class). -If a bundle wants to provide a new context for a timeline, the service `chill.main.timeline_builder` will helps to gather timeline's services supporting the defined context, and run queries across the models. +If a bundle wants to provide a new context for a timeline, the service `chill.main.timeline_builder` will helps to gather timeline's services supporting the defined context, and run queries across the models. .. _understanding-queries : Understanding queries ^^^^^^^^^^^^^^^^^^^^^ -Due to the fact that timelines should show only the X last events from Y differents tables, queries for a timeline may consume a lot of resources: at first on the database, and then on the ORM part, which will have to deserialize DB data to PHP classes, which may not be used if they are not part of the "last X events". +Due to the fact that timelines should show only the X last events from Y differents tables, queries for a timeline may consume a lot of resources: at first on the database, and then on the ORM part, which will have to deserialize DB data to PHP classes, which may not be used if they are not part of the "last X events". -To avoid such load on database, the objects are queried in two steps : +To avoid such load on database, the objects are queried in two steps : 1. An UNION request which gather the last X events, ordered by date. The data retrieved are the ID, the date, and a string key: a type. This type discriminates the data type. -2. The PHP objects are queried by ID, the type helps the program to link id with the kind of objects. +2. The PHP objects are queried by ID, the type helps the program to link id with the kind of objects. Those methods should ensure that only X PHP objects will be gathered and build by the ORM. What does the master timeline builder service ? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - When the service `chill.main.timeline_builder` is instanciated, the service is informed of each service taggued with `chill.timeline` tags. Then, + When the service `chill.main.timeline_builder` is instanciated, the service is informed of each service taggued with `chill.timeline` tags. Then, 1. The service build an UNION query by assembling column and tables names provided by the `fetchQuery` result ; 2. The UNION query is run, the result contains an id and a type for each row (see :ref:`above `) @@ -84,7 +86,7 @@ To push events on a timeline : Implementing the TimelineProviderInterface ------------------------------------------ -The has the following signature : +The has the following signature : .. code-block:: php @@ -92,19 +94,19 @@ The has the following signature : interface TimelineProviderInterface { - - /** - * + + /** + * * @param string $context * @param mixed[] $args the argument to the context. * @return TimelineSingleQuery * @throw \LogicException if the context is not supported */ public function fetchQuery($context, array $args); - + /** * Indicate if the result type may be handled by the service - * + * * @param string $type the key present in the SELECT query * @return boolean */ @@ -113,42 +115,42 @@ The has the following signature : /** * fetch entities from db into an associative array. The keys **MUST BE** * the id - * - * All ids returned by all SELECT queries + * + * All ids returned by all SELECT queries * (@see TimeLineProviderInterface::fetchQuery) and with the type * supported by the provider (@see TimelineProviderInterface::supportsType) * will be passed as argument. - * + * * @param array $ids an array of id * @return mixed[] an associative array of entities, with id as key */ public function getEntities(array $ids); - + /** * return an associative array with argument to render the entity * in an html template, which will be included in the timeline page - * + * * The result must have the following key : - * + * * - `template` : the template FQDN * - `template_data`: the data required by the template - * - * + * + * * Example: - * + * * ``` - * array( + * array( * 'template' => 'ChillMyBundle:timeline:template.html.twig', * 'template_data' => array( - * 'accompanyingPeriod' => $entity, - * 'person' => $args['person'] + * 'accompanyingPeriod' => $entity, + * 'person' => $args['person'] * ) * ); * ``` - * + * * `$context` and `$args` are defined by the bundle which will call the timeline - * rendering. - * + * rendering. + * * @param type $entity * @param type $context * @param array $args @@ -156,7 +158,7 @@ The has the following signature : * @throws \LogicException if the context is not supported */ public function getEntityTemplate($entity, $context, array $args); - + } @@ -176,7 +178,7 @@ The parameters should be replaced into the query by :code:`?`. They will be repl `$context` and `$args` are defined by the bundle which will call the timeline rendering. You may use them to build a different query depending on this context. -For instance, if the context is `'person'`, the args will be this array : +For instance, if the context is `'person'`, the args will be this array : .. code-block:: php @@ -197,7 +199,7 @@ You should find in the bundle documentation which contexts are arguments the bun .. note:: - We encourage to use `ClassMetaData` to define column names arguments. If you change your column names, changes will be reflected automatically during the execution of your code. + We encourage to use `ClassMetaData` to define column names arguments. If you change your column names, changes will be reflected automatically during the execution of your code. Example of an implementation : @@ -215,13 +217,13 @@ Example of an implementation : */ class TimelineReportProvider implements TimelineProviderInterface { - + /** * * @var EntityManager */ protected $em; - + public function __construct(EntityManager $em) { $this->em = $em; @@ -230,9 +232,9 @@ Example of an implementation : public function fetchQuery($context, array $args) { $this->checkContext($context); - + $metadata = $this->em->getClassMetadata('ChillReportBundle:Report'); - + return TimelineSingleQuery::fromArray([ 'id' => $metadata->getColumnName('id'), 'type' => 'report', @@ -254,11 +256,11 @@ Example of an implementation : The `supportsType` function ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This function indicate to the master `chill.main.timeline_builder` service (which orchestrate the build of UNION queries) that the service supports the type indicated in the result's array of the `fetchQuery` function. +This function indicate to the master `chill.main.timeline_builder` service (which orchestrate the build of UNION queries) that the service supports the type indicated in the result's array of the `fetchQuery` function. -The implementation of our previous example will be : +The implementation of our previous example will be : -.. code-block:: php +.. code-block:: php namespace Chill\ReportBundle\Timeline; @@ -272,7 +274,7 @@ The implementation of our previous example will be : //... /** - * + * * {@inheritDoc} */ public function supportsType($type) @@ -304,12 +306,12 @@ The results **must be** an array where the id given by the UNION query (remember { $reports = $this->em->getRepository('ChillReportBundle:Report') ->findBy(array('id' => $ids)); - + $result = array(); foreach($reports as $report) { $result[$report->getId()] = $report; } - + return $result; } @@ -318,9 +320,9 @@ The results **must be** an array where the id given by the UNION query (remember The `getEntityTemplate` function ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This is where the master service will collect information to render the entity. +This is where the master service will collect information to render the entity. -The result must be an associative array with : +The result must be an associative array with : - **template** is the FQDN of the template ; - **template_data** is an associative array where keys are the variables'names for this template, and values are the values. @@ -332,8 +334,8 @@ Example : array( 'template' => 'ChillMyBundle:timeline:template.html.twig', 'template_data' => array( - 'period' => $entity, - 'person' => $args['person'] + 'period' => $entity, + 'person' => $args['person'] ) ); @@ -349,7 +351,7 @@ Create a timeline with his own context You have to create a Controller which will execute the service `chill.main.timeline_builder`. Using the `Chill\MainBundle\Timeline\TimelineBuilder::getTimelineHTML` function, you will get an HTML representation of the timeline, which you may include with twig `raw` filter. -Example : +Example : .. code-block:: php diff --git a/docs/source/installation/index.rst b/docs/source/installation/index.rst index 852a2a6d0..910122196 100644 --- a/docs/source/installation/index.rst +++ b/docs/source/installation/index.rst @@ -151,6 +151,7 @@ This script will : # mount into to container ./docker-php.sh + bin/console chill:db:sync-views # and load fixtures bin/console doctrine:migrations:migrate @@ -161,7 +162,7 @@ Chill will be available at ``http://localhost:8001.`` Currently, there isn't any # mount into to container ./docker-php.sh - # and load fixtures + # and load fixtures (do not this for production) bin/console doctrine:fixtures:load --purge-with-truncate There are several users available: @@ -204,8 +205,10 @@ How to create the database schema (= run migrations) ? # if a container is running ./docker-php.sh bin/console doctrine:migrations:migrate + bin/console chill:db:sync-views # if not docker-compose run --user $(id -u) php bin/console doctrine:migrations:migrate + docker-compose run --user $(id -u) php bin/console chill:db:sync-views How to read the email sent by the program ? @@ -236,6 +239,23 @@ How to open a terminal in the project # if not docker-compose run --user $(id -u) php /bin/bash +How to run cron-jobs ? +====================== + +Some command must be executed in :ref:`cron jobs `. To execute them: + +.. code-block:: bash + + # if a container is running + ./docker-php.sh + bin/console chill:cron-job:execute + # some of them are executed only during the night. So, we have to force the execution during the day: + bin/console chill:cron-job:execute 'name-of-the-cron' + # if not + docker-compose run --user $(id -u) php bin/console chill:cron-job:execute + # some of them are executed only during the night. So, we have to force the execution during the day: + docker-compose run --user $(id -u) php bin/console chill:cron-job:execute 'name-of-the-cron' + How to run composer ? ===================== diff --git a/docs/source/installation/prod.rst b/docs/source/installation/prod.rst index f51141e8d..21da15267 100644 --- a/docs/source/installation/prod.rst +++ b/docs/source/installation/prod.rst @@ -38,6 +38,14 @@ This should be adapted to your needs: * Think about how you will backup your database. Some adminsys find easier to store database outside of docker, which might be easier to administrate or replicate. +Run migrations on each update +============================= + +Every time you start a new version, you should apply update the sql schema: + +- running ``bin/console doctrine:migration:migrate`` to run sql migration; +- synchonizing sql views to the last state: ``bin/console chill:db:sync-views`` + Cron jobs ========= diff --git a/rector.php b/rector.php index 2c5b08bec..ec9a0c684 100644 --- a/rector.php +++ b/rector.php @@ -12,14 +12,49 @@ return static function (RectorConfig $rectorConfig): void { __DIR__ . '/src', ]); - $rectorConfig->cacheClass(\Rector\Caching\ValueObject\Storage\FileCacheStorage::class); - $rectorConfig->cacheDirectory(__DIR__.'/.cache/rector'); + //$rectorConfig->cacheClass(\Rector\Caching\ValueObject\Storage\FileCacheStorage::class); + //$rectorConfig->cacheDirectory(__DIR__ . '/.cache/rector'); // register a single rule $rectorConfig->rule(InlineConstructorDefaultToPropertyRector::class); + $rectorConfig->disableParallel(); - // define sets of rules - // $rectorConfig->sets([ - // LevelSetList::UP_TO_PHP_74 - // ]); + //define sets of rules + $rectorConfig->sets([ + LevelSetList::UP_TO_PHP_74 + ]); + + // skip some path... + $rectorConfig->skip([ + // make rector stuck for some files + \Rector\Php56\Rector\FunctionLike\AddDefaultValueForUndefinedVariableRector::class, + + // we need to discuss this: are we going to have FALSE in tests instead of an error ? + \Rector\Php71\Rector\FuncCall\CountOnNullRector::class, + + // must merge MR500 and review a typing of "ArrayCollection" in entities + \Rector\TypeDeclaration\Rector\Property\TypedPropertyFromAssignsRector::class, + + // remove all PHP80 rules, in order to activate them one by one + \Rector\Php80\Rector\ClassMethod\AddParamBasedOnParentClassMethodRector::class, + \Rector\Php80\Rector\Class_\AnnotationToAttributeRector::class, + \Rector\Php80\Rector\Switch_\ChangeSwitchToMatchRector::class, + \Rector\Php80\Rector\FuncCall\ClassOnObjectRector::class, + \Rector\Php80\Rector\ClassConstFetch\ClassOnThisVariableObjectRector::class, + \Rector\Php80\Rector\Class_\ClassPropertyAssignToConstructorPromotionRector::class, + \Rector\Php80\Rector\Class_\DoctrineAnnotationClassToAttributeRector::class, + \Rector\Php80\Rector\ClassMethod\FinalPrivateToPrivateVisibilityRector::class, + \Rector\Php80\Rector\Ternary\GetDebugTypeRector::class, + \Rector\Php80\Rector\FunctionLike\MixedTypeRector::class, + \Rector\Php80\Rector\Property\NestedAnnotationToAttributeRector::class, + \Rector\Php80\Rector\FuncCall\Php8ResourceReturnToObjectRector::class, + \Rector\Php80\Rector\Catch_\RemoveUnusedVariableInCatchRector::class, + \Rector\Php80\Rector\ClassMethod\SetStateToStaticRector::class, + \Rector\Php80\Rector\NotIdentical\StrContainsRector::class, + \Rector\Php80\Rector\Identical\StrEndsWithRector::class, + \Rector\Php80\Rector\Identical\StrStartsWithRector::class, + \Rector\Php80\Rector\Class_\StringableForToStringRector::class, + \Rector\Php80\Rector\FuncCall\TokenGetAllToObjectRector::class, + \Rector\Php80\Rector\FunctionLike\UnionTypesRector::class + ]); }; diff --git a/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivity.php b/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivity.php index 8c53ca2d9..82949d635 100644 --- a/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivity.php +++ b/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivity.php @@ -50,7 +50,7 @@ class LoadActivity extends AbstractFixture implements OrderedFixtureInterface ->findAll(); foreach ($persons as $person) { - $activityNbr = mt_rand(0, 3); + $activityNbr = random_int(0, 3); for ($i = 0; $i < $activityNbr; ++$i) { $activity = $this->newRandomActivity($person); @@ -75,7 +75,7 @@ class LoadActivity extends AbstractFixture implements OrderedFixtureInterface // ->setAttendee($this->faker->boolean()) - for ($i = 0; mt_rand(0, 4) > $i; ++$i) { + for ($i = 0; random_int(0, 4) > $i; ++$i) { $reason = $this->getRandomActivityReason(); if (null !== $reason) { diff --git a/src/Bundle/ChillActivityBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillActivityBundle/DependencyInjection/Configuration.php index e22f6242c..57a1ec578 100644 --- a/src/Bundle/ChillActivityBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillActivityBundle/DependencyInjection/Configuration.php @@ -26,7 +26,7 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('chill_activity'); - $rootNode = $treeBuilder->getRootNode('chill_activity'); + $rootNode = $treeBuilder->getRootNode(); $rootNode ->children() @@ -59,9 +59,7 @@ class Configuration implements ConfigurationInterface ->info('The number of seconds of this duration. Must be an integer.') ->cannotBeEmpty() ->validate() - ->ifTrue(static function ($data) { - return !is_int($data); - })->thenInvalid('The value %s is not a valid integer') + ->ifTrue(static fn ($data) => !is_int($data))->thenInvalid('The value %s is not a valid integer') ->end() ->end() ->scalarNode('label') diff --git a/src/Bundle/ChillActivityBundle/Entity/Activity.php b/src/Bundle/ChillActivityBundle/Entity/Activity.php index 9adfa057f..32ceb2e74 100644 --- a/src/Bundle/ChillActivityBundle/Entity/Activity.php +++ b/src/Bundle/ChillActivityBundle/Entity/Activity.php @@ -195,7 +195,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User") * @Groups({"docgen:read"}) */ - private ?User $user; + private ?User $user = null; /** * @ORM\ManyToMany(targetEntity="Chill\MainBundle\Entity\User") diff --git a/src/Bundle/ChillActivityBundle/Entity/ActivityPresence.php b/src/Bundle/ChillActivityBundle/Entity/ActivityPresence.php index 95b3c95d2..b0154e509 100644 --- a/src/Bundle/ChillActivityBundle/Entity/ActivityPresence.php +++ b/src/Bundle/ChillActivityBundle/Entity/ActivityPresence.php @@ -34,7 +34,7 @@ class ActivityPresence * @ORM\GeneratedValue(strategy="AUTO") * @Serializer\Groups({"docgen:read"}) */ - private ?int $id; + private ?int $id = null; /** * @ORM\Column(type="json") diff --git a/src/Bundle/ChillActivityBundle/Entity/ActivityType.php b/src/Bundle/ChillActivityBundle/Entity/ActivityType.php index a6e0fc694..ed8260a4d 100644 --- a/src/Bundle/ChillActivityBundle/Entity/ActivityType.php +++ b/src/Bundle/ChillActivityBundle/Entity/ActivityType.php @@ -122,7 +122,7 @@ class ActivityType * @ORM\GeneratedValue(strategy="AUTO") * @Groups({"docgen:read"}) */ - private ?int $id; + private ?int $id = null; /** * @ORM\Column(type="string", nullable=false, options={"default": ""}) diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityDuration.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityDuration.php index 2b6919340..34771d077 100644 --- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityDuration.php +++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityDuration.php @@ -86,9 +86,7 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->repository->createQueryBuilder('activity'); diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityVisitDuration.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityVisitDuration.php index 359593059..df21362cd 100644 --- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityVisitDuration.php +++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityVisitDuration.php @@ -87,9 +87,7 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->repository->createQueryBuilder('activity'); diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/CountActivity.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/CountActivity.php index 2dc844aa2..6b7b1562d 100644 --- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/CountActivity.php +++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/CountActivity.php @@ -86,9 +86,7 @@ class CountActivity implements ExportInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->repository ->createQueryBuilder('activity') diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/ListActivity.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/ListActivity.php index 6d25b4e22..026e16f90 100644 --- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/ListActivity.php +++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/ListActivity.php @@ -109,9 +109,7 @@ class ListActivity implements ListInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->entityManager->createQueryBuilder(); diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityDuration.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityDuration.php index 1cf20dc5f..e916cab54 100644 --- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityDuration.php +++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityDuration.php @@ -87,9 +87,7 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->repository ->createQueryBuilder('activity') diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityVisitDuration.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityVisitDuration.php index 2c160f3cf..18a47289c 100644 --- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityVisitDuration.php +++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityVisitDuration.php @@ -87,9 +87,7 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->repository ->createQueryBuilder('activity') diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/ListActivity.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/ListActivity.php index 5d438d3a5..60110c9a8 100644 --- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/ListActivity.php +++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/ListActivity.php @@ -137,13 +137,11 @@ class ListActivity implements ListInterface, GroupedExportInterface $activity = $activityRepository->find($value); - return implode(', ', array_map(function (ActivityReason $r) { - return '"' . - $this->translatableStringHelper->localize($r->getCategory()->getName()) - . ' > ' . - $this->translatableStringHelper->localize($r->getName()) - . '"'; - }, $activity->getReasons()->toArray())); + return implode(', ', array_map(fn (ActivityReason $r) => '"' . + $this->translatableStringHelper->localize($r->getCategory()->getName()) + . ' > ' . + $this->translatableStringHelper->localize($r->getName()) + . '"', $activity->getReasons()->toArray())); }; case 'circle_name': @@ -152,7 +150,7 @@ class ListActivity implements ListInterface, GroupedExportInterface return 'circle'; } - return $this->translatableStringHelper->localize(json_decode($value, true)); + return $this->translatableStringHelper->localize(json_decode($value, true, 512, JSON_THROW_ON_ERROR)); }; case 'type_name': @@ -161,7 +159,7 @@ class ListActivity implements ListInterface, GroupedExportInterface return 'activity type'; } - return $this->translatableStringHelper->localize(json_decode($value, true)); + return $this->translatableStringHelper->localize(json_decode($value, true, 512, JSON_THROW_ON_ERROR)); }; default: @@ -197,9 +195,7 @@ class ListActivity implements ListInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); // throw an error if any fields are present if (!array_key_exists('fields', $data)) { diff --git a/src/Bundle/ChillActivityBundle/Export/Export/ListActivityHelper.php b/src/Bundle/ChillActivityBundle/Export/Export/ListActivityHelper.php index 0e8b28ab4..fae6ea6a6 100644 --- a/src/Bundle/ChillActivityBundle/Export/Export/ListActivityHelper.php +++ b/src/Bundle/ChillActivityBundle/Export/Export/ListActivityHelper.php @@ -179,7 +179,7 @@ class ListActivityHelper } } - $decoded = json_decode($value); + $decoded = json_decode($value, null, 512, JSON_THROW_ON_ERROR); return implode( '|', diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/ActivityTypeFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/ActivityTypeFilter.php index a793f21de..c6616a4c6 100644 --- a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/ActivityTypeFilter.php +++ b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/ActivityTypeFilter.php @@ -61,12 +61,9 @@ class ActivityTypeFilter implements FilterInterface $builder->add('accepted_activitytypes', EntityType::class, [ 'class' => ActivityType::class, 'choices' => $this->activityTypeRepository->findAllActive(), - 'choice_label' => function (ActivityType $aty) { - return - ($aty->hasCategory() ? $this->translatableStringHelper->localize($aty->getCategory()->getName()) . ' > ' : '') - . - $this->translatableStringHelper->localize($aty->getName()); - }, + 'choice_label' => fn (ActivityType $aty) => ($aty->hasCategory() ? $this->translatableStringHelper->localize($aty->getCategory()->getName()) . ' > ' : '') + . + $this->translatableStringHelper->localize($aty->getName()), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/UserScopeFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/UserScopeFilter.php index 1906db75e..4319c100a 100644 --- a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/UserScopeFilter.php +++ b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/UserScopeFilter.php @@ -64,11 +64,9 @@ class UserScopeFilter implements FilterInterface { $builder->add('accepted_userscope', EntityType::class, [ 'class' => Scope::class, - 'choice_label' => function (Scope $s) { - return $this->translatableStringHelper->localize( - $s->getName() - ); - }, + 'choice_label' => fn (Scope $s) => $this->translatableStringHelper->localize( + $s->getName() + ), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php index d1758039a..b9d39c3ce 100644 --- a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php +++ b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php @@ -61,12 +61,9 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter $builder->add('types', EntityType::class, [ 'choices' => $this->activityTypeRepository->findAllActive(), 'class' => ActivityType::class, - 'choice_label' => function (ActivityType $aty) { - return - ($aty->hasCategory() ? $this->translatableStringHelper->localize($aty->getCategory()->getName()) . ' > ' : '') - . - $this->translatableStringHelper->localize($aty->getName()); - }, + 'choice_label' => fn (ActivityType $aty) => ($aty->hasCategory() ? $this->translatableStringHelper->localize($aty->getCategory()->getName()) . ' > ' : '') + . + $this->translatableStringHelper->localize($aty->getName()), 'group_by' => function (ActivityType $type) { if (!$type->hasCategory()) { return null; diff --git a/src/Bundle/ChillActivityBundle/Form/ActivityReasonCategoryType.php b/src/Bundle/ChillActivityBundle/Form/ActivityReasonCategoryType.php index b8e03d2c7..3a0f2a318 100644 --- a/src/Bundle/ChillActivityBundle/Form/ActivityReasonCategoryType.php +++ b/src/Bundle/ChillActivityBundle/Form/ActivityReasonCategoryType.php @@ -32,7 +32,7 @@ class ActivityReasonCategoryType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\ActivityBundle\Entity\ActivityReasonCategory', + 'data_class' => \Chill\ActivityBundle\Entity\ActivityReasonCategory::class, ]); } diff --git a/src/Bundle/ChillActivityBundle/Form/ActivityType.php b/src/Bundle/ChillActivityBundle/Form/ActivityType.php index 5dfd756f9..a74178afd 100644 --- a/src/Bundle/ChillActivityBundle/Form/ActivityType.php +++ b/src/Bundle/ChillActivityBundle/Form/ActivityType.php @@ -211,13 +211,9 @@ class ActivityType extends AbstractType 'required' => $activityType->isRequired('attendee'), 'expanded' => true, 'class' => ActivityPresence::class, - 'choice_label' => function (ActivityPresence $activityPresence) { - return $this->translatableStringHelper->localize($activityPresence->getName()); - }, - 'query_builder' => static function (EntityRepository $er) { - return $er->createQueryBuilder('a') - ->where('a.active = true'); - }, + 'choice_label' => fn (ActivityPresence $activityPresence) => $this->translatableStringHelper->localize($activityPresence->getName()), + 'query_builder' => static fn (EntityRepository $er) => $er->createQueryBuilder('a') + ->where('a.active = true'), ]); } @@ -357,9 +353,7 @@ class ActivityType extends AbstractType return (string) $location->getId(); }, - function (?string $id): ?Location { - return $this->om->getRepository(Location::class)->findOneBy(['id' => (int) $id]); - } + fn (?string $id): ?Location => $this->om->getRepository(Location::class)->findOneBy(['id' => (int) $id]) )); } @@ -401,9 +395,7 @@ class ActivityType extends AbstractType // the datetimetransformer will then handle timezone as GMT $timezoneUTC = new DateTimeZone('GMT'); /** @var DateTime $data */ - $data = $formEvent->getData() === null ? - DateTime::createFromFormat('U', '300') : - $formEvent->getData(); + $data = $formEvent->getData() ?? DateTime::createFromFormat('U', '300'); $seconds = $data->getTimezone()->getOffset($data); $data->setTimeZone($timezoneUTC); $data->add(new DateInterval('PT' . $seconds . 'S')); diff --git a/src/Bundle/ChillActivityBundle/Form/ActivityTypeType.php b/src/Bundle/ChillActivityBundle/Form/ActivityTypeType.php index b27fa883e..073b8099f 100644 --- a/src/Bundle/ChillActivityBundle/Form/ActivityTypeType.php +++ b/src/Bundle/ChillActivityBundle/Form/ActivityTypeType.php @@ -45,9 +45,7 @@ class ActivityTypeType extends AbstractType ]) ->add('category', EntityType::class, [ 'class' => ActivityTypeCategory::class, - 'choice_label' => function (ActivityTypeCategory $activityTypeCategory) { - return $this->translatableStringHelper->localize($activityTypeCategory->getName()); - }, + 'choice_label' => fn (ActivityTypeCategory $activityTypeCategory) => $this->translatableStringHelper->localize($activityTypeCategory->getName()), ]) ->add('ordering', NumberType::class, [ 'required' => true, diff --git a/src/Bundle/ChillActivityBundle/Form/Type/PickActivityReasonType.php b/src/Bundle/ChillActivityBundle/Form/Type/PickActivityReasonType.php index a951ef940..35da7e02f 100644 --- a/src/Bundle/ChillActivityBundle/Form/Type/PickActivityReasonType.php +++ b/src/Bundle/ChillActivityBundle/Form/Type/PickActivityReasonType.php @@ -45,9 +45,7 @@ class PickActivityReasonType extends AbstractType $resolver->setDefaults( [ 'class' => ActivityReason::class, - 'choice_label' => function (ActivityReason $choice) { - return $this->reasonRender->renderString($choice, []); - }, + 'choice_label' => fn (ActivityReason $choice) => $this->reasonRender->renderString($choice, []), 'group_by' => function (ActivityReason $choice): ?string { if (null !== $category = $choice->getCategory()) { return $this->translatableStringHelper->localize($category->getName()); diff --git a/src/Bundle/ChillActivityBundle/Form/Type/TranslatableActivityReasonCategoryType.php b/src/Bundle/ChillActivityBundle/Form/Type/TranslatableActivityReasonCategoryType.php index 96dabe008..4aa259097 100644 --- a/src/Bundle/ChillActivityBundle/Form/Type/TranslatableActivityReasonCategoryType.php +++ b/src/Bundle/ChillActivityBundle/Form/Type/TranslatableActivityReasonCategoryType.php @@ -38,10 +38,8 @@ class TranslatableActivityReasonCategoryType extends AbstractType $resolver->setDefaults( [ 'class' => ActivityReasonCategory::class, - 'choice_label' => function (ActivityReasonCategory $category) { - return $this->translatableStringHelper->localize($category->getName()) - . (!$category->getActive() ? ' (' . $this->translator->trans('inactive') . ')' : ''); - }, + 'choice_label' => fn (ActivityReasonCategory $category) => $this->translatableStringHelper->localize($category->getName()) + . (!$category->getActive() ? ' (' . $this->translator->trans('inactive') . ')' : ''), ] ); } diff --git a/src/Bundle/ChillActivityBundle/Form/Type/TranslatableActivityType.php b/src/Bundle/ChillActivityBundle/Form/Type/TranslatableActivityType.php index 4a1d4bfa7..d4807b82d 100644 --- a/src/Bundle/ChillActivityBundle/Form/Type/TranslatableActivityType.php +++ b/src/Bundle/ChillActivityBundle/Form/Type/TranslatableActivityType.php @@ -39,9 +39,7 @@ class TranslatableActivityType extends AbstractType 'class' => ActivityType::class, 'active_only' => true, 'choices' => $this->activityTypeRepository->findAllActive(), - 'choice_label' => function (ActivityType $type) { - return $this->translatableStringHelper->localize($type->getName()); - }, + 'choice_label' => fn (ActivityType $type) => $this->translatableStringHelper->localize($type->getName()), ] ); } diff --git a/src/Bundle/ChillActivityBundle/Repository/ActivityACLAwareRepository.php b/src/Bundle/ChillActivityBundle/Repository/ActivityACLAwareRepository.php index 185e008eb..1f2039a2c 100644 --- a/src/Bundle/ChillActivityBundle/Repository/ActivityACLAwareRepository.php +++ b/src/Bundle/ChillActivityBundle/Repository/ActivityACLAwareRepository.php @@ -254,9 +254,7 @@ final class ActivityACLAwareRepository implements ActivityACLAwareRepositoryInte $reachableScopes = $this->authorizationHelper->getReachableScopes($this->tokenStorage->getToken()->getUser(), ActivityVoter::SEE, $center); // we get the ids for those scopes $reachablesScopesId = array_map( - static function (Scope $scope) { - return $scope->getId(); - }, + static fn (Scope $scope) => $scope->getId(), $reachableScopes ); diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php index ad570a8a4..624859eda 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php @@ -134,9 +134,7 @@ class ActivityContext implements $builder->add($key, EntityType::class, [ 'class' => Person::class, 'choices' => $persons, - 'choice_label' => function (Person $p) { - return $this->personRender->renderString($p, []); - }, + 'choice_label' => fn (Person $p) => $this->personRender->renderString($p, []), 'multiple' => false, 'required' => false, 'expanded' => true, diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php index b2272dd7b..3da451f2e 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php @@ -145,9 +145,7 @@ class ListActivitiesByAccompanyingPeriodContext implements return array_filter( $activities, function ($activity) use ($user) { - $activityUsernames = array_map(static function ($user) { - return $user['username']; - }, $activity['users'] ?? []); + $activityUsernames = array_map(static fn ($user) => $user['username'], $activity['users'] ?? []); return in_array($user->getUsername(), $activityUsernames, true); } ); @@ -158,9 +156,7 @@ class ListActivitiesByAccompanyingPeriodContext implements return array_filter( $works, function ($work) use ($user) { - $workUsernames = array_map(static function ($user) { - return $user['username']; - }, $work['referrers'] ?? []); + $workUsernames = array_map(static fn ($user) => $user['username'], $work['referrers'] ?? []); return in_array($user->getUsername(), $workUsernames, true); } diff --git a/src/Bundle/ChillActivityBundle/Service/EntityInfo/AccompanyingPeriodInfoQueryPart/ActivityUsersDateQueryPartForAccompanyingPeriodInfo.php b/src/Bundle/ChillActivityBundle/Service/EntityInfo/AccompanyingPeriodInfoQueryPart/ActivityUsersDateQueryPartForAccompanyingPeriodInfo.php new file mode 100644 index 000000000..bb70d6e87 --- /dev/null +++ b/src/Bundle/ChillActivityBundle/Service/EntityInfo/AccompanyingPeriodInfoQueryPart/ActivityUsersDateQueryPartForAccompanyingPeriodInfo.php @@ -0,0 +1,64 @@ +getId(); - }, $reachableScopesDelete), - array_map(static function ($s) { - return $s->getId(); - }, $reachableScopesUpdate) + array_map(static fn ($s) => $s->getId(), $reachableScopesDelete), + array_map(static fn ($s) => $s->getId(), $reachableScopesUpdate) ); if (count($reachableScopesId) === 0) { diff --git a/src/Bundle/ChillActivityBundle/Tests/Form/ActivityTypeTest.php b/src/Bundle/ChillActivityBundle/Tests/Form/ActivityTypeTest.php index df0a602a4..3ed6b4409 100644 --- a/src/Bundle/ChillActivityBundle/Tests/Form/ActivityTypeTest.php +++ b/src/Bundle/ChillActivityBundle/Tests/Form/ActivityTypeTest.php @@ -188,9 +188,7 @@ final class ActivityTypeTest extends KernelTestCase // map all the values in an array $values = array_map( - static function ($choice) { - return $choice->value; - }, + static fn ($choice) => $choice->value, $view['activity']['durationTime']->vars['choices'] ); diff --git a/src/Bundle/ChillActivityBundle/Tests/Form/Type/TranslatableActivityReasonTest.php b/src/Bundle/ChillActivityBundle/Tests/Form/Type/TranslatableActivityReasonTest.php index 3c9777051..a8d85daa6 100644 --- a/src/Bundle/ChillActivityBundle/Tests/Form/Type/TranslatableActivityReasonTest.php +++ b/src/Bundle/ChillActivityBundle/Tests/Form/Type/TranslatableActivityReasonTest.php @@ -79,15 +79,13 @@ final class TranslatableActivityReasonTest extends TypeTestCase $request = $prophet->prophesize(); $translator = $prophet->prophesize(); - $request->willExtend('Symfony\Component\HttpFoundation\Request'); + $request->willExtend(\Symfony\Component\HttpFoundation\Request::class); $request->getLocale()->willReturn($fallbackLocale); - $requestStack->willExtend('Symfony\Component\HttpFoundation\RequestStack'); - $requestStack->getCurrentRequest()->will(static function () use ($request) { - return $request; - }); + $requestStack->willExtend(\Symfony\Component\HttpFoundation\RequestStack::class); + $requestStack->getCurrentRequest()->will(static fn () => $request); - $translator->willExtend('Symfony\Component\Translation\Translator'); + $translator->willExtend(\Symfony\Component\Translation\Translator::class); $translator->getFallbackLocales()->willReturn($locale); return new TranslatableStringHelper( diff --git a/src/Bundle/ChillActivityBundle/Tests/Security/Authorization/ActivityVoterTest.php b/src/Bundle/ChillActivityBundle/Tests/Security/Authorization/ActivityVoterTest.php index a9b9e2ec7..1fb90a4ae 100644 --- a/src/Bundle/ChillActivityBundle/Tests/Security/Authorization/ActivityVoterTest.php +++ b/src/Bundle/ChillActivityBundle/Tests/Security/Authorization/ActivityVoterTest.php @@ -160,7 +160,7 @@ final class ActivityVoterTest extends KernelTestCase { $token = $this->prophet->prophesize(); $token - ->willImplement('\Symfony\Component\Security\Core\Authentication\Token\TokenInterface'); + ->willImplement('\\' . \Symfony\Component\Security\Core\Authentication\Token\TokenInterface::class); if (null === $user) { $token->getUser()->willReturn(null); diff --git a/src/Bundle/ChillActivityBundle/config/services.yaml b/src/Bundle/ChillActivityBundle/config/services.yaml index 23f00ed4e..d55f86d4f 100644 --- a/src/Bundle/ChillActivityBundle/config/services.yaml +++ b/src/Bundle/ChillActivityBundle/config/services.yaml @@ -34,6 +34,7 @@ services: resource: '../Validator/Constraints/' Chill\ActivityBundle\Service\DocGenerator\: - autowire: true - autoconfigure: true resource: '../Service/DocGenerator/' + + Chill\ActivityBundle\Service\EntityInfo\: + resource: '../Service/EntityInfo/' diff --git a/src/Bundle/ChillAsideActivityBundle/src/DependencyInjection/Configuration.php b/src/Bundle/ChillAsideActivityBundle/src/DependencyInjection/Configuration.php index d01998358..2e2398c3e 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillAsideActivityBundle/src/DependencyInjection/Configuration.php @@ -22,7 +22,7 @@ class Configuration implements ConfigurationInterface { $treeBuilder = new TreeBuilder('chill_aside_activity'); - $treeBuilder->getRootNode('chill_aside_activity') + $treeBuilder->getRootNode() ->children() ->arrayNode('form') ->canBeEnabled() @@ -132,9 +132,7 @@ class Configuration implements ConfigurationInterface ->info('The number of seconds of this duration. Must be an integer.') ->cannotBeEmpty() ->validate() - ->ifTrue(static function ($data) { - return !is_int($data); - })->thenInvalid('The value %s is not a valid integer') + ->ifTrue(static fn ($data) => !is_int($data))->thenInvalid('The value %s is not a valid integer') ->end() ->end() ->scalarNode('label') diff --git a/src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivity.php b/src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivity.php index 598988cfb..3dc205f09 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivity.php +++ b/src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivity.php @@ -57,7 +57,7 @@ class AsideActivity implements TrackCreationInterface, TrackUpdateInterface * @ORM\GeneratedValue * @ORM\Column(type="integer") */ - private ?int $id; + private ?int $id = null; /** * @ORM\Column(type="string", length=100, nullable=true) diff --git a/src/Bundle/ChillAsideActivityBundle/src/Export/Export/CountAsideActivity.php b/src/Bundle/ChillAsideActivityBundle/src/Export/Export/CountAsideActivity.php index 87aad1659..9204fad4b 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/Export/Export/CountAsideActivity.php +++ b/src/Bundle/ChillAsideActivityBundle/src/Export/Export/CountAsideActivity.php @@ -59,9 +59,7 @@ class CountAsideActivity implements ExportInterface, GroupedExportInterface $labels = array_combine($values, $values); $labels['_header'] = $this->getTitle(); - return static function ($value) use ($labels) { - return $labels[$value]; - }; + return static fn ($value) => $labels[$value]; } public function getQueryKeys($data): array diff --git a/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php b/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php index 9a95a8d09..727287972 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php +++ b/src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php @@ -95,9 +95,7 @@ final class AsideActivityFormType extends AbstractType // the datetimetransformer will then handle timezone as GMT $timezoneUTC = new DateTimeZone('GMT'); /** @var DateTimeImmutable $data */ - $data = $formEvent->getData() === null ? - DateTime::createFromFormat('U', '300') : - $formEvent->getData(); + $data = $formEvent->getData() ?? DateTime::createFromFormat('U', '300'); $seconds = $data->getTimezone()->getOffset($data); $data->setTimeZone($timezoneUTC); $data->add(new DateInterval('PT' . $seconds . 'S')); diff --git a/src/Bundle/ChillBudgetBundle/Controller/AbstractElementController.php b/src/Bundle/ChillBudgetBundle/Controller/AbstractElementController.php index badccf3b3..125c72ce4 100644 --- a/src/Bundle/ChillBudgetBundle/Controller/AbstractElementController.php +++ b/src/Bundle/ChillBudgetBundle/Controller/AbstractElementController.php @@ -116,7 +116,7 @@ abstract class AbstractElementController extends AbstractController $indexPage = 'chill_budget_elements_household_index'; } - $entity = null !== $element->getPerson() ? $element->getPerson() : $element->getHousehold(); + $entity = $element->getPerson() ?? $element->getHousehold(); $form = $this->createForm($this->getType(), $element); $form->add('submit', SubmitType::class); diff --git a/src/Bundle/ChillBudgetBundle/DependencyInjection/Compiler/CalculatorCompilerPass.php b/src/Bundle/ChillBudgetBundle/DependencyInjection/Compiler/CalculatorCompilerPass.php index 64df79202..012c4eab5 100644 --- a/src/Bundle/ChillBudgetBundle/DependencyInjection/Compiler/CalculatorCompilerPass.php +++ b/src/Bundle/ChillBudgetBundle/DependencyInjection/Compiler/CalculatorCompilerPass.php @@ -19,7 +19,7 @@ class CalculatorCompilerPass implements CompilerPassInterface { public function process(ContainerBuilder $container) { - $manager = $container->getDefinition('Chill\BudgetBundle\Calculator\CalculatorManager'); + $manager = $container->getDefinition(\Chill\BudgetBundle\Calculator\CalculatorManager::class); foreach ($container->findTaggedServiceIds('chill_budget.calculator') as $id => $tags) { foreach ($tags as $tag) { diff --git a/src/Bundle/ChillBudgetBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillBudgetBundle/DependencyInjection/Configuration.php index 8856df22b..ff9931f2d 100644 --- a/src/Bundle/ChillBudgetBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillBudgetBundle/DependencyInjection/Configuration.php @@ -19,7 +19,7 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('chill_budget'); - $rootNode = $treeBuilder->getRootNode('chill_budget'); + $rootNode = $treeBuilder->getRootNode(); $rootNode ->children() diff --git a/src/Bundle/ChillBudgetBundle/Entity/AbstractElement.php b/src/Bundle/ChillBudgetBundle/Entity/AbstractElement.php index f12ba3d72..619a6cdd7 100644 --- a/src/Bundle/ChillBudgetBundle/Entity/AbstractElement.php +++ b/src/Bundle/ChillBudgetBundle/Entity/AbstractElement.php @@ -41,7 +41,7 @@ abstract class AbstractElement /** * @ORM\Column(name="comment", type="text", nullable=true) */ - private ?string $comment; + private ?string $comment = null; /** * @ORM\Column(name="endDate", type="datetime_immutable", nullable=true) @@ -50,7 +50,7 @@ abstract class AbstractElement * message="The budget element's end date must be after the start date" * ) */ - private ?DateTimeImmutable $endDate; + private ?DateTimeImmutable $endDate = null; /** * @ORM\ManyToOne( diff --git a/src/Bundle/ChillBudgetBundle/Form/ChargeType.php b/src/Bundle/ChillBudgetBundle/Form/ChargeType.php index 3356057cf..72863163f 100644 --- a/src/Bundle/ChillBudgetBundle/Form/ChargeType.php +++ b/src/Bundle/ChillBudgetBundle/Form/ChargeType.php @@ -52,9 +52,7 @@ class ChargeType extends AbstractType 'label' => 'Charge type', 'required' => true, 'placeholder' => $this->translator->trans('admin.form.Choose the type of charge'), - 'choice_label' => function (ChargeKind $resource) { - return $this->translatableStringHelper->localize($resource->getName()); - }, + 'choice_label' => fn (ChargeKind $resource) => $this->translatableStringHelper->localize($resource->getName()), 'attr' => ['class' => 'select2'], ]) ->add('amount', MoneyType::class) diff --git a/src/Bundle/ChillBudgetBundle/Form/ResourceType.php b/src/Bundle/ChillBudgetBundle/Form/ResourceType.php index fd859217a..09dfd16f3 100644 --- a/src/Bundle/ChillBudgetBundle/Form/ResourceType.php +++ b/src/Bundle/ChillBudgetBundle/Form/ResourceType.php @@ -51,9 +51,7 @@ class ResourceType extends AbstractType 'label' => 'Resource type', 'required' => true, 'placeholder' => $this->translator->trans('admin.form.Choose the type of resource'), - 'choice_label' => function (ResourceKind $resource) { - return $this->translatableStringHelper->localize($resource->getName()); - }, + 'choice_label' => fn (ResourceKind $resource) => $this->translatableStringHelper->localize($resource->getName()), 'attr' => ['class' => 'select2'], ]) ->add('amount', MoneyType::class) diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Budget/_macros.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Budget/_macros.html.twig index 70e96d96c..dfa286af4 100644 --- a/src/Bundle/ChillBudgetBundle/Resources/views/Budget/_macros.html.twig +++ b/src/Bundle/ChillBudgetBundle/Resources/views/Budget/_macros.html.twig @@ -16,8 +16,14 @@ {% if f.isResource %} {{ f.resource.name|localize_translatable_string }} + {% if f.resource.getKind is same as 'other' %} + : {{ f.getComment }} + {% endif %} {% else %} {{ f.charge.name|localize_translatable_string }} + {% if f.charge.getKind is same as 'other' %} + : {{ f.getComment }} + {% endif %} {% endif %} {{ f.amount|format_currency('EUR') }} diff --git a/src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudget.php b/src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudget.php index ad2a014ed..1c66d4c1c 100644 --- a/src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudget.php +++ b/src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudget.php @@ -66,9 +66,7 @@ final class SummaryBudget implements SummaryBudgetInterface ]; } - $personIds = $household->getCurrentPersons()->map(static function (Person $p) { - return $p->getId(); - }); + $personIds = $household->getCurrentPersons()->map(static fn (Person $p) => $p->getId()); $ids = implode(', ', array_fill(0, count($personIds), '?')); $parameters = [...$personIds, $household->getId()]; @@ -127,18 +125,14 @@ final class SummaryBudget implements SummaryBudgetInterface { $keys = array_map(static fn (ChargeKind $kind) => $kind->getKind(), $this->chargeKindRepository->findAll()); - return array_combine($keys, array_map(function ($kind) { - return ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($this->chargeKindRepository->findOneByKind($kind)->getName()), 'comment' => '']; - }, $keys)); + return array_combine($keys, array_map(fn ($kind) => ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($this->chargeKindRepository->findOneByKind($kind)->getName()), 'comment' => ''], $keys)); } private function getEmptyResourceArray(): array { $keys = array_map(static fn (ResourceKind $kind) => $kind->getKind(), $this->resourceKindRepository->findAll()); - return array_combine($keys, array_map(function ($kind) { - return ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($this->resourceKindRepository->findOneByKind($kind)->getName()), 'comment' => '']; - }, $keys)); + return array_combine($keys, array_map(fn ($kind) => ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($this->resourceKindRepository->findOneByKind($kind)->getName()), 'comment' => ''], $keys)); } private function rowToArray(array $rows, string $kind): array diff --git a/src/Bundle/ChillBudgetBundle/Tests/Service/Summary/SummaryBudgetTest.php b/src/Bundle/ChillBudgetBundle/Tests/Service/Summary/SummaryBudgetTest.php index 7fcda6b11..77017abc5 100644 --- a/src/Bundle/ChillBudgetBundle/Tests/Service/Summary/SummaryBudgetTest.php +++ b/src/Bundle/ChillBudgetBundle/Tests/Service/Summary/SummaryBudgetTest.php @@ -50,9 +50,7 @@ final class SummaryBudgetTest extends TestCase ], ]); $queryCharges->setParameters(Argument::type('array')) - ->will(static function ($args, $query) { - return $query; - }); + ->will(static fn ($args, $query) => $query); $queryResources = $this->prophesize(AbstractQuery::class); $queryResources->getResult()->willReturn([ @@ -63,9 +61,7 @@ final class SummaryBudgetTest extends TestCase ], ]); $queryResources->setParameters(Argument::type('array')) - ->will(static function ($args, $query) { - return $query; - }); + ->will(static fn ($args, $query) => $query); $em = $this->prophesize(EntityManagerInterface::class); $em->createNativeQuery(Argument::type('string'), Argument::type(Query\ResultSetMapping::class)) @@ -100,9 +96,7 @@ final class SummaryBudgetTest extends TestCase $resourceRepository->findOneByKind('misc')->willReturn($misc); $translatableStringHelper = $this->prophesize(TranslatableStringHelperInterface::class); - $translatableStringHelper->localize(Argument::type('array'))->will(static function ($arg) { - return $arg[0]['fr']; - }); + $translatableStringHelper->localize(Argument::type('array'))->will(static fn ($arg) => $arg[0]['fr']); $person = new Person(); $personReflection = new ReflectionClass($person); diff --git a/src/Bundle/ChillCalendarBundle/Command/MapAndSubscribeUserCalendarCommand.php b/src/Bundle/ChillCalendarBundle/Command/MapAndSubscribeUserCalendarCommand.php index d0fdd0a02..b90fb83d4 100644 --- a/src/Bundle/ChillCalendarBundle/Command/MapAndSubscribeUserCalendarCommand.php +++ b/src/Bundle/ChillCalendarBundle/Command/MapAndSubscribeUserCalendarCommand.php @@ -60,7 +60,7 @@ class MapAndSubscribeUserCalendarCommand extends Command public function execute(InputInterface $input, OutputInterface $output): int { - $this->logger->info(__CLASS__ . ' execute command'); + $this->logger->info(self::class . ' execute command'); $limit = 50; $offset = 0; @@ -71,7 +71,7 @@ class MapAndSubscribeUserCalendarCommand extends Command $created = 0; $renewed = 0; - $this->logger->info(__CLASS__ . ' the number of user to get - renew', [ + $this->logger->info(self::class . ' the number of user to get - renew', [ 'total' => $total, 'expiration' => $expiration->format(DateTimeImmutable::ATOM), ]); @@ -92,7 +92,7 @@ class MapAndSubscribeUserCalendarCommand extends Command // we first try to renew an existing subscription, if any. // if not, or if it fails, we try to create a new one if ($this->mapCalendarToUser->hasActiveSubscription($user)) { - $this->logger->debug(__CLASS__ . ' renew a subscription for', [ + $this->logger->debug(self::class . ' renew a subscription for', [ 'userId' => $user->getId(), 'username' => $user->getUsernameCanonical(), ]); @@ -104,7 +104,7 @@ class MapAndSubscribeUserCalendarCommand extends Command if (0 !== $expirationTs) { ++$renewed; } else { - $this->logger->warning(__CLASS__ . ' could not renew subscription for a user', [ + $this->logger->warning(self::class . ' could not renew subscription for a user', [ 'userId' => $user->getId(), 'username' => $user->getUsernameCanonical(), ]); @@ -112,7 +112,7 @@ class MapAndSubscribeUserCalendarCommand extends Command } if (!$this->mapCalendarToUser->hasActiveSubscription($user)) { - $this->logger->debug(__CLASS__ . ' create a subscription for', [ + $this->logger->debug(self::class . ' create a subscription for', [ 'userId' => $user->getId(), 'username' => $user->getUsernameCanonical(), ]); @@ -124,7 +124,7 @@ class MapAndSubscribeUserCalendarCommand extends Command if (0 !== $expirationTs) { ++$created; } else { - $this->logger->warning(__CLASS__ . ' could not create subscription for a user', [ + $this->logger->warning(self::class . ' could not create subscription for a user', [ 'userId' => $user->getId(), 'username' => $user->getUsernameCanonical(), ]); @@ -139,7 +139,7 @@ class MapAndSubscribeUserCalendarCommand extends Command $this->em->clear(); } - $this->logger->warning(__CLASS__ . ' process executed', [ + $this->logger->warning(self::class . ' process executed', [ 'created' => $created, 'renewed' => $renewed, ]); diff --git a/src/Bundle/ChillCalendarBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillCalendarBundle/DependencyInjection/Configuration.php index 127b69047..a3e4ae391 100644 --- a/src/Bundle/ChillCalendarBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillCalendarBundle/DependencyInjection/Configuration.php @@ -24,7 +24,7 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('chill_calendar'); - $rootNode = $treeBuilder->getRootNode('chill_calendar'); + $rootNode = $treeBuilder->getRootNode(); $rootNode ->children() diff --git a/src/Bundle/ChillCalendarBundle/Entity/Calendar.php b/src/Bundle/ChillCalendarBundle/Entity/Calendar.php index d7f38adf0..79219a6e0 100644 --- a/src/Bundle/ChillCalendarBundle/Entity/Calendar.php +++ b/src/Bundle/ChillCalendarBundle/Entity/Calendar.php @@ -514,9 +514,7 @@ class Calendar implements TrackCreationInterface, TrackUpdateInterface, HasCente */ public function getUsers(): ReadableCollection { - return $this->getInvites()->map(static function (Invite $i) { - return $i->getUser(); - }); + return $this->getInvites()->map(static fn (Invite $i) => $i->getUser()); } public function hasCalendarRange(): bool @@ -601,9 +599,7 @@ class Calendar implements TrackCreationInterface, TrackUpdateInterface, HasCente } $invite = $this->invites - ->filter(static function (Invite $invite) use ($user) { - return $invite->getUser() === $user; - }) + ->filter(static fn (Invite $invite) => $invite->getUser() === $user) ->first(); $this->removeInvite($invite); diff --git a/src/Bundle/ChillCalendarBundle/Entity/CalendarRange.php b/src/Bundle/ChillCalendarBundle/Entity/CalendarRange.php index 14cfad98b..5dbc4286f 100644 --- a/src/Bundle/ChillCalendarBundle/Entity/CalendarRange.php +++ b/src/Bundle/ChillCalendarBundle/Entity/CalendarRange.php @@ -63,7 +63,7 @@ class CalendarRange implements TrackCreationInterface, TrackUpdateInterface * @Groups({"read", "write", "calendar:read"}) * @Assert\NotNull */ - private ?Location $location; + private ?Location $location = null; /** * @ORM\Column(type="datetime_immutable", nullable=false) diff --git a/src/Bundle/ChillCalendarBundle/Export/Export/CountCalendars.php b/src/Bundle/ChillCalendarBundle/Export/Export/CountCalendars.php index f3bf79547..9d3f00f99 100644 --- a/src/Bundle/ChillCalendarBundle/Export/Export/CountCalendars.php +++ b/src/Bundle/ChillCalendarBundle/Export/Export/CountCalendars.php @@ -61,9 +61,7 @@ class CountCalendars implements ExportInterface, GroupedExportInterface $labels = array_combine($values, $values); $labels['_header'] = $this->getTitle(); - return static function ($value) use ($labels) { - return $labels[$value]; - }; + return static fn ($value) => $labels[$value]; } public function getQueryKeys($data): array @@ -91,9 +89,7 @@ class CountCalendars implements ExportInterface, GroupedExportInterface */ public function initiateQuery(array $requiredModifiers, array $acl, array $data = []): QueryBuilder { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->calendarRepository->createQueryBuilder('cal'); diff --git a/src/Bundle/ChillCalendarBundle/Export/Export/StatCalendarAvgDuration.php b/src/Bundle/ChillCalendarBundle/Export/Export/StatCalendarAvgDuration.php index ddecba415..14dd42d6b 100644 --- a/src/Bundle/ChillCalendarBundle/Export/Export/StatCalendarAvgDuration.php +++ b/src/Bundle/ChillCalendarBundle/Export/Export/StatCalendarAvgDuration.php @@ -61,9 +61,7 @@ class StatCalendarAvgDuration implements ExportInterface, GroupedExportInterface $labels = array_combine($values, $values); $labels['_header'] = $this->getTitle(); - return static function ($value) use ($labels) { - return $labels[$value]; - }; + return static fn ($value) => $labels[$value]; } public function getQueryKeys($data): array diff --git a/src/Bundle/ChillCalendarBundle/Export/Export/StatCalendarSumDuration.php b/src/Bundle/ChillCalendarBundle/Export/Export/StatCalendarSumDuration.php index d99e73a2e..1d31bfa26 100644 --- a/src/Bundle/ChillCalendarBundle/Export/Export/StatCalendarSumDuration.php +++ b/src/Bundle/ChillCalendarBundle/Export/Export/StatCalendarSumDuration.php @@ -61,9 +61,7 @@ class StatCalendarSumDuration implements ExportInterface, GroupedExportInterface $labels = array_combine($values, $values); $labels['_header'] = $this->getTitle(); - return static function ($value) use ($labels) { - return $labels[$value]; - }; + return static fn ($value) => $labels[$value]; } public function getQueryKeys($data): array diff --git a/src/Bundle/ChillCalendarBundle/Export/Filter/AgentFilter.php b/src/Bundle/ChillCalendarBundle/Export/Filter/AgentFilter.php index 18a4b0f4b..b58cee594 100644 --- a/src/Bundle/ChillCalendarBundle/Export/Filter/AgentFilter.php +++ b/src/Bundle/ChillCalendarBundle/Export/Filter/AgentFilter.php @@ -58,9 +58,7 @@ class AgentFilter implements FilterInterface { $builder->add('accepted_agents', EntityType::class, [ 'class' => User::class, - 'choice_label' => function (User $u) { - return $this->userRender->renderString($u, []); - }, + 'choice_label' => fn (User $u) => $this->userRender->renderString($u, []), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillCalendarBundle/Export/Filter/JobFilter.php b/src/Bundle/ChillCalendarBundle/Export/Filter/JobFilter.php index 0f0f42adc..69fb24447 100644 --- a/src/Bundle/ChillCalendarBundle/Export/Filter/JobFilter.php +++ b/src/Bundle/ChillCalendarBundle/Export/Filter/JobFilter.php @@ -69,11 +69,9 @@ class JobFilter implements FilterInterface { $builder->add('job', EntityType::class, [ 'class' => UserJob::class, - 'choice_label' => function (UserJob $j) { - return $this->translatableStringHelper->localize( - $j->getLabel() - ); - }, + 'choice_label' => fn (UserJob $j) => $this->translatableStringHelper->localize( + $j->getLabel() + ), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillCalendarBundle/Export/Filter/ScopeFilter.php b/src/Bundle/ChillCalendarBundle/Export/Filter/ScopeFilter.php index 4d84543a3..08d9ae023 100644 --- a/src/Bundle/ChillCalendarBundle/Export/Filter/ScopeFilter.php +++ b/src/Bundle/ChillCalendarBundle/Export/Filter/ScopeFilter.php @@ -69,11 +69,9 @@ class ScopeFilter implements FilterInterface { $builder->add('scope', EntityType::class, [ 'class' => Scope::class, - 'choice_label' => function (Scope $s) { - return $this->translatableStringHelper->localize( - $s->getName() - ); - }, + 'choice_label' => fn (Scope $s) => $this->translatableStringHelper->localize( + $s->getName() + ), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillCalendarBundle/Messenger/Handler/CalendarToRemoteHandler.php b/src/Bundle/ChillCalendarBundle/Messenger/Handler/CalendarToRemoteHandler.php index 9bcc0c434..eabdf9063 100644 --- a/src/Bundle/ChillCalendarBundle/Messenger/Handler/CalendarToRemoteHandler.php +++ b/src/Bundle/ChillCalendarBundle/Messenger/Handler/CalendarToRemoteHandler.php @@ -89,14 +89,10 @@ class CalendarToRemoteHandler implements MessageHandlerInterface $newInvites = array_filter( array_map( - function ($id) { - return $this->inviteRepository->find($id); - }, + fn ($id) => $this->inviteRepository->find($id), $calendarMessage->getNewInvitesIds(), ), - static function (?Invite $invite) { - return null !== $invite; - } + static fn (?Invite $invite) => null !== $invite ); $this->calendarConnector->syncCalendar( diff --git a/src/Bundle/ChillCalendarBundle/Messenger/Handler/MSGraphChangeNotificationHandler.php b/src/Bundle/ChillCalendarBundle/Messenger/Handler/MSGraphChangeNotificationHandler.php index 9c1e84511..a09c70c1e 100644 --- a/src/Bundle/ChillCalendarBundle/Messenger/Handler/MSGraphChangeNotificationHandler.php +++ b/src/Bundle/ChillCalendarBundle/Messenger/Handler/MSGraphChangeNotificationHandler.php @@ -77,7 +77,7 @@ class MSGraphChangeNotificationHandler implements MessageHandlerInterface $user = $this->userRepository->find($changeNotificationMessage->getUserId()); if (null === $user) { - $this->logger->warning(__CLASS__ . ' notification concern non-existent user, skipping'); + $this->logger->warning(self::class . ' notification concern non-existent user, skipping'); return; } @@ -86,7 +86,7 @@ class MSGraphChangeNotificationHandler implements MessageHandlerInterface $secret = $this->mapCalendarToUser->getSubscriptionSecret($user); if ($secret !== ($notification['clientState'] ?? -1)) { - $this->logger->warning(__CLASS__ . ' could not validate secret, skipping'); + $this->logger->warning(self::class . ' could not validate secret, skipping'); continue; } @@ -101,7 +101,7 @@ class MSGraphChangeNotificationHandler implements MessageHandlerInterface $this->calendarSyncer->handleCalendarSync($calendar, $notification, $user); $this->em->flush(); } else { - $this->logger->info(__CLASS__ . ' id not found in any calendar nor calendar range'); + $this->logger->info(self::class . ' id not found in any calendar nor calendar range'); } } diff --git a/src/Bundle/ChillCalendarBundle/Messenger/Message/CalendarMessage.php b/src/Bundle/ChillCalendarBundle/Messenger/Message/CalendarMessage.php index ec5977ad3..c8a8f8aeb 100644 --- a/src/Bundle/ChillCalendarBundle/Messenger/Message/CalendarMessage.php +++ b/src/Bundle/ChillCalendarBundle/Messenger/Message/CalendarMessage.php @@ -58,14 +58,12 @@ class CalendarMessage $this->previousMainUserId = null !== $calendar->previousMainUser ? $calendar->previousMainUser->getId() : null; $this->newInvitesIds = array_map(static fn (Invite $i) => $i->getId(), $calendar->newInvites); - $this->oldInvites = array_map(static function (Invite $i) { - return [ - 'inviteId' => $i->getId(), - 'userId' => $i->getUser()->getId(), - 'userEmail' => $i->getUser()->getEmail(), - 'userLabel' => $i->getUser()->getLabel(), - ]; - }, $calendar->oldInvites); + $this->oldInvites = array_map(static fn (Invite $i) => [ + 'inviteId' => $i->getId(), + 'userId' => $i->getUser()->getId(), + 'userEmail' => $i->getUser()->getEmail(), + 'userLabel' => $i->getUser()->getLabel(), + ], $calendar->oldInvites); } public function getAction(): string diff --git a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/RemoteEventConverter.php b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/RemoteEventConverter.php index ac1de552a..176dbe0b0 100644 --- a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/RemoteEventConverter.php +++ b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/RemoteEventConverter.php @@ -121,9 +121,7 @@ class RemoteEventConverter 'subject' => '[Chill] ' . implode( ', ', - $calendar->getPersons()->map(function (Person $p) { - return $this->personRender->renderString($p, []); - })->toArray() + $calendar->getPersons()->map(fn (Person $p) => $this->personRender->renderString($p, []))->toArray() ), 'start' => [ 'dateTime' => $calendar->getStartDate()->setTimezone($this->remoteDateTimeZone) @@ -161,9 +159,7 @@ class RemoteEventConverter { return [ 'attendees' => $calendar->getInvites()->map( - function (Invite $i) { - return $this->buildInviteToAttendee($i); - } + fn (Invite $i) => $this->buildInviteToAttendee($i) )->toArray(), ]; } diff --git a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/RemoteToLocalSync/CalendarRangeSyncer.php b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/RemoteToLocalSync/CalendarRangeSyncer.php index a9227282d..d05adfed7 100644 --- a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/RemoteToLocalSync/CalendarRangeSyncer.php +++ b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/RemoteToLocalSync/CalendarRangeSyncer.php @@ -59,7 +59,7 @@ class CalendarRangeSyncer } $calendarRange->preventEnqueueChanges = true; - $this->logger->info(__CLASS__ . ' remove a calendar range because deleted on remote calendar'); + $this->logger->info(self::class . ' remove a calendar range because deleted on remote calendar'); $this->em->remove($calendarRange); break; @@ -71,7 +71,7 @@ class CalendarRangeSyncer $notification['resource'] )->toArray(); } catch (ClientExceptionInterface $clientException) { - $this->logger->warning(__CLASS__ . ' could not retrieve event from ms graph. Already deleted ?', [ + $this->logger->warning(self::class . ' could not retrieve event from ms graph. Already deleted ?', [ 'calendarRangeId' => $calendarRange->getId(), 'remoteEventId' => $notification['resource'], ]); @@ -82,7 +82,7 @@ class CalendarRangeSyncer $lastModified = RemoteEventConverter::convertStringDateWithTimezone($new['lastModifiedDateTime']); if ($calendarRange->getRemoteAttributes()['lastModifiedDateTime'] === $lastModified->getTimestamp()) { - $this->logger->info(__CLASS__ . ' change key is equals. Source is probably a local update', [ + $this->logger->info(self::class . ' change key is equals. Source is probably a local update', [ 'calendarRangeId' => $calendarRange->getId(), 'remoteEventId' => $notification['resource'], ]); diff --git a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/RemoteToLocalSync/CalendarSyncer.php b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/RemoteToLocalSync/CalendarSyncer.php index c5a640f32..b3febf4d4 100644 --- a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/RemoteToLocalSync/CalendarSyncer.php +++ b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/RemoteToLocalSync/CalendarSyncer.php @@ -79,7 +79,7 @@ class CalendarSyncer $notification['resource'] )->toArray(); } catch (ClientExceptionInterface $clientException) { - $this->logger->warning(__CLASS__ . ' could not retrieve event from ms graph. Already deleted ?', [ + $this->logger->warning(self::class . ' could not retrieve event from ms graph. Already deleted ?', [ 'calendarId' => $calendar->getId(), 'remoteEventId' => $notification['resource'], ]); @@ -96,7 +96,7 @@ class CalendarSyncer ); if ($calendar->getRemoteAttributes()['lastModifiedDateTime'] === $lastModified->getTimestamp()) { - $this->logger->info(__CLASS__ . ' change key is equals. Source is probably a local update', [ + $this->logger->info(self::class . ' change key is equals. Source is probably a local update', [ 'calendarRangeId' => $calendar->getId(), 'remoteEventId' => $notification['resource'], ]); diff --git a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraphRemoteCalendarConnector.php b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraphRemoteCalendarConnector.php index d14ebaa02..0e3beff5f 100644 --- a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraphRemoteCalendarConnector.php +++ b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraphRemoteCalendarConnector.php @@ -190,23 +190,17 @@ class MSGraphRemoteCalendarConnector implements RemoteCalendarConnectorInterface ] )->toArray(); - $ids = array_map(static function ($item) { - return $item['id']; - }, $bareEvents['value']); + $ids = array_map(static fn ($item) => $item['id'], $bareEvents['value']); $existingIdsInRange = $this->calendarRangeRepository->findRemoteIdsPresent($ids); $existingIdsInCalendar = $this->calendarRepository->findRemoteIdsPresent($ids); return array_values( array_map( - function ($item) { - return $this->remoteEventConverter->convertToRemote($item); - }, + fn ($item) => $this->remoteEventConverter->convertToRemote($item), // filter all event to keep only the one not in range array_filter( $bareEvents['value'], - static function ($item) use ($existingIdsInRange, $existingIdsInCalendar) { - return ((!$existingIdsInRange[$item['id']]) ?? true) && ((!$existingIdsInCalendar[$item['id']]) ?? true); - } + static fn ($item) => ((!$existingIdsInRange[$item['id']]) ?? true) && ((!$existingIdsInCalendar[$item['id']]) ?? true) ) ) ); @@ -604,9 +598,7 @@ class MSGraphRemoteCalendarConnector implements RemoteCalendarConnectorInterface } $this->cacheScheduleTimeForUser[$userId] = array_map( - function ($item) { - return $this->remoteEventConverter->convertAvailabilityToRemoteEvent($item); - }, + fn ($item) => $this->remoteEventConverter->convertAvailabilityToRemoteEvent($item), $response['value'][0]['scheduleItems'] ); diff --git a/src/Bundle/ChillCalendarBundle/Service/ShortMessageNotification/BulkCalendarShortMessageSender.php b/src/Bundle/ChillCalendarBundle/Service/ShortMessageNotification/BulkCalendarShortMessageSender.php index a35fffce0..83826bbcf 100644 --- a/src/Bundle/ChillCalendarBundle/Service/ShortMessageNotification/BulkCalendarShortMessageSender.php +++ b/src/Bundle/ChillCalendarBundle/Service/ShortMessageNotification/BulkCalendarShortMessageSender.php @@ -66,6 +66,6 @@ class BulkCalendarShortMessageSender $this->em->refresh($calendar); } - $this->logger->info(__CLASS__ . 'a bulk of messages was sent', ['count_calendars' => $countCalendars, 'count_sms' => $countSms]); + $this->logger->info(self::class . 'a bulk of messages was sent', ['count_calendars' => $countCalendars, 'count_sms' => $countSms]); } } diff --git a/src/Bundle/ChillCalendarBundle/Tests/Form/CalendarTypeTest.php b/src/Bundle/ChillCalendarBundle/Tests/Form/CalendarTypeTest.php index 80b2f8c45..9195d5eac 100644 --- a/src/Bundle/ChillCalendarBundle/Tests/Form/CalendarTypeTest.php +++ b/src/Bundle/ChillCalendarBundle/Tests/Form/CalendarTypeTest.php @@ -114,12 +114,8 @@ final class CalendarTypeTest extends TypeTestCase $this->assertEquals(8, $calendar->getCalendarRange()->getId()); $this->assertEquals(9, $calendar->getLocation()->getId()); $this->assertEquals(true, $calendar->getSendSMS()); - $this->assertContains(2, $calendar->getUsers()->map(static function (User $u) { - return $u->getId(); - })); - $this->assertContains(3, $calendar->getUsers()->map(static function (User $u) { - return $u->getId(); - })); + $this->assertContains(2, $calendar->getUsers()->map(static fn (User $u) => $u->getId())); + $this->assertContains(3, $calendar->getUsers()->map(static fn (User $u) => $u->getId())); } protected function getExtensions() @@ -148,25 +144,17 @@ final class CalendarTypeTest extends TypeTestCase ) { $transformer = $this->prophesize($classTransformer); $transformer->transform(Argument::type('array')) - ->will(static function ($args) { - return implode( - ',', - array_map(static function ($p) { - return $p->getId(); - }, $args[0]) - ); - }); + ->will(static fn ($args) => implode( + ',', + array_map(static fn ($p) => $p->getId(), $args[0]) + )); $transformer->transform(Argument::exact(null)) ->willReturn([]); $transformer->transform(Argument::type(Collection::class)) - ->will(static function ($args) { - return implode( - ',', - array_map(static function ($p) { - return $p->getId(); - }, $args[0]->toArray()) - ); - }); + ->will(static fn ($args) => implode( + ',', + array_map(static fn ($p) => $p->getId(), $args[0]->toArray()) + )); $transformer->reverseTransform(Argument::type('string')) ->will(static function ($args) use ($objClass) { if (null === $args[0]) { @@ -195,9 +183,7 @@ final class CalendarTypeTest extends TypeTestCase ) { $transformer = $this->prophesize($classTransformer); $transformer->transform(Argument::type('object')) - ->will(static function ($args) { - return (string) $args[0]->getId(); - }); + ->will(static fn ($args) => (string) $args[0]->getId()); $transformer->transform(Argument::exact(null)) ->willReturn(''); $transformer->reverseTransform(Argument::type('string')) diff --git a/src/Bundle/ChillCalendarBundle/Tests/RemoteCalendar/Connector/MSGraph/AddressConverterTest.php b/src/Bundle/ChillCalendarBundle/Tests/RemoteCalendar/Connector/MSGraph/AddressConverterTest.php index 485146939..827e22381 100644 --- a/src/Bundle/ChillCalendarBundle/Tests/RemoteCalendar/Connector/MSGraph/AddressConverterTest.php +++ b/src/Bundle/ChillCalendarBundle/Tests/RemoteCalendar/Connector/MSGraph/AddressConverterTest.php @@ -63,9 +63,7 @@ final class AddressConverterTest extends TestCase { $engine = $this->prophesize(EngineInterface::class); $translatableStringHelper = $this->prophesize(TranslatableStringHelperInterface::class); - $translatableStringHelper->localize(Argument::type('array'))->will(static function ($args): string { - return ($args[0] ?? ['fr' => 'not provided'])['fr'] ?? 'not provided'; - }); + $translatableStringHelper->localize(Argument::type('array'))->will(static fn ($args): string => ($args[0] ?? ['fr' => 'not provided'])['fr'] ?? 'not provided'); $addressRender = new AddressRender($engine->reveal(), $translatableStringHelper->reveal()); diff --git a/src/Bundle/ChillCalendarBundle/Tests/Service/ShortMessageNotification/CalendarForShortMessageProviderTest.php b/src/Bundle/ChillCalendarBundle/Tests/Service/ShortMessageNotification/CalendarForShortMessageProviderTest.php index f3e35ef93..34867d8bd 100644 --- a/src/Bundle/ChillCalendarBundle/Tests/Service/ShortMessageNotification/CalendarForShortMessageProviderTest.php +++ b/src/Bundle/ChillCalendarBundle/Tests/Service/ShortMessageNotification/CalendarForShortMessageProviderTest.php @@ -72,17 +72,13 @@ final class CalendarForShortMessageProviderTest extends TestCase Argument::type(DateTimeImmutable::class), Argument::type('int'), Argument::exact(0) - )->will(static function ($args) { - return array_fill(0, $args[2], new Calendar()); - })->shouldBeCalledTimes(1); + )->will(static fn ($args) => array_fill(0, $args[2], new Calendar()))->shouldBeCalledTimes(1); $calendarRepository->findByNotificationAvailable( Argument::type(DateTimeImmutable::class), Argument::type(DateTimeImmutable::class), Argument::type('int'), Argument::not(0) - )->will(static function ($args) { - return array_fill(0, $args[2] - 1, new Calendar()); - })->shouldBeCalledTimes(1); + )->will(static fn ($args) => array_fill(0, $args[2] - 1, new Calendar()))->shouldBeCalledTimes(1); $em = $this->prophesize(EntityManagerInterface::class); $em->clear()->shouldBeCalled(); @@ -108,17 +104,13 @@ final class CalendarForShortMessageProviderTest extends TestCase Argument::type(DateTimeImmutable::class), Argument::type('int'), Argument::exact(0) - )->will(static function ($args) { - return array_fill(0, 1, new Calendar()); - })->shouldBeCalledTimes(1); + )->will(static fn ($args) => array_fill(0, 1, new Calendar()))->shouldBeCalledTimes(1); $calendarRepository->findByNotificationAvailable( Argument::type(DateTimeImmutable::class), Argument::type(DateTimeImmutable::class), Argument::type('int'), Argument::not(0) - )->will(static function ($args) { - return []; - })->shouldBeCalledTimes(1); + )->will(static fn ($args) => [])->shouldBeCalledTimes(1); $em = $this->prophesize(EntityManagerInterface::class); $em->clear()->shouldBeCalled(); diff --git a/src/Bundle/ChillCustomFieldsBundle/Command/CreateFieldsOnGroupCommand.php b/src/Bundle/ChillCustomFieldsBundle/Command/CreateFieldsOnGroupCommand.php index c8c8ad4fc..2a03e90bb 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Command/CreateFieldsOnGroupCommand.php +++ b/src/Bundle/ChillCustomFieldsBundle/Command/CreateFieldsOnGroupCommand.php @@ -192,9 +192,7 @@ class CreateFieldsOnGroupCommand extends Command foreach ($languages as $lang) { //todo replace with service to find lang when available - $names[] = (isset($cf->getName()[$lang])) ? - $cf->getName()[$lang] : - 'Not available in this language'; + $names[] = $cf->getName()[$lang] ?? 'Not available in this language'; } if ($this->validator->validate($cf)) { @@ -249,9 +247,7 @@ class CreateFieldsOnGroupCommand extends Command foreach ($languages as $lang) { //todo replace with service to find lang when available - $row[] = (isset($customFieldGroup->getName()[$lang])) ? - $customFieldGroup->getName()[$lang] : - 'Not available in this language'; + $row[] = $customFieldGroup->getName()[$lang] ?? 'Not available in this language'; } $rows[] = $row; } diff --git a/src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldChoice.php b/src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldChoice.php index 7876dd026..781b2b233 100644 --- a/src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldChoice.php +++ b/src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldChoice.php @@ -294,7 +294,7 @@ class CustomFieldChoice extends AbstractCustomField public function render($value, CustomField $customField, $documentType = 'html') { //extract the data. They are under a _choice key if they are stored with allow_other - $data = (isset($value['_choices'])) ? $value['_choices'] : $value; + $data = $value['_choices'] ?? $value; $selected = (is_array($data)) ? $data : [$data]; $choices = $customField->getOptions()[self::CHOICES]; diff --git a/src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldLongChoice.php b/src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldLongChoice.php index 41c8b4694..75dc7792f 100644 --- a/src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldLongChoice.php +++ b/src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldLongChoice.php @@ -58,9 +58,7 @@ class CustomFieldLongChoice extends AbstractCustomField $translatableStringHelper = $this->translatableStringHelper; $builder->add($customField->getSlug(), Select2ChoiceType::class, [ 'choices' => $entries, - 'choice_label' => static function (Option $option) use ($translatableStringHelper) { - return $translatableStringHelper->localize($option->getText()); - }, + 'choice_label' => static fn (Option $option) => $translatableStringHelper->localize($option->getText()), 'choice_value' => static fn (Option $key): ?int => null === $key ? null : $key->getId(), 'multiple' => false, 'expanded' => false, diff --git a/src/Bundle/ChillCustomFieldsBundle/DataFixtures/ORM/LoadOption.php b/src/Bundle/ChillCustomFieldsBundle/DataFixtures/ORM/LoadOption.php index 0edc2457a..5b2598ab7 100644 --- a/src/Bundle/ChillCustomFieldsBundle/DataFixtures/ORM/LoadOption.php +++ b/src/Bundle/ChillCustomFieldsBundle/DataFixtures/ORM/LoadOption.php @@ -104,7 +104,7 @@ class LoadOption extends AbstractFixture implements OrderedFixtureInterface $manager->persist($parent); //Load children - $expected_nb_children = mt_rand(10, 50); + $expected_nb_children = random_int(10, 50); for ($i = 0; $i < $expected_nb_children; ++$i) { $companyName = $this->fakerFr->company; @@ -144,7 +144,7 @@ class LoadOption extends AbstractFixture implements OrderedFixtureInterface $manager->persist($parent); //Load children - $expected_nb_children = mt_rand(10, 50); + $expected_nb_children = random_int(10, 50); for ($i = 0; $i < $expected_nb_children; ++$i) { $manager->persist($this->createChildOption($parent, [ diff --git a/src/Bundle/ChillCustomFieldsBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillCustomFieldsBundle/DependencyInjection/Configuration.php index d0db269a2..e68fdd2c4 100644 --- a/src/Bundle/ChillCustomFieldsBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillCustomFieldsBundle/DependencyInjection/Configuration.php @@ -25,7 +25,7 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('chill_custom_fields'); - $rootNode = $treeBuilder->getRootNode('chill_custom_fields'); + $rootNode = $treeBuilder->getRootNode(); $classInfo = 'The class which may receive custom fields'; $nameInfo = 'The name which will appears in the user interface. May be translatable'; diff --git a/src/Bundle/ChillCustomFieldsBundle/EntityRepository/CustomFieldLongChoice/OptionRepository.php b/src/Bundle/ChillCustomFieldsBundle/EntityRepository/CustomFieldLongChoice/OptionRepository.php index 328eda36a..4ef6e046d 100644 --- a/src/Bundle/ChillCustomFieldsBundle/EntityRepository/CustomFieldLongChoice/OptionRepository.php +++ b/src/Bundle/ChillCustomFieldsBundle/EntityRepository/CustomFieldLongChoice/OptionRepository.php @@ -57,8 +57,6 @@ class OptionRepository extends EntityRepository ->getQuery() ->getScalarResult(); - return array_map(static function ($r) { - return $r['key']; - }, $keys); + return array_map(static fn ($r) => $r['key'], $keys); } } diff --git a/src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldType.php b/src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldType.php index aa1d1b7e1..0630bccf5 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldType.php +++ b/src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldType.php @@ -70,9 +70,7 @@ class CustomFieldType extends AbstractType if ('entity' === $options['group_widget']) { $builder->add('customFieldsGroup', EntityType::class, [ 'class' => 'ChillCustomFieldsBundle:CustomFieldsGroup', - 'choice_label' => function ($g) { - return $this->translatableStringHelper->localize($g->getName()); - }, + 'choice_label' => fn ($g) => $this->translatableStringHelper->localize($g->getName()), ]); } elseif ('hidden' === $options['group_widget']) { $builder->add('customFieldsGroup', HiddenType::class); @@ -119,7 +117,7 @@ class CustomFieldType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\CustomFieldsBundle\Entity\CustomField', + 'data_class' => \Chill\CustomFieldsBundle\Entity\CustomField::class, ]); $resolver->setRequired(['type', 'group_widget']) diff --git a/src/Bundle/ChillCustomFieldsBundle/Form/DataTransformer/JsonCustomFieldToArrayTransformer.php b/src/Bundle/ChillCustomFieldsBundle/Form/DataTransformer/JsonCustomFieldToArrayTransformer.php index 6bd12a07a..2b34b498a 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Form/DataTransformer/JsonCustomFieldToArrayTransformer.php +++ b/src/Bundle/ChillCustomFieldsBundle/Form/DataTransformer/JsonCustomFieldToArrayTransformer.php @@ -38,9 +38,7 @@ class JsonCustomFieldToArrayTransformer implements DataTransformerInterface // @TODO: in the array_map callback, CustomField::getLabel() does not exist. What do we do here? $customFieldsLablels = array_map( - static function ($e) { - return $e->getLabel(); - }, + static fn ($e) => $e->getLabel(), $customFields ); @@ -108,7 +106,7 @@ class JsonCustomFieldToArrayTransformer implements DataTransformerInterface //echo json_encode($customFieldsArrayRet); - return json_encode($customFieldsArrayRet); + return json_encode($customFieldsArrayRet, JSON_THROW_ON_ERROR); } public function transform($customFieldsJSON) diff --git a/src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoicesListType.php b/src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoicesListType.php index 071363451..c50bd856e 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoicesListType.php +++ b/src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoicesListType.php @@ -38,7 +38,7 @@ class ChoicesListType extends AbstractType $formData = $form->getData(); if (null === $formData['slug']) { - $slug = uniqid(mt_rand(), true); + $slug = uniqid(random_int(0, mt_getrandmax()), true); $data['slug'] = $slug; $event->setData($data); diff --git a/src/Bundle/ChillCustomFieldsBundle/Form/Type/CustomFieldType.php b/src/Bundle/ChillCustomFieldsBundle/Form/Type/CustomFieldType.php index 5b1d39529..67ea171e6 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Form/Type/CustomFieldType.php +++ b/src/Bundle/ChillCustomFieldsBundle/Form/Type/CustomFieldType.php @@ -49,7 +49,7 @@ class CustomFieldType extends AbstractType { $resolver ->setRequired(['group']) - ->addAllowedTypes('group', ['Chill\CustomFieldsBundle\Entity\CustomFieldsGroup']); + ->addAllowedTypes('group', [\Chill\CustomFieldsBundle\Entity\CustomFieldsGroup::class]); } public function getBlockPrefix() diff --git a/src/Bundle/ChillCustomFieldsBundle/Service/CustomFieldsHelper.php b/src/Bundle/ChillCustomFieldsBundle/Service/CustomFieldsHelper.php index 67afdec85..9ffd836e6 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Service/CustomFieldsHelper.php +++ b/src/Bundle/ChillCustomFieldsBundle/Service/CustomFieldsHelper.php @@ -49,7 +49,7 @@ class CustomFieldsHelper public function isEmptyValue(array $fields, CustomField $customField) { $slug = $customField->getSlug(); - $rawValue = (isset($fields[$slug])) ? $fields[$slug] : null; + $rawValue = $fields[$slug] ?? null; $customFieldType = $this->provider->getCustomFieldByType($customField->getType()); $deserializedValue = $customFieldType->deserialize($rawValue, $customField); @@ -71,7 +71,7 @@ class CustomFieldsHelper public function renderCustomField(array $fields, CustomField $customField, $documentType = 'html') { $slug = $customField->getSlug(); - $rawValue = (isset($fields[$slug])) ? $fields[$slug] : null; + $rawValue = $fields[$slug] ?? null; $customFieldType = $this->provider->getCustomFieldByType($customField->getType()); return $customFieldType->render($rawValue, $customField, $documentType); diff --git a/src/Bundle/ChillCustomFieldsBundle/Tests/Controller/CustomFieldsGroupControllerTest.php b/src/Bundle/ChillCustomFieldsBundle/Tests/Controller/CustomFieldsGroupControllerTest.php index 067fe7de6..7e0fe12d2 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Tests/Controller/CustomFieldsGroupControllerTest.php +++ b/src/Bundle/ChillCustomFieldsBundle/Tests/Controller/CustomFieldsGroupControllerTest.php @@ -52,7 +52,7 @@ final class CustomFieldsGroupControllerTest extends WebTestCase // Fill in the form and submit it $form = $crawler->selectButton('Créer')->form([ 'custom_fields_group[name][fr]' => 'Test', - 'custom_fields_group[entity]' => 'Chill\PersonBundle\Entity\Person', + 'custom_fields_group[entity]' => \Chill\PersonBundle\Entity\Person::class, ]); $crawler = $client->submit($form); diff --git a/src/Bundle/ChillCustomFieldsBundle/Tests/CustomFieldTestHelper.php b/src/Bundle/ChillCustomFieldsBundle/Tests/CustomFieldTestHelper.php index 35a9ee82b..79f547fe2 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Tests/CustomFieldTestHelper.php +++ b/src/Bundle/ChillCustomFieldsBundle/Tests/CustomFieldTestHelper.php @@ -34,12 +34,12 @@ trait CustomFieldTestHelper $kernel = static::$kernel; //check a kernel is accessible - $customFieldsGroup = $this->createMock('Chill\CustomFieldsBundle\Entity\CustomFieldsGroup'); + $customFieldsGroup = $this->createMock(\Chill\CustomFieldsBundle\Entity\CustomFieldsGroup::class); $customFieldsGroup->expects($this->once()) ->method('getActiveCustomFields') ->will($this->returnValue([$field])); - $request = $this->createMock('Symfony\Component\HttpFoundation\Request'); + $request = $this->createMock(\Symfony\Component\HttpFoundation\Request::class); $request->expects($this->any()) ->method('getLocale') ->will($this->returnValue($locale)); diff --git a/src/Bundle/ChillCustomFieldsBundle/Tests/CustomFields/CustomFieldsTextTest.php b/src/Bundle/ChillCustomFieldsBundle/Tests/CustomFields/CustomFieldsTextTest.php index cc1b4db64..6bfe2663c 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Tests/CustomFields/CustomFieldsTextTest.php +++ b/src/Bundle/ChillCustomFieldsBundle/Tests/CustomFields/CustomFieldsTextTest.php @@ -41,11 +41,11 @@ final class CustomFieldsTextTest extends WebTestCase $customField = $this->customFieldProvider->getCustomFieldByType('text'); $this->assertInstanceOf( - 'Chill\CustomFieldsBundle\CustomFields\CustomFieldInterface', + \Chill\CustomFieldsBundle\CustomFields\CustomFieldInterface::class, $customField ); $this->assertInstanceOf( - 'Chill\CustomFieldsBundle\CustomFields\CustomFieldText', + \Chill\CustomFieldsBundle\CustomFields\CustomFieldText::class, $customField ); } diff --git a/src/Bundle/ChillCustomFieldsBundle/Tests/Templating/Twig/CustomFieldRenderingTwigTest.php b/src/Bundle/ChillCustomFieldsBundle/Tests/Templating/Twig/CustomFieldRenderingTwigTest.php index 420e79dff..2e29d988b 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Tests/Templating/Twig/CustomFieldRenderingTwigTest.php +++ b/src/Bundle/ChillCustomFieldsBundle/Tests/Templating/Twig/CustomFieldRenderingTwigTest.php @@ -46,7 +46,7 @@ final class CustomFieldRenderingTwigTest extends KernelTestCase // set locale to fr $prophet = new \Prophecy\Prophet(); $request = $prophet->prophesize(); - $request->willExtend('Symfony\Component\HttpFoundation\Request'); + $request->willExtend(\Symfony\Component\HttpFoundation\Request::class); $request->getLocale()->willReturn('fr'); self::$kernel->getContainer()->get('request_stack') ->push($request->reveal()); diff --git a/src/Bundle/ChillCustomFieldsBundle/Tests/Templating/Twig/CustomFieldsGroupRenderingTwigTest.php b/src/Bundle/ChillCustomFieldsBundle/Tests/Templating/Twig/CustomFieldsGroupRenderingTwigTest.php index 7ffa31db5..f3b93c390 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Tests/Templating/Twig/CustomFieldsGroupRenderingTwigTest.php +++ b/src/Bundle/ChillCustomFieldsBundle/Tests/Templating/Twig/CustomFieldsGroupRenderingTwigTest.php @@ -48,7 +48,7 @@ final class CustomFieldsGroupRenderingTwigTest extends KernelTestCase // set locale to fr $prophet = new \Prophecy\Prophet(); $request = $prophet->prophesize(); - $request->willExtend('Symfony\Component\HttpFoundation\Request'); + $request->willExtend(\Symfony\Component\HttpFoundation\Request::class); $request->getLocale()->willReturn('fr'); self::$kernel->getContainer()->get('request_stack') ->push($request->reveal()); diff --git a/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php b/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php index b5bd10d16..5b4a8be30 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php +++ b/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php @@ -61,12 +61,8 @@ class DocGeneratorTemplateType extends AbstractType $sub = $builder ->create('options', null, ['compound' => true]) ->addModelTransformer(new CallbackTransformer( - static function (array $data) use ($context) { - return $context->adminFormTransform($data); - }, - static function (array $data) use ($context) { - return $context->adminFormReverseTransform($data); - } + static fn (array $data) => $context->adminFormTransform($data), + static fn (array $data) => $context->adminFormReverseTransform($data) )); $context->buildAdminForm($sub); $builder->add($sub); diff --git a/src/Bundle/ChillDocGeneratorBundle/GeneratorDriver/RelatorioDriver.php b/src/Bundle/ChillDocGeneratorBundle/GeneratorDriver/RelatorioDriver.php index 0f62931b4..c14b67df7 100644 --- a/src/Bundle/ChillDocGeneratorBundle/GeneratorDriver/RelatorioDriver.php +++ b/src/Bundle/ChillDocGeneratorBundle/GeneratorDriver/RelatorioDriver.php @@ -44,7 +44,7 @@ final class RelatorioDriver implements DriverInterface { $form = new FormDataPart( [ - 'variables' => json_encode($data), + 'variables' => json_encode($data, JSON_THROW_ON_ERROR), 'template' => new DataPart($template, $templateName ?? uniqid('template_'), $resourceType), ] ); @@ -61,7 +61,7 @@ final class RelatorioDriver implements DriverInterface $content = $e->getResponse()->getContent(false); if (400 === $e->getResponse()->getStatusCode()) { - $content = json_decode($content, true); + $content = json_decode($content, true, 512, JSON_THROW_ON_ERROR); $this->logger->error('relatorio: template error', [ 'error' => $content['message'] ?? '_not defined', ]); diff --git a/src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/CollectionDocGenNormalizer.php b/src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/CollectionDocGenNormalizer.php index 196018a03..b4e99bb98 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/CollectionDocGenNormalizer.php +++ b/src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/CollectionDocGenNormalizer.php @@ -13,6 +13,7 @@ namespace Chill\DocGeneratorBundle\Serializer\Normalizer; use ArrayObject; use Doctrine\Common\Collections\Collection; +use Doctrine\Common\Collections\ReadableCollection; use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface; use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface; use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait; @@ -51,7 +52,9 @@ class CollectionDocGenNormalizer implements ContextAwareNormalizerInterface, Nor return false; } - return $data instanceof Collection - || (null === $data && Collection::class === ($context['docgen:expects'] ?? null)); + return $data instanceof ReadableCollection + || (null === $data && Collection::class === ($context['docgen:expects'] ?? null)) + || (null === $data && ReadableCollection::class === ($context['docgen:expects'] ?? null)) + ; } } diff --git a/src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/DocGenObjectNormalizer.php b/src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/DocGenObjectNormalizer.php index 3807ee9ee..bbf12b0fd 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/DocGenObjectNormalizer.php +++ b/src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/DocGenObjectNormalizer.php @@ -13,6 +13,7 @@ namespace Chill\DocGeneratorBundle\Serializer\Normalizer; use Chill\DocGeneratorBundle\Serializer\Helper\NormalizeNullValueHelper; use Chill\MainBundle\Templating\TranslatableStringHelperInterface; +use Doctrine\Common\Collections\ReadableCollection; use ReflectionClass; use RuntimeException; use Symfony\Component\PropertyAccess\PropertyAccess; @@ -271,6 +272,14 @@ class DocGenObjectNormalizer implements NormalizerAwareInterface, NormalizerInte if ($isTranslatable) { $data[$key] = $this->translatableStringHelper ->localize($value); + } elseif ($value instanceof ReadableCollection) { + // when normalizing collection, we should not preserve keys (to ensure that the result is a list) + // this is why we make call to the normalizer again to use the CollectionDocGenNormalizer + $data[$key] = + $this->normalizer->normalize($value, $format, array_merge( + $objectContext, + $attribute->getNormalizationContextForGroups($expectedGroups) + )); } elseif (is_iterable($value)) { $arr = []; diff --git a/src/Bundle/ChillDocGeneratorBundle/Service/Generator/ObjectReadyException.php b/src/Bundle/ChillDocGeneratorBundle/Service/Generator/ObjectReadyException.php index 37540a2f8..15db2eed4 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Service/Generator/ObjectReadyException.php +++ b/src/Bundle/ChillDocGeneratorBundle/Service/Generator/ObjectReadyException.php @@ -17,6 +17,6 @@ class ObjectReadyException extends RuntimeException { public function __construct() { - parent::__construct('object is already ready', 6698856); + parent::__construct('object is already ready', 6_698_856); } } diff --git a/src/Bundle/ChillDocGeneratorBundle/Service/Generator/RelatedEntityNotFoundException.php b/src/Bundle/ChillDocGeneratorBundle/Service/Generator/RelatedEntityNotFoundException.php index 9cca0bcda..0453975b2 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Service/Generator/RelatedEntityNotFoundException.php +++ b/src/Bundle/ChillDocGeneratorBundle/Service/Generator/RelatedEntityNotFoundException.php @@ -19,7 +19,7 @@ class RelatedEntityNotFoundException extends RuntimeException { parent::__construct( sprintf('Related entity not found: %s, %s', $relatedEntityClass, $relatedEntityId), - 99876652, + 99_876_652, $previous ); } diff --git a/src/Bundle/ChillDocGeneratorBundle/tests/Serializer/Normalizer/CollectionDocGenNormalizerTest.php b/src/Bundle/ChillDocGeneratorBundle/tests/Serializer/Normalizer/CollectionDocGenNormalizerTest.php new file mode 100644 index 000000000..7bfddadca --- /dev/null +++ b/src/Bundle/ChillDocGeneratorBundle/tests/Serializer/Normalizer/CollectionDocGenNormalizerTest.php @@ -0,0 +1,52 @@ +normalizer = self::$container->get(NormalizerInterface::class); + } + + public function testNormalizeFilteredArray(): void + { + $coll = new ArrayCollection([ + (object) ['v' => 'foo'], + (object) ['v' => 'bar'], + (object) ['v' => 'baz'], + ]); + + //filter to get non continuous indexes + $criteria = new Criteria(); + $criteria->where(Criteria::expr()->neq('v', 'bar')); + + $filtered = $coll->matching($criteria); + $normalized = $this->normalizer->normalize($filtered, 'docgen', []); + + self::assertIsArray($normalized); + self::assertArrayHasKey(0, $normalized); + self::assertArrayHasKey(1, $normalized); + } +} diff --git a/src/Bundle/ChillDocStoreBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillDocStoreBundle/DependencyInjection/Configuration.php index d2c56d8d1..466158783 100644 --- a/src/Bundle/ChillDocStoreBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillDocStoreBundle/DependencyInjection/Configuration.php @@ -24,7 +24,7 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('chill_doc_store'); - $rootNode = $treeBuilder->getRootNode('chill_doc_store'); + $rootNode = $treeBuilder->getRootNode(); // Here you should define the parameters that are allowed to // configure your bundle. See the documentation linked above for diff --git a/src/Bundle/ChillDocStoreBundle/Entity/StoredObject.php b/src/Bundle/ChillDocStoreBundle/Entity/StoredObject.php index e83d3b3fc..0583e26b2 100644 --- a/src/Bundle/ChillDocStoreBundle/Entity/StoredObject.php +++ b/src/Bundle/ChillDocStoreBundle/Entity/StoredObject.php @@ -58,7 +58,7 @@ class StoredObject implements AsyncFileInterface, Document, TrackCreationInterfa * @ORM\Column(type="integer") * @Serializer\Groups({"read", "write"}) */ - private ?int $id; + private ?int $id = null; /** * @var int[] @@ -94,7 +94,7 @@ class StoredObject implements AsyncFileInterface, Document, TrackCreationInterfa /** * @ORM\ManyToOne(targetEntity=DocGeneratorTemplate::class) */ - private ?DocGeneratorTemplate $template; + private ?DocGeneratorTemplate $template = null; /** * @ORM\Column(type="text", options={"default": "ready"}) diff --git a/src/Bundle/ChillDocStoreBundle/Form/AccompanyingCourseDocumentType.php b/src/Bundle/ChillDocStoreBundle/Form/AccompanyingCourseDocumentType.php index f77083390..5ed5b5981 100644 --- a/src/Bundle/ChillDocStoreBundle/Form/AccompanyingCourseDocumentType.php +++ b/src/Bundle/ChillDocStoreBundle/Form/AccompanyingCourseDocumentType.php @@ -72,14 +72,10 @@ class AccompanyingCourseDocumentType extends AbstractType ->add('category', EntityType::class, [ 'placeholder' => 'Choose a document category', 'class' => DocumentCategory::class, - 'query_builder' => static function (EntityRepository $er) { - return $er->createQueryBuilder('c') - ->where('c.documentClass = :docClass') - ->setParameter('docClass', AccompanyingCourseDocument::class); - }, - 'choice_label' => function ($entity = null) { - return $entity ? $this->translatableStringHelper->localize($entity->getName()) : ''; - }, + 'query_builder' => static fn (EntityRepository $er) => $er->createQueryBuilder('c') + ->where('c.documentClass = :docClass') + ->setParameter('docClass', AccompanyingCourseDocument::class), + 'choice_label' => fn ($entity = null) => $entity ? $this->translatableStringHelper->localize($entity->getName()) : '', ]); } diff --git a/src/Bundle/ChillDocStoreBundle/Form/PersonDocumentType.php b/src/Bundle/ChillDocStoreBundle/Form/PersonDocumentType.php index c87cc4e73..11f73e862 100644 --- a/src/Bundle/ChillDocStoreBundle/Form/PersonDocumentType.php +++ b/src/Bundle/ChillDocStoreBundle/Form/PersonDocumentType.php @@ -67,14 +67,10 @@ class PersonDocumentType extends AbstractType ->add('category', EntityType::class, [ 'placeholder' => 'Choose a document category', 'class' => DocumentCategory::class, - 'query_builder' => static function (EntityRepository $er) { - return $er->createQueryBuilder('c') - ->where('c.documentClass = :docClass') - ->setParameter('docClass', PersonDocument::class); - }, - 'choice_label' => function ($entity = null) { - return $entity ? $this->translatableStringHelper->localize($entity->getName()) : ''; - }, + 'query_builder' => static fn (EntityRepository $er) => $er->createQueryBuilder('c') + ->where('c.documentClass = :docClass') + ->setParameter('docClass', PersonDocument::class), + 'choice_label' => fn ($entity = null) => $entity ? $this->translatableStringHelper->localize($entity->getName()) : '', ]); if ($isScopeConcerned && $this->parameterBag->get('chill_main')['acl']['form_show_scopes']) { diff --git a/src/Bundle/ChillDocStoreBundle/Form/StoredObjectType.php b/src/Bundle/ChillDocStoreBundle/Form/StoredObjectType.php index 664e7a2aa..4f3cd315f 100644 --- a/src/Bundle/ChillDocStoreBundle/Form/StoredObjectType.php +++ b/src/Bundle/ChillDocStoreBundle/Form/StoredObjectType.php @@ -95,7 +95,7 @@ class StoredObjectType extends AbstractType return null; } - return json_decode($value, true); + return json_decode($value, true, 512, JSON_THROW_ON_ERROR); } public function reverseTransformObject($object) @@ -120,7 +120,7 @@ class StoredObjectType extends AbstractType return null; } - return json_encode($object); + return json_encode($object, JSON_THROW_ON_ERROR); } public function transformObject($object = null) diff --git a/src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php b/src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php index c538bd107..c3285507e 100644 --- a/src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php +++ b/src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php @@ -51,9 +51,7 @@ class AccompanyingCourseDocumentWorkflowHandler implements EntityWorkflowHandler $persons = []; if (null !== $course) { - $persons = $course->getCurrentParticipations()->map(static function (AccompanyingPeriodParticipation $participation) { - return $participation->getPerson(); - })->toArray(); + $persons = $course->getCurrentParticipations()->map(static fn (AccompanyingPeriodParticipation $participation) => $participation->getPerson())->toArray(); } return [ diff --git a/src/Bundle/ChillEventBundle/Controller/ParticipationController.php b/src/Bundle/ChillEventBundle/Controller/ParticipationController.php index dafbc8b8a..1929beac1 100644 --- a/src/Bundle/ChillEventBundle/Controller/ParticipationController.php +++ b/src/Bundle/ChillEventBundle/Controller/ParticipationController.php @@ -113,9 +113,7 @@ class ParticipationController extends AbstractController [ 'event_id' => current($participations)->getEvent()->getId(), 'persons_ids' => implode(',', array_map( - static function (Participation $p) { - return $p->getPerson()->getId(); - }, + static fn (Participation $p) => $p->getPerson()->getId(), $participations )), ] @@ -649,19 +647,14 @@ class ParticipationController extends AbstractController // create a collection of person's id participating to the event /** @var \Doctrine\Common\Collections\ArrayCollection $peopleParticipating */ - $peopleParticipating = $peopleParticipating ?? - $participation->getEvent()->getParticipations()->map( - static function (Participation $p) { - return $p->getPerson()->getId(); - } - ); + $peopleParticipating ??= $participation->getEvent()->getParticipations()->map( + static fn (Participation $p) => $p->getPerson()->getId() + ); // check that the user is not already in the event if ($peopleParticipating->contains($participation->getPerson()->getId())) { $ignoredParticipations[] = $participation ->getEvent()->getParticipations()->filter( - static function (Participation $p) use ($participation) { - return $p->getPerson()->getId() === $participation->getPerson()->getId(); - } + static fn (Participation $p) => $p->getPerson()->getId() === $participation->getPerson()->getId() )->first(); } else { $newParticipations[] = $participation; diff --git a/src/Bundle/ChillEventBundle/DataFixtures/ORM/LoadParticipation.php b/src/Bundle/ChillEventBundle/DataFixtures/ORM/LoadParticipation.php index ed38faf01..71b07a123 100644 --- a/src/Bundle/ChillEventBundle/DataFixtures/ORM/LoadParticipation.php +++ b/src/Bundle/ChillEventBundle/DataFixtures/ORM/LoadParticipation.php @@ -43,7 +43,7 @@ class LoadParticipation extends AbstractFixture implements OrderedFixtureInterfa for ($i = 0; $i < $expectedNumber; ++$i) { $event = (new Event()) ->setDate($this->faker->dateTimeBetween('-2 years', '+6 months')) - ->setName($this->faker->words(mt_rand(2, 4), true)) + ->setName($this->faker->words(random_int(2, 4), true)) ->setType($this->getReference(LoadEventTypes::$refs[array_rand(LoadEventTypes::$refs)])) ->setCenter($center) ->setCircle( @@ -75,7 +75,7 @@ class LoadParticipation extends AbstractFixture implements OrderedFixtureInterfa /** @var \Chill\PersonBundle\Entity\Person $person */ foreach ($people as $person) { - $nb = mt_rand(0, 3); + $nb = random_int(0, 3); for ($i = 0; $i < $nb; ++$i) { $event = $events[array_rand($events)]; diff --git a/src/Bundle/ChillEventBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillEventBundle/DependencyInjection/Configuration.php index b36f7b6a9..fe42ad99a 100644 --- a/src/Bundle/ChillEventBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillEventBundle/DependencyInjection/Configuration.php @@ -24,7 +24,7 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('chill_event'); - $rootNode = $treeBuilder->getRootNode('chill_event'); + $rootNode = $treeBuilder->getRootNode(); // Here you should define the parameters that are allowed to // configure your bundle. See the documentation linked above for diff --git a/src/Bundle/ChillEventBundle/Entity/Event.php b/src/Bundle/ChillEventBundle/Entity/Event.php index 6ac9c1508..d55a7b8a8 100644 --- a/src/Bundle/ChillEventBundle/Entity/Event.php +++ b/src/Bundle/ChillEventBundle/Entity/Event.php @@ -176,9 +176,7 @@ class Event implements HasCenterInterface, HasScopeInterface { $iterator = $this->participations->getIterator(); - $iterator->uasort(static function ($first, $second) { - return strnatcasecmp($first->getPerson()->getFirstName(), $second->getPerson()->getFirstName()); - }); + $iterator->uasort(static fn ($first, $second) => strnatcasecmp($first->getPerson()->getFirstName(), $second->getPerson()->getFirstName())); return $iterator; } diff --git a/src/Bundle/ChillEventBundle/Form/ChoiceLoader/EventChoiceLoader.php b/src/Bundle/ChillEventBundle/Form/ChoiceLoader/EventChoiceLoader.php index 30a00ebb9..962799dbc 100644 --- a/src/Bundle/ChillEventBundle/Form/ChoiceLoader/EventChoiceLoader.php +++ b/src/Bundle/ChillEventBundle/Form/ChoiceLoader/EventChoiceLoader.php @@ -62,9 +62,7 @@ class EventChoiceLoader implements ChoiceLoaderInterface { return new \Symfony\Component\Form\ChoiceList\ArrayChoiceList( $this->lazyLoadedEvents, - static function (Event $p) use ($value) { - return call_user_func($value, $p); - } + static fn (Event $p) => call_user_func($value, $p) ); } diff --git a/src/Bundle/ChillEventBundle/Form/EventType.php b/src/Bundle/ChillEventBundle/Form/EventType.php index fec26c373..a72b90494 100644 --- a/src/Bundle/ChillEventBundle/Form/EventType.php +++ b/src/Bundle/ChillEventBundle/Form/EventType.php @@ -54,7 +54,7 @@ class EventType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\EventBundle\Entity\Event', + 'data_class' => \Chill\EventBundle\Entity\Event::class, ]); $resolver ->setRequired(['center', 'role']) diff --git a/src/Bundle/ChillEventBundle/Form/EventTypeType.php b/src/Bundle/ChillEventBundle/Form/EventTypeType.php index 9f971f55d..bab13c374 100644 --- a/src/Bundle/ChillEventBundle/Form/EventTypeType.php +++ b/src/Bundle/ChillEventBundle/Form/EventTypeType.php @@ -36,7 +36,7 @@ class EventTypeType extends AbstractType public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\EventBundle\Entity\EventType', + 'data_class' => \Chill\EventBundle\Entity\EventType::class, ]); } } diff --git a/src/Bundle/ChillEventBundle/Form/RoleType.php b/src/Bundle/ChillEventBundle/Form/RoleType.php index e4e55faca..519e814cf 100644 --- a/src/Bundle/ChillEventBundle/Form/RoleType.php +++ b/src/Bundle/ChillEventBundle/Form/RoleType.php @@ -38,9 +38,7 @@ class RoleType extends AbstractType ->add('active') ->add('type', EntityType::class, [ 'class' => EventType::class, - 'choice_label' => function (EventType $e) { - return $this->translatableStringHelper->localize($e->getName()); - }, + 'choice_label' => fn (EventType $e) => $this->translatableStringHelper->localize($e->getName()), ]); } @@ -55,7 +53,7 @@ class RoleType extends AbstractType public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\EventBundle\Entity\Role', + 'data_class' => \Chill\EventBundle\Entity\Role::class, ]); } } diff --git a/src/Bundle/ChillEventBundle/Form/StatusType.php b/src/Bundle/ChillEventBundle/Form/StatusType.php index e70011d22..5801f3264 100644 --- a/src/Bundle/ChillEventBundle/Form/StatusType.php +++ b/src/Bundle/ChillEventBundle/Form/StatusType.php @@ -38,7 +38,7 @@ class StatusType extends AbstractType public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\EventBundle\Entity\Status', + 'data_class' => \Chill\EventBundle\Entity\Status::class, ]); } } diff --git a/src/Bundle/ChillEventBundle/Form/Type/PickEventType.php b/src/Bundle/ChillEventBundle/Form/Type/PickEventType.php index 4e8179f10..05436b3e8 100644 --- a/src/Bundle/ChillEventBundle/Form/Type/PickEventType.php +++ b/src/Bundle/ChillEventBundle/Form/Type/PickEventType.php @@ -109,16 +109,12 @@ class PickEventType extends AbstractType // add the default options $resolver->setDefaults([ 'class' => Event::class, - 'choice_label' => static function (Event $e) { - return $e->getDate()->format('d/m/Y, H:i') . ' → ' . - // $e->getType()->getName()['fr'] . ': ' . // display the type of event - $e->getName(); - }, + 'choice_label' => static fn (Event $e) => $e->getDate()->format('d/m/Y, H:i') . ' → ' . + // $e->getType()->getName()['fr'] . ': ' . // display the type of event + $e->getName(), 'placeholder' => 'Pick an event', 'attr' => ['class' => 'select2 '], - 'choice_attr' => static function (Event $e) { - return ['data-center' => $e->getCenter()->getId()]; - }, + 'choice_attr' => static fn (Event $e) => ['data-center' => $e->getCenter()->getId()], 'choiceloader' => function (Options $options) { $centers = $this->filterCenters($options); @@ -143,9 +139,7 @@ class PickEventType extends AbstractType // option role if (null === $options['role']) { $centers = array_map( - static function (GroupCenter $g) { - return $g->getCenter(); - }, + static fn (GroupCenter $g) => $g->getCenter(), $this->user->getGroupCenters()->toArray() ); } else { @@ -173,9 +167,7 @@ class PickEventType extends AbstractType if ( !in_array($c->getId(), array_map( - static function (Center $c) { - return $c->getId(); - }, + static fn (Center $c) => $c->getId(), $centers ), true) ) { diff --git a/src/Bundle/ChillEventBundle/Form/Type/PickEventTypeType.php b/src/Bundle/ChillEventBundle/Form/Type/PickEventTypeType.php index eacdc78f1..d027c05cf 100644 --- a/src/Bundle/ChillEventBundle/Form/Type/PickEventTypeType.php +++ b/src/Bundle/ChillEventBundle/Form/Type/PickEventTypeType.php @@ -39,16 +39,10 @@ class PickEventTypeType extends AbstractType $resolver->setDefaults( [ 'class' => EventType::class, - 'query_builder' => static function (EntityRepository $er) { - return $er->createQueryBuilder('et') - ->where('et.active = true'); - }, - 'choice_label' => static function (EventType $t) use ($helper) { - return $helper->localize($t->getName()); - }, - 'choice_attrs' => static function (EventType $t) { - return ['data-link-category' => $t->getId()]; - }, + 'query_builder' => static fn (EntityRepository $er) => $er->createQueryBuilder('et') + ->where('et.active = true'), + 'choice_label' => static fn (EventType $t) => $helper->localize($t->getName()), + 'choice_attrs' => static fn (EventType $t) => ['data-link-category' => $t->getId()], ] ); } diff --git a/src/Bundle/ChillEventBundle/Form/Type/PickRoleType.php b/src/Bundle/ChillEventBundle/Form/Type/PickRoleType.php index 95864056a..8fd8ff7d7 100644 --- a/src/Bundle/ChillEventBundle/Form/Type/PickRoleType.php +++ b/src/Bundle/ChillEventBundle/Form/Type/PickRoleType.php @@ -80,9 +80,7 @@ class PickRoleType extends AbstractType $options = $config->getOptions(); $form->getParent()->add($name, $type, array_replace($options, [ - 'group_by' => function (Role $r) { - return $this->translatableStringHelper->localize($r->getType()->getName()); - }, + 'group_by' => fn (Role $r) => $this->translatableStringHelper->localize($r->getType()->getName()), ])); } } @@ -111,17 +109,13 @@ class PickRoleType extends AbstractType 'class' => Role::class, 'query_builder' => $qb, 'group_by' => null, - 'choice_attr' => static function (Role $r) { - return [ - 'data-event-type' => $r->getType()->getId(), - 'data-link-category' => $r->getType()->getId(), - ]; - }, - 'choice_label' => static function (Role $r) use ($translatableStringHelper, $translator) { - return $translatableStringHelper->localize($r->getName()) . - ($r->getActive() === true ? '' : - ' (' . $translator->trans('unactive') . ')'); - }, + 'choice_attr' => static fn (Role $r) => [ + 'data-event-type' => $r->getType()->getId(), + 'data-link-category' => $r->getType()->getId(), + ], + 'choice_label' => static fn (Role $r) => $translatableStringHelper->localize($r->getName()) . + ($r->getActive() === true ? '' : + ' (' . $translator->trans('unactive') . ')'), ]); } diff --git a/src/Bundle/ChillEventBundle/Form/Type/PickStatusType.php b/src/Bundle/ChillEventBundle/Form/Type/PickStatusType.php index 4d96ed95d..dcc3ba205 100644 --- a/src/Bundle/ChillEventBundle/Form/Type/PickStatusType.php +++ b/src/Bundle/ChillEventBundle/Form/Type/PickStatusType.php @@ -82,9 +82,7 @@ class PickStatusType extends AbstractType $type = $config->getType()->getName(); $options = $config->getOptions(); $form->getParent()->add($name, $type, array_replace($options, [ - 'group_by' => function (Status $s) { - return $this->translatableStringHelper->localize($s->getType()->getName()); - }, + 'group_by' => fn (Status $s) => $this->translatableStringHelper->localize($s->getType()->getName()), ])); } ); @@ -112,17 +110,13 @@ class PickStatusType extends AbstractType 'class' => Status::class, 'query_builder' => $qb, 'group_by' => null, - 'choice_attr' => static function (Status $s) { - return [ - 'data-event-type' => $s->getType()->getId(), - 'data-link-category' => $s->getType()->getId(), - ]; - }, - 'choice_label' => static function (Status $s) use ($translatableStringHelper, $translator) { - return $translatableStringHelper->localize($s->getName()) . - ($s->getActive() === true ? '' : - ' (' . $translator->trans('unactive') . ')'); - }, + 'choice_attr' => static fn (Status $s) => [ + 'data-event-type' => $s->getType()->getId(), + 'data-link-category' => $s->getType()->getId(), + ], + 'choice_label' => static fn (Status $s) => $translatableStringHelper->localize($s->getName()) . + ($s->getActive() === true ? '' : + ' (' . $translator->trans('unactive') . ')'), ]); } diff --git a/src/Bundle/ChillEventBundle/Tests/Controller/ParticipationControllerTest.php b/src/Bundle/ChillEventBundle/Tests/Controller/ParticipationControllerTest.php index fa1ecabbe..d61c1f385 100644 --- a/src/Bundle/ChillEventBundle/Tests/Controller/ParticipationControllerTest.php +++ b/src/Bundle/ChillEventBundle/Tests/Controller/ParticipationControllerTest.php @@ -239,9 +239,7 @@ final class ParticipationControllerTest extends WebTestCase $this->personsIdsCache = array_merge( $this->personsIdsCache, $event->getParticipations()->map( - static function ($p) { - return $p->getPerson()->getId(); - } + static fn ($p) => $p->getPerson()->getId() ) ->toArray() ); @@ -305,9 +303,7 @@ final class ParticipationControllerTest extends WebTestCase $event = $this->getRandomEventWithMultipleParticipations(); $persons_id = implode(',', $event->getParticipations()->map( - static function ($p) { - return $p->getPerson()->getId(); - } + static fn ($p) => $p->getPerson()->getId() )->toArray()); $crawler = $this->client->request( @@ -333,9 +329,7 @@ final class ParticipationControllerTest extends WebTestCase $nbParticipations = $event->getParticipations()->count(); // get the persons_id participating on this event $persons_id = $event->getParticipations()->map( - static function ($p) { - return $p->getPerson()->getId(); - } + static fn ($p) => $p->getPerson()->getId() )->toArray(); // exclude the existing persons_ids from the new person $this->personsIdsCache = array_merge($this->personsIdsCache, $persons_id); @@ -464,9 +458,7 @@ final class ParticipationControllerTest extends WebTestCase $circles = $this->em->getRepository(\Chill\MainBundle\Entity\Scope::class) ->findAll(); - array_filter($circles, static function ($circle) use ($circleName) { - return in_array($circleName, $circle->getName(), true); - }); + array_filter($circles, static fn ($circle) => in_array($circleName, $circle->getName(), true)); $circle = $circles[0]; $events = $this->em->getRepository(\Chill\EventBundle\Entity\Event::class) diff --git a/src/Bundle/ChillEventBundle/Timeline/TimelineEventProvider.php b/src/Bundle/ChillEventBundle/Timeline/TimelineEventProvider.php index c1ae84b95..9fac6c88e 100644 --- a/src/Bundle/ChillEventBundle/Timeline/TimelineEventProvider.php +++ b/src/Bundle/ChillEventBundle/Timeline/TimelineEventProvider.php @@ -208,9 +208,7 @@ class TimelineEventProvider implements TimelineProviderInterface foreach ($reachableCenters as $center) { $reachableCircleId = array_map( - static function (Scope $scope) { - return $scope->getId(); - }, + static fn (Scope $scope) => $scope->getId(), $this->helper->getReachableCircles($this->user, $role, $person->getCenter()) ); $centerAndScopeLines[] = sprintf( diff --git a/src/Bundle/ChillFamilyMembersBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillFamilyMembersBundle/DependencyInjection/Configuration.php index d2c09d7fa..98ea3125a 100644 --- a/src/Bundle/ChillFamilyMembersBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillFamilyMembersBundle/DependencyInjection/Configuration.php @@ -24,7 +24,7 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('chill_amli_family_members'); - $rootNode = $treeBuilder->getRootNode('chill_amli_family_members'); + $rootNode = $treeBuilder->getRootNode(); $rootNode ->children() diff --git a/src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php b/src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php index 9e6555025..730ac32c1 100644 --- a/src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php +++ b/src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php @@ -230,7 +230,7 @@ class CRUDController extends AbstractController */ protected function createFormFor(string $action, $entity, ?string $formClass = null, array $formOptions = []): FormInterface { - $formClass = $formClass ?? $this->getFormClassFor($action); + $formClass ??= $this->getFormClassFor($action); $form = $this->createForm($formClass, $entity, $formOptions); diff --git a/src/Bundle/ChillMainBundle/CRUD/Routing/CRUDRoutesLoader.php b/src/Bundle/ChillMainBundle/CRUD/Routing/CRUDRoutesLoader.php index 76da401a3..4fbf5961d 100644 --- a/src/Bundle/ChillMainBundle/CRUD/Routing/CRUDRoutesLoader.php +++ b/src/Bundle/ChillMainBundle/CRUD/Routing/CRUDRoutesLoader.php @@ -141,9 +141,7 @@ class CRUDRoutesLoader extends Loader $methods = array_keys(array_filter( $action['methods'], - static function ($value, $key) { - return $value; - }, + static fn ($value, $key) => $value, ARRAY_FILTER_USE_BOTH )); diff --git a/src/Bundle/ChillMainBundle/ChillMainBundle.php b/src/Bundle/ChillMainBundle/ChillMainBundle.php index 9e276311d..8e115fa4f 100644 --- a/src/Bundle/ChillMainBundle/ChillMainBundle.php +++ b/src/Bundle/ChillMainBundle/ChillMainBundle.php @@ -30,6 +30,7 @@ use Chill\MainBundle\Search\SearchApiInterface; use Chill\MainBundle\Security\ProvideRoleInterface; use Chill\MainBundle\Security\Resolver\CenterResolverInterface; use Chill\MainBundle\Security\Resolver\ScopeResolverInterface; +use Chill\MainBundle\Service\EntityInfo\ViewEntityInfoProviderInterface; use Chill\MainBundle\Templating\Entity\ChillEntityRenderInterface; use Chill\MainBundle\Templating\UI\NotificationCounterInterface; use Chill\MainBundle\Workflow\EntityWorkflowHandlerInterface; @@ -62,6 +63,8 @@ class ChillMainBundle extends Bundle ->addTag('chill_main.workflow_handler'); $container->registerForAutoconfiguration(CronJobInterface::class) ->addTag('chill_main.cron_job'); + $container->registerForAutoconfiguration(ViewEntityInfoProviderInterface::class) + ->addTag('chill_main.entity_info_provider'); $container->addCompilerPass(new SearchableServicesCompilerPass()); $container->addCompilerPass(new ConfigConsistencyCompilerPass()); diff --git a/src/Bundle/ChillMainBundle/Command/LoadPostalCodesCommand.php b/src/Bundle/ChillMainBundle/Command/LoadPostalCodesCommand.php index fd8a469d6..ea42fde78 100644 --- a/src/Bundle/ChillMainBundle/Command/LoadPostalCodesCommand.php +++ b/src/Bundle/ChillMainBundle/Command/LoadPostalCodesCommand.php @@ -102,11 +102,7 @@ class LoadPostalCodesCommand extends Command try { $this->addPostalCode($row, $output); ++$num; - } catch (ExistingPostalCodeException $ex) { - $output->writeln(' on line ' . $line . ' : ' . $ex->getMessage() . ''); - } catch (CountryCodeNotFoundException $ex) { - $output->writeln(' on line ' . $line . ' : ' . $ex->getMessage() . ''); - } catch (PostalCodeNotValidException $ex) { + } catch (ExistingPostalCodeException|CountryCodeNotFoundException|PostalCodeNotValidException $ex) { $output->writeln(' on line ' . $line . ' : ' . $ex->getMessage() . ''); } ++$line; diff --git a/src/Bundle/ChillMainBundle/Command/SynchronizeEntityInfoViewsCommand.php b/src/Bundle/ChillMainBundle/Command/SynchronizeEntityInfoViewsCommand.php new file mode 100644 index 000000000..c3dc8a87c --- /dev/null +++ b/src/Bundle/ChillMainBundle/Command/SynchronizeEntityInfoViewsCommand.php @@ -0,0 +1,40 @@ +setDescription('Update or create sql views which provide info for various entities'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $this->viewEntityInfoManager->synchronizeOnDB(); + + return 0; + } + +} diff --git a/src/Bundle/ChillMainBundle/Controller/ExportController.php b/src/Bundle/ChillMainBundle/Controller/ExportController.php index caeec8327..6c4ea0269 100644 --- a/src/Bundle/ChillMainBundle/Controller/ExportController.php +++ b/src/Bundle/ChillMainBundle/Controller/ExportController.php @@ -164,7 +164,7 @@ class ExportController extends AbstractController { $this->denyAccessUnlessGranted(SavedExportVoter::GENERATE, $savedExport); - $key = md5(uniqid((string) mt_rand(), false)); + $key = md5(uniqid((string) random_int(0, mt_getrandmax()), false)); $this->redis->setEx($key, 3600, serialize($savedExport->getOptions())); @@ -481,7 +481,7 @@ class ExportController extends AbstractController 'alias' => $alias, ]; unset($parameters['_token']); - $key = md5(uniqid((string) mt_rand(), false)); + $key = md5(uniqid((string) random_int(0, mt_getrandmax()), false)); $this->redis->setEx($key, 3600, serialize($parameters)); @@ -665,7 +665,7 @@ class ExportController extends AbstractController $this->logger->notice('[export] choices for an export unserialized', [ 'key' => $key, - 'rawData' => json_encode($rawData), + 'rawData' => json_encode($rawData, JSON_THROW_ON_ERROR), ]); return $rawData; diff --git a/src/Bundle/ChillMainBundle/Controller/NotificationController.php b/src/Bundle/ChillMainBundle/Controller/NotificationController.php index a6e876b6d..327a06df6 100644 --- a/src/Bundle/ChillMainBundle/Controller/NotificationController.php +++ b/src/Bundle/ChillMainBundle/Controller/NotificationController.php @@ -282,9 +282,7 @@ class NotificationController extends AbstractController if ($request->query->has('edit')) { $commentId = $request->query->getInt('edit'); - $editedComment = $notification->getComments()->filter(static function (NotificationComment $c) use ($commentId) { - return $c->getId() === $commentId; - })->first(); + $editedComment = $notification->getComments()->filter(static fn (NotificationComment $c) => $c->getId() === $commentId)->first(); if (false === $editedComment) { throw $this->createNotFoundException("Comment with id {$commentId} does not exists nor belong to this notification"); diff --git a/src/Bundle/ChillMainBundle/Controller/PermissionsGroupController.php b/src/Bundle/ChillMainBundle/Controller/PermissionsGroupController.php index 372d0d7d1..5d32a8dbb 100644 --- a/src/Bundle/ChillMainBundle/Controller/PermissionsGroupController.php +++ b/src/Bundle/ChillMainBundle/Controller/PermissionsGroupController.php @@ -158,9 +158,7 @@ class PermissionsGroupController extends AbstractController 'edit_form' => $editForm->createView(), 'role_scopes_sorted' => $roleScopesSorted, 'expanded_roles' => $this->getExpandedRoles($permissionsGroup->getRoleScopes()->toArray()), - 'delete_role_scopes_form' => array_map(static function ($form) { - return $form->createView(); - }, $deleteRoleScopesForm), + 'delete_role_scopes_form' => array_map(static fn ($form) => $form->createView(), $deleteRoleScopesForm), 'add_role_scopes_form' => $addRoleScopesForm->createView(), ]); } @@ -305,9 +303,7 @@ class PermissionsGroupController extends AbstractController 'role_scopes_sorted' => $roleScopesSorted, 'edit_form' => $editForm->createView(), 'expanded_roles' => $this->getExpandedRoles($permissionsGroup->getRoleScopes()->toArray()), - 'delete_role_scopes_form' => array_map(static function ($form) { - return $form->createView(); - }, $deleteRoleScopesForm), + 'delete_role_scopes_form' => array_map(static fn ($form) => $form->createView(), $deleteRoleScopesForm), 'add_role_scopes_form' => $addRoleScopesForm->createView(), ]); } @@ -449,9 +445,7 @@ class PermissionsGroupController extends AbstractController 'role_scopes_sorted' => $roleScopesSorted, 'edit_form' => $editForm->createView(), 'expanded_roles' => $this->getExpandedRoles($permissionsGroup->getRoleScopes()->toArray()), - 'delete_role_scopes_form' => array_map(static function ($form) { - return $form->createView(); - }, $deleteRoleScopesForm), + 'delete_role_scopes_form' => array_map(static fn ($form) => $form->createView(), $deleteRoleScopesForm), 'add_role_scopes_form' => $addRoleScopesForm->createView(), ]); } @@ -573,9 +567,7 @@ class PermissionsGroupController extends AbstractController if (!array_key_exists($roleScope->getRole(), $expandedRoles)) { $expandedRoles[$roleScope->getRole()] = array_map( - static function (Role $role) { - return $role->getRole(); - }, + static fn (Role $role) => $role->getRole(), $this->roleHierarchy ->getReachableRoles( [new Role($roleScope->getRole())] diff --git a/src/Bundle/ChillMainBundle/Controller/SearchController.php b/src/Bundle/ChillMainBundle/Controller/SearchController.php index 8592dd2c3..7eec60324 100644 --- a/src/Bundle/ChillMainBundle/Controller/SearchController.php +++ b/src/Bundle/ChillMainBundle/Controller/SearchController.php @@ -109,10 +109,8 @@ class SearchController extends AbstractController ->getHasAdvancedFormSearchServices(); if (count($advancedSearchProviders) === 1) { - reset($advancedSearchProviders); - return $this->redirectToRoute('chill_main_advanced_search', [ - 'name' => key($advancedSearchProviders), + 'name' => array_key_first($advancedSearchProviders), ]); } diff --git a/src/Bundle/ChillMainBundle/Controller/UserController.php b/src/Bundle/ChillMainBundle/Controller/UserController.php index 9d3941411..ecf8a3c9c 100644 --- a/src/Bundle/ChillMainBundle/Controller/UserController.php +++ b/src/Bundle/ChillMainBundle/Controller/UserController.php @@ -337,14 +337,13 @@ class UserController extends CRUDController [ 'add_groupcenter_form' => $this->createAddLinkGroupCenterForm($entity, $request)->createView(), 'delete_groupcenter_form' => array_map( - static function (Form $form) { - return $form->createView(); - }, + static fn (Form $form) => $form->createView(), iterator_to_array($this->getDeleteLinkGroupCenterByUser($entity, $request), true) ), ] ); - } elseif ('index' === $action) { + } + if ('index' === $action) { return array_merge( ['allow_change_password' => $this->parameterBag->get('chill_main.access_user_change_password')], $defaultTemplateParameters diff --git a/src/Bundle/ChillMainBundle/Controller/WorkflowController.php b/src/Bundle/ChillMainBundle/Controller/WorkflowController.php index ee09cc1a6..cfd28160c 100644 --- a/src/Bundle/ChillMainBundle/Controller/WorkflowController.php +++ b/src/Bundle/ChillMainBundle/Controller/WorkflowController.php @@ -345,12 +345,10 @@ class WorkflowController extends AbstractController if ($transitionForm->isSubmitted() && $transitionForm->isValid()) { if (!$workflow->can($entityWorkflow, $transition = $transitionForm['transition']->getData()->getName())) { $blockers = $workflow->buildTransitionBlockerList($entityWorkflow, $transition); - $msgs = array_map(function (TransitionBlocker $tb) { - return $this->translator->trans( - $tb->getMessage(), - $tb->getParameters() - ); - }, iterator_to_array($blockers)); + $msgs = array_map(fn (TransitionBlocker $tb) => $this->translator->trans( + $tb->getMessage(), + $tb->getParameters() + ), iterator_to_array($blockers)); throw $this->createAccessDeniedException( sprintf( @@ -361,9 +359,9 @@ class WorkflowController extends AbstractController } // TODO symfony 5: add those "future" on context ($workflow->apply($entityWorkflow, $transition, $context) - $entityWorkflow->futureCcUsers = $transitionForm['future_cc_users']->getData(); - $entityWorkflow->futureDestUsers = $transitionForm['future_dest_users']->getData(); - $entityWorkflow->futureDestEmails = $transitionForm['future_dest_emails']->getData(); + $entityWorkflow->futureCcUsers = $transitionForm['future_cc_users']->getData() ?? []; + $entityWorkflow->futureDestUsers = $transitionForm['future_dest_users']->getData() ?? []; + $entityWorkflow->futureDestEmails = $transitionForm['future_dest_emails']->getData() ?? []; $workflow->apply($entityWorkflow, $transition); diff --git a/src/Bundle/ChillMainBundle/DataFixtures/ORM/LoadAddressReferences.php b/src/Bundle/ChillMainBundle/DataFixtures/ORM/LoadAddressReferences.php index 93aaf01b3..0fef33c2f 100644 --- a/src/Bundle/ChillMainBundle/DataFixtures/ORM/LoadAddressReferences.php +++ b/src/Bundle/ChillMainBundle/DataFixtures/ORM/LoadAddressReferences.php @@ -69,7 +69,7 @@ class LoadAddressReferences extends AbstractFixture implements ContainerAwareInt $ar->setRefId($this->faker->numerify('ref-id-######')); $ar->setStreet($this->faker->streetName); - $ar->setStreetNumber((string) mt_rand(0, 199)); + $ar->setStreetNumber((string) random_int(0, 199)); $ar->setPoint($this->getRandomPoint()); $ar->setPostcode($this->getReference( LoadPostalCodes::$refs[array_rand(LoadPostalCodes::$refs)] @@ -89,8 +89,8 @@ class LoadAddressReferences extends AbstractFixture implements ContainerAwareInt { $lonBrussels = 4.35243; $latBrussels = 50.84676; - $lon = $lonBrussels + 0.01 * mt_rand(-5, 5); - $lat = $latBrussels + 0.01 * mt_rand(-5, 5); + $lon = $lonBrussels + 0.01 * random_int(-5, 5); + $lat = $latBrussels + 0.01 * random_int(-5, 5); return Point::fromLonLat($lon, $lat); } diff --git a/src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/MenuCompilerPass.php b/src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/MenuCompilerPass.php index c41a32056..d6a27c943 100644 --- a/src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/MenuCompilerPass.php +++ b/src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/MenuCompilerPass.php @@ -37,13 +37,7 @@ class MenuCompilerPass implements CompilerPassInterface ]; } - usort($services, static function ($a, $b) { - if ($a['priority'] === $b['priority']) { - return 0; - } - - return ($a['priority'] < $b['priority']) ? -1 : 1; - }); + usort($services, static fn ($a, $b) => $a['priority'] <=> $b['priority']); foreach ($services as $service) { $class = $container->getDefinition($service['id'])->getClass(); diff --git a/src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/ShortMessageCompilerPass.php b/src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/ShortMessageCompilerPass.php index f75840c3a..f9fdb80d0 100644 --- a/src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/ShortMessageCompilerPass.php +++ b/src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/ShortMessageCompilerPass.php @@ -34,7 +34,7 @@ class ShortMessageCompilerPass implements CompilerPassInterface { public function process(ContainerBuilder $container) { - $config = $container->resolveEnvPlaceholders($container->getParameter('chill_main.short_messages', null), true); + $config = $container->resolveEnvPlaceholders($container->getParameter('chill_main.short_messages'), true); // weird fix for special characters $config['dsn'] = str_replace(['%%'], ['%'], $config['dsn']); $dsn = parse_url($config['dsn']); @@ -43,7 +43,7 @@ class ShortMessageCompilerPass implements CompilerPassInterface if ('null' === $dsn['scheme'] || false === $config['enabled']) { $defaultTransporter = new Reference(NullShortMessageSender::class); } elseif ('ovh' === $dsn['scheme']) { - if (!class_exists('\Ovh\Api')) { + if (!class_exists('\\' . \Ovh\Api::class)) { throw new RuntimeException('Class \\Ovh\\Api not found'); } @@ -66,17 +66,17 @@ class ShortMessageCompilerPass implements CompilerPassInterface $ovh = new Definition(); $ovh - ->setClass('\Ovh\Api') + ->setClass('\\' . \Ovh\Api::class) ->setArgument(0, $dsn['user']) ->setArgument(1, $dsn['pass']) ->setArgument(2, $dsn['host']) ->setArgument(3, $dsn['queries']['consumer_key']); - $container->setDefinition('Ovh\Api', $ovh); + $container->setDefinition(\Ovh\Api::class, $ovh); $ovhSender = new Definition(); $ovhSender ->setClass(OvhShortMessageSender::class) - ->setArgument(0, new Reference('Ovh\Api')) + ->setArgument(0, new Reference(\Ovh\Api::class)) ->setArgument(1, $dsn['queries']['service_name']) ->setArgument(2, $dsn['queries']['sender']) ->setArgument(3, new Reference(LoggerInterface::class)) diff --git a/src/Bundle/ChillMainBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillMainBundle/DependencyInjection/Configuration.php index 9631900ab..4605f35ab 100644 --- a/src/Bundle/ChillMainBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillMainBundle/DependencyInjection/Configuration.php @@ -37,7 +37,7 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('chill_main'); - $rootNode = $treeBuilder->getRootNode('chill_main'); + $rootNode = $treeBuilder->getRootNode(); $rootNode ->children() diff --git a/src/Bundle/ChillMainBundle/DependencyInjection/Widget/AbstractWidgetsCompilerPass.php b/src/Bundle/ChillMainBundle/DependencyInjection/Widget/AbstractWidgetsCompilerPass.php index 223a7b6cb..d5234bfbe 100644 --- a/src/Bundle/ChillMainBundle/DependencyInjection/Widget/AbstractWidgetsCompilerPass.php +++ b/src/Bundle/ChillMainBundle/DependencyInjection/Widget/AbstractWidgetsCompilerPass.php @@ -193,8 +193,7 @@ abstract class AbstractWidgetsCompilerPass implements CompilerPassInterface /** @var WidgetFactoryInterface $factory */ $factory = $this->widgetServices[$alias]; // get the config (under the key which equals to widget_alias - $config = isset($param[$factory->getWidgetAlias()]) ? - $param[$factory->getWidgetAlias()] : []; + $config = $param[$factory->getWidgetAlias()] ?? []; // register the service into the container $serviceId = $this->registerServiceIntoContainer( $container, diff --git a/src/Bundle/ChillMainBundle/DependencyInjection/Widget/AddWidgetConfigurationTrait.php b/src/Bundle/ChillMainBundle/DependencyInjection/Widget/AddWidgetConfigurationTrait.php index 3cff6583e..41ec16818 100644 --- a/src/Bundle/ChillMainBundle/DependencyInjection/Widget/AddWidgetConfigurationTrait.php +++ b/src/Bundle/ChillMainBundle/DependencyInjection/Widget/AddWidgetConfigurationTrait.php @@ -139,7 +139,7 @@ trait AddWidgetConfigurationTrait protected function addWidgetsConfiguration(string $place, ContainerBuilder $containerBuilder) { $treeBuilder = new TreeBuilder($place); - $root = $treeBuilder->getRootNode($place) + $root = $treeBuilder->getRootNode() ->canBeUnset() ->info('register widgets on place "' . $place . '"'); @@ -170,7 +170,7 @@ trait AddWidgetConfigurationTrait // adding the possible config on each widget under the widget_alias foreach ($this->filterWidgetByPlace($place) as $factory) { $builder = new TreeBuilder($factory->getWidgetAlias()); - $widgetOptionsRoot = $builder->getRootNode($factory->getWidgetAlias()); + $widgetOptionsRoot = $builder->getRootNode(); $widgetOptionsRoot->canBeUnset() ->info(sprintf( 'the configuration for the widget "%s" (only required if this widget is set in widget_alias)', diff --git a/src/Bundle/ChillMainBundle/Doctrine/DQL/Greatest.php b/src/Bundle/ChillMainBundle/Doctrine/DQL/Greatest.php index b9ca9c4b6..c76bd22cf 100644 --- a/src/Bundle/ChillMainBundle/Doctrine/DQL/Greatest.php +++ b/src/Bundle/ChillMainBundle/Doctrine/DQL/Greatest.php @@ -33,9 +33,7 @@ class Greatest extends FunctionNode public function getSql(SqlWalker $sqlWalker) { - return 'GREATEST(' . implode(', ', array_map(static function (Node $expr) use ($sqlWalker) { - return $expr->dispatch($sqlWalker); - }, $this->exprs)) . ')'; + return 'GREATEST(' . implode(', ', array_map(static fn (Node $expr) => $expr->dispatch($sqlWalker), $this->exprs)) . ')'; } public function parse(Parser $parser) diff --git a/src/Bundle/ChillMainBundle/Doctrine/DQL/Least.php b/src/Bundle/ChillMainBundle/Doctrine/DQL/Least.php index 0c8a1b17d..9befa5f40 100644 --- a/src/Bundle/ChillMainBundle/Doctrine/DQL/Least.php +++ b/src/Bundle/ChillMainBundle/Doctrine/DQL/Least.php @@ -33,9 +33,7 @@ class Least extends FunctionNode public function getSql(SqlWalker $sqlWalker) { - return 'LEAST(' . implode(', ', array_map(static function (Node $expr) use ($sqlWalker) { - return $expr->dispatch($sqlWalker); - }, $this->exprs)) . ')'; + return 'LEAST(' . implode(', ', array_map(static fn (Node $expr) => $expr->dispatch($sqlWalker), $this->exprs)) . ')'; } public function parse(Parser $parser) diff --git a/src/Bundle/ChillMainBundle/Doctrine/Event/TrackCreateUpdateSubscriber.php b/src/Bundle/ChillMainBundle/Doctrine/Event/TrackCreateUpdateSubscriber.php index bf493c344..166003f73 100644 --- a/src/Bundle/ChillMainBundle/Doctrine/Event/TrackCreateUpdateSubscriber.php +++ b/src/Bundle/ChillMainBundle/Doctrine/Event/TrackCreateUpdateSubscriber.php @@ -41,12 +41,12 @@ class TrackCreateUpdateSubscriber implements EventSubscriber { $object = $args->getObject(); - if ( - $object instanceof TrackCreationInterface - && $this->security->getUser() instanceof User - ) { - $object->setCreatedBy($this->security->getUser()); + if ($object instanceof TrackCreationInterface) { $object->setCreatedAt(new DateTimeImmutable('now')); + + if ($this->security->getUser() instanceof User) { + $object->setCreatedBy($this->security->getUser()); + } } $this->onUpdate($object); @@ -61,12 +61,12 @@ class TrackCreateUpdateSubscriber implements EventSubscriber protected function onUpdate(object $object): void { - if ( - $object instanceof TrackUpdateInterface - && $this->security->getUser() instanceof User - ) { - $object->setUpdatedBy($this->security->getUser()); + if ($object instanceof TrackUpdateInterface) { $object->setUpdatedAt(new DateTimeImmutable('now')); + + if ($this->security->getUser() instanceof User) { + $object->setUpdatedBy($this->security->getUser()); + } } } } diff --git a/src/Bundle/ChillMainBundle/Doctrine/Model/Point.php b/src/Bundle/ChillMainBundle/Doctrine/Model/Point.php index c4c18d179..684030ee3 100644 --- a/src/Bundle/ChillMainBundle/Doctrine/Model/Point.php +++ b/src/Bundle/ChillMainBundle/Doctrine/Model/Point.php @@ -41,7 +41,7 @@ class Point implements JsonSerializable public static function fromGeoJson(string $geojson): self { - $a = json_decode($geojson); + $a = json_decode($geojson, null, 512, JSON_THROW_ON_ERROR); if (null === $a) { throw PointException::badJsonString($geojson); @@ -96,7 +96,7 @@ class Point implements JsonSerializable { $array = $this->toArrayGeoJson(); - return json_encode($array); + return json_encode($array, JSON_THROW_ON_ERROR); } public function toWKT(): string diff --git a/src/Bundle/ChillMainBundle/Entity/Address.php b/src/Bundle/ChillMainBundle/Entity/Address.php index 8e5299579..1bd1a453a 100644 --- a/src/Bundle/ChillMainBundle/Entity/Address.php +++ b/src/Bundle/ChillMainBundle/Entity/Address.php @@ -149,7 +149,7 @@ class Address implements TrackCreationInterface, TrackUpdateInterface * @Groups({"write"}) * @ORM\JoinColumn(nullable=true, onDelete="SET NULL") */ - private ?ThirdParty $linkedToThirdParty; + private ?ThirdParty $linkedToThirdParty = null; /** * A geospatial field storing the coordinates of the Address. @@ -570,9 +570,9 @@ class Address implements TrackCreationInterface, TrackUpdateInterface * @return Address * @deprecated */ - public function setStreetAddress1($streetAddress1) + public function setStreetAddress1(?string $streetAddress1): self { - $this->street = null === $streetAddress1 ? '' : $streetAddress1; + $this->street = (string) $streetAddress1; return $this; } @@ -584,9 +584,9 @@ class Address implements TrackCreationInterface, TrackUpdateInterface * @deprecated * @return Address */ - public function setStreetAddress2($streetAddress2) + public function setStreetAddress2(?string $streetAddress2): self { - $this->streetNumber = null === $streetAddress2 ? '' : $streetAddress2; + $this->streetNumber = (string) $streetAddress2; return $this; } diff --git a/src/Bundle/ChillMainBundle/Entity/AddressReference.php b/src/Bundle/ChillMainBundle/Entity/AddressReference.php index 57421749f..e75402c5f 100644 --- a/src/Bundle/ChillMainBundle/Entity/AddressReference.php +++ b/src/Bundle/ChillMainBundle/Entity/AddressReference.php @@ -55,7 +55,7 @@ class AddressReference * @ORM\Column(type="integer") * @groups({"read"}) */ - private ?int $id; + private ?int $id = null; /** * @ORM\Column(type="text", nullable=false, options={"default": ""}) @@ -79,7 +79,7 @@ class AddressReference * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\PostalCode") * @groups({"read"}) */ - private ?PostalCode $postcode; + private ?PostalCode $postcode = null; /** * @ORM\Column(type="text", nullable=false, options={"default": ""}) diff --git a/src/Bundle/ChillMainBundle/Entity/Embeddable/PrivateCommentEmbeddable.php b/src/Bundle/ChillMainBundle/Entity/Embeddable/PrivateCommentEmbeddable.php index 560b0dd7f..44e53671d 100644 --- a/src/Bundle/ChillMainBundle/Entity/Embeddable/PrivateCommentEmbeddable.php +++ b/src/Bundle/ChillMainBundle/Entity/Embeddable/PrivateCommentEmbeddable.php @@ -45,7 +45,7 @@ class PrivateCommentEmbeddable public function merge(PrivateCommentEmbeddable $newComment): self { - $currentComments = null === $this->getComments() ? [] : $this->getComments(); + $currentComments = $this->getComments() ?? []; $mergedComments = $newComment->getComments() + $currentComments; diff --git a/src/Bundle/ChillMainBundle/Entity/GeographicalUnit.php b/src/Bundle/ChillMainBundle/Entity/GeographicalUnit.php index 37735bbc2..ea017f053 100644 --- a/src/Bundle/ChillMainBundle/Entity/GeographicalUnit.php +++ b/src/Bundle/ChillMainBundle/Entity/GeographicalUnit.php @@ -36,7 +36,7 @@ class GeographicalUnit /** * @ORM\ManyToOne(targetEntity=GeographicalUnitLayer::class, inversedBy="units") */ - private ?GeographicalUnitLayer $layer; + private ?GeographicalUnitLayer $layer = null; /** * @ORM\Column(type="text", nullable=false, options={"default": ""}) diff --git a/src/Bundle/ChillMainBundle/Entity/Notification.php b/src/Bundle/ChillMainBundle/Entity/Notification.php index b8586b2e6..dc81b1b54 100644 --- a/src/Bundle/ChillMainBundle/Entity/Notification.php +++ b/src/Bundle/ChillMainBundle/Entity/Notification.php @@ -120,12 +120,12 @@ class Notification implements TrackUpdateInterface /** * @ORM\Column(type="datetime_immutable") */ - private ?DateTimeImmutable $updatedAt; + private ?DateTimeImmutable $updatedAt = null; /** * @ORM\ManyToOne(targetEntity=User::class) */ - private ?User $updatedBy; + private ?User $updatedBy = null; public function __construct() { diff --git a/src/Bundle/ChillMainBundle/Entity/PermissionsGroup.php b/src/Bundle/ChillMainBundle/Entity/PermissionsGroup.php index fa505e550..6c0d0be5b 100644 --- a/src/Bundle/ChillMainBundle/Entity/PermissionsGroup.php +++ b/src/Bundle/ChillMainBundle/Entity/PermissionsGroup.php @@ -121,9 +121,7 @@ class PermissionsGroup public function isRoleScopePresentOnce(ExecutionContextInterface $context) { $roleScopesId = array_map( - static function (RoleScope $roleScope) { - return $roleScope->getId(); - }, + static fn (RoleScope $roleScope) => $roleScope->getId(), $this->getRoleScopes()->toArray() ); $countedIds = array_count_values($roleScopesId); diff --git a/src/Bundle/ChillMainBundle/Entity/User.php b/src/Bundle/ChillMainBundle/Entity/User.php index a8ef88fbe..35b73786b 100644 --- a/src/Bundle/ChillMainBundle/Entity/User.php +++ b/src/Bundle/ChillMainBundle/Entity/User.php @@ -506,11 +506,11 @@ class User implements UserInterface * * @return User */ - public function setUsername($name) + public function setUsername(?string $name) { - $this->username = $name; + $this->username = (string) $name; - if (empty($this->getLabel())) { + if ("" === trim($this->getLabel())) { $this->setLabel($name); } diff --git a/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflowStep.php b/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflowStep.php index e43d524a4..1f3070eb2 100644 --- a/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflowStep.php +++ b/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflowStep.php @@ -291,9 +291,7 @@ class EntityWorkflowStep public function removeDestEmail(string $email): self { - $this->destEmail = array_filter($this->destEmail, static function (string $existing) use ($email) { - return $email !== $existing; - }); + $this->destEmail = array_filter($this->destEmail, static fn (string $existing) => $email !== $existing); return $this; } diff --git a/src/Bundle/ChillMainBundle/Export/Formatter/CSVListFormatter.php b/src/Bundle/ChillMainBundle/Export/Formatter/CSVListFormatter.php index 7dc6f120f..b84c80118 100644 --- a/src/Bundle/ChillMainBundle/Export/Formatter/CSVListFormatter.php +++ b/src/Bundle/ChillMainBundle/Export/Formatter/CSVListFormatter.php @@ -199,9 +199,7 @@ class CSVListFormatter implements FormatterInterface foreach ($keys as $key) { // get an array with all values for this key if possible - $values = array_map(static function ($v) use ($key) { - return $v[$key]; - }, $this->result); + $values = array_map(static fn ($v) => $v[$key], $this->result); // store the label in the labelsCache property $this->labelsCache[$key] = $export->getLabels($key, $values, $this->exportData); } diff --git a/src/Bundle/ChillMainBundle/Export/Formatter/CSVPivotedListFormatter.php b/src/Bundle/ChillMainBundle/Export/Formatter/CSVPivotedListFormatter.php index b062a9c3c..63d691443 100644 --- a/src/Bundle/ChillMainBundle/Export/Formatter/CSVPivotedListFormatter.php +++ b/src/Bundle/ChillMainBundle/Export/Formatter/CSVPivotedListFormatter.php @@ -187,9 +187,7 @@ class CSVPivotedListFormatter implements FormatterInterface foreach ($keys as $key) { // get an array with all values for this key if possible - $values = array_map(static function ($v) use ($key) { - return $v[$key]; - }, $this->result); + $values = array_map(static fn ($v) => $v[$key], $this->result); // store the label in the labelsCache property $this->labelsCache[$key] = $export->getLabels($key, $values, $this->exportData); } diff --git a/src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php b/src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php index 6b77e5b2b..dc09c55a1 100644 --- a/src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php +++ b/src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php @@ -435,7 +435,7 @@ class SpreadSheetFormatter implements FormatterInterface * Get the displayable result. * * @param string $key - * @param string $value + * @param mixed $value * * @return string */ @@ -445,7 +445,7 @@ class SpreadSheetFormatter implements FormatterInterface $this->initializeCache($key); } - $value = null === $value ? '' : $value; + $value ??= ''; return call_user_func($this->cacheDisplayableResult[$key], $value); } diff --git a/src/Bundle/ChillMainBundle/Export/Helper/AggregateStringHelper.php b/src/Bundle/ChillMainBundle/Export/Helper/AggregateStringHelper.php index 6266ce86f..3ee5f20d8 100644 --- a/src/Bundle/ChillMainBundle/Export/Helper/AggregateStringHelper.php +++ b/src/Bundle/ChillMainBundle/Export/Helper/AggregateStringHelper.php @@ -29,7 +29,7 @@ class AggregateStringHelper return implode( '|', - json_decode($value, true) + json_decode($value, true, 512, JSON_THROW_ON_ERROR) ); }; } diff --git a/src/Bundle/ChillMainBundle/Export/Helper/ExportAddressHelper.php b/src/Bundle/ChillMainBundle/Export/Helper/ExportAddressHelper.php index 9077b501a..fca338a6f 100644 --- a/src/Bundle/ChillMainBundle/Export/Helper/ExportAddressHelper.php +++ b/src/Bundle/ChillMainBundle/Export/Helper/ExportAddressHelper.php @@ -249,7 +249,7 @@ class ExportAddressHelper if (($params & $bitmask) === $bitmask) { if ('geographical_units' === $key) { // geographical unit generate keys dynamically, depending on layers - $prefixes = array_merge($prefixes, array_keys($this->generateKeysForUnitsNames($prefix)), array_keys($this->generateKeysForUnitsRefs($prefix))); + $prefixes = [...$prefixes, ...array_keys($this->generateKeysForUnitsNames($prefix)), ...array_keys($this->generateKeysForUnitsRefs($prefix))]; continue; } @@ -257,9 +257,7 @@ class ExportAddressHelper $prefixes = array_merge( $prefixes, array_map( - static function ($item) use ($prefix) { - return $prefix . $item; - }, + static fn ($item) => $prefix . $item, self::COLUMN_MAPPING[$key] ) ); @@ -310,7 +308,7 @@ class ExportAddressHelper return ''; } - return $this->translatableStringHelper->localize(json_decode($value, true)); + return $this->translatableStringHelper->localize(json_decode($value, true, 512, JSON_THROW_ON_ERROR)); }; case 'isNoAddress': @@ -369,7 +367,7 @@ class ExportAddressHelper return ''; } - $decodedValues = json_decode($value, true); + $decodedValues = json_decode($value, true, 512, JSON_THROW_ON_ERROR); switch (count($decodedValues)) { case 0: diff --git a/src/Bundle/ChillMainBundle/Export/Helper/TranslatableStringExportLabelHelper.php b/src/Bundle/ChillMainBundle/Export/Helper/TranslatableStringExportLabelHelper.php index 44ce2b194..9b49d476b 100644 --- a/src/Bundle/ChillMainBundle/Export/Helper/TranslatableStringExportLabelHelper.php +++ b/src/Bundle/ChillMainBundle/Export/Helper/TranslatableStringExportLabelHelper.php @@ -39,7 +39,7 @@ class TranslatableStringExportLabelHelper return ''; } - return $this->translatableStringHelper->localize(json_decode($value, true)); + return $this->translatableStringHelper->localize(json_decode($value, true, 512, JSON_THROW_ON_ERROR)); }; } @@ -54,7 +54,7 @@ class TranslatableStringExportLabelHelper return ''; } - $decoded = json_decode($value, true); + $decoded = json_decode($value, true, 512, JSON_THROW_ON_ERROR); return implode( '|', diff --git a/src/Bundle/ChillMainBundle/Export/Helper/UserHelper.php b/src/Bundle/ChillMainBundle/Export/Helper/UserHelper.php index 0e770786d..2821bf1a6 100644 --- a/src/Bundle/ChillMainBundle/Export/Helper/UserHelper.php +++ b/src/Bundle/ChillMainBundle/Export/Helper/UserHelper.php @@ -54,7 +54,7 @@ class UserHelper return ''; } - $decoded = json_decode($value); + $decoded = json_decode($value, null, 512, JSON_THROW_ON_ERROR); if (0 === count($decoded)) { return ''; diff --git a/src/Bundle/ChillMainBundle/Form/AdvancedSearchType.php b/src/Bundle/ChillMainBundle/Form/AdvancedSearchType.php deleted file mode 100644 index 9157e8023..000000000 --- a/src/Bundle/ChillMainBundle/Form/AdvancedSearchType.php +++ /dev/null @@ -1,44 +0,0 @@ -searchProvider = $searchProvider; - } - - public function buildForm(FormBuilderInterface $builder, array $options) - { - $this->searchProvider - ->getHasAdvancedFormByName($options['search_service']) - ->createSearchForm($builder); - } - - public function configureOptions(OptionsResolver $resolver) - { - $resolver - ->setRequired('search_service') - ->setAllowedTypes('search_service', ['string']); - } -} diff --git a/src/Bundle/ChillMainBundle/Form/CenterType.php b/src/Bundle/ChillMainBundle/Form/CenterType.php index 6af579870..ff758ca49 100644 --- a/src/Bundle/ChillMainBundle/Form/CenterType.php +++ b/src/Bundle/ChillMainBundle/Form/CenterType.php @@ -30,7 +30,7 @@ class CenterType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\MainBundle\Entity\Center', + 'data_class' => \Chill\MainBundle\Entity\Center::class, ]); } diff --git a/src/Bundle/ChillMainBundle/Form/ChoiceLoader/PostalCodeChoiceLoader.php b/src/Bundle/ChillMainBundle/Form/ChoiceLoader/PostalCodeChoiceLoader.php index bb9b180f5..174fb3304 100644 --- a/src/Bundle/ChillMainBundle/Form/ChoiceLoader/PostalCodeChoiceLoader.php +++ b/src/Bundle/ChillMainBundle/Form/ChoiceLoader/PostalCodeChoiceLoader.php @@ -48,9 +48,7 @@ class PostalCodeChoiceLoader implements ChoiceLoaderInterface { return new \Symfony\Component\Form\ChoiceList\ArrayChoiceList( $this->lazyLoadedPostalCodes, - static function (?PostalCode $pc = null) use ($value) { - return call_user_func($value, $pc); - } + static fn (?PostalCode $pc = null) => call_user_func($value, $pc) ); } diff --git a/src/Bundle/ChillMainBundle/Form/DataMapper/ExportPickCenterDataMapper.php b/src/Bundle/ChillMainBundle/Form/DataMapper/ExportPickCenterDataMapper.php index 52e053795..01303bfbb 100644 --- a/src/Bundle/ChillMainBundle/Form/DataMapper/ExportPickCenterDataMapper.php +++ b/src/Bundle/ChillMainBundle/Form/DataMapper/ExportPickCenterDataMapper.php @@ -37,9 +37,7 @@ class ExportPickCenterDataMapper implements DataMapperInterface foreach ($this->regroupmentRepository->findAll() as $regroupment) { /** @phpstan-ignore-next-line */ - [$contained, $notContained] = $regroupment->getCenters()->partition(static function (Center $center): bool { - return false; - }); + [$contained, $notContained] = $regroupment->getCenters()->partition(static fn (Center $center): bool => false); if (0 === count($notContained)) { $pickedRegroupment[] = $regroupment; diff --git a/src/Bundle/ChillMainBundle/Form/DataTransformer/IdToEntityDataTransformer.php b/src/Bundle/ChillMainBundle/Form/DataTransformer/IdToEntityDataTransformer.php index cc215e7aa..6aa5eee40 100644 --- a/src/Bundle/ChillMainBundle/Form/DataTransformer/IdToEntityDataTransformer.php +++ b/src/Bundle/ChillMainBundle/Form/DataTransformer/IdToEntityDataTransformer.php @@ -42,9 +42,7 @@ class IdToEntityDataTransformer implements DataTransformerInterface { $this->repository = $repository; $this->multiple = $multiple; - $this->getId = $getId ?? static function (object $o) { - return $o->getId(); - }; + $this->getId = $getId ?? static fn (object $o) => $o->getId(); } /** diff --git a/src/Bundle/ChillMainBundle/Form/LocationFormType.php b/src/Bundle/ChillMainBundle/Form/LocationFormType.php index 8e6861029..ff2c563d3 100644 --- a/src/Bundle/ChillMainBundle/Form/LocationFormType.php +++ b/src/Bundle/ChillMainBundle/Form/LocationFormType.php @@ -36,15 +36,11 @@ final class LocationFormType extends AbstractType $builder ->add('locationType', EntityType::class, [ 'class' => EntityLocationType::class, - 'choice_attr' => static function (EntityLocationType $entity) { - return [ - 'data-address' => $entity->getAddressRequired(), - 'data-contact' => $entity->getContactData(), - ]; - }, - 'choice_label' => function (EntityLocationType $entity) { - return $this->translatableStringHelper->localize($entity->getTitle()); - }, + 'choice_attr' => static fn (EntityLocationType $entity) => [ + 'data-address' => $entity->getAddressRequired(), + 'data-contact' => $entity->getContactData(), + ], + 'choice_label' => fn (EntityLocationType $entity) => $this->translatableStringHelper->localize($entity->getTitle()), ]) ->add('name', TextType::class) ->add('phonenumber1', ChillPhoneNumberType::class, ['required' => false]) @@ -75,7 +71,7 @@ final class LocationFormType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\MainBundle\Entity\Location', + 'data_class' => \Chill\MainBundle\Entity\Location::class, ]); } diff --git a/src/Bundle/ChillMainBundle/Form/PermissionsGroupType.php b/src/Bundle/ChillMainBundle/Form/PermissionsGroupType.php index ad5f7243b..16aafeb41 100644 --- a/src/Bundle/ChillMainBundle/Form/PermissionsGroupType.php +++ b/src/Bundle/ChillMainBundle/Form/PermissionsGroupType.php @@ -60,7 +60,7 @@ class PermissionsGroupType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\MainBundle\Entity\PermissionsGroup', + 'data_class' => \Chill\MainBundle\Entity\PermissionsGroup::class, ]); } diff --git a/src/Bundle/ChillMainBundle/Form/ScopeType.php b/src/Bundle/ChillMainBundle/Form/ScopeType.php index 86335c554..c5a7657b0 100644 --- a/src/Bundle/ChillMainBundle/Form/ScopeType.php +++ b/src/Bundle/ChillMainBundle/Form/ScopeType.php @@ -36,7 +36,7 @@ class ScopeType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\MainBundle\Entity\Scope', + 'data_class' => \Chill\MainBundle\Entity\Scope::class, ]); } diff --git a/src/Bundle/ChillMainBundle/Form/Type/AppendScopeChoiceTypeTrait.php b/src/Bundle/ChillMainBundle/Form/Type/AppendScopeChoiceTypeTrait.php index 547aeb3ec..8eda0d9d9 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/AppendScopeChoiceTypeTrait.php +++ b/src/Bundle/ChillMainBundle/Form/Type/AppendScopeChoiceTypeTrait.php @@ -83,8 +83,8 @@ trait AppendScopeChoiceTypeTrait { $resolver ->setRequired(['center', 'role']) - ->setAllowedTypes('center', 'Chill\MainBundle\Entity\Center') - ->setAllowedTypes('role', 'Symfony\Component\Security\Core\Role\Role'); + ->setAllowedTypes('center', \Chill\MainBundle\Entity\Center::class) + ->setAllowedTypes('role', 'string'); } /** diff --git a/src/Bundle/ChillMainBundle/Form/Type/ComposedGroupCenterType.php b/src/Bundle/ChillMainBundle/Form/Type/ComposedGroupCenterType.php index d78cf813b..48bd37dcc 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/ComposedGroupCenterType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/ComposedGroupCenterType.php @@ -23,21 +23,17 @@ class ComposedGroupCenterType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('permissionsgroup', EntityType::class, [ - 'class' => 'Chill\MainBundle\Entity\PermissionsGroup', - 'choice_label' => static function (PermissionsGroup $group) { - return $group->getName(); - }, + 'class' => \Chill\MainBundle\Entity\PermissionsGroup::class, + 'choice_label' => static fn (PermissionsGroup $group) => $group->getName(), ])->add('center', EntityType::class, [ - 'class' => 'Chill\MainBundle\Entity\Center', - 'choice_label' => static function (Center $center) { - return $center->getName(); - }, + 'class' => \Chill\MainBundle\Entity\Center::class, + 'choice_label' => static fn (Center $center) => $center->getName(), ]); } public function configureOptions(OptionsResolver $resolver) { - $resolver->setDefault('data_class', 'Chill\MainBundle\Entity\GroupCenter'); + $resolver->setDefault('data_class', \Chill\MainBundle\Entity\GroupCenter::class); } public function getBlockPrefix() diff --git a/src/Bundle/ChillMainBundle/Form/Type/ComposedRoleScopeType.php b/src/Bundle/ChillMainBundle/Form/Type/ComposedRoleScopeType.php index 627ce596a..38f1475d5 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/ComposedRoleScopeType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/ComposedRoleScopeType.php @@ -82,16 +82,12 @@ class ComposedRoleScopeType extends AbstractType return ['data-has-scope' => '1']; }, - 'group_by' => function ($role, $key, $index) { - return $this->roleProvider->getRoleTitle($role); - }, + 'group_by' => fn ($role, $key, $index) => $this->roleProvider->getRoleTitle($role), ]) ->add('scope', EntityType::class, [ 'class' => Scope::class, + 'choice_label' => static fn (Scope $scope) => $translatableStringHelper->localize($scope->getName()), 'placeholder' => 'Choose amongst scopes', - 'choice_label' => static function (Scope $scope) use ($translatableStringHelper) { - return $translatableStringHelper->localize($scope->getName()); - }, 'required' => false, 'data' => null, ]); @@ -99,6 +95,6 @@ class ComposedRoleScopeType extends AbstractType public function configureOptions(OptionsResolver $resolver) { - $resolver->setDefault('data_class', 'Chill\MainBundle\Entity\RoleScope'); + $resolver->setDefault('data_class', \Chill\MainBundle\Entity\RoleScope::class); } } diff --git a/src/Bundle/ChillMainBundle/Form/Type/DataTransformer/EntityToJsonTransformer.php b/src/Bundle/ChillMainBundle/Form/Type/DataTransformer/EntityToJsonTransformer.php index 46fa8799f..7dff8d672 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/DataTransformer/EntityToJsonTransformer.php +++ b/src/Bundle/ChillMainBundle/Form/Type/DataTransformer/EntityToJsonTransformer.php @@ -43,7 +43,11 @@ class EntityToJsonTransformer implements DataTransformerInterface public function reverseTransform($value) { - $denormalized = json_decode($value, true); + if ("" === $value) { + return null; + } + + $denormalized = json_decode($value, true, 512, JSON_THROW_ON_ERROR); if ($this->multiple) { if (null === $denormalized) { @@ -51,17 +55,11 @@ class EntityToJsonTransformer implements DataTransformerInterface } return array_map( - function ($item) { - return $this->denormalizeOne($item); - }, + fn ($item) => $this->denormalizeOne($item), $denormalized ); } - if ('' === $value) { - return null; - } - return $this->denormalizeOne($denormalized); } diff --git a/src/Bundle/ChillMainBundle/Form/Type/Export/PickCenterType.php b/src/Bundle/ChillMainBundle/Form/Type/Export/PickCenterType.php index 8287a8814..c89907cf3 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/Export/PickCenterType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/Export/PickCenterType.php @@ -67,9 +67,7 @@ final class PickCenterType extends AbstractType 'choices' => $centers, 'multiple' => true, 'expanded' => true, - 'choice_label' => static function (Center $c) { - return $c->getName(); - }, + 'choice_label' => static fn (Center $c) => $c->getName(), 'data' => $centers, ]); @@ -80,9 +78,7 @@ final class PickCenterType extends AbstractType 'multiple' => true, 'expanded' => true, 'choices' => $this->regroupmentRepository->findAllActive(), - 'choice_label' => static function (Regroupment $r) { - return $r->getName(); - }, + 'choice_label' => static fn (Regroupment $r) => $r->getName(), ]); } diff --git a/src/Bundle/ChillMainBundle/Form/Type/PickCenterType.php b/src/Bundle/ChillMainBundle/Form/Type/PickCenterType.php index 0f6dd44bc..83e957623 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/PickCenterType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/PickCenterType.php @@ -90,9 +90,7 @@ class PickCenterType extends AbstractType return ['center' => $data]; }, - static function ($data) { - return $data['center']; - } + static fn ($data) => $data['center'] )); } diff --git a/src/Bundle/ChillMainBundle/Form/Type/PickCivilityType.php b/src/Bundle/ChillMainBundle/Form/Type/PickCivilityType.php index 84342dfc3..adb0f2a67 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/PickCivilityType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/PickCivilityType.php @@ -34,17 +34,13 @@ class PickCivilityType extends AbstractType ->setDefault('label', 'Civility') ->setDefault( 'choice_label', - function (Civility $civility): string { - return $this->translatableStringHelper->localize($civility->getName()); - } + fn (Civility $civility): string => $this->translatableStringHelper->localize($civility->getName()) ) ->setDefault( 'query_builder', - static function (EntityRepository $er): QueryBuilder { - return $er->createQueryBuilder('c') - ->where('c.active = true') - ->orderBy('c.order'); - }, + static fn (EntityRepository $er): QueryBuilder => $er->createQueryBuilder('c') + ->where('c.active = true') + ->orderBy('c.order'), ) ->setDefault('placeholder', 'choose civility') ->setDefault('class', Civility::class); diff --git a/src/Bundle/ChillMainBundle/Form/Type/PickLocationTypeType.php b/src/Bundle/ChillMainBundle/Form/Type/PickLocationTypeType.php index 6774e0941..3d993c9f1 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/PickLocationTypeType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/PickLocationTypeType.php @@ -31,9 +31,7 @@ class PickLocationTypeType extends AbstractType $resolver ->setDefaults([ 'class' => LocationType::class, - 'choice_label' => function (LocationType $type) { - return $this->translatableStringHelper->localize($type->getTitle()); - }, + 'choice_label' => fn (LocationType $type) => $this->translatableStringHelper->localize($type->getTitle()), 'placeholder' => 'Pick a location type', 'required' => false, 'attr' => ['class' => 'select2'], diff --git a/src/Bundle/ChillMainBundle/Form/Type/PickUserLocationType.php b/src/Bundle/ChillMainBundle/Form/Type/PickUserLocationType.php index 792daa39e..d78957f29 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/PickUserLocationType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/PickUserLocationType.php @@ -36,11 +36,9 @@ class PickUserLocationType extends AbstractType ->setDefaults([ 'class' => Location::class, 'choices' => $this->locationRepository->findByPublicLocations(), - 'choice_label' => function (Location $entity) { - return $entity->getName() ? - $entity->getName() . ' (' . $this->translatableStringHelper->localize($entity->getLocationType()->getTitle()) . ')' : - $this->translatableStringHelper->localize($entity->getLocationType()->getTitle()); - }, + 'choice_label' => fn (Location $entity) => $entity->getName() ? + $entity->getName() . ' (' . $this->translatableStringHelper->localize($entity->getLocationType()->getTitle()) . ')' : + $this->translatableStringHelper->localize($entity->getLocationType()->getTitle()), 'placeholder' => 'Pick a location', 'required' => false, 'attr' => ['class' => 'select2'], diff --git a/src/Bundle/ChillMainBundle/Form/Type/PostalCodeType.php b/src/Bundle/ChillMainBundle/Form/Type/PostalCodeType.php index 60fefddfa..51a321be6 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/PostalCodeType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/PostalCodeType.php @@ -77,10 +77,8 @@ class PostalCodeType extends AbstractType $helper = $this->translatableStringHelper; $resolver ->setDefault('class', PostalCode::class) - ->setDefault('choice_label', static function (PostalCode $code) use ($helper) { - return $code->getCode() . ' ' . $code->getName() . ' [' . - $helper->localize($code->getCountry()->getName()) . ']'; - }) + ->setDefault('choice_label', static fn (PostalCode $code) => $code->getCode() . ' ' . $code->getName() . ' [' . + $helper->localize($code->getCountry()->getName()) . ']') ->setDefault('choice_loader', $this->choiceLoader) ->setDefault('placeholder', 'Select a postal code'); } diff --git a/src/Bundle/ChillMainBundle/Form/Type/ScopePickerType.php b/src/Bundle/ChillMainBundle/Form/Type/ScopePickerType.php index 2529a0655..c86684a8a 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/ScopePickerType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/ScopePickerType.php @@ -67,9 +67,7 @@ class ScopePickerType extends AbstractType $options['role'] instanceof Role ? $options['role']->getRole() : $options['role'], $options['center'] ), - static function (Scope $s) { - return $s->isActive(); - } + static fn (Scope $s) => $s->isActive() ) ); @@ -81,9 +79,7 @@ class ScopePickerType extends AbstractType $builder->add('scope', EntityType::class, [ 'class' => Scope::class, 'placeholder' => 'Choose the circle', - 'choice_label' => function (Scope $c) { - return $this->translatableStringHelper->localize($c->getName()); - }, + 'choice_label' => fn (Scope $c) => $this->translatableStringHelper->localize($c->getName()), 'choices' => $items, ]); $builder->setDataMapper(new ScopePickerDataMapper()); diff --git a/src/Bundle/ChillMainBundle/Form/Type/Select2CountryType.php b/src/Bundle/ChillMainBundle/Form/Type/Select2CountryType.php index 5b4d49edd..bc4d7d3ef 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/Select2CountryType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/Select2CountryType.php @@ -77,7 +77,7 @@ class Select2CountryType extends AbstractType asort($choices, SORT_STRING | SORT_FLAG_CASE); $resolver->setDefaults([ - 'class' => 'Chill\MainBundle\Entity\Country', + 'class' => \Chill\MainBundle\Entity\Country::class, 'choices' => array_combine(array_values($choices), array_keys($choices)), 'preferred_choices' => array_combine(array_values($preferredChoices), array_keys($preferredChoices)), ]); diff --git a/src/Bundle/ChillMainBundle/Form/Type/Select2LanguageType.php b/src/Bundle/ChillMainBundle/Form/Type/Select2LanguageType.php index 164a138d9..328f3c174 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/Select2LanguageType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/Select2LanguageType.php @@ -73,7 +73,7 @@ class Select2LanguageType extends AbstractType asort($choices, SORT_STRING | SORT_FLAG_CASE); $resolver->setDefaults([ - 'class' => 'Chill\MainBundle\Entity\Language', + 'class' => \Chill\MainBundle\Entity\Language::class, 'choices' => array_combine(array_values($choices), array_keys($choices)), 'preferred_choices' => array_combine(array_values($preferredChoices), array_keys($preferredChoices)), ]); diff --git a/src/Bundle/ChillMainBundle/Form/Type/UserPickerType.php b/src/Bundle/ChillMainBundle/Form/Type/UserPickerType.php index 6b1bb357a..c430a1053 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/UserPickerType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/UserPickerType.php @@ -79,9 +79,7 @@ class UserPickerType extends AbstractType ->setAllowedTypes('having_permissions_group_flag', ['string', 'null']) ->setDefault('class', User::class) ->setDefault('placeholder', 'Choose an user') - ->setDefault('choice_label', function (User $u) { - return $this->userRender->renderString($u, []); - }) + ->setDefault('choice_label', fn (User $u) => $this->userRender->renderString($u, [])) ->setDefault('scope', null) ->setAllowedTypes('scope', [Scope::class, 'array', 'null']) ->setNormalizer('choices', function (Options $options) { diff --git a/src/Bundle/ChillMainBundle/Form/UserType.php b/src/Bundle/ChillMainBundle/Form/UserType.php index dc2140997..f8485aa99 100644 --- a/src/Bundle/ChillMainBundle/Form/UserType.php +++ b/src/Bundle/ChillMainBundle/Form/UserType.php @@ -77,18 +77,14 @@ class UserType extends AbstractType 'required' => false, 'placeholder' => 'Choose a main scope', 'class' => Scope::class, - 'choice_label' => function (Scope $c) { - return $this->translatableStringHelper->localize($c->getName()); - }, + 'choice_label' => fn (Scope $c) => $this->translatableStringHelper->localize($c->getName()), ]) ->add('userJob', EntityType::class, [ 'label' => 'user job', 'required' => false, 'placeholder' => 'choose a job', 'class' => UserJob::class, - 'choice_label' => function (UserJob $c) { - return $this->translatableStringHelper->localize($c->getLabel()); - }, + 'choice_label' => fn (UserJob $c) => $this->translatableStringHelper->localize($c->getLabel()), 'query_builder' => static function (EntityRepository $er) { $qb = $er->createQueryBuilder('uj'); $qb->where('uj.active = TRUE'); @@ -101,9 +97,7 @@ class UserType extends AbstractType 'required' => false, 'placeholder' => 'choose a location', 'class' => Location::class, - 'choice_label' => function (Location $l) { - return $this->translatableStringHelper->localize($l->getLocationType()->getTitle()) . ' - ' . $l->getName(); - }, + 'choice_label' => fn (Location $l) => $this->translatableStringHelper->localize($l->getLocationType()->getTitle()) . ' - ' . $l->getName(), 'query_builder' => static function (EntityRepository $er) { $qb = $er->createQueryBuilder('l'); $qb->orderBy('l.locationType'); @@ -167,7 +161,7 @@ class UserType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\MainBundle\Entity\User', + 'data_class' => \Chill\MainBundle\Entity\User::class, ]); $resolver diff --git a/src/Bundle/ChillMainBundle/Form/WorkflowStepType.php b/src/Bundle/ChillMainBundle/Form/WorkflowStepType.php index 54d953016..c6278d133 100644 --- a/src/Bundle/ChillMainBundle/Form/WorkflowStepType.php +++ b/src/Bundle/ChillMainBundle/Form/WorkflowStepType.php @@ -69,9 +69,7 @@ class WorkflowStepType extends AbstractType $choices = array_combine( array_map( - static function (Transition $transition) { - return $transition->getName(); - }, + static fn (Transition $transition) => $transition->getName(), $transitions ), $transitions @@ -88,14 +86,10 @@ class WorkflowStepType extends AbstractType 'backward' => 'backward', 'neutral' => 'neutral', ], - 'choice_label' => function (string $key) use ($inputLabels) { - return $this->translatableStringHelper->localize($inputLabels[$key]); - }, - 'choice_attr' => static function (string $key) { - return [ - $key => $key, - ]; - }, + 'choice_label' => fn (string $key) => $this->translatableStringHelper->localize($inputLabels[$key]), + 'choice_attr' => static fn (string $key) => [ + $key => $key, + ], 'mapped' => false, 'expanded' => true, 'data' => 'forward', @@ -203,7 +197,7 @@ class WorkflowStepType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver - ->setDefined('class', EntityWorkflowStep::class) + ->setDefined('class') ->setRequired('transition') ->setAllowedTypes('transition', 'bool') ->setRequired('entity_workflow') diff --git a/src/Bundle/ChillMainBundle/Pagination/PaginatorFactory.php b/src/Bundle/ChillMainBundle/Pagination/PaginatorFactory.php index e6e0863a2..7f06bf216 100644 --- a/src/Bundle/ChillMainBundle/Pagination/PaginatorFactory.php +++ b/src/Bundle/ChillMainBundle/Pagination/PaginatorFactory.php @@ -78,9 +78,8 @@ class PaginatorFactory $totalItems, $this->getCurrentItemsPerPage(), $this->getCurrentPageNumber(), - null === $route ? $this->getCurrentRoute() : $route, - null === $routeParameters ? $this->getCurrentRouteParameters() : - $routeParameters, + $route ?? $this->getCurrentRoute(), + $routeParameters ?? $this->getCurrentRouteParameters(), $this->router, self::DEFAULT_CURRENT_PAGE_KEY, self::DEFAULT_ITEM_PER_NUMBER_KEY diff --git a/src/Bundle/ChillMainBundle/Phonenumber/PhonenumberHelper.php b/src/Bundle/ChillMainBundle/Phonenumber/PhonenumberHelper.php index 9ee013b1a..a92db39ce 100644 --- a/src/Bundle/ChillMainBundle/Phonenumber/PhonenumberHelper.php +++ b/src/Bundle/ChillMainBundle/Phonenumber/PhonenumberHelper.php @@ -224,7 +224,7 @@ final class PhonenumberHelper implements PhoneNumberHelperInterface return null; } - $validation = json_decode($response->getBody()->getContents())->carrier->type; + $validation = json_decode($response->getBody()->getContents(), null, 512, JSON_THROW_ON_ERROR)->carrier->type; $item ->set($validation) diff --git a/src/Bundle/ChillMainBundle/Routing/MenuBuilder/UserMenuBuilder.php b/src/Bundle/ChillMainBundle/Routing/MenuBuilder/UserMenuBuilder.php index ea5ed2062..e4ee3b062 100644 --- a/src/Bundle/ChillMainBundle/Routing/MenuBuilder/UserMenuBuilder.php +++ b/src/Bundle/ChillMainBundle/Routing/MenuBuilder/UserMenuBuilder.php @@ -72,7 +72,7 @@ class UserMenuBuilder implements LocalMenuBuilderInterface ] ) ->setExtras([ - 'order' => -9999999, + 'order' => -9_999_999, 'icon' => 'map-marker', ]); @@ -84,7 +84,7 @@ class UserMenuBuilder implements LocalMenuBuilderInterface 'route' => 'chill_main_user_absence_index', ]) ->setExtras([ - 'order' => -8888888, + 'order' => -8_888_888, ]); $menu @@ -116,7 +116,7 @@ class UserMenuBuilder implements LocalMenuBuilderInterface ['route' => 'change_my_password'] ) ->setExtras([ - 'order' => 99999999998, + 'order' => 99_999_999_998, ]); } } @@ -129,7 +129,7 @@ class UserMenuBuilder implements LocalMenuBuilderInterface ] ) ->setExtras([ - 'order' => 99999999999, + 'order' => 99_999_999_999, 'icon' => 'power-off', ]); } diff --git a/src/Bundle/ChillMainBundle/Search/HasAdvancedSearchFormInterface.php b/src/Bundle/ChillMainBundle/Search/HasAdvancedSearchFormInterface.php index e5f103cdf..7aaf31bb3 100644 --- a/src/Bundle/ChillMainBundle/Search/HasAdvancedSearchFormInterface.php +++ b/src/Bundle/ChillMainBundle/Search/HasAdvancedSearchFormInterface.php @@ -20,4 +20,6 @@ interface HasAdvancedSearchFormInterface extends SearchInterface public function convertFormDataToQuery(array $data); public function convertTermsToFormData(array $terms); + + public function getAdvancedSearchTitle(): string; } diff --git a/src/Bundle/ChillMainBundle/Search/SearchProvider.php b/src/Bundle/ChillMainBundle/Search/SearchProvider.php index f63d3c04f..095b749bc 100644 --- a/src/Bundle/ChillMainBundle/Search/SearchProvider.php +++ b/src/Bundle/ChillMainBundle/Search/SearchProvider.php @@ -33,7 +33,7 @@ use function count; class SearchProvider { /** - * @var HasAdvancedSearchForm[] + * @var HasAdvancedSearchFormInterface[] */ private $hasAdvancedFormSearchServices = []; @@ -90,13 +90,7 @@ class SearchProvider public function getByOrder() { //sort the array - uasort($this->searchServices, static function (SearchInterface $a, SearchInterface $b) { - if ($a->getOrder() === $b->getOrder()) { - return 0; - } - - return ($a->getOrder() < $b->getOrder()) ? -1 : 1; - }); + uasort($this->searchServices, static fn (SearchInterface $a, SearchInterface $b) => $a->getOrder() <=> $b->getOrder()); return $this->searchServices; } @@ -105,13 +99,9 @@ class SearchProvider * return searchservice with an advanced form, defined in service * definition. * - * @param string $name - * * @throws UnknowSearchNameException - * - * @return HasAdvancedSearchForm */ - public function getHasAdvancedFormByName($name) + public function getHasAdvancedFormByName(string $name): HasAdvancedSearchFormInterface { if (array_key_exists($name, $this->hasAdvancedFormSearchServices)) { return $this->hasAdvancedFormSearchServices[$name]; @@ -123,13 +113,7 @@ class SearchProvider public function getHasAdvancedFormSearchServices() { //sort the array - uasort($this->hasAdvancedFormSearchServices, static function (SearchInterface $a, SearchInterface $b) { - if ($a->getOrder() === $b->getOrder()) { - return 0; - } - - return ($a->getOrder() < $b->getOrder()) ? -1 : 1; - }); + uasort($this->hasAdvancedFormSearchServices, static fn (HasAdvancedSearchFormInterface $a, HasAdvancedSearchFormInterface $b): int => $a->getOrder() <=> $b->getOrder()); return $this->hasAdvancedFormSearchServices; } diff --git a/src/Bundle/ChillMainBundle/Service/AddressGeographicalUnit/RefreshAddressToGeographicalUnitMaterializedViewCronJob.php b/src/Bundle/ChillMainBundle/Service/AddressGeographicalUnit/RefreshAddressToGeographicalUnitMaterializedViewCronJob.php index 3c1ff0a75..9dbb38a3f 100644 --- a/src/Bundle/ChillMainBundle/Service/AddressGeographicalUnit/RefreshAddressToGeographicalUnitMaterializedViewCronJob.php +++ b/src/Bundle/ChillMainBundle/Service/AddressGeographicalUnit/RefreshAddressToGeographicalUnitMaterializedViewCronJob.php @@ -41,7 +41,7 @@ class RefreshAddressToGeographicalUnitMaterializedViewCronJob implements CronJob return $cronJobExecution->getLastStart() < $now->sub(new DateInterval('P1D')) // introduce a random component to ensure a roll when multiple instances are hosted on same machines - && mt_rand(0, 10) === 0; + && random_int(0, 10) === 0; } public function getKey(): string diff --git a/src/Bundle/ChillMainBundle/Service/EntityInfo/ViewEntityInfoManager.php b/src/Bundle/ChillMainBundle/Service/EntityInfo/ViewEntityInfoManager.php new file mode 100644 index 000000000..6b7b81224 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Service/EntityInfo/ViewEntityInfoManager.php @@ -0,0 +1,48 @@ +connection->transactional(function (Connection $conn): void { + foreach ($this->vienEntityInfoProviders as $viewProvider) { + foreach ($this->createOrReplaceViewSQL($viewProvider, $viewProvider->getViewName()) as $sql) { + $conn->executeQuery($sql); + } + } + }); + } + + /** + * @return array + */ + private function createOrReplaceViewSQL(ViewEntityInfoProviderInterface $viewProvider, string $viewName): array + { + return [ + "DROP VIEW IF EXISTS {$viewName}", + sprintf("CREATE VIEW {$viewName} AS %s", $viewProvider->getViewQuery()) + ]; + } +} diff --git a/src/Bundle/ChillMainBundle/Service/EntityInfo/ViewEntityInfoProviderInterface.php b/src/Bundle/ChillMainBundle/Service/EntityInfo/ViewEntityInfoProviderInterface.php new file mode 100644 index 000000000..392c0f82c --- /dev/null +++ b/src/Bundle/ChillMainBundle/Service/EntityInfo/ViewEntityInfoProviderInterface.php @@ -0,0 +1,19 @@ + 'addresses-' . $list . '.' . $lang . '.csv.gz' === $item['name']); return array_values($asset)[0]['browser_download_url']; } diff --git a/src/Bundle/ChillMainBundle/Service/Import/PostalCodeBEFromBestAddress.php b/src/Bundle/ChillMainBundle/Service/Import/PostalCodeBEFromBestAddress.php index a6d9512c7..aa04c9ac3 100644 --- a/src/Bundle/ChillMainBundle/Service/Import/PostalCodeBEFromBestAddress.php +++ b/src/Bundle/ChillMainBundle/Service/Import/PostalCodeBEFromBestAddress.php @@ -66,11 +66,11 @@ class PostalCodeBEFromBestAddress gzclose($uncompressedStream); unlink($tmpname); - $this->logger->info(__CLASS__ . ' list of postal code downloaded'); + $this->logger->info(self::class . ' list of postal code downloaded'); $this->baseImporter->finalize(); - $this->logger->info(__CLASS__ . ' postal code fetched', ['offset' => $offset ?? 0]); + $this->logger->info(self::class . ' postal code fetched', ['offset' => $offset ?? 0]); } private function getFileDownloadUrl(string $lang): string @@ -82,9 +82,7 @@ class PostalCodeBEFromBestAddress throw new RuntimeException('could not get the release definition', 0, $e); } - $postals = array_filter($release['assets'], static function (array $item) use ($lang) { - return 'postals.' . $lang . '.csv.gz' === $item['name']; - }); + $postals = array_filter($release['assets'], static fn (array $item) => 'postals.' . $lang . '.csv.gz' === $item['name']); return array_values($postals)[0]['browser_download_url']; } diff --git a/src/Bundle/ChillMainBundle/Service/Import/PostalCodeFRFromOpenData.php b/src/Bundle/ChillMainBundle/Service/Import/PostalCodeFRFromOpenData.php index e2d25350d..e680b8497 100644 --- a/src/Bundle/ChillMainBundle/Service/Import/PostalCodeFRFromOpenData.php +++ b/src/Bundle/ChillMainBundle/Service/Import/PostalCodeFRFromOpenData.php @@ -73,7 +73,7 @@ class PostalCodeFRFromOpenData $this->baseImporter->finalize(); fclose($tmpfile); - $this->logger->info(__CLASS__ . ' postal code fetched', ['offset' => $offset ?? 0]); + $this->logger->info(self::class . ' postal code fetched', ['offset' => $offset ?? 0]); } private function handleRecord(array $record): void diff --git a/src/Bundle/ChillMainBundle/Service/Mailer/ChillMailer.php b/src/Bundle/ChillMainBundle/Service/Mailer/ChillMailer.php index 4658d7e3b..36374c6af 100644 --- a/src/Bundle/ChillMainBundle/Service/Mailer/ChillMailer.php +++ b/src/Bundle/ChillMainBundle/Service/Mailer/ChillMailer.php @@ -39,9 +39,7 @@ class ChillMailer implements MailerInterface } $this->chillLogger->info('chill email sent', [ - 'to' => array_map(static function (Address $address) { - return $address->getAddress(); - }, $message->getTo()), + 'to' => array_map(static fn (Address $address) => $address->getAddress(), $message->getTo()), 'subject' => $message->getSubject(), ]); diff --git a/src/Bundle/ChillMainBundle/Test/Export/AbstractAggregatorTest.php b/src/Bundle/ChillMainBundle/Test/Export/AbstractAggregatorTest.php index af0e3843a..99a75582f 100644 --- a/src/Bundle/ChillMainBundle/Test/Export/AbstractAggregatorTest.php +++ b/src/Bundle/ChillMainBundle/Test/Export/AbstractAggregatorTest.php @@ -243,7 +243,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase $result = $results[0]; $this->assertTrue( - $result instanceof Traversable || is_array($result), + is_iterable($result), 'test that each row in the result is traversable or an array' ); diff --git a/src/Bundle/ChillMainBundle/Test/Export/AbstractExportTest.php b/src/Bundle/ChillMainBundle/Test/Export/AbstractExportTest.php index 0e5b56ae0..23f6c4b84 100644 --- a/src/Bundle/ChillMainBundle/Test/Export/AbstractExportTest.php +++ b/src/Bundle/ChillMainBundle/Test/Export/AbstractExportTest.php @@ -230,7 +230,7 @@ abstract class AbstractExportTest extends WebTestCase $result = $results[0]; $this->assertTrue( - $result instanceof Traversable || is_array($result), + is_iterable($result), 'test that each row in the result is traversable or an array' ); diff --git a/src/Bundle/ChillMainBundle/Test/PrepareCenterTrait.php b/src/Bundle/ChillMainBundle/Test/PrepareCenterTrait.php index 343c41180..e43cc8fdb 100644 --- a/src/Bundle/ChillMainBundle/Test/PrepareCenterTrait.php +++ b/src/Bundle/ChillMainBundle/Test/PrepareCenterTrait.php @@ -38,7 +38,7 @@ trait PrepareCenterTrait } $center = $this->centerProphet->prophesize(); - $center->willExtend('\Chill\MainBundle\Entity\Center'); + $center->willExtend('\\' . \Chill\MainBundle\Entity\Center::class); $center->getId()->willReturn($id); $center->getName()->willReturn($name); diff --git a/src/Bundle/ChillMainBundle/Test/PrepareCircleTrait.php b/src/Bundle/ChillMainBundle/Test/PrepareCircleTrait.php index 4621fce04..8cbe9337c 100644 --- a/src/Bundle/ChillMainBundle/Test/PrepareCircleTrait.php +++ b/src/Bundle/ChillMainBundle/Test/PrepareCircleTrait.php @@ -38,7 +38,7 @@ trait PrepareCircleTrait } $scope = $this->circleProphet->prophesize(); - $scope->willExtend('\Chill\MainBundle\Entity\Scope'); + $scope->willExtend('\\' . \Chill\MainBundle\Entity\Scope::class); $scope->getId()->willReturn($id); $scope->getName()->willReturn($name); diff --git a/src/Bundle/ChillMainBundle/Tests/Controller/AddressToReferenceMatcherControllerTest.php b/src/Bundle/ChillMainBundle/Tests/Controller/AddressToReferenceMatcherControllerTest.php index 7bcbe9889..4a65883e2 100644 --- a/src/Bundle/ChillMainBundle/Tests/Controller/AddressToReferenceMatcherControllerTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Controller/AddressToReferenceMatcherControllerTest.php @@ -84,7 +84,7 @@ class AddressToReferenceMatcherControllerTest extends WebTestCase /** @var Address $address */ $address = $em->createQuery('SELECT a FROM '.Address::class.' a') - ->setFirstResult(rand(0, $nb)) + ->setFirstResult(random_int(0, $nb)) ->setMaxResults(1) ->getSingleResult(); @@ -108,7 +108,7 @@ class AddressToReferenceMatcherControllerTest extends WebTestCase $ref = $em->createQuery('SELECT a FROM '.AddressReference::class.' a') ->setMaxResults(1) - ->setFirstResult(rand(0, $nb)) + ->setFirstResult(random_int(0, $nb)) ->getSingleResult(); $address = Address::createFromAddressReference($ref); diff --git a/src/Bundle/ChillMainBundle/Tests/Controller/GeographicalUnitByAddressApiControllerTest.php b/src/Bundle/ChillMainBundle/Tests/Controller/GeographicalUnitByAddressApiControllerTest.php index a320bb073..60273a8c9 100644 --- a/src/Bundle/ChillMainBundle/Tests/Controller/GeographicalUnitByAddressApiControllerTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Controller/GeographicalUnitByAddressApiControllerTest.php @@ -44,7 +44,7 @@ class GeographicalUnitByAddressApiControllerTest extends WebTestCase $nb = $em->createQuery('SELECT COUNT(a) FROM '.Address::class.' a')->getSingleScalarResult(); /** @var \Chill\MainBundle\Entity\Address $random */ $random = $em->createQuery('SELECT a FROM '.Address::class.' a') - ->setFirstResult(rand(0, $nb)) + ->setFirstResult(random_int(0, $nb)) ->setMaxResults(1) ->getSingleResult(); diff --git a/src/Bundle/ChillMainBundle/Tests/Controller/PermissionApiControllerTest.php b/src/Bundle/ChillMainBundle/Tests/Controller/PermissionApiControllerTest.php index 59adb374a..2b89ec3db 100644 --- a/src/Bundle/ChillMainBundle/Tests/Controller/PermissionApiControllerTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Controller/PermissionApiControllerTest.php @@ -44,7 +44,7 @@ final class PermissionApiControllerTest extends WebTestCase $this->assertResponseIsSuccessful(); - $data = json_decode($client->getResponse()->getContent(), true); + $data = json_decode($client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertFalse($data['roles']['FOO_ROLE']); } @@ -67,7 +67,7 @@ final class PermissionApiControllerTest extends WebTestCase $this->assertResponseIsSuccessful(); - $data = json_decode($client->getResponse()->getContent(), true); + $data = json_decode($client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertTrue($data['roles']['ROLE_USER']); $this->assertFalse($data['roles']['ROLE_ADMIN']); } diff --git a/src/Bundle/ChillMainBundle/Tests/Controller/PostalCodeApiControllerTest.php b/src/Bundle/ChillMainBundle/Tests/Controller/PostalCodeApiControllerTest.php index 31bfab285..a777be44c 100644 --- a/src/Bundle/ChillMainBundle/Tests/Controller/PostalCodeApiControllerTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Controller/PostalCodeApiControllerTest.php @@ -35,7 +35,7 @@ final class PostalCodeApiControllerTest extends WebTestCase $this->assertResponseIsSuccessful(); - $data = json_decode($client->getResponse()->getContent(), true); + $data = json_decode($client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertEquals('Fontenay Le Comte', $data['results'][0]['name']); diff --git a/src/Bundle/ChillMainBundle/Tests/Controller/UserApiControllerTest.php b/src/Bundle/ChillMainBundle/Tests/Controller/UserApiControllerTest.php index 57800c6cb..ef421020e 100644 --- a/src/Bundle/ChillMainBundle/Tests/Controller/UserApiControllerTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Controller/UserApiControllerTest.php @@ -47,7 +47,7 @@ final class UserApiControllerTest extends WebTestCase $this->assertResponseIsSuccessful(); - $data = json_decode($client->getResponse()->getContent(), true); + $data = json_decode($client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertTrue(array_key_exists('count', $data)); $this->assertGreaterThan(0, $data['count']); $this->assertTrue(array_key_exists('results', $data)); diff --git a/src/Bundle/ChillMainBundle/Tests/Entity/NotificationTest.php b/src/Bundle/ChillMainBundle/Tests/Entity/NotificationTest.php index 9246cf1e6..d641b94a8 100644 --- a/src/Bundle/ChillMainBundle/Tests/Entity/NotificationTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Entity/NotificationTest.php @@ -134,9 +134,7 @@ final class NotificationTest extends KernelTestCase $this->assertEquals($senderId, $notification->getSender()->getId()); $this->assertCount(count($addressesIds), $notification->getUnreadBy()); - $unreadIds = $notification->getUnreadBy()->map(static function (User $u) { - return $u->getId(); - }); + $unreadIds = $notification->getUnreadBy()->map(static fn (User $u) => $u->getId()); foreach ($addressesIds as $addresseeId) { $this->assertContains($addresseeId, $unreadIds); diff --git a/src/Bundle/ChillMainBundle/Tests/Export/ExportManagerTest.php b/src/Bundle/ChillMainBundle/Tests/Export/ExportManagerTest.php index 77f5aa1e1..f0a57e1b0 100644 --- a/src/Bundle/ChillMainBundle/Tests/Export/ExportManagerTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Export/ExportManagerTest.php @@ -198,10 +198,10 @@ final class ExportManagerTest extends KernelTestCase //create a formatter $formatterFoo = $this->prophet->prophesize(); - $formatterFoo->willImplement('Chill\MainBundle\Export\FormatterInterface'); + $formatterFoo->willImplement(\Chill\MainBundle\Export\FormatterInterface::class); $formatterFoo->getType()->willReturn('foo'); $formatterBar = $this->prophet->prophesize(); - $formatterBar->willImplement('Chill\MainBundle\Export\FormatterInterface'); + $formatterBar->willImplement(\Chill\MainBundle\Export\FormatterInterface::class); $formatterBar->getType()->willReturn('bar'); $exportManager->addFormatter($formatterFoo->reveal(), 'foo'); $exportManager->addFormatter($formatterBar->reveal(), 'bar'); @@ -380,12 +380,12 @@ final class ExportManagerTest extends KernelTestCase //create a filter and add it to ExportManager $agg = $this->prophet->prophesize(); - $agg->willImplement('Chill\MainBundle\Export\AggregatorInterface'); + $agg->willImplement(\Chill\MainBundle\Export\AggregatorInterface::class); $exportManager->addAggregator($agg->reveal(), 'dummy'); $obtained = $exportManager->getAggregator('dummy'); - $this->assertInstanceof('Chill\MainBundle\Export\AggregatorInterface', $obtained); + $this->assertInstanceof(\Chill\MainBundle\Export\AggregatorInterface::class, $obtained); } public function testGetAggregatorNonExistant() @@ -403,11 +403,11 @@ final class ExportManagerTest extends KernelTestCase //create three filters and add them to ExportManager $aggFoo = $this->prophet->prophesize(); - $aggFoo->willImplement('Chill\MainBundle\Export\AggregatorInterface'); + $aggFoo->willImplement(\Chill\MainBundle\Export\AggregatorInterface::class); $aggBar = $this->prophet->prophesize(); - $aggBar->willImplement('Chill\MainBundle\Export\AggregatorInterface'); + $aggBar->willImplement(\Chill\MainBundle\Export\AggregatorInterface::class); $aggFooBar = $this->prophet->prophesize(); - $aggFooBar->willImplement('Chill\MainBundle\Export\AggregatorInterface'); + $aggFooBar->willImplement(\Chill\MainBundle\Export\AggregatorInterface::class); $exportManager->addAggregator($aggFoo->reveal(), 'foo'); $exportManager->addAggregator($aggBar->reveal(), 'bar'); $exportManager->addAggregator($aggFooBar->reveal(), 'foobar'); @@ -477,12 +477,12 @@ final class ExportManagerTest extends KernelTestCase //create a filter and add it to ExportManager $filter = $this->prophet->prophesize(); - $filter->willImplement('Chill\MainBundle\Export\FilterInterface'); + $filter->willImplement(\Chill\MainBundle\Export\FilterInterface::class); $exportManager->addFilter($filter->reveal(), 'dummy'); $obtained = $exportManager->getFilter('dummy'); - $this->assertInstanceof('Chill\MainBundle\Export\FilterInterface', $obtained); + $this->assertInstanceof(\Chill\MainBundle\Export\FilterInterface::class, $obtained); } public function testGetFilterNonExistant() @@ -500,11 +500,11 @@ final class ExportManagerTest extends KernelTestCase //create three filters and add them to ExportManager $filterFoo = $this->prophet->prophesize(); - $filterFoo->willImplement('Chill\MainBundle\Export\FilterInterface'); + $filterFoo->willImplement(\Chill\MainBundle\Export\FilterInterface::class); $filterBar = $this->prophet->prophesize(); - $filterBar->willImplement('Chill\MainBundle\Export\FilterInterface'); + $filterBar->willImplement(\Chill\MainBundle\Export\FilterInterface::class); $filterFooBar = $this->prophet->prophesize(); - $filterFooBar->willImplement('Chill\MainBundle\Export\FilterInterface'); + $filterFooBar->willImplement(\Chill\MainBundle\Export\FilterInterface::class); $exportManager->addFilter($filterFoo->reveal(), 'foo'); $exportManager->addFilter($filterBar->reveal(), 'bar'); $exportManager->addFilter($filterFooBar->reveal(), 'foobar'); @@ -522,12 +522,12 @@ final class ExportManagerTest extends KernelTestCase //create a formatter $formatter = $this->prophet->prophesize(); - $formatter->willImplement('Chill\MainBundle\Export\FormatterInterface'); + $formatter->willImplement(\Chill\MainBundle\Export\FormatterInterface::class); $exportManager->addFormatter($formatter->reveal(), 'dummy'); $obtained = $exportManager->getFormatter('dummy'); - $this->assertInstanceOf('Chill\MainBundle\Export\FormatterInterface', $obtained); + $this->assertInstanceOf(\Chill\MainBundle\Export\FormatterInterface::class, $obtained); } public function testIsGrantedForElementWithExportAndUserIsGranted() @@ -536,7 +536,7 @@ final class ExportManagerTest extends KernelTestCase $user = $this->prepareUser([]); $authorizationChecker = $this->prophet->prophesize(); - $authorizationChecker->willImplement('Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface'); + $authorizationChecker->willImplement(\Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface::class); $authorizationChecker->isGranted('CHILL_STAT_DUMMY', $center) ->willReturn(true); @@ -564,7 +564,7 @@ final class ExportManagerTest extends KernelTestCase $user = $this->prepareUser([]); $authorizationChecker = $this->prophet->prophesize(); - $authorizationChecker->willImplement('Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface'); + $authorizationChecker->willImplement(\Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface::class); $authorizationChecker->isGranted('CHILL_STAT_DUMMY', $center) ->willReturn(true); $authorizationChecker->isGranted('CHILL_STAT_DUMMY', $centerB) diff --git a/src/Bundle/ChillMainBundle/Tests/Form/Type/PickCenterTypeTest.php b/src/Bundle/ChillMainBundle/Tests/Form/Type/PickCenterTypeTest.php index ad32ecee7..ffb7c6bed 100644 --- a/src/Bundle/ChillMainBundle/Tests/Form/Type/PickCenterTypeTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Form/Type/PickCenterTypeTest.php @@ -101,7 +101,7 @@ final class PickCenterTypeTest extends TypeTestCase $prophet = new \Prophecy\Prophet(); $prophecyCenter = $prophet->prophesize(); - $prophecyCenter->willExtend('\Chill\MainBundle\Entity\Center'); + $prophecyCenter->willExtend('\\' . \Chill\MainBundle\Entity\Center::class); $prophecyCenter->getId()->willReturn($id); $prophecyCenter->getName()->willReturn($name); @@ -122,18 +122,18 @@ final class PickCenterTypeTest extends TypeTestCase //create a center transformer $centerTransformerProphecy = $prophet->prophesize(); $centerTransformerProphecy - ->willExtend('Chill\MainBundle\Form\Type\DataTransformer\CenterTransformer'); + ->willExtend(\Chill\MainBundle\Form\Type\DataTransformer\CenterTransformer::class); $transformer = $centerTransformerProphecy->reveal(); $tokenProphecy = $prophet->prophesize(); $tokenProphecy - ->willImplement('\Symfony\Component\Security\Core\Authentication\Token\TokenInterface'); + ->willImplement('\\' . \Symfony\Component\Security\Core\Authentication\Token\TokenInterface::class); $tokenProphecy->getUser()->willReturn($user); $token = $tokenProphecy->reveal(); $tokenStorageProphecy = $prophet->prophesize(); $tokenStorageProphecy - ->willExtend('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage'); + ->willExtend(\Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage::class); $tokenStorageProphecy->getToken()->willReturn($token); $tokenStorage = $tokenStorageProphecy->reveal(); diff --git a/src/Bundle/ChillMainBundle/Tests/Form/Type/ScopePickerTypeTest.php b/src/Bundle/ChillMainBundle/Tests/Form/Type/ScopePickerTypeTest.php index ce41c9a21..0e37f0fde 100644 --- a/src/Bundle/ChillMainBundle/Tests/Form/Type/ScopePickerTypeTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Form/Type/ScopePickerTypeTest.php @@ -96,9 +96,7 @@ final class ScopePickerTypeTest extends TypeTestCase $translatableStringHelper = $this->prophesize(TranslatableStringHelperInterface::class); $translatableStringHelper->localize(Argument::type('array'))->will( - static function ($args) { - return $args[0]['fr']; - } + static fn ($args) => $args[0]['fr'] ); $type = new ScopePickerType( diff --git a/src/Bundle/ChillMainBundle/Tests/Search/AbstractSearchTest.php b/src/Bundle/ChillMainBundle/Tests/Search/AbstractSearchTest.php index 497f91271..9348c6fe2 100644 --- a/src/Bundle/ChillMainBundle/Tests/Search/AbstractSearchTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Search/AbstractSearchTest.php @@ -26,7 +26,7 @@ final class AbstractSearchTest extends \PHPUnit\Framework\TestCase protected function setUp(): void { - $this->stub = $this->getMockForAbstractClass('Chill\MainBundle\Search\AbstractSearch'); + $this->stub = $this->getMockForAbstractClass(\Chill\MainBundle\Search\AbstractSearch::class); } public function testParseDateRegular() diff --git a/src/Bundle/ChillMainBundle/Tests/Search/SearchProviderTest.php b/src/Bundle/ChillMainBundle/Tests/Search/SearchProviderTest.php index 362787b84..f9dbcec51 100644 --- a/src/Bundle/ChillMainBundle/Tests/Search/SearchProviderTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Search/SearchProviderTest.php @@ -245,7 +245,7 @@ final class SearchProviderTest extends TestCase private function createDefaultSearchService($result, $order) { $mock = $this - ->getMockForAbstractClass('Chill\MainBundle\Search\AbstractSearch'); + ->getMockForAbstractClass(\Chill\MainBundle\Search\AbstractSearch::class); //set the mock as default $mock->expects($this->any()) @@ -267,7 +267,7 @@ final class SearchProviderTest extends TestCase private function createNonDefaultDomainSearchService($result, $order, $domain) { $mock = $this - ->getMockForAbstractClass('Chill\MainBundle\Search\AbstractSearch'); + ->getMockForAbstractClass(\Chill\MainBundle\Search\AbstractSearch::class); //set the mock as default $mock->expects($this->any()) diff --git a/src/Bundle/ChillMainBundle/Tests/Search/Utils/ExtractDateFromPatternTest.php b/src/Bundle/ChillMainBundle/Tests/Search/Utils/ExtractDateFromPatternTest.php index 392e9a4ff..49419f261 100644 --- a/src/Bundle/ChillMainBundle/Tests/Search/Utils/ExtractDateFromPatternTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Search/Utils/ExtractDateFromPatternTest.php @@ -52,9 +52,7 @@ final class ExtractDateFromPatternTest extends TestCase $this->assertContainsOnlyInstancesOf(DateTimeImmutable::class, $result->getFound()); $dates = array_map( - static function (DateTimeImmutable $d) { - return $d->format('Y-m-d'); - }, + static fn (DateTimeImmutable $d) => $d->format('Y-m-d'), $result->getFound() ); diff --git a/src/Bundle/ChillMainBundle/Tests/Security/Authorization/AuthorizationHelperTest.php b/src/Bundle/ChillMainBundle/Tests/Security/Authorization/AuthorizationHelperTest.php index cc5a49096..8c681bfb0 100644 --- a/src/Bundle/ChillMainBundle/Tests/Security/Authorization/AuthorizationHelperTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Security/Authorization/AuthorizationHelperTest.php @@ -211,9 +211,7 @@ final class AuthorizationHelperTest extends KernelTestCase $centerA ); - $usernames = array_map(static function (User $u) { - return $u->getUsername(); - }, $users); + $usernames = array_map(static fn (User $u) => $u->getUsername(), $users); $this->assertContains('center a_social', $usernames); } @@ -279,8 +277,8 @@ final class AuthorizationHelperTest extends KernelTestCase ]); $helper = $this->getAuthorizationHelper(); $entity = $this->getProphet()->prophesize(); - $entity->willImplement('\Chill\MainBundle\Entity\HasCenterInterface'); - $entity->willImplement('\Chill\MainBundle\Entity\HasScopeInterface'); + $entity->willImplement('\\' . \Chill\MainBundle\Entity\HasCenterInterface::class); + $entity->willImplement('\\' . \Chill\MainBundle\Entity\HasScopeInterface::class); $entity->getCenter()->willReturn($center); $entity->getScope()->willReturn($scope); @@ -386,7 +384,7 @@ final class AuthorizationHelperTest extends KernelTestCase ]); $helper = $this->getAuthorizationHelper(); $entity = $this->getProphet()->prophesize(); - $entity->willImplement('\Chill\MainBundle\Entity\HasCenterInterface'); + $entity->willImplement('\\' . \Chill\MainBundle\Entity\HasCenterInterface::class); $entity->getCenter()->willReturn($center); $this->assertTrue($helper->userHasAccess( @@ -410,7 +408,7 @@ final class AuthorizationHelperTest extends KernelTestCase $helper = $this->getAuthorizationHelper(); $entity = $this->getProphet()->prophesize(); - $entity->willImplement('\Chill\MainBundle\Entity\HasCenterInterface'); + $entity->willImplement('\\' . \Chill\MainBundle\Entity\HasCenterInterface::class); $entity->getCenter()->willReturn($center); $this->assertTrue($helper->userHasAccess( @@ -434,8 +432,8 @@ final class AuthorizationHelperTest extends KernelTestCase ]); $helper = $this->getAuthorizationHelper(); $entity = $this->getProphet()->prophesize(); - $entity->willImplement('\Chill\MainBundle\Entity\HasCenterInterface'); - $entity->willImplement('\Chill\MainBundle\Entity\HasScopeInterface'); + $entity->willImplement('\\' . \Chill\MainBundle\Entity\HasCenterInterface::class); + $entity->willImplement('\\' . \Chill\MainBundle\Entity\HasScopeInterface::class); $entity->getCenter()->willReturn($centerB); $entity->getScope()->willReturn($scope); @@ -455,7 +453,7 @@ final class AuthorizationHelperTest extends KernelTestCase ]); $helper = $this->getAuthorizationHelper(); $entity = $this->getProphet()->prophesize(); - $entity->willImplement('\Chill\MainBundle\Entity\HasCenterInterface'); + $entity->willImplement('\\' . \Chill\MainBundle\Entity\HasCenterInterface::class); $entity->getCenter()->willReturn($center); $this->assertFalse($helper->userHasAccess($user, $entity->reveal(), 'CHILL_ROLE')); @@ -474,8 +472,8 @@ final class AuthorizationHelperTest extends KernelTestCase ]); $helper = $this->getAuthorizationHelper(); $entity = $this->getProphet()->prophesize(); - $entity->willImplement('\Chill\MainBundle\Entity\HasCenterInterface'); - $entity->willImplement('\Chill\MainBundle\Entity\HasScopeInterface'); + $entity->willImplement('\\' . \Chill\MainBundle\Entity\HasCenterInterface::class); + $entity->willImplement('\\' . \Chill\MainBundle\Entity\HasScopeInterface::class); $entity->getCenter()->willReturn($center); $entity->getScope()->willReturn($scope); @@ -506,7 +504,7 @@ final class AuthorizationHelperTest extends KernelTestCase ]); $helper = $this->getAuthorizationHelper(); $entity = $this->getProphet()->prophesize(); - $entity->willImplement('\Chill\MainBundle\Entity\HasCenterInterface'); + $entity->willImplement('\\' . \Chill\MainBundle\Entity\HasCenterInterface::class); $entity->getCenter()->willReturn($centerA); $this->assertFalse($helper->userHasAccess($user, $entity->reveal(), 'CHILL_ROLE')); diff --git a/src/Bundle/ChillMainBundle/Tests/Services/Import/GeographicalUnitBaseImporterTest.php b/src/Bundle/ChillMainBundle/Tests/Services/Import/GeographicalUnitBaseImporterTest.php index 33198c500..b3bd856ff 100644 --- a/src/Bundle/ChillMainBundle/Tests/Services/Import/GeographicalUnitBaseImporterTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Services/Import/GeographicalUnitBaseImporterTest.php @@ -64,7 +64,7 @@ final class GeographicalUnitBaseImporterTest extends KernelTestCase $this->assertEquals($results['unitrefid'], 'layer_one'); $this->assertEquals($results['unitname'], 'Layer one'); - $this->assertEquals(json_decode($results['layername'], true), ['fr' => 'Test Layer']); + $this->assertEquals(json_decode($results['layername'], true, 512, JSON_THROW_ON_ERROR), ['fr' => 'Test Layer']); $this->assertEquals($results['layerrefid'], 'test'); $this->assertEquals($results['geom'], 'MULTIPOLYGON(((30 20,45 40,10 40,30 20)),((15 5,40 10,10 20,5 10,15 5)))'); @@ -93,7 +93,7 @@ final class GeographicalUnitBaseImporterTest extends KernelTestCase $this->assertEquals($results['unitrefid'], 'layer_one'); $this->assertEquals($results['unitname'], 'Layer one fixed'); - $this->assertEquals(json_decode($results['layername'], true), ['fr' => 'Test Layer fixed']); + $this->assertEquals(json_decode($results['layername'], true, 512, JSON_THROW_ON_ERROR), ['fr' => 'Test Layer fixed']); $this->assertEquals($results['layerrefid'], 'test'); $this->assertEquals($results['geom'], 'MULTIPOLYGON(((130 120,45 40,10 40,130 120)),((0 0,15 5,40 10,10 20,0 0)))'); } diff --git a/src/Bundle/ChillMainBundle/Workflow/EventSubscriber/EntityWorkflowTransitionEventSubscriber.php b/src/Bundle/ChillMainBundle/Workflow/EventSubscriber/EntityWorkflowTransitionEventSubscriber.php index 192ca0712..f3e04eeca 100644 --- a/src/Bundle/ChillMainBundle/Workflow/EventSubscriber/EntityWorkflowTransitionEventSubscriber.php +++ b/src/Bundle/ChillMainBundle/Workflow/EventSubscriber/EntityWorkflowTransitionEventSubscriber.php @@ -105,9 +105,7 @@ class EntityWorkflowTransitionEventSubscriber implements EventSubscriberInterfac [ '%users%' => implode( ', ', - $entityWorkflow->getCurrentStep()->getAllDestUser()->map(function (User $u) { - return $this->userRender->renderString($u, []); - })->toArray() + $entityWorkflow->getCurrentStep()->getAllDestUser()->map(fn (User $u) => $this->userRender->renderString($u, []))->toArray() ), ] )); diff --git a/src/Bundle/ChillMainBundle/Workflow/EventSubscriber/NotificationOnTransition.php b/src/Bundle/ChillMainBundle/Workflow/EventSubscriber/NotificationOnTransition.php index f02341ff7..76ad4a4b0 100644 --- a/src/Bundle/ChillMainBundle/Workflow/EventSubscriber/NotificationOnTransition.php +++ b/src/Bundle/ChillMainBundle/Workflow/EventSubscriber/NotificationOnTransition.php @@ -109,9 +109,7 @@ class NotificationOnTransition implements EventSubscriberInterface 'dest' => $subscriber, 'place' => $place, 'workflow' => $workflow, - 'is_dest' => in_array($subscriber->getId(), array_map(static function (User $u) { - return $u->getId(); - }, $entityWorkflow->futureDestUsers), true), + 'is_dest' => in_array($subscriber->getId(), array_map(static fn (User $u) => $u->getId(), $entityWorkflow->futureDestUsers), true), ]; $notification = new Notification(); diff --git a/src/Bundle/ChillMainBundle/Workflow/Validator/EntityWorkflowCreationValidator.php b/src/Bundle/ChillMainBundle/Workflow/Validator/EntityWorkflowCreationValidator.php index 0c8d1c72f..bb3586251 100644 --- a/src/Bundle/ChillMainBundle/Workflow/Validator/EntityWorkflowCreationValidator.php +++ b/src/Bundle/ChillMainBundle/Workflow/Validator/EntityWorkflowCreationValidator.php @@ -59,9 +59,7 @@ class EntityWorkflowCreationValidator extends \Symfony\Component\Validator\Const $workflows = $this->entityWorkflowManager->getSupportedWorkflows($value); - $matched = array_filter($workflows, static function (WorkflowInterface $workflow) use ($value) { - return $workflow->getName() === $value->getWorkflowName(); - }); + $matched = array_filter($workflows, static fn (WorkflowInterface $workflow) => $workflow->getName() === $value->getWorkflowName()); if (0 === count($matched)) { $this->context->buildViolation($constraint->messageWorkflowNotAvailable) diff --git a/src/Bundle/ChillMainBundle/config/services.yaml b/src/Bundle/ChillMainBundle/config/services.yaml index 6248c508e..5976cb8b0 100644 --- a/src/Bundle/ChillMainBundle/config/services.yaml +++ b/src/Bundle/ChillMainBundle/config/services.yaml @@ -1,6 +1,9 @@ parameters: # cl_chill_main.example.class: Chill\MainBundle\Example +imports: + - ./services/clock.yaml + services: _defaults: autowire: true @@ -118,3 +121,7 @@ services: lazy: true arguments: $jobs: !tagged_iterator chill_main.cron_job + + Chill\MainBundle\Service\EntityInfo\ViewEntityInfoManager: + arguments: + $vienEntityInfoProviders: !tagged_iterator chill_main.entity_info_provider diff --git a/src/Bundle/ChillMainBundle/config/services/clock.yaml b/src/Bundle/ChillMainBundle/config/services/clock.yaml new file mode 100644 index 000000000..0629cd869 --- /dev/null +++ b/src/Bundle/ChillMainBundle/config/services/clock.yaml @@ -0,0 +1,4 @@ +# temporary, waiting for symfony 6.0 to load clock +services: + Symfony\Component\Clock\NativeClock: ~ + Symfony\Component\Clock\ClockInterface: '@Symfony\Component\Clock\NativeClock' diff --git a/src/Bundle/ChillMainBundle/config/services/command.yaml b/src/Bundle/ChillMainBundle/config/services/command.yaml index f9a863f10..d9efbf27a 100644 --- a/src/Bundle/ChillMainBundle/config/services/command.yaml +++ b/src/Bundle/ChillMainBundle/config/services/command.yaml @@ -67,3 +67,7 @@ services: autowire: true tags: - {name: console.command } + + Chill\MainBundle\Command\SynchronizeEntityInfoViewsCommand: + tags: + - {name: console.command} diff --git a/src/Bundle/ChillMainBundle/migrations/Version20180709181423.php b/src/Bundle/ChillMainBundle/migrations/Version20180709181423.php index 5da4509bf..1c410970b 100644 --- a/src/Bundle/ChillMainBundle/migrations/Version20180709181423.php +++ b/src/Bundle/ChillMainBundle/migrations/Version20180709181423.php @@ -49,18 +49,18 @@ final class Version20180709181423 extends AbstractMigration $this->addSql('CREATE UNIQUE INDEX UNIQ_1483A5E9885281E ON users (emailCanonical)'); $this->addSql( - <<<'SQL' - CREATE OR REPLACE FUNCTION canonicalize_user_on_update() RETURNS TRIGGER AS - $BODY$ - BEGIN - IF NEW.username <> OLD.username OR NEW.email <> OLD.email OR OLD.emailcanonical IS NULL OR OLD.usernamecanonical IS NULL THEN - UPDATE users SET usernamecanonical=LOWER(UNACCENT(NEW.username)), emailcanonical=LOWER(UNACCENT(NEW.email)) WHERE id=NEW.id; - END IF; + <<<'SQL_WRAP' + CREATE OR REPLACE FUNCTION canonicalize_user_on_update() RETURNS TRIGGER AS + $BODY$ + BEGIN + IF NEW.username <> OLD.username OR NEW.email <> OLD.email OR OLD.emailcanonical IS NULL OR OLD.usernamecanonical IS NULL THEN + UPDATE users SET usernamecanonical=LOWER(UNACCENT(NEW.username)), emailcanonical=LOWER(UNACCENT(NEW.email)) WHERE id=NEW.id; + END IF; - RETURN NEW; - END; - $BODY$ LANGUAGE PLPGSQL - SQL + RETURN NEW; + END; + $BODY$ LANGUAGE PLPGSQL +SQL_WRAP ); $this->addSql( @@ -74,16 +74,16 @@ final class Version20180709181423 extends AbstractMigration ); $this->addSql( - <<<'SQL' - CREATE OR REPLACE FUNCTION canonicalize_user_on_insert() RETURNS TRIGGER AS - $BODY$ - BEGIN - UPDATE users SET usernamecanonical=LOWER(UNACCENT(NEW.username)), emailcanonical=LOWER(UNACCENT(NEW.email)) WHERE id=NEW.id; + <<<'SQL_WRAP' + CREATE OR REPLACE FUNCTION canonicalize_user_on_insert() RETURNS TRIGGER AS + $BODY$ + BEGIN + UPDATE users SET usernamecanonical=LOWER(UNACCENT(NEW.username)), emailcanonical=LOWER(UNACCENT(NEW.email)) WHERE id=NEW.id; - RETURN NEW; - END; - $BODY$ LANGUAGE PLPGSQL; - SQL + RETURN NEW; + END; + $BODY$ LANGUAGE PLPGSQL; +SQL_WRAP ); $this->addSql( diff --git a/src/Bundle/ChillMainBundle/translations/messages.fr.yml b/src/Bundle/ChillMainBundle/translations/messages.fr.yml index b8349ce2e..14de6dbf0 100644 --- a/src/Bundle/ChillMainBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillMainBundle/translations/messages.fr.yml @@ -564,6 +564,7 @@ export: _as_string: Adresse formattée confidential: Adresse confidentielle ? isNoAddress: Adresse incomplète ? + steps: Escaliers _lat: Latitude _lon: Longitude diff --git a/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeCronjob.php b/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeCronjob.php new file mode 100644 index 000000000..f637e70b9 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeCronjob.php @@ -0,0 +1,46 @@ +clock->now(); + + if (null !== $cronJobExecution && $now->sub(new \DateInterval('P1D')) < $cronJobExecution->getLastStart()) { + return false; + } + + return in_array((int) $now->format('H'), [1, 2, 3, 4, 5, 6], true); + } + + public function getKey(): string + { + return 'accompanying-period-step-change'; + } + + public function run(): void + { + ($this->requestor)(); + } +} diff --git a/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeMessageHandler.php b/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeMessageHandler.php new file mode 100644 index 000000000..881b3999a --- /dev/null +++ b/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeMessageHandler.php @@ -0,0 +1,38 @@ +accompanyingPeriodRepository->find($message->getPeriodId())) { + throw new \RuntimeException(self::LOG_PREFIX . 'Could not find period with this id: '. $message->getPeriodId()); + } + + ($this->changer)($period, $message->getTransition()); + } + +} diff --git a/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeRequestMessage.php b/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeRequestMessage.php new file mode 100644 index 000000000..457e78d35 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeRequestMessage.php @@ -0,0 +1,47 @@ +periodId = $period; + } else { + if (null !== $id = $period->getId()) { + $this->periodId = $id; + } + + throw new \LogicException("This AccompanyingPeriod does not have and id yet"); + } + } + + public function getPeriodId(): int + { + return $this->periodId; + } + + public function getTransition(): string + { + return $this->transition; + } +} diff --git a/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeRequestor.php b/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeRequestor.php new file mode 100644 index 000000000..3d4979608 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeRequestor.php @@ -0,0 +1,88 @@ +get('chill_person')['accompanying_period_lifecycle_delays']; + $this->isMarkInactive = $config['mark_inactive']; + $this->intervalForShortInactive = new \DateInterval($config['mark_inactive_short_after']); + $this->intervalForLongInactive = new \DateInterval($config['mark_inactive_long_after']); + } + + public function __invoke(): void + { + if (!$this->isMarkInactive) { + return; + } + + // get the oldest ones first + foreach ( + $olders = $this->accompanyingPeriodInfoRepository->findAccompanyingPeriodIdInactiveAfter( + $this->intervalForLongInactive, + [AccompanyingPeriod::STEP_CONFIRMED, AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_SHORT] + ) as $accompanyingPeriodId + ) { + $this->logger->debug('request mark period as inactive_short', ['period' => $accompanyingPeriodId]); + $this->messageBus->dispatch(new AccompanyingPeriodStepChangeRequestMessage($accompanyingPeriodId, 'mark_inactive_long')); + } + + // the newest + foreach ( + $this->accompanyingPeriodInfoRepository->findAccompanyingPeriodIdInactiveAfter( + $this->intervalForShortInactive, + [AccompanyingPeriod::STEP_CONFIRMED] + ) as $accompanyingPeriodId + ) { + if (in_array($accompanyingPeriodId, $olders, true)) { + continue; + } + + $this->logger->debug('request mark period as inactive_long', ['period' => $accompanyingPeriodId]); + $this->messageBus->dispatch(new AccompanyingPeriodStepChangeRequestMessage($accompanyingPeriodId, 'mark_inactive_short')); + } + + // a new event has been created => remove inactive long, or short + foreach ( + $this->accompanyingPeriodInfoRepository->findAccompanyingPeriodIdActiveSince( + $this->intervalForShortInactive, + [AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_SHORT, AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_LONG] + ) as $accompanyingPeriodId + ) { + $this->logger->debug('request mark period as active', ['period' => $accompanyingPeriodId]); + $this->messageBus->dispatch(new AccompanyingPeriodStepChangeRequestMessage($accompanyingPeriodId, 'mark_active')); + } + } + +} diff --git a/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChanger.php b/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChanger.php new file mode 100644 index 000000000..05dfee6db --- /dev/null +++ b/src/Bundle/ChillPersonBundle/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChanger.php @@ -0,0 +1,58 @@ +workflowRegistry->get($period, $workflowName); + + if (!$workflow->can($period, $transition)) { + $this->logger->info(self::LOG_PREFIX . 'not able to apply the transition on period', [ + 'period_id' => $period->getId(), + 'transition' => $transition + ]); + + return; + } + + $workflow->apply($period, $transition); + + $this->entityManager->flush(); + + $this->logger->info(self::LOG_PREFIX . 'could apply a transition', [ + 'period_id' => $period->getId(), + 'transition' => $transition + ]); + } +} diff --git a/src/Bundle/ChillPersonBundle/ChillPersonBundle.php b/src/Bundle/ChillPersonBundle/ChillPersonBundle.php index d5ade1de0..4233a7914 100644 --- a/src/Bundle/ChillPersonBundle/ChillPersonBundle.php +++ b/src/Bundle/ChillPersonBundle/ChillPersonBundle.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\PersonBundle; use Chill\PersonBundle\DependencyInjection\CompilerPass\AccompanyingPeriodTimelineCompilerPass; +use Chill\PersonBundle\Service\EntityInfo\AccompanyingPeriodInfoUnionQueryPartInterface; use Chill\PersonBundle\Widget\PersonListWidgetFactory; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; @@ -26,5 +27,7 @@ class ChillPersonBundle extends Bundle ->addWidgetFactory(new PersonListWidgetFactory()); $container->addCompilerPass(new AccompanyingPeriodTimelineCompilerPass()); + $container->registerForAutoconfiguration(AccompanyingPeriodInfoUnionQueryPartInterface::class) + ->addTag('chill_person.accompanying_period_info_part'); } } diff --git a/src/Bundle/ChillPersonBundle/Command/ImportSocialWorkMetadata.php b/src/Bundle/ChillPersonBundle/Command/ImportSocialWorkMetadata.php index 91615935c..8085732ba 100644 --- a/src/Bundle/ChillPersonBundle/Command/ImportSocialWorkMetadata.php +++ b/src/Bundle/ChillPersonBundle/Command/ImportSocialWorkMetadata.php @@ -42,10 +42,18 @@ final class ImportSocialWorkMetadata extends Command protected function configure() { + $description = 'Imports a structured table containing social issues, social actions, objectives, results and evaluations.'; + $help = 'File to csv format, no headers, semi-colon as delimiter, datas sorted by alphabetical order, column after column.'. PHP_EOL + . 'Columns are: social issues parent, social issues child, social actions parent, social actions child, goals, results, evaluations.'. PHP_EOL + . PHP_EOL + . 'See social_work_metadata.csv as example.'. PHP_EOL; + $this ->setName('chill:person:import-socialwork') ->addOption('filepath', 'f', InputOption::VALUE_REQUIRED, 'The file to import.') - ->addOption('language', 'l', InputOption::VALUE_OPTIONAL, 'The default language'); + ->addOption('language', 'l', InputOption::VALUE_OPTIONAL, 'The default language') + ->setDescription($description) + ->setHelp($help); } protected function execute(InputInterface $input, OutputInterface $output) diff --git a/src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseApiController.php b/src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseApiController.php index 70ea1d3c5..181f60a02 100644 --- a/src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseApiController.php +++ b/src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseApiController.php @@ -169,9 +169,7 @@ final class AccompanyingCourseApiController extends ApiController $accompanyingPeriods = $person->getCurrentAccompanyingPeriods(); $accompanyingPeriodsChecked = array_filter( $accompanyingPeriods, - function (AccompanyingPeriod $period) { - return $this->isGranted(AccompanyingPeriodVoter::SEE, $period); - } + fn (AccompanyingPeriod $period) => $this->isGranted(AccompanyingPeriodVoter::SEE, $period) ); return $this->json(array_values($accompanyingPeriodsChecked), Response::HTTP_OK, [], ['groups' => ['read']]); diff --git a/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodController.php b/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodController.php index e9e27f9c9..b32454387 100644 --- a/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodController.php +++ b/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodController.php @@ -222,14 +222,10 @@ class AccompanyingPeriodController extends AbstractController $accompanyingPeriodsRaw = $this->accompanyingPeriodACLAwareRepository ->findByPerson($person, AccompanyingPeriodVoter::SEE); - usort($accompanyingPeriodsRaw, static function ($a, $b) { - return $b->getOpeningDate() > $a->getOpeningDate(); - }); + usort($accompanyingPeriodsRaw, static fn ($a, $b) => $b->getOpeningDate() > $a->getOpeningDate()); // filter visible or not visible - $accompanyingPeriods = array_filter($accompanyingPeriodsRaw, function (AccompanyingPeriod $ap) { - return $this->isGranted(AccompanyingPeriodVoter::SEE, $ap); - }); + $accompanyingPeriods = array_filter($accompanyingPeriodsRaw, fn (AccompanyingPeriod $ap) => $this->isGranted(AccompanyingPeriodVoter::SEE, $ap)); return $this->render('@ChillPerson/AccompanyingPeriod/list.html.twig', [ 'accompanying_periods' => $accompanyingPeriods, @@ -331,9 +327,7 @@ class AccompanyingPeriodController extends AbstractController /** @var AccompanyingPeriod $period */ $period = array_filter( $person->getAccompanyingPeriods(), - static function (AccompanyingPeriod $p) use ($period_id) { - return $p->getId() === ($period_id); - } + static fn (AccompanyingPeriod $p) => $p->getId() === ($period_id) )[0] ?? null; if (null === $period) { diff --git a/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodRegulationListController.php b/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodRegulationListController.php index a91b0f5ff..6bbb6c368 100644 --- a/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodRegulationListController.php +++ b/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodRegulationListController.php @@ -105,12 +105,8 @@ class AccompanyingPeriodRegulationListController $builder ->add('services', EntityType::class, [ 'class' => Scope::class, - 'query_builder' => static function (EntityRepository $er) { - return $er->createQueryBuilder('s'); - }, - 'choice_label' => function (Scope $s) { - return $this->translatableStringHelper->localize($s->getName()); - }, + 'query_builder' => static fn (EntityRepository $er) => $er->createQueryBuilder('s'), + 'choice_label' => fn (Scope $s) => $this->translatableStringHelper->localize($s->getName()), 'multiple' => true, 'label' => 'Service', 'required' => false, @@ -123,9 +119,7 @@ class AccompanyingPeriodRegulationListController return $qb; }, - 'choice_label' => function (UserJob $j) { - return $this->translatableStringHelper->localize($j->getLabel()); - }, + 'choice_label' => fn (UserJob $j) => $this->translatableStringHelper->localize($j->getLabel()), 'multiple' => true, 'label' => 'Métier', 'required' => false, @@ -147,9 +141,7 @@ class AccompanyingPeriodRegulationListController return $qb; }, - 'choice_label' => static function (Location $l) { - return $l->getName(); - }, + 'choice_label' => static fn (Location $l) => $l->getName(), 'multiple' => true, 'group_by' => function (Location $l) { if (null === $type = $l->getLocationType()) { diff --git a/src/Bundle/ChillPersonBundle/Controller/HouseholdCompositionController.php b/src/Bundle/ChillPersonBundle/Controller/HouseholdCompositionController.php index 43d35934b..61e030322 100644 --- a/src/Bundle/ChillPersonBundle/Controller/HouseholdCompositionController.php +++ b/src/Bundle/ChillPersonBundle/Controller/HouseholdCompositionController.php @@ -164,9 +164,7 @@ class HouseholdCompositionController extends AbstractController $isEdit = $request->query->has('edit'); if ($isEdit) { - $householdCompositions = $household->getCompositions()->filter(static function (HouseholdComposition $composition) use ($request) { - return $composition->getId() === $request->query->getInt('edit'); - }); + $householdCompositions = $household->getCompositions()->filter(static fn (HouseholdComposition $composition) => $composition->getId() === $request->query->getInt('edit')); if ($householdCompositions->count() !== 1) { throw new BadRequestHttpException('could not find the composition with this id associated to the household'); diff --git a/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php b/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php index 7b9eb0084..42092249b 100644 --- a/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php +++ b/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php @@ -81,9 +81,7 @@ class HouseholdController extends AbstractController } } - usort($accompanyingPeriods, static function ($a, $b) { - return $b->getOpeningDate() <=> $a->getOpeningDate(); - }); + usort($accompanyingPeriods, static fn ($a, $b) => $b->getOpeningDate() <=> $a->getOpeningDate()); $oldMembers = $household->getNonCurrentMembers(); $accompanyingPeriodsOld = []; diff --git a/src/Bundle/ChillPersonBundle/Controller/PersonApiController.php b/src/Bundle/ChillPersonBundle/Controller/PersonApiController.php index bf0d998ff..505f307e6 100644 --- a/src/Bundle/ChillPersonBundle/Controller/PersonApiController.php +++ b/src/Bundle/ChillPersonBundle/Controller/PersonApiController.php @@ -108,14 +108,10 @@ class PersonApiController extends ApiController $addresses = $person ->getAccompanyingPeriodParticipations() ->filter( - static function (AccompanyingPeriodParticipation $accompanyingPeriodParticipation): bool { - return null !== $accompanyingPeriodParticipation->getAccompanyingPeriod()->getAddressLocation(); - } + static fn (AccompanyingPeriodParticipation $accompanyingPeriodParticipation): bool => null !== $accompanyingPeriodParticipation->getAccompanyingPeriod()->getAddressLocation() ) ->map( - static function (AccompanyingPeriodParticipation $accompanyingPeriodParticipation): ?Address { - return $accompanyingPeriodParticipation->getAccompanyingPeriod()->getAddressLocation(); - } + static fn (AccompanyingPeriodParticipation $accompanyingPeriodParticipation): ?Address => $accompanyingPeriodParticipation->getAccompanyingPeriod()->getAddressLocation() ) ->filter( // We remove potential null addresses. diff --git a/src/Bundle/ChillPersonBundle/Controller/PersonController.php b/src/Bundle/ChillPersonBundle/Controller/PersonController.php index ae12c566d..2d4732289 100644 --- a/src/Bundle/ChillPersonBundle/Controller/PersonController.php +++ b/src/Bundle/ChillPersonBundle/Controller/PersonController.php @@ -165,7 +165,7 @@ final class PersonController extends AbstractController $cFGroup = null; $cFDefaultGroup = $this->em->getRepository(\Chill\CustomFieldsBundle\Entity\CustomFieldsDefaultGroup::class) - ->findOneByEntity('Chill\\PersonBundle\\Entity\\Person'); + ->findOneByEntity(\Chill\PersonBundle\Entity\Person::class); if ($cFDefaultGroup) { $cFGroup = $cFDefaultGroup->getCustomFieldsGroup(); diff --git a/src/Bundle/ChillPersonBundle/Controller/ReassignAccompanyingPeriodController.php b/src/Bundle/ChillPersonBundle/Controller/ReassignAccompanyingPeriodController.php index 5b2de9f65..bafc4b1cb 100644 --- a/src/Bundle/ChillPersonBundle/Controller/ReassignAccompanyingPeriodController.php +++ b/src/Bundle/ChillPersonBundle/Controller/ReassignAccompanyingPeriodController.php @@ -120,7 +120,7 @@ class ReassignAccompanyingPeriodController extends AbstractController $assignForm->handleRequest($request); if ($assignForm->isSubmitted() && $assignForm->isValid()) { - $assignPeriodIds = json_decode($assignForm->get('periods')->getData(), true); + $assignPeriodIds = json_decode($assignForm->get('periods')->getData(), true, 512, JSON_THROW_ON_ERROR); $userTo = $assignForm->get('userTo')->getData(); $userFrom = $assignForm->get('userFrom')->getData(); @@ -179,7 +179,7 @@ class ReassignAccompanyingPeriodController extends AbstractController { $defaultData = [ 'userFrom' => $userFrom, - 'periods' => json_encode($periodIds), + 'periods' => json_encode($periodIds, JSON_THROW_ON_ERROR), ]; $builder = $this->formFactory->createNamedBuilder('reassign', FormType::class, $defaultData); diff --git a/src/Bundle/ChillPersonBundle/Controller/SocialWorkSocialActionApiController.php b/src/Bundle/ChillPersonBundle/Controller/SocialWorkSocialActionApiController.php index 3ae5c5b7c..4fe877a72 100644 --- a/src/Bundle/ChillPersonBundle/Controller/SocialWorkSocialActionApiController.php +++ b/src/Bundle/ChillPersonBundle/Controller/SocialWorkSocialActionApiController.php @@ -44,9 +44,7 @@ class SocialWorkSocialActionApiController extends ApiController $socialActions = $socialIssue->getRecursiveSocialActions()->toArray(); - usort($socialActions, static function (SocialAction $sa, SocialAction $sb) { - return $sa->getOrdering() <=> $sb->getOrdering(); - }); + usort($socialActions, static fn (SocialAction $sa, SocialAction $sb) => $sa->getOrdering() <=> $sb->getOrdering()); $pagination = $this->paginator->create(count($socialActions)); // max one page diff --git a/src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadCustomFields.php b/src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadCustomFields.php index 14434be6e..78180adff 100644 --- a/src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadCustomFields.php +++ b/src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadCustomFields.php @@ -115,9 +115,7 @@ class LoadCustomFields extends AbstractFixture implements // get possible values for cfGroup $choices = array_map( - static function ($a) { - return $a['slug']; - }, + static fn ($a) => $a['slug'], $this->customFieldChoice->getOptions()['choices'] ); // create faker @@ -125,12 +123,12 @@ class LoadCustomFields extends AbstractFixture implements // select a set of people and add data foreach ($personIds as $id) { // add info on 1 person on 2 - if (mt_rand(0, 1) === 1) { + if (random_int(0, 1) === 1) { /** @var Person $person */ $person = $manager->getRepository(Person::class)->find($id); $person->setCFData([ 'remarques' => $this->createCustomFieldText() - ->serialize($faker->text(mt_rand(150, 250)), $this->customFieldText), + ->serialize($faker->text(random_int(150, 250)), $this->customFieldText), 'document-d-identite' => $this->createCustomFieldChoice() ->serialize([$choices[array_rand($choices)]], $this->customFieldChoice), ]); diff --git a/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php b/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php index d60e15e41..569dd1502 100644 --- a/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php +++ b/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php @@ -15,6 +15,7 @@ use Chill\MainBundle\DependencyInjection\MissingBundleException; use Chill\MainBundle\Security\Authorization\ChillExportVoter; use Chill\PersonBundle\Controller\HouseholdCompositionTypeApiController; use Chill\PersonBundle\Doctrine\DQL\AddressPart; +use Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodCommentVoter; use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodResourceVoter; use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodVoter; @@ -1006,22 +1007,46 @@ class ChillPersonExtension extends Extension implements PrependExtensionInterfac 'property' => 'step', ], 'supports' => [ - 'Chill\PersonBundle\Entity\AccompanyingPeriod', + \Chill\PersonBundle\Entity\AccompanyingPeriod::class, ], 'initial_marking' => 'DRAFT', 'places' => [ - 'DRAFT', - 'CONFIRMED', - 'CLOSED', + AccompanyingPeriod::STEP_DRAFT, + AccompanyingPeriod::STEP_CONFIRMED, + AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_SHORT, + AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_LONG, + AccompanyingPeriod::STEP_CLOSED, ], 'transitions' => [ 'confirm' => [ - 'from' => 'DRAFT', - 'to' => 'CONFIRMED', + 'from' => AccompanyingPeriod::STEP_DRAFT, + 'to' => AccompanyingPeriod::STEP_CONFIRMED, + ], + 'mark_inactive_short' => [ + 'from' => AccompanyingPeriod::STEP_CONFIRMED, + 'to' => AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_SHORT, + ], + 'mark_inactive_long' => [ + 'from' => [ + AccompanyingPeriod::STEP_CONFIRMED, + AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_SHORT + ], + 'to' => AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_LONG, + ], + 'mark_active' => [ + 'from' => [ + AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_LONG, + AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_SHORT, + ], + 'to' => AccompanyingPeriod::STEP_CONFIRMED ], 'close' => [ - 'from' => 'CONFIRMED', - 'to' => 'CLOSED', + 'from' => [ + AccompanyingPeriod::STEP_CONFIRMED, + AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_SHORT, + AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_LONG, + ], + 'to' => AccompanyingPeriod::STEP_CLOSED, ], ], ], @@ -1043,7 +1068,7 @@ class ChillPersonExtension extends Extension implements PrependExtensionInterfac $container->prependExtensionConfig( 'chill_custom_fields', ['customizables_entities' => [ - ['class' => 'Chill\PersonBundle\Entity\Person', 'name' => 'PersonEntity'], + ['class' => \Chill\PersonBundle\Entity\Person::class, 'name' => 'PersonEntity'], ], ] ); diff --git a/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php index f9686c900..64ca07066 100644 --- a/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php @@ -30,7 +30,7 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('cl_chill_person'); - $rootNode = $treeBuilder->getRootNode('cl_chill_person'); + $rootNode = $treeBuilder->getRootNode(); $rootNode ->canBeDisabled() @@ -128,6 +128,15 @@ class Configuration implements ConfigurationInterface ->info('Can we have more than one simultaneous accompanying period in the same time. Default false.') ->defaultValue(false) ->end() + ->arrayNode('accompanying_period_lifecycle_delays') + ->addDefaultsIfNotSet() + ->info('Delays before marking an accompanying period as inactive') + ->children() + ->booleanNode('mark_inactive')->defaultTrue()->end() + ->scalarNode('mark_inactive_short_after')->defaultValue('P6M')->end() + ->scalarNode('mark_inactive_long_after')->defaultValue('P2Y')->end() + ->end() + ->end() // end of 'accompanying_period_lifecycle_delays ->end() // children of 'root', parent = root ; @@ -137,7 +146,7 @@ class Configuration implements ConfigurationInterface private function addFieldNode($key) { $tree = new TreeBuilder($key, 'enum'); - $node = $tree->getRootNode($key); + $node = $tree->getRootNode(); switch ($key) { case 'accompanying_period': diff --git a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php index 510e1c327..a8e191df3 100644 --- a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php +++ b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php @@ -109,6 +109,24 @@ class AccompanyingPeriod implements */ public const STEP_CONFIRMED = 'CONFIRMED'; + /** + * Mark an accompanying period as confirmed, but inactive + * + * this means that the accompanying period **is** + * confirmed, but no activity (Activity, AccompanyingPeriod, ...) + * has been associated, or updated, within this accompanying period. + */ + public const STEP_CONFIRMED_INACTIVE_SHORT = 'CONFIRMED_INACTIVE_SHORT'; + + /** + * Mark an accompanying period as confirmed, but inactive + * + * this means that the accompanying period **is** + * confirmed, but no activity (Activity, AccompanyingPeriod, ...) + * has been associated, or updated, within this accompanying period. + */ + public const STEP_CONFIRMED_INACTIVE_LONG = 'CONFIRMED_INACTIVE_LONG'; + /** * Mark an accompanying period as "draft". * @@ -340,6 +358,7 @@ class AccompanyingPeriod implements /** * @ORM\Column(type="string", length=32, nullable=true) * @Groups({"read"}) + * @var AccompanyingPeriod::STEP_* */ private string $step = self::STEP_DRAFT; @@ -712,11 +731,9 @@ class AccompanyingPeriod implements if ($this->getStep() === self::STEP_DRAFT) { return [[self::STEP_DRAFT]]; } - - if ($this->getStep() === self::STEP_CONFIRMED) { + if (str_starts_with($this->getStep(), 'CONFIRM')) { return [[self::STEP_DRAFT, self::STEP_CONFIRMED]]; } - if ($this->getStep() === self::STEP_CLOSED) { return [[self::STEP_DRAFT, self::STEP_CONFIRMED, self::STEP_CLOSED]]; } @@ -828,9 +845,7 @@ class AccompanyingPeriod implements $collection = $this ->getParticipationsContainsPerson($person) ->filter( - static function (AccompanyingPeriodParticipation $participation): bool { - return null === $participation->getEndDate(); - } + static fn (AccompanyingPeriodParticipation $participation): bool => null === $participation->getEndDate() ); return $collection->count() > 0 ? $collection->first() : null; @@ -844,9 +859,7 @@ class AccompanyingPeriod implements return $this ->getParticipations() ->filter( - static function (AccompanyingPeriodParticipation $participation): bool { - return null === $participation->getEndDate(); - } + static fn (AccompanyingPeriodParticipation $participation): bool => null === $participation->getEndDate() ); } diff --git a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodInfo.php b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodInfo.php new file mode 100644 index 000000000..795247eda --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodInfo.php @@ -0,0 +1,79 @@ +getAddresses()->filter(static function (Address $a) use ($at) { - return $a->getValidFrom() <= $at && ( - null === $a->getValidTo() || $a->getValidTo() > $at - ); - }); + $addrs = $this->getAddresses()->filter(static fn (Address $a) => $a->getValidFrom() <= $at && ( + null === $a->getValidTo() || $a->getValidTo() > $at + )); if ($addrs->count() > 0) { return $addrs->first(); @@ -338,9 +336,7 @@ class Household public function getCurrentPersons(?DateTimeImmutable $now = null): ReadableCollection { return $this->getCurrentMembers($now) - ->map(static function (HouseholdMember $m) { - return $m->getPerson(); - }); + ->map(static fn (HouseholdMember $m) => $m->getPerson()); } public function getId(): ?int @@ -367,9 +363,7 @@ class Household $membership->getStartDate(), $membership->getEndDate() )->filter( - static function (HouseholdMember $m) use ($membership) { - return $m->getPerson() !== $membership->getPerson(); - } + static fn (HouseholdMember $m) => $m->getPerson() !== $membership->getPerson() ); } @@ -412,7 +406,7 @@ class Household { $criteria = new Criteria(); $expr = Criteria::expr(); - $date = null === $now ? (new DateTimeImmutable('today')) : $now; + $date = $now ?? new DateTimeImmutable('today'); $criteria ->where( @@ -508,9 +502,7 @@ class Household usort( $compositionOrdered, - static function (HouseholdComposition $a, HouseholdComposition $b) { - return $a->getStartDate() <=> $b->getStartDate(); - } + static fn (HouseholdComposition $a, HouseholdComposition $b) => $a->getStartDate() <=> $b->getStartDate() ); $iterator = new ArrayIterator($compositionOrdered); @@ -634,7 +626,7 @@ class Household { $criteria = new Criteria(); $expr = Criteria::expr(); - $date = null === $now ? (new DateTimeImmutable('today')) : $now; + $date = $now ?? new DateTimeImmutable('today'); $criteria ->where($expr->orX( diff --git a/src/Bundle/ChillPersonBundle/Entity/Household/HouseholdMember.php b/src/Bundle/ChillPersonBundle/Entity/Household/HouseholdMember.php index e5e5e4626..fad3b213a 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Household/HouseholdMember.php +++ b/src/Bundle/ChillPersonBundle/Entity/Household/HouseholdMember.php @@ -142,7 +142,7 @@ class HouseholdMember public function isCurrent(?DateTimeImmutable $at = null): bool { - $at = null === $at ? new DateTimeImmutable('now') : $at; + $at ??= new DateTimeImmutable('now'); return $this->getStartDate() < $at && ( null === $this->getEndDate() || $this->getEndDate() > $at diff --git a/src/Bundle/ChillPersonBundle/Entity/Person.php b/src/Bundle/ChillPersonBundle/Entity/Person.php index 27c34ba23..af8e7f92b 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person.php @@ -775,9 +775,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI ): int { // TODO should be optimized to avoid loading accompanying period ? return $this->getAccompanyingPeriodInvolved($asParticipantOpen, $asRequestor) - ->filter(function (AccompanyingPeriod $p) { - return $p->getStep() !== AccompanyingPeriod::STEP_DRAFT; - }) + ->filter(fn (AccompanyingPeriod $p) => $p->getStep() !== AccompanyingPeriod::STEP_DRAFT) ->count(); } @@ -1087,7 +1085,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI { $criteria = new Criteria(); $expr = Criteria::expr(); - $date = null === $at ? new DateTimeImmutable('today') : $at; + $date = $at ?? new DateTimeImmutable('today'); $datef = $date->format('Y-m-d'); if ( @@ -1341,9 +1339,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI return $this->getAccompanyingPeriodParticipations() ->matching($criteria) - ->filter(static function (AccompanyingPeriodParticipation $app) { - return AccompanyingPeriod::STEP_CLOSED !== $app->getAccompanyingPeriod()->getStep(); - }); + ->filter(static fn (AccompanyingPeriodParticipation $app) => AccompanyingPeriod::STEP_CLOSED !== $app->getAccompanyingPeriod()->getStep()); } public function getOtherPhoneNumbers(): Collection diff --git a/src/Bundle/ChillPersonBundle/Entity/Person/PersonCurrentAddress.php b/src/Bundle/ChillPersonBundle/Entity/Person/PersonCurrentAddress.php index d95f4c7c8..52d6a34af 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person/PersonCurrentAddress.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person/PersonCurrentAddress.php @@ -50,7 +50,7 @@ class PersonCurrentAddress /** * @ORM\Column(name="valid_to", type="date_immutable") */ - protected ?DateTimeImmutable $validTo; + protected ?DateTimeImmutable $validTo = null; public function getAddress(): Address { diff --git a/src/Bundle/ChillPersonBundle/Entity/Person/PersonResource.php b/src/Bundle/ChillPersonBundle/Entity/Person/PersonResource.php index 576380476..a4b6cf085 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person/PersonResource.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person/PersonResource.php @@ -55,7 +55,7 @@ class PersonResource implements TrackCreationInterface, TrackUpdateInterface * @ORM\Column(type="integer") * @Groups({"read", "docgen:read"}) */ - private ?int $id; + private ?int $id = null; /** * @ORM\ManyToOne(targetEntity=PersonResourceKind::class, inversedBy="personResources") diff --git a/src/Bundle/ChillPersonBundle/Entity/PersonPhone.php b/src/Bundle/ChillPersonBundle/Entity/PersonPhone.php index 5013ac9b7..068260b45 100644 --- a/src/Bundle/ChillPersonBundle/Entity/PersonPhone.php +++ b/src/Bundle/ChillPersonBundle/Entity/PersonPhone.php @@ -41,7 +41,7 @@ class PersonPhone * @ORM\Column(name="id", type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ - private ?int $id; + private ?int $id = null; /** * @ORM\ManyToOne( @@ -59,7 +59,7 @@ class PersonPhone /** * @ORM\Column(type="text", length=40, nullable=true) */ - private ?string $type; + private ?string $type = null; public function __construct() { diff --git a/src/Bundle/ChillPersonBundle/Entity/SocialWork/Result.php b/src/Bundle/ChillPersonBundle/Entity/SocialWork/Result.php index 823f31426..f65192a04 100644 --- a/src/Bundle/ChillPersonBundle/Entity/SocialWork/Result.php +++ b/src/Bundle/ChillPersonBundle/Entity/SocialWork/Result.php @@ -45,7 +45,7 @@ class Result /** * @ORM\Column(type="datetime", nullable=true) */ - private ?DateTime $desactivationDate; + private ?DateTime $desactivationDate = null; /** * @ORM\ManyToMany(targetEntity=Goal::class, mappedBy="results") diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/GeographicalUnitStatAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/GeographicalUnitStatAggregator.php index 6f10dbaa7..d001cbef7 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/GeographicalUnitStatAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/GeographicalUnitStatAggregator.php @@ -128,9 +128,7 @@ final class GeographicalUnitStatAggregator implements AggregatorInterface 'placeholder' => 'Select a geographical layer', 'class' => GeographicalUnitLayer::class, 'choices' => $this->geographicalUnitLayerRepository->findAllHavingUnits(), - 'choice_label' => function (GeographicalUnitLayer $item) { - return $this->translatableStringHelper->localize($item->getName()); - }, + 'choice_label' => fn (GeographicalUnitLayer $item) => $this->translatableStringHelper->localize($item->getName()), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/StepAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/StepAggregator.php index 84dbd4e69..85cfc3190 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/StepAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/StepAggregator.php @@ -86,13 +86,19 @@ final class StepAggregator implements AggregatorInterface return function ($value): string { switch ($value) { case AccompanyingPeriod::STEP_DRAFT: - return $this->translator->trans('Draft'); + return $this->translator->trans('course.draft'); case AccompanyingPeriod::STEP_CONFIRMED: - return $this->translator->trans('Confirmed'); + return $this->translator->trans('course.confirmed'); case AccompanyingPeriod::STEP_CLOSED: - return $this->translator->trans('Closed'); + return $this->translator->trans('course.closed'); + + case AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_SHORT: + return $this->translator->trans('course.inactive_short'); + + case AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_LONG: + return $this->translator->trans('course.inactive_long'); case '_header': return 'Step'; diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/CountryOfBirthAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/CountryOfBirthAggregator.php index 395070a8a..3d785b586 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/CountryOfBirthAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/CountryOfBirthAggregator.php @@ -147,9 +147,7 @@ final class CountryOfBirthAggregator implements AggregatorInterface, ExportEleme ]; } - return static function (string $value) use ($labels): string { - return $labels[$value]; - }; + return static fn (string $value): string => $labels[$value]; } public function getQueryKeys($data) diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/GeographicalUnitAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/GeographicalUnitAggregator.php index 9d34edfca..5d73c1fdd 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/GeographicalUnitAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/GeographicalUnitAggregator.php @@ -100,9 +100,7 @@ class GeographicalUnitAggregator implements AggregatorInterface 'placeholder' => 'Select a geographical layer', 'class' => GeographicalUnitLayer::class, 'choices' => $this->geographicalUnitLayerRepository->findAllHavingUnits(), - 'choice_label' => function (GeographicalUnitLayer $item) { - return $this->translatableStringHelper->localize($item->getName()); - }, + 'choice_label' => fn (GeographicalUnitLayer $item) => $this->translatableStringHelper->localize($item->getName()), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/NationalityAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/NationalityAggregator.php index 1eced58d3..d7c4097af 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/NationalityAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/NationalityAggregator.php @@ -141,9 +141,7 @@ final class NationalityAggregator implements AggregatorInterface, ExportElementV ]; } - return static function ($value) use ($labels): string { - return $labels[$value]; - }; + return static fn ($value): string => $labels[$value]; } public function getQueryKeys($data) diff --git a/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingCourse.php b/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingCourse.php index a9f794888..978f88a10 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingCourse.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingCourse.php @@ -64,9 +64,7 @@ class CountAccompanyingCourse implements ExportInterface, GroupedExportInterface $labels = array_combine($values, $values); $labels['_header'] = $this->getTitle(); - return static function ($value) use ($labels) { - return $labels[$value]; - }; + return static fn ($value) => $labels[$value]; } public function getQueryKeys($data): array @@ -91,9 +89,7 @@ class CountAccompanyingCourse implements ExportInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []): QueryBuilder { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->repository->createQueryBuilder('acp'); diff --git a/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWork.php b/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWork.php index 40253ea0b..122ee14d9 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWork.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWork.php @@ -63,9 +63,7 @@ class CountAccompanyingPeriodWork implements ExportInterface, GroupedExportInter $labels = array_combine($values, $values); $labels['_header'] = $this->getTitle(); - return static function ($value) use ($labels) { - return $labels[$value]; - }; + return static fn ($value) => $labels[$value]; } public function getQueryKeys($data): array @@ -90,9 +88,7 @@ class CountAccompanyingPeriodWork implements ExportInterface, GroupedExportInter public function initiateQuery(array $requiredModifiers, array $acl, array $data = []): QueryBuilder { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->em->createQueryBuilder(); diff --git a/src/Bundle/ChillPersonBundle/Export/Export/CountEvaluation.php b/src/Bundle/ChillPersonBundle/Export/Export/CountEvaluation.php index 578cc1452..1613b63d3 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/CountEvaluation.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/CountEvaluation.php @@ -62,9 +62,7 @@ class CountEvaluation implements ExportInterface, GroupedExportInterface $labels = array_combine($values, $values); $labels['_header'] = $this->getTitle(); - return static function ($value) use ($labels) { - return $labels[$value]; - }; + return static fn ($value) => $labels[$value]; } public function getQueryKeys($data): array @@ -89,9 +87,7 @@ class CountEvaluation implements ExportInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->entityManager->createQueryBuilder(); diff --git a/src/Bundle/ChillPersonBundle/Export/Export/CountHousehold.php b/src/Bundle/ChillPersonBundle/Export/Export/CountHousehold.php index f1eaeb4cb..0b693b9d8 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/CountHousehold.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/CountHousehold.php @@ -113,9 +113,7 @@ class CountHousehold implements ExportInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->entityManager->createQueryBuilder(); diff --git a/src/Bundle/ChillPersonBundle/Export/Export/CountPerson.php b/src/Bundle/ChillPersonBundle/Export/Export/CountPerson.php index 07a307563..60429ae55 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/CountPerson.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/CountPerson.php @@ -62,9 +62,7 @@ class CountPerson implements ExportInterface, GroupedExportInterface $labels = array_combine($values, $values); $labels['_header'] = $this->getTitle(); - return static function ($value) use ($labels) { - return $labels[$value]; - }; + return static fn ($value) => $labels[$value]; } public function getQueryKeys($data) @@ -94,9 +92,7 @@ class CountPerson implements ExportInterface, GroupedExportInterface */ public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->personRepository->createQueryBuilder('person'); diff --git a/src/Bundle/ChillPersonBundle/Export/Export/CountPersonWithAccompanyingCourse.php b/src/Bundle/ChillPersonBundle/Export/Export/CountPersonWithAccompanyingCourse.php index 7acbd09cf..e52cc83b1 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/CountPersonWithAccompanyingCourse.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/CountPersonWithAccompanyingCourse.php @@ -64,9 +64,7 @@ class CountPersonWithAccompanyingCourse implements ExportInterface, GroupedExpor $labels = array_combine($values, $values); $labels['_header'] = $this->getTitle(); - return static function ($value) use ($labels) { - return $labels[$value]; - }; + return static fn ($value) => $labels[$value]; } public function getQueryKeys($data): array @@ -91,9 +89,7 @@ class CountPersonWithAccompanyingCourse implements ExportInterface, GroupedExpor public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->repository->createQueryBuilder('acp'); diff --git a/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriod.php b/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriod.php index 8c96906fc..0647460dd 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriod.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriod.php @@ -41,6 +41,7 @@ use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Contracts\Translation\TranslatorInterface; use function strlen; class ListAccompanyingPeriod implements ListInterface, GroupedExportInterface @@ -100,6 +101,8 @@ class ListAccompanyingPeriod implements ListInterface, GroupedExportInterface private TranslatableStringHelperInterface $translatableStringHelper; + private TranslatorInterface $translator; + private UserHelper $userHelper; public function __construct( @@ -113,6 +116,7 @@ class ListAccompanyingPeriod implements ListInterface, GroupedExportInterface SocialIssueRepository $socialIssueRepository, SocialIssueRender $socialIssueRender, TranslatableStringHelperInterface $translatableStringHelper, + TranslatorInterface $translator, RollingDateConverterInterface $rollingDateConverter, UserHelper $userHelper ) { @@ -126,6 +130,7 @@ class ListAccompanyingPeriod implements ListInterface, GroupedExportInterface $this->thirdPartyRender = $thirdPartyRender; $this->thirdPartyRepository = $thirdPartyRepository; $this->translatableStringHelper = $translatableStringHelper; + $this->translator = $translator; $this->rollingDateConverter = $rollingDateConverter; $this->userHelper = $userHelper; } @@ -182,7 +187,7 @@ class ListAccompanyingPeriod implements ListInterface, GroupedExportInterface return ''; } - return $this->translatableStringHelper->localize(json_decode($value, true)); + return $this->translatableStringHelper->localize(json_decode($value, true, 512, JSON_THROW_ON_ERROR)); }; case 'locationPersonName': @@ -226,7 +231,7 @@ class ListAccompanyingPeriod implements ListInterface, GroupedExportInterface '|', array_map( fn ($s) => $this->translatableStringHelper->localize($s), - json_decode($value, true) + json_decode($value, true, 512, JSON_THROW_ON_ERROR) ) ); }; @@ -245,11 +250,32 @@ class ListAccompanyingPeriod implements ListInterface, GroupedExportInterface '|', array_map( fn ($s) => $this->socialIssueRender->renderString($this->socialIssueRepository->find($s), []), - json_decode($value, true) + json_decode($value, true, 512, JSON_THROW_ON_ERROR) ) ); }; + case 'step': + return fn ($value) => match ($value) { + '_header' => 'export.list.acp.step', + null => '', + AccompanyingPeriod::STEP_DRAFT => $this->translator->trans('course.draft'), + AccompanyingPeriod::STEP_CONFIRMED => $this->translator->trans('course.confirmed'), + AccompanyingPeriod::STEP_CLOSED => $this->translator->trans('course.closed'), + AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_SHORT => $this->translator->trans('course.inactive_short'), + AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_LONG => $this->translator->trans('course.inactive_long'), + default => $value, + }; + + case 'intensity': + return fn ($value) => match ($value) { + '_header' => 'export.list.acp.intensity', + null => '', + AccompanyingPeriod::INTENSITY_OCCASIONAL => $this->translator->trans('occasional'), + AccompanyingPeriod::INTENSITY_REGULAR => $this->translator->trans('regular'), + default => $value, + }; + default: return static function ($value) use ($key) { if ('_header' === $value) { @@ -290,9 +316,7 @@ class ListAccompanyingPeriod implements ListInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->entityManager->createQueryBuilder(); diff --git a/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWork.php b/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWork.php index d0c1863c3..00fa8adb1 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWork.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWork.php @@ -263,9 +263,7 @@ class ListAccompanyingPeriodWork implements ListInterface, GroupedExportInterfac public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->entityManager->createQueryBuilder(); diff --git a/src/Bundle/ChillPersonBundle/Export/Export/ListEvaluation.php b/src/Bundle/ChillPersonBundle/Export/Export/ListEvaluation.php index 010618733..f0985436b 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/ListEvaluation.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/ListEvaluation.php @@ -241,9 +241,7 @@ class ListEvaluation implements ListInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->entityManager->createQueryBuilder(); diff --git a/src/Bundle/ChillPersonBundle/Export/Export/ListHouseholdInPeriod.php b/src/Bundle/ChillPersonBundle/Export/Export/ListHouseholdInPeriod.php index fc72de77b..24d929c00 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/ListHouseholdInPeriod.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/ListHouseholdInPeriod.php @@ -146,9 +146,7 @@ class ListHouseholdInPeriod implements ListInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->entityManager->createQueryBuilder(); diff --git a/src/Bundle/ChillPersonBundle/Export/Export/ListPerson.php b/src/Bundle/ChillPersonBundle/Export/Export/ListPerson.php index acaeb498c..8145fd658 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/ListPerson.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/ListPerson.php @@ -191,9 +191,7 @@ class ListPerson implements ExportElementValidatedInterface, ListInterface, Grou */ public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); // throw an error if any fields are present if (!array_key_exists('fields', $data)) { @@ -334,7 +332,7 @@ class ListPerson implements ExportElementValidatedInterface, ListInterface, Grou return $this->customFieldProvider ->getCustomFieldByType($cf->getType()) - ->render(json_decode($value, true), $cf, 'csv'); + ->render(json_decode($value, true, 512, JSON_THROW_ON_ERROR), $cf, 'csv'); }; if ($cfType instanceof CustomFieldChoice && $cfType->isMultiple($cf)) { @@ -344,7 +342,7 @@ class ListPerson implements ExportElementValidatedInterface, ListInterface, Grou if (null === $value) { return ''; } - $decoded = json_decode($value, true); + $decoded = json_decode($value, true, 512, JSON_THROW_ON_ERROR); if ('_header' === $value) { $label = $cfType->getChoices($cf)[$slugChoice]; diff --git a/src/Bundle/ChillPersonBundle/Export/Export/ListPersonWithAccompanyingPeriod.php b/src/Bundle/ChillPersonBundle/Export/Export/ListPersonWithAccompanyingPeriod.php index bab67fb39..7cb066e87 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/ListPersonWithAccompanyingPeriod.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/ListPersonWithAccompanyingPeriod.php @@ -159,9 +159,7 @@ class ListPersonWithAccompanyingPeriod implements ExportElementValidatedInterfac */ public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); // throw an error if any fields are present if (!array_key_exists('fields', $data)) { diff --git a/src/Bundle/ChillPersonBundle/Export/Export/StatAccompanyingCourseDuration.php b/src/Bundle/ChillPersonBundle/Export/Export/StatAccompanyingCourseDuration.php index c124f0227..31ca41cbb 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/StatAccompanyingCourseDuration.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/StatAccompanyingCourseDuration.php @@ -112,9 +112,7 @@ class StatAccompanyingCourseDuration implements ExportInterface, GroupedExportIn public function initiateQuery(array $requiredModifiers, array $acl, array $data = []): QueryBuilder { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->repository->createQueryBuilder('acp'); diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ClosingMotiveFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ClosingMotiveFilter.php index 07e61b42e..e57370f30 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ClosingMotiveFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ClosingMotiveFilter.php @@ -59,9 +59,7 @@ class ClosingMotiveFilter implements FilterInterface { $builder->add('accepted_closingmotives', EntityType::class, [ 'class' => ClosingMotive::class, - 'choice_label' => function (ClosingMotive $cm) { - return $this->translatableStringHelper->localize($cm->getName()); - }, + 'choice_label' => fn (ClosingMotive $cm) => $this->translatableStringHelper->localize($cm->getName()), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorJobFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorJobFilter.php index 62cf49d6d..f585cfafb 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorJobFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorJobFilter.php @@ -61,11 +61,9 @@ class CreatorJobFilter implements FilterInterface $builder->add('creator_job', EntityType::class, [ 'class' => UserJob::class, 'choices' => $this->userJobRepository->findAllActive(), - 'choice_label' => function (UserJob $j) { - return $this->translatableStringHelper->localize( - $j->getLabel() - ); - }, + 'choice_label' => fn (UserJob $j) => $this->translatableStringHelper->localize( + $j->getLabel() + ), 'multiple' => true, 'expanded' => true, 'label' => 'Job', diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/EvaluationFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/EvaluationFilter.php index 1839268e1..ab7f4257e 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/EvaluationFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/EvaluationFilter.php @@ -69,9 +69,7 @@ class EvaluationFilter implements FilterInterface $builder->add('accepted_evaluations', EntityType::class, [ 'class' => Evaluation::class, 'choices' => $this->evaluationRepository->findAllActive(), - 'choice_label' => function (Evaluation $ev) { - return $this->translatableStringHelper->localize($ev->getTitle()); - }, + 'choice_label' => fn (Evaluation $ev) => $this->translatableStringHelper->localize($ev->getTitle()), 'multiple' => true, 'expanded' => false, 'attr' => ['class' => 'select2'], diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/GeographicalUnitStatFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/GeographicalUnitStatFilter.php index 5bbb22e53..d35565c80 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/GeographicalUnitStatFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/GeographicalUnitStatFilter.php @@ -107,9 +107,7 @@ class GeographicalUnitStatFilter implements FilterInterface 'placeholder' => 'Select a geographical unit', 'choices' => $this->geographicalUnitRepository->findAll(), 'choice_value' => static fn (SimpleGeographicalUnitDTO $item) => $item->id, - 'choice_label' => function (SimpleGeographicalUnitDTO $item) { - return $this->translatableStringHelper->localize($this->geographicalUnitLayerRepository->find($item->layerId)->getName()) . ' > ' . $item->unitName; - }, + 'choice_label' => fn (SimpleGeographicalUnitDTO $item) => $this->translatableStringHelper->localize($this->geographicalUnitLayerRepository->find($item->layerId)->getName()) . ' > ' . $item->unitName, 'attr' => [ 'class' => 'select2', ], @@ -124,9 +122,7 @@ class GeographicalUnitStatFilter implements FilterInterface '%units' => implode( ', ', array_map( - function (SimpleGeographicalUnitDTO $item) { - return $this->translatableStringHelper->localize($this->geographicalUnitLayerRepository->find($item->layerId)->getName()) . ' > ' . $item->unitName; - }, + fn (SimpleGeographicalUnitDTO $item) => $this->translatableStringHelper->localize($this->geographicalUnitLayerRepository->find($item->layerId)->getName()) . ' > ' . $item->unitName, $data['units'] ) ), diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/HavingAnAccompanyingPeriodInfoWithinDatesFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/HavingAnAccompanyingPeriodInfoWithinDatesFilter.php new file mode 100644 index 000000000..7069a1d80 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/HavingAnAccompanyingPeriodInfoWithinDatesFilter.php @@ -0,0 +1,91 @@ +add('start_date', PickRollingDateType::class, [ + 'label' => 'export.filter.course.having_info_within_interval.start_date', + 'data' => new RollingDate(RollingDate::T_TODAY), + ]) + ->add('end_date', PickRollingDateType::class, [ + 'label' => 'export.filter.course.having_info_within_interval.end_date', + 'data' => new RollingDate(RollingDate::T_TODAY), + ]) + ; + } + + public function getTitle(): string + { + return 'export.filter.course.having_info_within_interval.title'; + } + + public function describeAction($data, $format = 'string'): array + { + return [ + 'export.filter.course.having_info_within_interval.Only course with events between %startDate% and %endDate%', + [ + '%startDate%' => $this->rollingDateConverter->convert($data['start_date'])->format('d-m-Y'), + '%endDate%' => $this->rollingDateConverter->convert($data['end_date'])->format('d-m-Y'), + ] + ]; + } + + public function addRole(): ?string + { + return null; + } + + public function alterQuery(QueryBuilder $qb, $data): void + { + $ai = 'having_ai_within_interval_acc_info'; + $as = 'having_ai_within_interval_start_date'; + $ae = 'having_ai_within_interval_end_date'; + + $qb + ->andWhere( + $qb->expr()->exists( + 'SELECT 1 FROM ' . AccompanyingPeriodInfo::class . " {$ai} WHERE {$ai}.infoDate BETWEEN :{$as} AND :{$ae} AND IDENTITY({$ai}.accompanyingPeriod) = acp.id" + ) + ) + ->setParameter($as, $this->rollingDateConverter->convert($data['start_date']), Types::DATETIME_IMMUTABLE) + ->setParameter($ae, $this->rollingDateConverter->convert($data['end_date']), Types::DATETIME_IMMUTABLE); + } + + public function applyOn(): string + { + return Declarations::ACP_TYPE; + } +} diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/OriginFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/OriginFilter.php index 445535734..00febc640 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/OriginFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/OriginFilter.php @@ -59,9 +59,7 @@ class OriginFilter implements FilterInterface { $builder->add('accepted_origins', EntityType::class, [ 'class' => Origin::class, - 'choice_label' => function (Origin $o) { - return $this->translatableStringHelper->localize($o->getLabel()); - }, + 'choice_label' => fn (Origin $o) => $this->translatableStringHelper->localize($o->getLabel()), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilter.php index 240b093b5..8ee798c07 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilter.php @@ -32,9 +32,11 @@ class StepFilter implements FilterInterface private const P = 'acp_step_filter_date'; private const STEPS = [ - 'Draft' => AccompanyingPeriod::STEP_DRAFT, - 'Confirmed' => AccompanyingPeriod::STEP_CONFIRMED, - 'Closed' => AccompanyingPeriod::STEP_CLOSED, + 'course.draft' => AccompanyingPeriod::STEP_DRAFT, + 'course.confirmed' => AccompanyingPeriod::STEP_CONFIRMED, + 'course.closed' => AccompanyingPeriod::STEP_CLOSED, + 'course.inactive_short' => AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_SHORT, + 'course.inactive_long' => AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_LONG, ]; private RollingDateConverterInterface $rollingDateConverter; @@ -96,7 +98,7 @@ class StepFilter implements FilterInterface 'data' => self::DEFAULT_CHOICE, ]) ->add('calc_date', PickRollingDateType::class, [ - 'label' => 'export.acp.filter.by_step.date_calc', + 'label' => 'export.filter.course.by_step.date_calc', 'data' => new RollingDate(RollingDate::T_TODAY), ]); } diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/UserWorkingOnCourseFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/UserWorkingOnCourseFilter.php new file mode 100644 index 000000000..586bb645d --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/UserWorkingOnCourseFilter.php @@ -0,0 +1,88 @@ +add('users', PickUserDynamicType::class, [ + 'multiple' => true, + ]); + } + + public function getTitle(): string + { + return 'export.filter.course.by_user_working.title'; + } + + public function describeAction($data, $format = 'string'): array + { + return [ + 'export.filter.course.by_user_working.Filtered by user working on course: only %users%', [ + '%users%' => implode( + ', ', + array_map( + fn (User $u) => $this->userRender->renderString($u, []), + $data['users'] + ) + ), + ], + ]; + } + + public function addRole(): ?string + { + return null; + } + + public function alterQuery(QueryBuilder $qb, $data): void + { + $qb + ->andWhere( + $qb->expr()->exists( + "SELECT 1 FROM " . AccompanyingPeriod\AccompanyingPeriodInfo::class . " " . self::AI_ALIAS . " " . + "WHERE " . self::AI_ALIAS . ".user IN (:" . self::AI_USERS .") AND IDENTITY(" . self::AI_ALIAS . ".accompanyingPeriod) = acp.id" + ) + ) + ->setParameter(self::AI_USERS, $data['users']) + ; + } + + public function applyOn(): string + { + return Declarations::ACP_TYPE; + } +} diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/EvaluationFilters/EvaluationTypeFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/EvaluationFilters/EvaluationTypeFilter.php index 65e38f41e..6a0c71d55 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/EvaluationFilters/EvaluationTypeFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/EvaluationFilters/EvaluationTypeFilter.php @@ -59,9 +59,7 @@ final class EvaluationTypeFilter implements FilterInterface { $builder->add('accepted_evaluationtype', EntityType::class, [ 'class' => Evaluation::class, - 'choice_label' => function (Evaluation $ev): string { - return $this->translatableStringHelper->localize($ev->getTitle()); - }, + 'choice_label' => fn (Evaluation $ev): string => $this->translatableStringHelper->localize($ev->getTitle()), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/HouseholdFilters/CompositionFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/HouseholdFilters/CompositionFilter.php index 922702418..22761c158 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/HouseholdFilters/CompositionFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/HouseholdFilters/CompositionFilter.php @@ -78,11 +78,9 @@ class CompositionFilter implements FilterInterface $builder ->add('accepted_composition', EntityType::class, [ 'class' => HouseholdCompositionType::class, - 'choice_label' => function (HouseholdCompositionType $type) { - return $this->translatableStringHelper->localize( - $type->getLabel() - ); - }, + 'choice_label' => fn (HouseholdCompositionType $type) => $this->translatableStringHelper->localize( + $type->getLabel() + ), 'multiple' => true, 'expanded' => true, ]) diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/AddressRefStatusFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/AddressRefStatusFilter.php index 0fe1973e9..7580a37a3 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/AddressRefStatusFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/AddressRefStatusFilter.php @@ -81,9 +81,7 @@ class AddressRefStatusFilter implements \Chill\MainBundle\Export\FilterInterface ->add('ref_statuses', ChoiceType::class, [ 'label' => 'export.filter.person.by_address_ref_status.Status', 'choices' => [Address::ADDR_REFERENCE_STATUS_TO_REVIEW, Address::ADDR_REFERENCE_STATUS_REVIEWED, Address::ADDR_REFERENCE_STATUS_MATCH], - 'choice_label' => function (string $item) { - return 'export.filter.person.by_address_ref_status.'.$item; - }, + 'choice_label' => fn (string $item) => 'export.filter.person.by_address_ref_status.'.$item, 'multiple' => true, 'expanded' => true, 'data' => [Address::ADDR_REFERENCE_STATUS_TO_REVIEW] @@ -99,9 +97,7 @@ class AddressRefStatusFilter implements \Chill\MainBundle\Export\FilterInterface '%statuses%' => implode( ', ', array_map( - function (string $item) { - return 'export.filter.person.by_address_ref_status.'.$item; - }, + fn (string $item) => 'export.filter.person.by_address_ref_status.'.$item, $data['ref_statuses'] ?? RollingDate::T_TODAY ) ), diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/AgeFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/AgeFilter.php index 0bf175ce4..c05f97ca8 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/AgeFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/AgeFilter.php @@ -42,8 +42,8 @@ class AgeFilter implements ExportElementValidatedInterface, FilterInterface { $where = $qb->getDQLPart('where'); - $min = null !== $data['min_age'] ? $data['min_age'] : 0; - $max = null !== $data['max_age'] ? $data['max_age'] : 150; + $min = $data['min_age'] ?? 0; + $max = $data['max_age'] ?? 150; $calc = $this->rollingDateConverter->convert($data['date_calc']); $minDate = $calc->sub(new DateInterval('P' . $max . 'Y')); diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php index 228749c34..739945b98 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php @@ -67,9 +67,7 @@ class GenderFilter implements $qb->add('where', $where); $qb->setParameter('person_gender', array_filter( $data['accepted_genders'], - static function ($el) { - return 'null' !== $el; - } + static fn ($el) => 'null' !== $el )); } diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GeographicalUnitFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GeographicalUnitFilter.php index 9bdb3f2d4..79f5cb2d4 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GeographicalUnitFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GeographicalUnitFilter.php @@ -98,9 +98,7 @@ class GeographicalUnitFilter implements \Chill\MainBundle\Export\FilterInterface 'placeholder' => 'Select a geographical unit', 'choices' => $this->geographicalUnitRepository->findAll(), 'choice_value' => static fn (SimpleGeographicalUnitDTO $item) => $item->id, - 'choice_label' => function (SimpleGeographicalUnitDTO $item) { - return $this->translatableStringHelper->localize($this->geographicalUnitLayerRepository->find($item->layerId)->getName()) . ' > ' . $item->unitName; - }, + 'choice_label' => fn (SimpleGeographicalUnitDTO $item) => $this->translatableStringHelper->localize($this->geographicalUnitLayerRepository->find($item->layerId)->getName()) . ' > ' . $item->unitName, 'attr' => [ 'class' => 'select2', ], @@ -117,9 +115,7 @@ class GeographicalUnitFilter implements \Chill\MainBundle\Export\FilterInterface '%units%' => implode( ', ', array_map( - function (SimpleGeographicalUnitDTO $item) { - return $this->translatableStringHelper->localize($this->geographicalUnitLayerRepository->find($item->layerId)->getName()) . ' > ' . $item->unitName; - }, + fn (SimpleGeographicalUnitDTO $item) => $this->translatableStringHelper->localize($this->geographicalUnitLayerRepository->find($item->layerId)->getName()) . ' > ' . $item->unitName, $data['units'] ) ), diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/MaritalStatusFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/MaritalStatusFilter.php index aad98a394..47a75871c 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/MaritalStatusFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/MaritalStatusFilter.php @@ -49,11 +49,9 @@ class MaritalStatusFilter implements FilterInterface { $builder->add('maritalStatus', EntityType::class, [ 'class' => MaritalStatus::class, - 'choice_label' => function (MaritalStatus $ms) { - return $this->translatableStringHelper->localize( - $ms->getName() - ); - }, + 'choice_label' => fn (MaritalStatus $ms) => $this->translatableStringHelper->localize( + $ms->getName() + ), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/NationalityFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/NationalityFilter.php index 1156527cc..b1d77d60e 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/NationalityFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/NationalityFilter.php @@ -72,9 +72,7 @@ class NationalityFilter implements { $countries = $data['nationalities']; - $names = array_map(function (Country $c) { - return $this->translatableStringHelper->localize($c->getName()); - }, [$countries]); + $names = array_map(fn (Country $c) => $this->translatableStringHelper->localize($c->getName()), [$countries]); return [ 'Filtered by nationality : %nationalities%', diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/ResidentialAddressAtThirdpartyFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/ResidentialAddressAtThirdpartyFilter.php index 90003c6bf..21bb40947 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/ResidentialAddressAtThirdpartyFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/ResidentialAddressAtThirdpartyFilter.php @@ -100,9 +100,7 @@ class ResidentialAddressAtThirdpartyFilter implements FilterInterface $builder->add('thirdparty_cat', EntityType::class, [ 'class' => ThirdPartyCategory::class, 'label' => 'Category', - 'choice_label' => function (ThirdPartyCategory $tpc) { - return $this->translatableStringHelper->localize($tpc->getName()); - }, + 'choice_label' => fn (ThirdPartyCategory $tpc) => $this->translatableStringHelper->localize($tpc->getName()), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/JobFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/JobFilter.php index a69e1ac76..144bf3260 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/JobFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/JobFilter.php @@ -69,11 +69,9 @@ class JobFilter implements FilterInterface { $builder->add('job', EntityType::class, [ 'class' => UserJob::class, - 'choice_label' => function (UserJob $j) { - return $this->translatableStringHelper->localize( - $j->getLabel() - ); - }, + 'choice_label' => fn (UserJob $j) => $this->translatableStringHelper->localize( + $j->getLabel() + ), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/ScopeFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/ScopeFilter.php index 8cb2f6421..315025722 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/ScopeFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/ScopeFilter.php @@ -69,11 +69,9 @@ class ScopeFilter implements FilterInterface { $builder->add('scope', EntityType::class, [ 'class' => Scope::class, - 'choice_label' => function (Scope $s) { - return $this->translatableStringHelper->localize( - $s->getName() - ); - }, + 'choice_label' => fn (Scope $s) => $this->translatableStringHelper->localize( + $s->getName() + ), 'multiple' => true, 'expanded' => true, ]); diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/SocialWorkTypeFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/SocialWorkTypeFilter.php index 853d50744..11fd0ed9d 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/SocialWorkTypeFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/SocialWorkTypeFilter.php @@ -136,7 +136,7 @@ class SocialWorkTypeFilter implements FilterInterface } return ['Filtered actions by type, goals and results: %selected%', [ - '%selected%' => implode(', ', array_merge($actionTypes, $goals, $results)), + '%selected%' => implode(', ', [...$actionTypes, ...$goals, ...$results]), ]]; } diff --git a/src/Bundle/ChillPersonBundle/Export/Helper/LabelPersonHelper.php b/src/Bundle/ChillPersonBundle/Export/Helper/LabelPersonHelper.php index 2cfc8d3cf..fc196dd50 100644 --- a/src/Bundle/ChillPersonBundle/Export/Helper/LabelPersonHelper.php +++ b/src/Bundle/ChillPersonBundle/Export/Helper/LabelPersonHelper.php @@ -39,7 +39,7 @@ class LabelPersonHelper return ''; } - $decoded = json_decode($value); + $decoded = json_decode($value, null, 512, JSON_THROW_ON_ERROR); if (0 === count($decoded)) { return ''; diff --git a/src/Bundle/ChillPersonBundle/Export/Helper/ListPersonHelper.php b/src/Bundle/ChillPersonBundle/Export/Helper/ListPersonHelper.php index de8870674..77a1d9c86 100644 --- a/src/Bundle/ChillPersonBundle/Export/Helper/ListPersonHelper.php +++ b/src/Bundle/ChillPersonBundle/Export/Helper/ListPersonHelper.php @@ -361,7 +361,7 @@ class ListPersonHelper return ''; } - $ids = json_decode($value); + $ids = json_decode($value, null, 512, JSON_THROW_ON_ERROR); return implode( diff --git a/src/Bundle/ChillPersonBundle/Form/AccompanyingPeriodType.php b/src/Bundle/ChillPersonBundle/Form/AccompanyingPeriodType.php index f6bf4962e..25d380562 100644 --- a/src/Bundle/ChillPersonBundle/Form/AccompanyingPeriodType.php +++ b/src/Bundle/ChillPersonBundle/Form/AccompanyingPeriodType.php @@ -98,7 +98,7 @@ class AccompanyingPeriodType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\PersonBundle\Entity\AccompanyingPeriod', + 'data_class' => \Chill\PersonBundle\Entity\AccompanyingPeriod::class, ]); $resolver diff --git a/src/Bundle/ChillPersonBundle/Form/ChoiceLoader/PersonChoiceLoader.php b/src/Bundle/ChillPersonBundle/Form/ChoiceLoader/PersonChoiceLoader.php index 0e63fe580..03db7c156 100644 --- a/src/Bundle/ChillPersonBundle/Form/ChoiceLoader/PersonChoiceLoader.php +++ b/src/Bundle/ChillPersonBundle/Form/ChoiceLoader/PersonChoiceLoader.php @@ -55,9 +55,7 @@ class PersonChoiceLoader implements ChoiceLoaderInterface { return new \Symfony\Component\Form\ChoiceList\ArrayChoiceList( $this->lazyLoadedPersons, - static function (Person $p) use ($value) { - return call_user_func($value, $p); - } + static fn (Person $p) => call_user_func($value, $p) ); } diff --git a/src/Bundle/ChillPersonBundle/Form/HouseholdCompositionType.php b/src/Bundle/ChillPersonBundle/Form/HouseholdCompositionType.php index d6919cc5d..a63b008c6 100644 --- a/src/Bundle/ChillPersonBundle/Form/HouseholdCompositionType.php +++ b/src/Bundle/ChillPersonBundle/Form/HouseholdCompositionType.php @@ -40,9 +40,7 @@ class HouseholdCompositionType extends AbstractType ->add('householdCompositionType', EntityType::class, [ 'class' => \Chill\PersonBundle\Entity\Household\HouseholdCompositionType::class, 'choices' => $types, - 'choice_label' => function (\Chill\PersonBundle\Entity\Household\HouseholdCompositionType $type) { - return $this->translatableStringHelper->localize($type->getLabel()); - }, + 'choice_label' => fn (\Chill\PersonBundle\Entity\Household\HouseholdCompositionType $type) => $this->translatableStringHelper->localize($type->getLabel()), 'label' => 'household_composition.Household composition', ]) ->add('startDate', ChillDateType::class, [ diff --git a/src/Bundle/ChillPersonBundle/Form/PersonType.php b/src/Bundle/ChillPersonBundle/Form/PersonType.php index 15888c015..927812929 100644 --- a/src/Bundle/ChillPersonBundle/Form/PersonType.php +++ b/src/Bundle/ChillPersonBundle/Form/PersonType.php @@ -118,12 +118,8 @@ class PersonType extends AbstractType ]); $builder->get('placeOfBirth')->addModelTransformer(new CallbackTransformer( - static function ($string) { - return strtoupper((string) $string); - }, - static function ($string) { - return strtoupper((string) $string); - } + static fn ($string) => strtoupper((string) $string), + static fn ($string) => strtoupper((string) $string) )); } @@ -167,9 +163,7 @@ class PersonType extends AbstractType 'allow_delete' => true, 'by_reference' => false, 'label' => false, - 'delete_empty' => static function (?PersonPhone $pp = null) { - return null === $pp || $pp->isEmpty(); - }, + 'delete_empty' => static fn (?PersonPhone $pp = null) => null === $pp || $pp->isEmpty(), 'error_bubbling' => false, 'empty_collection_explain' => 'No additional phone numbers', ]); @@ -250,7 +244,7 @@ class PersonType extends AbstractType $resolver->setAllowedTypes( 'cFGroup', - ['null', 'Chill\CustomFieldsBundle\Entity\CustomFieldsGroup'] + ['null', \Chill\CustomFieldsBundle\Entity\CustomFieldsGroup::class] ); } diff --git a/src/Bundle/ChillPersonBundle/Form/SocialWork/GoalType.php b/src/Bundle/ChillPersonBundle/Form/SocialWork/GoalType.php index 6d07bf64f..a6f55e917 100644 --- a/src/Bundle/ChillPersonBundle/Form/SocialWork/GoalType.php +++ b/src/Bundle/ChillPersonBundle/Form/SocialWork/GoalType.php @@ -46,9 +46,7 @@ class GoalType extends AbstractType 'class' => Result::class, 'required' => false, 'multiple' => true, - 'choice_label' => function (Result $r) { - return $this->translatableStringHelper->localize($r->getTitle()); - }, + 'choice_label' => fn (Result $r) => $this->translatableStringHelper->localize($r->getTitle()), 'attr' => ['class' => 'select2 '], ]) ->add('desactivationDate', ChillDateType::class, [ diff --git a/src/Bundle/ChillPersonBundle/Form/SocialWork/SocialActionType.php b/src/Bundle/ChillPersonBundle/Form/SocialWork/SocialActionType.php index 5a6095f7b..0b6cbe73d 100644 --- a/src/Bundle/ChillPersonBundle/Form/SocialWork/SocialActionType.php +++ b/src/Bundle/ChillPersonBundle/Form/SocialWork/SocialActionType.php @@ -50,16 +50,12 @@ class SocialActionType extends AbstractType ->add('issue', EntityType::class, [ 'class' => SocialIssue::class, 'label' => 'socialAction.socialIssue', - 'choice_label' => function (SocialIssue $issue) { - return $this->translatableStringHelper->localize($issue->getTitle()); - }, + 'choice_label' => fn (SocialIssue $issue) => $this->translatableStringHelper->localize($issue->getTitle()), ]) ->add('parent', EntityType::class, [ 'class' => SocialAction::class, 'required' => false, - 'choice_label' => function (SocialAction $issue) { - return $this->translatableStringHelper->localize($issue->getTitle()); - }, + 'choice_label' => fn (SocialAction $issue) => $this->translatableStringHelper->localize($issue->getTitle()), ]) ->add('ordering', NumberType::class, [ 'required' => true, @@ -70,9 +66,7 @@ class SocialActionType extends AbstractType 'required' => false, 'multiple' => true, 'attr' => ['class' => 'select2'], - 'choice_label' => function (Result $r) { - return $this->translatableStringHelper->localize($r->getTitle()); - }, + 'choice_label' => fn (Result $r) => $this->translatableStringHelper->localize($r->getTitle()), ]) ->add('goals', EntityType::class, [ @@ -80,9 +74,7 @@ class SocialActionType extends AbstractType 'required' => false, 'multiple' => true, 'attr' => ['class' => 'select2'], - 'choice_label' => function (Goal $g) { - return $this->translatableStringHelper->localize($g->getTitle()); - }, + 'choice_label' => fn (Goal $g) => $this->translatableStringHelper->localize($g->getTitle()), ]) ->add('evaluations', EntityType::class, [ @@ -90,9 +82,7 @@ class SocialActionType extends AbstractType 'required' => false, 'multiple' => true, 'attr' => ['class' => 'select2'], - 'choice_label' => function (Evaluation $e) { - return $this->translatableStringHelper->localize($e->getTitle()); - }, + 'choice_label' => fn (Evaluation $e) => $this->translatableStringHelper->localize($e->getTitle()), ]) ->add('defaultNotificationDelay', DateIntervalType::class, [ diff --git a/src/Bundle/ChillPersonBundle/Form/Type/ClosingMotivePickerType.php b/src/Bundle/ChillPersonBundle/Form/Type/ClosingMotivePickerType.php index 2f96d4966..240bcfbb4 100644 --- a/src/Bundle/ChillPersonBundle/Form/Type/ClosingMotivePickerType.php +++ b/src/Bundle/ChillPersonBundle/Form/Type/ClosingMotivePickerType.php @@ -60,18 +60,14 @@ class ClosingMotivePickerType extends AbstractType 'class' => ClosingMotive::class, 'empty_data' => null, 'placeholder' => 'Choose a motive', - 'choice_label' => function (ClosingMotive $cm) { - return $this->entityRenderExtension->renderString($cm); - }, + 'choice_label' => fn (ClosingMotive $cm) => $this->entityRenderExtension->renderString($cm), 'only_leaf' => true, ]); $resolver ->setAllowedTypes('only_leaf', 'bool') - ->setNormalizer('choices', function (Options $options) { - return $this->repository - ->getActiveClosingMotive($options['only_leaf']); - }); + ->setNormalizer('choices', fn (Options $options) => $this->repository + ->getActiveClosingMotive($options['only_leaf'])); } /** diff --git a/src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php b/src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php index 501af5b9d..026a24bb6 100644 --- a/src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php +++ b/src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php @@ -113,15 +113,11 @@ class PickPersonType extends AbstractType // add the default options $resolver->setDefaults([ 'class' => Person::class, - 'choice_label' => static function (Person $p) { - return $p->getFirstname() . ' ' . $p->getLastname(); - }, + 'choice_label' => static fn (Person $p) => $p->getFirstname() . ' ' . $p->getLastname(), 'placeholder' => 'Pick a person', - 'choice_attr' => static function (Person $p) { - return [ - 'data-center' => $p->getCenter()->getId(), - ]; - }, + 'choice_attr' => static fn (Person $p) => [ + 'data-center' => $p->getCenter()->getId(), + ], 'attr' => ['class' => 'select2 '], 'choice_loader' => function (Options $options) { $centers = $this->filterCentersfom($options); @@ -139,9 +135,7 @@ class PickPersonType extends AbstractType protected function filterCentersfom(Options $options) { if (null === $options['role']) { - $centers = array_map(static function (GroupCenter $g) { - return $g->getCenter(); - }, $this->user->getGroupCenters()->toArray()); + $centers = array_map(static fn (GroupCenter $g) => $g->getCenter(), $this->user->getGroupCenters()->toArray()); } else { $centers = $this->authorizationHelper ->getReachableCenters($this->user, $options['role']->getRole()); @@ -164,9 +158,7 @@ class PickPersonType extends AbstractType if ( !in_array($c->getId(), array_map( - static function (Center $c) { - return $c->getId(); - }, + static fn (Center $c) => $c->getId(), $centers ), true) ) { diff --git a/src/Bundle/ChillPersonBundle/Form/Type/PickSocialActionType.php b/src/Bundle/ChillPersonBundle/Form/Type/PickSocialActionType.php index 7c0da43b1..fd947e9cd 100644 --- a/src/Bundle/ChillPersonBundle/Form/Type/PickSocialActionType.php +++ b/src/Bundle/ChillPersonBundle/Form/Type/PickSocialActionType.php @@ -38,9 +38,7 @@ class PickSocialActionType extends AbstractType ->setDefaults([ 'class' => SocialAction::class, 'choices' => $this->actionRepository->findAllActive(), - 'choice_label' => function (SocialAction $sa) { - return $this->actionRender->renderString($sa, []); - }, + 'choice_label' => fn (SocialAction $sa) => $this->actionRender->renderString($sa, []), 'placeholder' => 'Pick a social action', 'required' => false, 'attr' => ['class' => 'select2'], diff --git a/src/Bundle/ChillPersonBundle/Form/Type/PickSocialIssueType.php b/src/Bundle/ChillPersonBundle/Form/Type/PickSocialIssueType.php index e79c17191..b560337ac 100644 --- a/src/Bundle/ChillPersonBundle/Form/Type/PickSocialIssueType.php +++ b/src/Bundle/ChillPersonBundle/Form/Type/PickSocialIssueType.php @@ -38,9 +38,7 @@ class PickSocialIssueType extends AbstractType ->setDefaults([ 'class' => SocialIssue::class, 'choices' => $this->issueRepository->findAllActive(), - 'choice_label' => function (SocialIssue $si) { - return $this->issueRender->renderString($si, []); - }, + 'choice_label' => fn (SocialIssue $si) => $this->issueRender->renderString($si, []), 'placeholder' => 'Pick a social issue', 'required' => false, 'attr' => ['class' => 'select2'], diff --git a/src/Bundle/ChillPersonBundle/Form/Type/Select2MaritalStatusType.php b/src/Bundle/ChillPersonBundle/Form/Type/Select2MaritalStatusType.php index 0099e6367..f057bc1d1 100644 --- a/src/Bundle/ChillPersonBundle/Form/Type/Select2MaritalStatusType.php +++ b/src/Bundle/ChillPersonBundle/Form/Type/Select2MaritalStatusType.php @@ -40,13 +40,13 @@ class Select2MaritalStatusType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { - $transformer = new ObjectToIdTransformer($this->em, 'Chill\PersonBundle\Entity\MaritalStatus'); + $transformer = new ObjectToIdTransformer($this->em, \Chill\PersonBundle\Entity\MaritalStatus::class); $builder->addModelTransformer($transformer); } public function configureOptions(OptionsResolver $resolver) { - $maritalStatuses = $this->em->getRepository('Chill\PersonBundle\Entity\MaritalStatus')->findAll(); + $maritalStatuses = $this->em->getRepository(\Chill\PersonBundle\Entity\MaritalStatus::class)->findAll(); $choices = []; foreach ($maritalStatuses as $ms) { diff --git a/src/Bundle/ChillPersonBundle/Household/MembersEditor.php b/src/Bundle/ChillPersonBundle/Household/MembersEditor.php index bdb7a8eca..2b2564091 100644 --- a/src/Bundle/ChillPersonBundle/Household/MembersEditor.php +++ b/src/Bundle/ChillPersonBundle/Household/MembersEditor.php @@ -168,7 +168,7 @@ class MembersEditor $criteria->where( $expr->andX( $expr->lt('startDate', $date), - $expr->isNull('endDate', $date) + $expr->isNull('endDate') ) ); diff --git a/src/Bundle/ChillPersonBundle/Privacy/PrivacyEventSubscriber.php b/src/Bundle/ChillPersonBundle/Privacy/PrivacyEventSubscriber.php index 0b67537cb..33d01de1b 100644 --- a/src/Bundle/ChillPersonBundle/Privacy/PrivacyEventSubscriber.php +++ b/src/Bundle/ChillPersonBundle/Privacy/PrivacyEventSubscriber.php @@ -76,9 +76,7 @@ class PrivacyEventSubscriber implements EventSubscriberInterface $involved = $this->getInvolved(); $involved['period_id'] = $event->getPeriod()->getId(); $involved['persons'] = $event->getPeriod()->getPersons() - ->map(static function (Person $p) { - return $p->getId(); - }) + ->map(static fn (Person $p) => $p->getId()) ->toArray(); $this->logger->notice( @@ -102,9 +100,7 @@ class PrivacyEventSubscriber implements EventSubscriberInterface if ($event->hasPersons()) { $involved['persons'] = array_map( - static function (Person $p) { - return $p->getId(); - }, + static fn (Person $p) => $p->getId(), $event->getPersons() ); } diff --git a/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodInfoRepository.php b/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodInfoRepository.php new file mode 100644 index 000000000..57925b131 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodInfoRepository.php @@ -0,0 +1,93 @@ +entityRepository = $em->getRepository($this->getClassName()); + } + + public function findAccompanyingPeriodIdInactiveAfter(DateInterval $interval, array $statuses = []): array + { + $query = $this->em->createQuery(); + $baseDql = 'SELECT DISTINCT IDENTITY(ai.accompanyingPeriod) FROM '.AccompanyingPeriodInfo::class.' ai JOIN ai.accompanyingPeriod a WHERE NOT EXISTS + (SELECT 1 FROM ' . AccompanyingPeriodInfo::class . ' aiz WHERE aiz.infoDate > :after AND IDENTITY(aiz.accompanyingPeriod) = IDENTITY(ai.accompanyingPeriod))'; + + if ([] !== $statuses) { + $dql = $baseDql . ' AND a.step IN (:statuses)'; + $query->setParameter('statuses', $statuses); + } else { + $dql = $baseDql; + } + + return $query->setDQL($dql) + ->setParameter('after', $this->clock->now()->sub($interval)) + ->getSingleColumnResult(); + } + + public function findAccompanyingPeriodIdActiveSince(DateInterval $interval, array $statuses = []): array + { + $query = $this->em->createQuery(); + $baseDql = 'SELECT DISTINCT IDENTITY(ai.accompanyingPeriod) FROM ' . AccompanyingPeriodInfo::class . ' ai + JOIN ai.accompanyingPeriod a WHERE ai.infoDate > :after'; + + if ([] !== $statuses) { + $dql = $baseDql . ' AND a.step IN (:statuses)'; + $query->setParameter('statuses', $statuses); + } else { + $dql = $baseDql; + } + + return $query->setDQL($dql) + ->setParameter('after', $this->clock->now()->sub($interval)) + ->getSingleColumnResult(); + } + + public function find($id): ?AccompanyingPeriodInfo + { + throw new LogicException("Calling an accompanying period info by his id does not make sense"); + } + + public function findAll(): array + { + return $this->entityRepository->findAll(); + } + + public function findBy(array $criteria, ?array $orderBy = null, ?int $limit = null, ?int $offset = null): array + { + return $this->entityRepository->findBy($criteria, $orderBy, $limit, $offset); + } + + public function findOneBy(array $criteria): ?AccompanyingPeriodInfo + { + return $this->entityRepository->findOneBy($criteria); + } + + public function getClassName(): string + { + return AccompanyingPeriodInfo::class; + } + +} diff --git a/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodInfoRepositoryInterface.php b/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodInfoRepositoryInterface.php new file mode 100644 index 000000000..07397cd48 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodInfoRepositoryInterface.php @@ -0,0 +1,38 @@ + + */ +interface AccompanyingPeriodInfoRepositoryInterface extends ObjectRepository +{ + /** + * Return a list of id for inactive accompanying periods + * + * @param \DateInterval $interval + * @param list $statuses + * @return list + */ + public function findAccompanyingPeriodIdInactiveAfter(\DateInterval $interval, array $statuses = []): array; + + /** + * @param \DateInterval $interval + * @param list $statuses + * @return list + */ + public function findAccompanyingPeriodIdActiveSince(\DateInterval $interval, array $statuses = []): array; +} diff --git a/src/Bundle/ChillPersonBundle/Repository/PersonACLAwareRepository.php b/src/Bundle/ChillPersonBundle/Repository/PersonACLAwareRepository.php index cc9e7b145..30c79147c 100644 --- a/src/Bundle/ChillPersonBundle/Repository/PersonACLAwareRepository.php +++ b/src/Bundle/ChillPersonBundle/Repository/PersonACLAwareRepository.php @@ -322,9 +322,7 @@ final class PersonACLAwareRepository implements PersonACLAwareRepositoryInterfac ), ] ), - array_map(static function (Center $c) { - return $c->getId(); - }, $authorizedCenters) + array_map(static fn (Center $c) => $c->getId(), $authorizedCenters) ); } } diff --git a/src/Bundle/ChillPersonBundle/Repository/ResidentialAddressRepository.php b/src/Bundle/ChillPersonBundle/Repository/ResidentialAddressRepository.php index 424411a72..5f75d537b 100644 --- a/src/Bundle/ChillPersonBundle/Repository/ResidentialAddressRepository.php +++ b/src/Bundle/ChillPersonBundle/Repository/ResidentialAddressRepository.php @@ -44,7 +44,7 @@ class ResidentialAddressRepository extends ServiceEntityRepository public function buildQueryFindCurrentResidentialAddresses(Person $person, ?DateTimeImmutable $at = null): QueryBuilder { - $date = null === $at ? new DateTimeImmutable('today') : $at; + $date = $at ?? new DateTimeImmutable('today'); $qb = $this->createQueryBuilder('ra'); $dateFilter = $qb->expr()->andX( diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/App.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/App.vue index 51fc2c1d0..c66214b0b 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/App.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/App.vue @@ -14,7 +14,7 @@ - + diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Banner.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Banner.vue index dcade7e0f..fb8a09784 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Banner.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Banner.vue @@ -11,12 +11,22 @@ {{ $t('course.step.draft') }} - - + + {{ $t('course.step.active') }} + + + {{ $t('course.step.inactive_short') }} + + + + + {{ $t('course.step.inactive_long') }} + + {{ $t('course.open_at') }}{{ $d(accompanyingCourse.openingDate.datetime, 'text') }} diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/js/i18n.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/js/i18n.js index 8bbd5c4ca..1a46a79ca 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/js/i18n.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/js/i18n.js @@ -21,7 +21,9 @@ const appMessages = { step: { draft: "Brouillon", active: "En file active", - closed: "Cloturé" + closed: "Cloturé", + inactive_short: "Hors file active", + inactive_long: "Pré-archivé", }, open_at: "ouvert le ", by: "par ", diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Person/list_with_period.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Person/list_with_period.html.twig index 4497b8226..4735fb5a3 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/Person/list_with_period.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/Person/list_with_period.html.twig @@ -52,11 +52,13 @@ {% endif %} {% if acp.step == 'DRAFT' %} - {{ 'course.draft'|trans }} - {% endif %} - - {% if acp.step == 'CLOSED' %} - {{ 'course.closed'|trans }} + {{ 'course.draft'|trans }} + {% elseif acp.step == 'CLOSED' %} + {{ 'course.closed'|trans }} + {% elseif acp.step == 'CONFIRMED_INACTIVE_SHORT' %} + {{ 'course.inactive_short'|trans }} + {% elseif acp.step == 'CONFIRMED_INACTIVE_LONG' %} + {{ 'course.inactive_long'|trans }} {% endif %} diff --git a/src/Bundle/ChillPersonBundle/Search/PersonSearch.php b/src/Bundle/ChillPersonBundle/Search/PersonSearch.php index 7cd1849a3..dabc79475 100644 --- a/src/Bundle/ChillPersonBundle/Search/PersonSearch.php +++ b/src/Bundle/ChillPersonBundle/Search/PersonSearch.php @@ -173,7 +173,7 @@ class PersonSearch extends AbstractSearch implements HasAdvancedSearchFormInterf return $data; } - public function getAdvancedSearchTitle() + public function getAdvancedSearchTitle(): string { return 'Search within persons'; } diff --git a/src/Bundle/ChillPersonBundle/Security/Authorization/HouseholdVoter.php b/src/Bundle/ChillPersonBundle/Security/Authorization/HouseholdVoter.php index 47a15db54..6ba1ac1a9 100644 --- a/src/Bundle/ChillPersonBundle/Security/Authorization/HouseholdVoter.php +++ b/src/Bundle/ChillPersonBundle/Security/Authorization/HouseholdVoter.php @@ -97,9 +97,7 @@ class HouseholdVoter extends Voter implements ProvideRoleHierarchyInterface, Chi private function checkAssociatedMembersRole(Household $household, string $attribute): bool { - foreach ($household->getCurrentMembers()->map(static function (HouseholdMember $member) { - return $member->getPerson(); - }) as $person) { + foreach ($household->getCurrentMembers()->map(static fn (HouseholdMember $member) => $member->getPerson()) as $person) { if ($this->security->isGranted($attribute, $person)) { return true; } diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizer.php index 0e1c81592..bc13dec66 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizer.php @@ -150,12 +150,8 @@ class AccompanyingPeriodDocGenNormalizer implements ContextAwareNormalizerInterf $this->closingMotiveRender->renderString($period->getClosingMotive(), []) : '', 'ref' => $this->normalizer->normalize($period->getUser(), $format, $userContext), 'hasRef' => $period->getUser() !== null, - 'socialIssuesText' => implode(', ', array_map(function (SocialIssue $s) { - return $this->socialIssueRender->renderString($s, []); - }, $period->getSocialIssues()->toArray())), - 'scopesText' => implode(', ', array_map(function (Scope $s) { - return $this->translatableStringHelper->localize($s->getName()); - }, $scopes)), + 'socialIssuesText' => implode(', ', array_map(fn (SocialIssue $s) => $this->socialIssueRender->renderString($s, []), $period->getSocialIssues()->toArray())), + 'scopesText' => implode(', ', array_map(fn (Scope $s) => $this->translatableStringHelper->localize($s->getName()), $scopes)), 'hasRequestor' => $period->getRequestor() !== null, 'requestorKind' => $period->getRequestorKind(), 'hasLocation' => $period->getLocation() !== null, diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkEvaluationNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkEvaluationNormalizer.php index 8cd917961..a0268ae31 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkEvaluationNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkEvaluationNormalizer.php @@ -48,9 +48,7 @@ class AccompanyingPeriodWorkEvaluationNormalizer implements ContextAwareNormaliz $initial = $this->normalizer->normalize($object, $format, array_merge( $context, [self::IGNORE_EVALUATION => spl_object_hash($object)], - [AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => static function ($object, $format, $context) { - return $object->getId(); - }] + [AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => static fn ($object, $format, $context) => $object->getId()] )); // due to bug: https://api-platform.com/docs/core/serialization/#collection-relation diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php index 74ca55398..7b500e6bb 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php @@ -94,9 +94,7 @@ class PersonDocGenNormalizer implements // we simplify the list of attributes for the embedded persons AbstractNormalizer::GROUPS => ['docgen:read'], // when a person reference the same person... take care of circular references - AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object, $format, $context) { - return $this->normalizer->normalize(null, $format, $context); - }, + AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => fn ($object, $format, $context) => $this->normalizer->normalize(null, $format, $context), ]); if (null === $person) { @@ -117,9 +115,7 @@ class PersonDocGenNormalizer implements 'altNames' => implode( ', ', array_map( - static function (PersonAltName $altName) { - return $altName->getLabel(); - }, + static fn (PersonAltName $altName) => $altName->getLabel(), $person->getAltNames()->toArray() ) ), diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php index a94ae3af9..2cadd0c75 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php @@ -257,12 +257,10 @@ class PersonJsonNormalizer implements DenormalizerAwareInterface, NormalizerAwar { return $altNames ->map( - static function (PersonAltName $personAltName): array { - return [ - 'key' => $personAltName->getKey(), - 'label' => $personAltName->getLabel(), - ]; - } + static fn (PersonAltName $personAltName): array => [ + 'key' => $personAltName->getKey(), + 'label' => $personAltName->getLabel(), + ] ) ->toArray(); } diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialIssueNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialIssueNormalizer.php index 3f2e46b3f..32b1635c4 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialIssueNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialIssueNormalizer.php @@ -37,9 +37,7 @@ class SocialIssueNormalizer implements ContextAwareNormalizerInterface, Normaliz 'type' => 'social_issue', 'id' => $socialIssue->getId(), 'parent_id' => $socialIssue->hasParent() ? $socialIssue->getParent()->getId() : null, - 'children_ids' => $socialIssue->getChildren()->map(static function (SocialIssue $si) { - return $si->getId(); - }), + 'children_ids' => $socialIssue->getChildren()->map(static fn (SocialIssue $si) => $si->getId()), 'title' => $socialIssue->getTitle(), 'text' => $this->render->renderString($socialIssue, []), ]; diff --git a/src/Bundle/ChillPersonBundle/Service/AccompanyingPeriod/OldDraftAccompanyingPeriodRemover.php b/src/Bundle/ChillPersonBundle/Service/AccompanyingPeriod/OldDraftAccompanyingPeriodRemover.php index 2a608e4c1..a5663050a 100644 --- a/src/Bundle/ChillPersonBundle/Service/AccompanyingPeriod/OldDraftAccompanyingPeriodRemover.php +++ b/src/Bundle/ChillPersonBundle/Service/AccompanyingPeriod/OldDraftAccompanyingPeriodRemover.php @@ -34,7 +34,7 @@ class OldDraftAccompanyingPeriodRemover implements OldDraftAccompanyingPeriodRem public function remove(DateInterval $interval): void { - $this->logger->debug('[' . __CLASS__ . '] start to remove old periods', [ + $this->logger->debug('[' . self::class . '] start to remove old periods', [ 'interval' => $interval->format('%d days'), ]); @@ -96,7 +96,7 @@ class OldDraftAccompanyingPeriodRemover implements OldDraftAccompanyingPeriodRem ]; }); - $this->logger->info('[' . __CLASS__ . '] periods removed', array_merge($results, [ + $this->logger->info('[' . self::class . '] periods removed', array_merge($results, [ 'interval' => $interval->format('%d days'), ])); } diff --git a/src/Bundle/ChillPersonBundle/Service/DocGenerator/AccompanyingPeriodContext.php b/src/Bundle/ChillPersonBundle/Service/DocGenerator/AccompanyingPeriodContext.php index 4a08eff08..a42765c12 100644 --- a/src/Bundle/ChillPersonBundle/Service/DocGenerator/AccompanyingPeriodContext.php +++ b/src/Bundle/ChillPersonBundle/Service/DocGenerator/AccompanyingPeriodContext.php @@ -143,14 +143,10 @@ class AccompanyingPeriodContext implements ->add('category', EntityType::class, [ 'placeholder' => 'Choose a document category', 'class' => DocumentCategory::class, - 'query_builder' => static function (EntityRepository $er) { - return $er->createQueryBuilder('c') - ->where('c.documentClass = :docClass') - ->setParameter('docClass', AccompanyingCourseDocument::class); - }, - 'choice_label' => function ($entity = null) { - return $entity ? $this->translatableStringHelper->localize($entity->getName()) : ''; - }, + 'query_builder' => static fn (EntityRepository $er) => $er->createQueryBuilder('c') + ->where('c.documentClass = :docClass') + ->setParameter('docClass', AccompanyingCourseDocument::class), + 'choice_label' => fn ($entity = null) => $entity ? $this->translatableStringHelper->localize($entity->getName()) : '', ]); } @@ -160,9 +156,7 @@ class AccompanyingPeriodContext implements public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, mixed $entity): void { $options = $template->getOptions(); - $persons = new ArrayCollection($entity->getCurrentParticipations()->map(static function (AccompanyingPeriodParticipation $p) { - return $p->getPerson(); - })->toArray()); + $persons = new ArrayCollection($entity->getCurrentParticipations()->map(static fn (AccompanyingPeriodParticipation $p) => $p->getPerson())->toArray()); foreach ($entity->getCurrentParticipations() as $p) { foreach ($p->getPerson()->getResources() as $r) { @@ -187,9 +181,7 @@ class AccompanyingPeriodContext implements $builder->add($key, EntityType::class, [ 'class' => Person::class, 'choices' => $persons, - 'choice_label' => function (Person $p) { - return $this->personRender->renderString($p, ['addAge' => true]); - }, + 'choice_label' => fn (Person $p) => $this->personRender->renderString($p, ['addAge' => true]), 'multiple' => false, 'expanded' => true, 'required' => false, diff --git a/src/Bundle/ChillPersonBundle/Service/DocGenerator/AccompanyingPeriodWorkEvaluationContext.php b/src/Bundle/ChillPersonBundle/Service/DocGenerator/AccompanyingPeriodWorkEvaluationContext.php index 4718b7b00..34b339822 100644 --- a/src/Bundle/ChillPersonBundle/Service/DocGenerator/AccompanyingPeriodWorkEvaluationContext.php +++ b/src/Bundle/ChillPersonBundle/Service/DocGenerator/AccompanyingPeriodWorkEvaluationContext.php @@ -63,9 +63,7 @@ class AccompanyingPeriodWorkEvaluationContext implements $this->accompanyingPeriodWorkContext->adminFormReverseTransform($data), [ 'evaluations' => array_map( - static function (Evaluation $e) { - return $e->getId(); - }, + static fn (Evaluation $e) => $e->getId(), $data['evaluations'] ), ] @@ -78,9 +76,7 @@ class AccompanyingPeriodWorkEvaluationContext implements $this->accompanyingPeriodWorkContext->adminFormTransform($data), [ 'evaluations' => array_map( - function ($id) { - return $this->evaluationRepository->find($id); - }, + fn ($id) => $this->evaluationRepository->find($id), $data['evaluations'] ?? [] ), ] @@ -97,9 +93,7 @@ class AccompanyingPeriodWorkEvaluationContext implements 'class' => Evaluation::class, 'label' => 'Linked evaluations', 'choices' => $this->evaluationRepository->findAll(), - 'choice_label' => function (Evaluation $e) { - return $this->translatableStringHelper->localize($e->getTitle()); - }, + 'choice_label' => fn (Evaluation $e) => $this->translatableStringHelper->localize($e->getTitle()), 'multiple' => true, 'attr' => ['class' => 'select2'], ]); diff --git a/src/Bundle/ChillPersonBundle/Service/DocGenerator/PersonContext.php b/src/Bundle/ChillPersonBundle/Service/DocGenerator/PersonContext.php index c7c7d2352..1fdfd23d9 100644 --- a/src/Bundle/ChillPersonBundle/Service/DocGenerator/PersonContext.php +++ b/src/Bundle/ChillPersonBundle/Service/DocGenerator/PersonContext.php @@ -126,14 +126,10 @@ final class PersonContext implements PersonContextInterface ->add('category', EntityType::class, [ 'placeholder' => 'Choose a document category', 'class' => DocumentCategory::class, - 'query_builder' => static function (EntityRepository $er) { - return $er->createQueryBuilder('c') - ->where('c.documentClass = :docClass') - ->setParameter('docClass', PersonDocument::class); - }, - 'choice_label' => function ($entity = null) { - return $entity ? $this->translatableStringHelper->localize($entity->getName()) : ''; - }, + 'query_builder' => static fn (EntityRepository $er) => $er->createQueryBuilder('c') + ->where('c.documentClass = :docClass') + ->setParameter('docClass', PersonDocument::class), + 'choice_label' => fn ($entity = null) => $entity ? $this->translatableStringHelper->localize($entity->getName()) : '', 'required' => true, ]); } diff --git a/src/Bundle/ChillPersonBundle/Service/EntityInfo/AccompanyingPeriodInfoQueryBuilder.php b/src/Bundle/ChillPersonBundle/Service/EntityInfo/AccompanyingPeriodInfoQueryBuilder.php new file mode 100644 index 000000000..efc6c9923 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Service/EntityInfo/AccompanyingPeriodInfoQueryBuilder.php @@ -0,0 +1,49 @@ + $query->getAccompanyingPeriodIdColumn(), + '{related_entity_column_id}' => $query->getRelatedEntityColumn(), + '{related_entity_id_column_id}' => $query->getRelatedEntityIdColumn(), + '{user_id}' => $query->getUserIdColumn(), + '{datetime}' => $query->getDateTimeColumn(), + '{discriminator}' => $query->getDiscriminator(), + '{metadata}' => $query->getMetadataColumn(), + '{from_statement}' => $query->getFromStatement(), + '{where_statement}' => '' === $query->getWhereClause() ? '' : 'WHERE '.$query->getWhereClause(), + ] + ); + } +} diff --git a/src/Bundle/ChillPersonBundle/Service/EntityInfo/AccompanyingPeriodInfoQueryPart/AccompanyingPeriodStartQueryPartForAccompanyingPeriodInfo.php b/src/Bundle/ChillPersonBundle/Service/EntityInfo/AccompanyingPeriodInfoQueryPart/AccompanyingPeriodStartQueryPartForAccompanyingPeriodInfo.php new file mode 100644 index 000000000..19272900a --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Service/EntityInfo/AccompanyingPeriodInfoQueryPart/AccompanyingPeriodStartQueryPartForAccompanyingPeriodInfo.php @@ -0,0 +1,63 @@ + $this->builder->buildQuery($part), + iterator_to_array($this->unions) + ) + ); + } + + public function getViewName(): string + { + return 'view_chill_person_accompanying_period_info'; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/AccompanyingPeriodConfidentialTest.php b/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/AccompanyingPeriodConfidentialTest.php index 1d1711ce4..dc5c5c2ce 100644 --- a/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/AccompanyingPeriodConfidentialTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/AccompanyingPeriodConfidentialTest.php @@ -110,7 +110,7 @@ final class AccompanyingPeriodConfidentialTest extends WebTestCase [], // parameters [], // files [], // server parameters - json_encode(['type' => 'accompanying_period', 'user' => $user]) + json_encode(['type' => 'accompanying_period', 'user' => $user], JSON_THROW_ON_ERROR) ); $response = $this->client->getResponse(); diff --git a/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/Events/PersonMoveEventSubscriberTest.php b/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/Events/PersonMoveEventSubscriberTest.php index e35766a75..4f9977b6d 100644 --- a/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/Events/PersonMoveEventSubscriberTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/Events/PersonMoveEventSubscriberTest.php @@ -162,7 +162,7 @@ final class PersonMoveEventSubscriberTest extends KernelTestCase ->setNextMembership($nextMembership); $notificationPersister = $this->prophesize(NotificationPersisterInterface::class); - $notificationPersister->persist(Argument::type(Notification::class))->shouldBeCalled(1); + $notificationPersister->persist(Argument::type(Notification::class))->shouldBeCalled(); $eventSubscriber = $this->buildSubscriber(null, $notificationPersister->reveal(), null, null); $eventSubscriber->resetPeriodLocation($event); diff --git a/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeCronjobTest.php b/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeCronjobTest.php new file mode 100644 index 000000000..5c3c29179 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/Lifecycle/AccompanyingPeriodStepChangeCronjobTest.php @@ -0,0 +1,55 @@ +prophesize(AccompanyingPeriodStepChangeRequestor::class); + $clock = new MockClock($datetime); + + $cronJob = new AccompanyingPeriodStepChangeCronjob($clock, $requestor->reveal()); + $cronJobExecution = (new CronJobExecution($cronJob->getKey()))->setLastStart($lastExecutionStart); + + $this->assertEquals($canRun, $cronJob->canRun($cronJobExecution)); + } + + public function provideRunTimes(): iterable + { + // can run, during the night + yield ['2023-01-15T01:00:00+02:00', new \DateTimeImmutable('2023-01-14T00:00:00+02:00'), true]; + + // can not run, not during the night + yield ['2023-01-15T10:00:00+02:00', new \DateTimeImmutable('2023-01-14T00:00:00+02:00'), false]; + + // can not run: not enough elapsed time + yield ['2023-01-15T01:00:00+02:00', new \DateTimeImmutable('2023-01-15T00:30:00+02:00'), false]; + } + +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingCourseApiControllerTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingCourseApiControllerTest.php index 154dbd884..ac722f2f6 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingCourseApiControllerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingCourseApiControllerTest.php @@ -313,10 +313,10 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase [], // parameters [], // files [], // server parameters - json_encode(['type' => 'person', 'id' => $personId]) + json_encode(['type' => 'person', 'id' => $personId], JSON_THROW_ON_ERROR) ); $response = $this->client->getResponse(); - $data = json_decode($response->getContent(), true); + $data = json_decode($response->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertTrue(in_array($response->getStatusCode(), [200, 422], true)); @@ -338,13 +338,11 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase } $response = $this->client->getResponse(); - $data = json_decode($response->getContent()); + $data = json_decode($response->getContent(), null, 512, JSON_THROW_ON_ERROR); // check that the person id is contained $participationsPersonsIds = array_map( - static function ($participation) { - return $participation->person->id; - }, + static fn ($participation) => $participation->person->id, $data->participations ); @@ -357,10 +355,10 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase [], // parameters [], // files [], // server parameters - json_encode(['type' => 'person', 'id' => $personId]) + json_encode(['type' => 'person', 'id' => $personId], JSON_THROW_ON_ERROR) ); $response = $this->client->getResponse(); - $data = json_decode($response->getContent(), true); + $data = json_decode($response->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertTrue(in_array($response->getStatusCode(), [200, 422], true)); @@ -387,7 +385,7 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase [], [], [], - json_encode(['type' => 'social_issue', 'id' => $si->getId()]) + json_encode(['type' => 'social_issue', 'id' => $si->getId()], JSON_THROW_ON_ERROR) ); $this->assertTrue(in_array($this->client->getResponse()->getStatusCode(), [200, 422], true)); @@ -396,7 +394,7 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase $this->markTestSkipped('the next tests should appears only on valid accompanying period'); } - $data = json_decode($this->client->getResponse()->getContent(), true); + $data = json_decode($this->client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertArrayHasKey('id', $data); $this->assertArrayHasKey('type', $data); $this->assertEquals('social_issue', $data['type']); @@ -407,7 +405,7 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase [], [], [], - json_encode(['type' => 'social_issue', 'id' => $si->getId()]) + json_encode(['type' => 'social_issue', 'id' => $si->getId()], JSON_THROW_ON_ERROR) ); $this->assertTrue(in_array($this->client->getResponse()->getStatusCode(), [200, 422], true)); @@ -427,7 +425,7 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase $this->markTestSkipped('the next tests should appears only on valid accompanying period'); } - $data = json_decode($response->getContent()); + $data = json_decode($response->getContent(), null, 512, JSON_THROW_ON_ERROR); $this->assertEquals( $data->id, $periodId, @@ -453,7 +451,7 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase [], // parameters [], // files [], // server parameters - json_encode(['type' => 'accompanying_period', 'emergency' => !$initialValueEmergency]) + json_encode(['type' => 'accompanying_period', 'emergency' => !$initialValueEmergency], JSON_THROW_ON_ERROR) ); $response = $this->client->getResponse(); @@ -492,7 +490,7 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase json_encode(['type' => 'accompanying_period_comment', 'content' => 'this is a text']) ); $response = $this->client->getResponse(); - $data = json_decode($response->getContent(), true); + $data = json_decode($response->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertTrue(in_array($response->getStatusCode(), [200, 422], true)); @@ -508,10 +506,10 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase [], // parameters [], // files [], // server parameters - json_encode(['type' => 'accompanying_period_comment', 'id' => $data['id']]) + json_encode(['type' => 'accompanying_period_comment', 'id' => $data['id']], JSON_THROW_ON_ERROR) ); $response = $this->client->getResponse(); - $data = json_decode($response->getContent(), true); + $data = json_decode($response->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertTrue(in_array($response->getStatusCode(), [200, 422], true)); } @@ -568,10 +566,10 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase [], // parameters [], // files [], // server parameters - json_encode(['type' => 'person', 'id' => $personId]) + json_encode(['type' => 'person', 'id' => $personId], JSON_THROW_ON_ERROR) ); $response = $this->client->getResponse(); - $data = json_decode($response->getContent(), true); + $data = json_decode($response->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertTrue(in_array($response->getStatusCode(), [200, 422], true)); @@ -595,10 +593,10 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase [], // parameters [], // files [], // server parameters - json_encode(['type' => 'thirdparty', 'id' => $thirdPartyId]) + json_encode(['type' => 'thirdparty', 'id' => $thirdPartyId], JSON_THROW_ON_ERROR) ); $response = $this->client->getResponse(); - $data = json_decode($response->getContent(), true); + $data = json_decode($response->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertTrue(in_array($response->getStatusCode(), [200, 422], true)); @@ -655,7 +653,7 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase json_encode(['type' => 'accompanying_period_resource', 'resource' => ['type' => 'person', 'id' => $personId]]) ); $response = $this->client->getResponse(); - $data = json_decode($response->getContent(), true); + $data = json_decode($response->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertTrue(in_array($response->getStatusCode(), [200, 422], true)); @@ -680,7 +678,7 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase [], [], [], //server - json_encode(['type' => 'accompanying_period_resource', 'id' => $resource->getId()]) + json_encode(['type' => 'accompanying_period_resource', 'id' => $resource->getId()], JSON_THROW_ON_ERROR) ); $response = $this->client->getResponse(); $this->assertTrue(in_array($response->getStatusCode(), [200, 422], true)); @@ -699,7 +697,7 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase json_encode(['type' => 'accompanying_period_resource', 'resource' => ['type' => 'thirdparty', 'id' => $thirdPartyId]]) ); $response = $this->client->getResponse(); - $data = json_decode($response->getContent(), true); + $data = json_decode($response->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertTrue(in_array($response->getStatusCode(), [200, 422], true)); @@ -724,7 +722,7 @@ final class AccompanyingCourseApiControllerTest extends WebTestCase [], [], [], //server - json_encode(['type' => 'accompanying_period_resource', 'id' => $resource->getId()]) + json_encode(['type' => 'accompanying_period_resource', 'id' => $resource->getId()], JSON_THROW_ON_ERROR) ); $response = $this->client->getResponse(); $this->assertTrue(in_array($response->getStatusCode(), [200, 422], true)); diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php index 8686172ee..f01eeeaa9 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php @@ -157,13 +157,11 @@ final class HouseholdApiControllerTest extends WebTestCase ); $this->assertResponseIsSuccessful(); - $data = json_decode($client->getResponse()->getContent(), true); + $data = json_decode($client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertArrayHasKey('count', $data); $this->assertArrayHasKey('results', $data); - $householdIds = array_map(static function ($r) { - return $r['id']; - }, $data['results']); + $householdIds = array_map(static fn ($r) => $r['id'], $data['results']); $this->assertContains($expectedHouseholdId, $householdIds); } diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdMemberControllerTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdMemberControllerTest.php index 34c7e3113..56000c3e0 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdMemberControllerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdMemberControllerTest.php @@ -179,7 +179,7 @@ final class HouseholdMemberControllerTest extends WebTestCase $client->getResponse()->getStatusCode() ); - $data = json_decode($client->getResponse()->getContent(), true); + $data = json_decode($client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertEquals(null, $data); } @@ -284,7 +284,7 @@ final class HouseholdMemberControllerTest extends WebTestCase $client->getResponse()->getStatusCode() ); - $data = json_decode($client->getResponse()->getContent(), true); + $data = json_decode($client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertIsArray($data); $this->assertArrayHasKey('members', $data); diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/PersonApiControllerTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/PersonApiControllerTest.php index f5a886fa6..0de312d84 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Controller/PersonApiControllerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Controller/PersonApiControllerTest.php @@ -112,7 +112,7 @@ final class PersonApiControllerTest extends WebTestCase $this->assertResponseIsSuccessful(); - $data = json_decode($client->getResponse()->getContent(), true); + $data = json_decode($client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertArrayHasKey('type', $data); $this->assertArrayHasKey('id', $data); diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerCreateTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerCreateTest.php index fbba0bbc3..6f92c864b 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerCreateTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerCreateTest.php @@ -89,7 +89,7 @@ final class PersonControllerCreateTest extends WebTestCase $form = $crawler->selectButton('Ajouter la personne')->form(); $this->assertInstanceOf( - 'Symfony\Component\DomCrawler\Form', + \Symfony\Component\DomCrawler\Form::class, $form, 'The page contains a butto ' ); diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerUpdateTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerUpdateTest.php index bb70866e2..94b618e41 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerUpdateTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerUpdateTest.php @@ -294,49 +294,23 @@ final class PersonControllerUpdateTest extends WebTestCase public function validTextFieldsProvider() { return [ - ['firstName', 'random Value', static function (Person $person) { - return $person->getFirstName(); - }], - ['lastName', 'random Value', static function (Person $person) { - return $person->getLastName(); - }], + ['firstName', 'random Value', static fn (Person $person) => $person->getFirstName()], + ['lastName', 'random Value', static fn (Person $person) => $person->getLastName()], // reminder: this value is capitalized - ['placeOfBirth', 'A PLACE', static function (Person $person) { - return $person->getPlaceOfBirth(); - }], - ['birthdate', '1980-12-15', static function (Person $person) { - return $person->getBirthdate()->format('Y-m-d'); - }], + ['placeOfBirth', 'A PLACE', static fn (Person $person) => $person->getPlaceOfBirth()], + ['birthdate', '1980-12-15', static fn (Person $person) => $person->getBirthdate()->format('Y-m-d')], // TODO test on phonenumber update // ['phonenumber', '+32123456789', static function (Person $person) { return $person->getPhonenumber(); }], - ['memo', 'jfkdlmq jkfldmsq jkmfdsq', static function (Person $person) { - return $person->getMemo(); - }], - ['countryOfBirth', 'BE', static function (Person $person) { - return $person->getCountryOfBirth()->getCountryCode(); - }], - ['nationality', 'FR', static function (Person $person) { - return $person->getNationality()->getCountryCode(); - }], - ['placeOfBirth', '', static function (Person $person) { - return $person->getPlaceOfBirth(); - }], - ['birthdate', '', static function (Person $person) { - return $person->getBirthdate(); - }], + ['memo', 'jfkdlmq jkfldmsq jkmfdsq', static fn (Person $person) => $person->getMemo()], + ['countryOfBirth', 'BE', static fn (Person $person) => $person->getCountryOfBirth()->getCountryCode()], + ['nationality', 'FR', static fn (Person $person) => $person->getNationality()->getCountryCode()], + ['placeOfBirth', '', static fn (Person $person) => $person->getPlaceOfBirth()], + ['birthdate', '', static fn (Person $person) => $person->getBirthdate()], //['phonenumber', '', static function (Person $person) { return $person->getPhonenumber(); }], - ['memo', '', static function (Person $person) { - return $person->getMemo(); - }], - ['countryOfBirth', null, static function (Person $person) { - return $person->getCountryOfBirth(); - }], - ['nationality', null, static function (Person $person) { - return $person->getNationality(); - }], - ['gender', Person::FEMALE_GENDER, static function (Person $person) { - return $person->getGender(); - }], + ['memo', '', static fn (Person $person) => $person->getMemo()], + ['countryOfBirth', null, static fn (Person $person) => $person->getCountryOfBirth()], + ['nationality', null, static fn (Person $person) => $person->getNationality()], + ['gender', Person::FEMALE_GENDER, static fn (Person $person) => $person->getGender()], ]; } diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerUpdateWithHiddenFieldsTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerUpdateWithHiddenFieldsTest.php index 403f89dd4..441358c02 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerUpdateWithHiddenFieldsTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerUpdateWithHiddenFieldsTest.php @@ -197,24 +197,12 @@ final class PersonControllerUpdateWithHiddenFieldsTest extends WebTestCase public function validTextFieldsProvider() { return [ - ['firstName', 'random Value', static function (Person $person) { - return $person->getFirstName(); - }], - ['lastName', 'random Value', static function (Person $person) { - return $person->getLastName(); - }], - ['birthdate', '15-12-1980', static function (Person $person) { - return $person->getBirthdate()->format('d-m-Y'); - }], - ['memo', 'jfkdlmq jkfldmsq jkmfdsq', static function (Person $person) { - return $person->getMemo(); - }], - ['birthdate', '', static function (Person $person) { - return $person->getBirthdate(); - }], - ['gender', Person::FEMALE_GENDER, static function (Person $person) { - return $person->getGender(); - }], + ['firstName', 'random Value', static fn (Person $person) => $person->getFirstName()], + ['lastName', 'random Value', static fn (Person $person) => $person->getLastName()], + ['birthdate', '15-12-1980', static fn (Person $person) => $person->getBirthdate()->format('d-m-Y')], + ['memo', 'jfkdlmq jkfldmsq jkmfdsq', static fn (Person $person) => $person->getMemo()], + ['birthdate', '', static fn (Person $person) => $person->getBirthdate()], + ['gender', Person::FEMALE_GENDER, static fn (Person $person) => $person->getGender()], ]; } diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/RelationshipApiControllerTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/RelationshipApiControllerTest.php index 67b45acd5..d6fb7a8da 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Controller/RelationshipApiControllerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Controller/RelationshipApiControllerTest.php @@ -136,7 +136,7 @@ final class RelationshipApiControllerTest extends WebTestCase 'toPerson' => ['id' => $toPersonId, 'type' => 'person'], 'relation' => ['id' => $relationId, 'type' => 'relation'], 'reverse' => $isReverse, - ]) + ], JSON_THROW_ON_ERROR) ); $response = $this->client->getResponse(); diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/SocialIssueApiControllerTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/SocialIssueApiControllerTest.php index a0dcae59a..ba19fc56e 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Controller/SocialIssueApiControllerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Controller/SocialIssueApiControllerTest.php @@ -47,7 +47,7 @@ final class SocialIssueApiControllerTest extends WebTestCase $this->assertEquals(200, $client->getResponse()->getStatusCode()); - $data = json_decode($client->getResponse()->getContent(), true); + $data = json_decode($client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertArrayHasKey('id', $data); $this->assertArrayHasKey('type', $data); @@ -60,7 +60,7 @@ final class SocialIssueApiControllerTest extends WebTestCase $this->assertEquals(200, $client->getResponse()->getStatusCode()); - $data = json_decode($client->getResponse()->getContent(), true); + $data = json_decode($client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR); $this->assertGreaterThan(0, $data['count']); $this->assertGreaterThan(0, count($data['results'])); diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/SocialWorkEvaluationApiControllerTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/SocialWorkEvaluationApiControllerTest.php index aa98fdcd3..9ed62e4b3 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Controller/SocialWorkEvaluationApiControllerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Controller/SocialWorkEvaluationApiControllerTest.php @@ -77,7 +77,7 @@ final class SocialWorkEvaluationApiControllerTest extends WebTestCase $this->assertResponseIsSuccessful(); - $content = json_decode($client->getResponse()->getContent(), true); + $content = json_decode($client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR); $ids = array_map(static fn (array $item) => $item['id'], $content['results']); diff --git a/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php b/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php index 2f38da244..0a9c22df1 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php @@ -152,9 +152,7 @@ final class AccompanyingPeriodTest extends \PHPUnit\Framework\TestCase $locations = $period->getLocationHistories()->toArray(); - usort($locations, static function (AccompanyingPeriod\AccompanyingPeriodLocationHistory $a, AccompanyingPeriod\AccompanyingPeriodLocationHistory $b) { - return $a->getStartDate() <=> $b->getStartDate(); - }); + usort($locations, static fn (AccompanyingPeriod\AccompanyingPeriodLocationHistory $a, AccompanyingPeriod\AccompanyingPeriodLocationHistory $b) => $a->getStartDate() <=> $b->getStartDate()); $iterator = new ArrayIterator($locations); $iterator->rewind(); diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingCourseFilters/StepFilterTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingCourseFilters/StepFilterTest.php index 9388aa8ae..42eec5823 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingCourseFilters/StepFilterTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingCourseFilters/StepFilterTest.php @@ -40,6 +40,8 @@ final class StepFilterTest extends AbstractFilterTest return [ ['accepted_steps' => AccompanyingPeriod::STEP_DRAFT], ['accepted_steps' => AccompanyingPeriod::STEP_CONFIRMED], + ['accepted_steps' => AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_LONG], + ['accepted_steps' => AccompanyingPeriod::STEP_CONFIRMED_INACTIVE_SHORT], ['accepted_steps' => AccompanyingPeriod::STEP_CLOSED], ]; } diff --git a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php index a58560bdd..8ec7ee573 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php @@ -101,19 +101,13 @@ final class MembersEditorTest extends TestCase $editor = $factory->createEditor($household2 = new Household()); $editor->addMovement(new DateTimeImmutable('yesterday'), $person, $positionNotSharing); - $sharings = $household->getCurrentMembers()->filter(static function (HouseholdMember $m) { - return $m->getShareHousehold(); - }); - $notSharing = $household2->getCurrentMembers()->filter(static function (HouseholdMember $m) { - return !$m->getShareHousehold(); - }); + $sharings = $household->getCurrentMembers()->filter(static fn (HouseholdMember $m) => $m->getShareHousehold()); + $notSharing = $household2->getCurrentMembers()->filter(static fn (HouseholdMember $m) => !$m->getShareHousehold()); $this->assertCount(1, $notSharing); $this->assertCount(1, $sharings); - $getPerson = static function (HouseholdMember $m) { - return $m->getPerson(); - }; + $getPerson = static fn (HouseholdMember $m) => $m->getPerson(); $this->assertContains($person, $notSharing->map($getPerson)); } @@ -143,19 +137,13 @@ final class MembersEditorTest extends TestCase $editor = $factory->createEditor($household); $editor->addMovement(new DateTimeImmutable('yesterday'), $person, $positionNotSharing); - $sharings = $household->getCurrentMembers()->filter(static function (HouseholdMember $m) { - return $m->getShareHousehold(); - }); - $notSharing = $household->getCurrentMembers()->filter(static function (HouseholdMember $m) { - return !$m->getShareHousehold(); - }); + $sharings = $household->getCurrentMembers()->filter(static fn (HouseholdMember $m) => $m->getShareHousehold()); + $notSharing = $household->getCurrentMembers()->filter(static fn (HouseholdMember $m) => !$m->getShareHousehold()); $this->assertCount(1, $notSharing); $this->assertCount(0, $sharings); - $getPerson = static function (HouseholdMember $m) { - return $m->getPerson(); - }; + $getPerson = static fn (HouseholdMember $m) => $m->getPerson(); $this->assertContains($person, $notSharing->map($getPerson)); } diff --git a/src/Bundle/ChillPersonBundle/Tests/Security/Authorization/PersonVoterTest.php b/src/Bundle/ChillPersonBundle/Tests/Security/Authorization/PersonVoterTest.php index d7f08a3a4..e6651028c 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Security/Authorization/PersonVoterTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Security/Authorization/PersonVoterTest.php @@ -158,7 +158,7 @@ final class PersonVoterTest extends KernelTestCase { $token = $this->prophet->prophesize(); $token - ->willImplement('\Symfony\Component\Security\Core\Authentication\Token\TokenInterface'); + ->willImplement('\\' . \Symfony\Component\Security\Core\Authentication\Token\TokenInterface::class); if (null === $permissions) { $token->getUser()->willReturn(null); diff --git a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/AccompanyingPeriodWorkDocGenNormalizerTest.php b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/AccompanyingPeriodWorkDocGenNormalizerTest.php index e71e0bf51..ce226834b 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/AccompanyingPeriodWorkDocGenNormalizerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/AccompanyingPeriodWorkDocGenNormalizerTest.php @@ -88,7 +88,7 @@ final class AccompanyingPeriodWorkDocGenNormalizerTest extends KernelTestCase $this->assertEqualsCanonicalizing(array_keys($expected), array_keys($actual)); foreach ($expected as $key => $item) { - if ('@ignored' === $item) { + if (0 === $item) { continue; } diff --git a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/HouseholdNormalizerTest.php b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/HouseholdNormalizerTest.php index acd4119a1..093b882ce 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/HouseholdNormalizerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/HouseholdNormalizerTest.php @@ -18,6 +18,7 @@ use Chill\PersonBundle\Entity\Person; use DateTimeImmutable; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; /** @@ -39,7 +40,7 @@ final class HouseholdNormalizerTest extends KernelTestCase $this->entityManager = self::$container->get(EntityManagerInterface::class); } - public function testNormalizationRecursive() + public function testNormalizationRecursive(): void { $person = new Person(); $person->setFirstName('ok')->setLastName('ok'); @@ -67,4 +68,53 @@ final class HouseholdNormalizerTest extends KernelTestCase $this->assertArrayHasKey('type', $normalized); $this->assertEquals('household', $normalized['type']); } + + /** + * When a household have old members (members which are not "current"), + * the indexes of the household must be reset to numerical and contiguous + * indexes. This ensure that it will be mapped as a list, not as an associative + * array. + */ + public function testHouseholdDocGenNormalizationWithOldMembers(): void + { + $previousPerson = new Person(); + $previousPerson->setFirstName('ok')->setLastName('ok'); + $this->entityManager->persist($previousPerson); + $member = new HouseholdMember(); + $household = new Household(); + $position = (new Position()) + ->setShareHousehold(true) + ->setAllowHolder(true); + + $member->setPerson($previousPerson) + ->setStartDate(new DateTimeImmutable('1 year ago')) + ->setEndDate(new DateTimeImmutable('1 month ago')) + ->setPosition($position); + + $household->addMember($member); + + $currentPerson1 = new Person(); + $currentPerson1->setFirstName('p1')->setLastName('p1'); + $this->entityManager->persist($currentPerson1); + $member = new HouseholdMember(); + $member->setPerson($currentPerson1) + ->setStartDate(new DateTimeImmutable('1 year ago')) + ->setPosition($position); + $household->addMember($member); + + $normalized = $this->normalizer->normalize( + $household, + 'docgen', + [ + AbstractNormalizer::GROUPS => ['docgen:read'], + 'docgen:expects' => Household::class, + 'docgen:person:with-household' => false, + 'docgen:person:with-relations' => false, + 'docgen:person:with-budget' => false, + ] + ); + + self::assertIsArray($normalized); + self::assertArrayHasKey(0, $normalized['currentMembers']); + } } diff --git a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php index e85813d62..f7a05f7ce 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php @@ -318,9 +318,7 @@ final class PersonDocGenNormalizerTest extends KernelTestCase $normalizerManager = $this->prophesize(NormalizerInterface::class); $normalizerManager->supportsNormalization(Argument::any(), 'docgen', Argument::any())->willReturn(true); $normalizerManager->normalize(Argument::type(Person::class), 'docgen', Argument::any()) - ->will(static function ($args) use ($normalizer) { - return $normalizer->normalize($args[0], $args[1], $args[2]); - }); + ->will(static fn ($args) => $normalizer->normalize($args[0], $args[1], $args[2])); $normalizerManager->normalize(Argument::any(), 'docgen', Argument::any())->will( static function ($args) { if (is_iterable($args[0])) { diff --git a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/RelationshipDocGenNormalizerTest.php b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/RelationshipDocGenNormalizerTest.php index 05d2eace1..6b3f49fde 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/RelationshipDocGenNormalizerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/RelationshipDocGenNormalizerTest.php @@ -118,9 +118,7 @@ final class RelationshipDocGenNormalizerTest extends TestCase { $translatableStringHelper = $this->prophesize(TranslatableStringHelperInterface::class); $translatableStringHelper->localize(Argument::type('array'))->will( - static function ($args) { - return $args[0][array_keys($args[0])[0]]; - } + static fn ($args) => $args[0][array_keys($args[0])[0]] ); $normalizer = new RelationshipDocGenNormalizer( @@ -130,9 +128,7 @@ final class RelationshipDocGenNormalizerTest extends TestCase $normalizerManager = $this->prophesize(NormalizerInterface::class); $normalizerManager->supportsNormalization(Argument::any(), 'docgen', Argument::any())->willReturn(true); $normalizerManager->normalize(Argument::type(Relationship::class), 'docgen', Argument::any()) - ->will(static function ($args) use ($normalizer) { - return $normalizer->normalize($args[0], $args[1], $args[2]); - }); + ->will(static fn ($args) => $normalizer->normalize($args[0], $args[1], $args[2])); $normalizerManager->normalize(Argument::any(), 'docgen', Argument::any())->will( static function ($args) { if (null === $args[0]) { diff --git a/src/Bundle/ChillPersonBundle/Tests/Service/DocGenerator/PersonContextTest.php b/src/Bundle/ChillPersonBundle/Tests/Service/DocGenerator/PersonContextTest.php index 44414cdba..d0138dc30 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Service/DocGenerator/PersonContextTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Service/DocGenerator/PersonContextTest.php @@ -187,8 +187,7 @@ final class PersonContextTest extends TestCase { $builder = $this->prophesize(FormBuilderInterface::class); - $builder->add('title', TextType::class, Argument::type('array')) - ->shouldBeCalled(1); + $builder->add('title', TextType::class, Argument::type('array'))->shouldBeCalled(); if ($withScope) { $builder->add('scope', ScopePickerType::class, Argument::type('array')) @@ -264,9 +263,7 @@ final class PersonContextTest extends TestCase if (null === $translatableStringHelper) { $translatableStringHelper = $this->prophesize(TranslatableStringHelperInterface::class); // return only the 'fr' key - $translatableStringHelper->localize(Argument::type('array'))->will(static function ($args) { - return $args[0]['fr']; - }); + $translatableStringHelper->localize(Argument::type('array'))->will(static fn ($args) => $args[0]['fr']); $translatableStringHelper = $translatableStringHelper->reveal(); } diff --git a/src/Bundle/ChillPersonBundle/Tests/Service/DocGenerator/PersonContextWithThirdPartyTest.php b/src/Bundle/ChillPersonBundle/Tests/Service/DocGenerator/PersonContextWithThirdPartyTest.php index a4f08e7c1..70bccfda4 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Service/DocGenerator/PersonContextWithThirdPartyTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Service/DocGenerator/PersonContextWithThirdPartyTest.php @@ -70,9 +70,7 @@ final class PersonContextWithThirdPartyTest extends KernelTestCase { $normalizer = $this->prophesize(NormalizerInterface::class); $normalizer->normalize(Argument::type(ThirdParty::class), 'docgen', Argument::type('array')) - ->will(static function ($args): array { - return ['class' => '3party', 'hash' => spl_object_hash($args[0])]; - }); + ->will(static fn ($args): array => ['class' => '3party', 'hash' => spl_object_hash($args[0])]); $personContext = $this->prophesize(PersonContextInterface::class); diff --git a/src/Bundle/ChillPersonBundle/Validator/Constraints/AccompanyingPeriod/AccompanyingPeriodValidityValidator.php b/src/Bundle/ChillPersonBundle/Validator/Constraints/AccompanyingPeriod/AccompanyingPeriodValidityValidator.php index 9454d31d0..ed0337f1f 100644 --- a/src/Bundle/ChillPersonBundle/Validator/Constraints/AccompanyingPeriod/AccompanyingPeriodValidityValidator.php +++ b/src/Bundle/ChillPersonBundle/Validator/Constraints/AccompanyingPeriod/AccompanyingPeriodValidityValidator.php @@ -74,9 +74,7 @@ class AccompanyingPeriodValidityValidator extends ConstraintValidator $periodIssuesWithAncestors = array_merge( $periodIssuesWithAncestors, array_map( - static function (SocialIssue $si) { - return spl_object_hash($si); - }, + static fn (SocialIssue $si) => spl_object_hash($si), $si->getAncestors(true) ) ); diff --git a/src/Bundle/ChillPersonBundle/config/services.yaml b/src/Bundle/ChillPersonBundle/config/services.yaml index f989b5dda..45548d843 100644 --- a/src/Bundle/ChillPersonBundle/config/services.yaml +++ b/src/Bundle/ChillPersonBundle/config/services.yaml @@ -98,3 +98,7 @@ services: autowire: true autoconfigure: true resource: '../Workflow/' + + Chill\PersonBundle\Service\EntityInfo\AccompanyingPeriodViewEntityInfoProvider: + arguments: + $unions: !tagged_iterator chill_person.accompanying_period_info_part diff --git a/src/Bundle/ChillPersonBundle/config/services/accompanyingPeriod.yaml b/src/Bundle/ChillPersonBundle/config/services/accompanyingPeriod.yaml index 7d7f9072d..e6b35de77 100644 --- a/src/Bundle/ChillPersonBundle/config/services/accompanyingPeriod.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/accompanyingPeriod.yaml @@ -25,6 +25,11 @@ services: autowire: true autoconfigure: true + Chill\PersonBundle\AccompanyingPeriod\Lifecycle\: + resource: './../../AccompanyingPeriod/Lifecycle' + autowire: true + autoconfigure: true + Chill\PersonBundle\AccompanyingPeriod\Events\UserRefEventSubscriber: autowire: true autoconfigure: true diff --git a/src/Bundle/ChillPersonBundle/config/services/exports_accompanying_course.yaml b/src/Bundle/ChillPersonBundle/config/services/exports_accompanying_course.yaml index bb2cfa556..adde8d336 100644 --- a/src/Bundle/ChillPersonBundle/config/services/exports_accompanying_course.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/exports_accompanying_course.yaml @@ -128,6 +128,13 @@ services: tags: - { name: chill.export_filter, alias: accompanyingcourse_creator_job_filter } + Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters\UserWorkingOnCourseFilter: + tags: + - { name: chill.export_filter, alias: accompanyingcourse_user_working_on_filter } + + Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters\HavingAnAccompanyingPeriodInfoWithinDatesFilter: + tags: + - { name: chill.export_filter, alias: accompanyingcourse_info_within_filter } ## Aggregators chill.person.export.aggregator_referrer_scope: diff --git a/src/Bundle/ChillPersonBundle/migrations/Version20160818113633.php b/src/Bundle/ChillPersonBundle/migrations/Version20160818113633.php index 0e06fccab..6b11a1d63 100644 --- a/src/Bundle/ChillPersonBundle/migrations/Version20160818113633.php +++ b/src/Bundle/ChillPersonBundle/migrations/Version20160818113633.php @@ -45,7 +45,7 @@ class Version20160818113633 extends AbstractMigration foreach ($personIdAndCFData as $person) { $personId = $person['id']; $cFDataArray = unserialize($person['cfdata']); - $cFDataJson = json_encode($cFDataArray); + $cFDataJson = json_encode($cFDataArray, JSON_THROW_ON_ERROR); $this->addSql( 'UPDATE person set cfdata = :cfdatajson WHERE id = :id', ['cfdatajson' => $cFDataJson, 'id' => $personId] diff --git a/src/Bundle/ChillPersonBundle/migrations/Version20181023101621.php b/src/Bundle/ChillPersonBundle/migrations/Version20181023101621.php index 4f7765000..d3adb3401 100644 --- a/src/Bundle/ChillPersonBundle/migrations/Version20181023101621.php +++ b/src/Bundle/ChillPersonBundle/migrations/Version20181023101621.php @@ -40,20 +40,20 @@ final class Version20181023101621 extends AbstractMigration $this->addSql('CREATE INDEX fullnameCanonical_trgm_idx ON chill_person_person USING GIN (fullnameCanonical gin_trgm_ops)'); $this->addSql( - <<<'SQL' - CREATE OR REPLACE FUNCTION canonicalize_fullname_on_update() RETURNS TRIGGER AS - $BODY$ - BEGIN - IF NEW.firstname <> OLD.firstname OR NEW.lastname <> OLD.lastname - THEN - UPDATE chill_person_person - SET fullnameCanonical=LOWER(UNACCENT(CONCAT(NEW.firstname, ' ', NEW.lastname))) - WHERE id=NEW.id; - END IF; - RETURN NEW; - END; - $BODY$ LANGUAGE PLPGSQL; - SQL + <<<'SQL_WRAP' + CREATE OR REPLACE FUNCTION canonicalize_fullname_on_update() RETURNS TRIGGER AS + $BODY$ + BEGIN + IF NEW.firstname <> OLD.firstname OR NEW.lastname <> OLD.lastname + THEN + UPDATE chill_person_person + SET fullnameCanonical=LOWER(UNACCENT(CONCAT(NEW.firstname, ' ', NEW.lastname))) + WHERE id=NEW.id; + END IF; + RETURN NEW; + END; + $BODY$ LANGUAGE PLPGSQL; +SQL_WRAP ); $this->addSql( <<<'SQL' @@ -67,17 +67,17 @@ final class Version20181023101621 extends AbstractMigration ); $this->addSql( - <<<'SQL' - CREATE OR REPLACE FUNCTION canonicalize_fullname_on_insert() RETURNS TRIGGER AS - $BODY$ - BEGIN - UPDATE chill_person_person - SET fullnameCanonical=LOWER(UNACCENT(CONCAT(NEW.firstname, ' ', NEW.lastname))) - WHERE id=NEW.id; - RETURN NEW; - END; - $BODY$ LANGUAGE PLPGSQL; - SQL + <<<'SQL_WRAP' + CREATE OR REPLACE FUNCTION canonicalize_fullname_on_insert() RETURNS TRIGGER AS + $BODY$ + BEGIN + UPDATE chill_person_person + SET fullnameCanonical=LOWER(UNACCENT(CONCAT(NEW.firstname, ' ', NEW.lastname))) + WHERE id=NEW.id; + RETURN NEW; + END; + $BODY$ LANGUAGE PLPGSQL; +SQL_WRAP ); $this->addSql( <<<'SQL' diff --git a/src/Bundle/ChillPersonBundle/migrations/Version20200130213446.php b/src/Bundle/ChillPersonBundle/migrations/Version20200130213446.php index 947d26357..7d48b5f53 100644 --- a/src/Bundle/ChillPersonBundle/migrations/Version20200130213446.php +++ b/src/Bundle/ChillPersonBundle/migrations/Version20200130213446.php @@ -130,20 +130,20 @@ final class Version20200130213446 extends AbstractMigration $this->addSql('DROP TRIGGER canonicalize_fullname_on_alt_name_delete ON chill_person_alt_name;'); $this->addSql('DROP FUNCTION canonicalize_fullname_on_alt_name_alter();'); $this->addSql( - <<<'SQL' - CREATE OR REPLACE FUNCTION canonicalize_fullname_on_update() RETURNS TRIGGER AS - $BODY$ - BEGIN - IF NEW.firstname <> OLD.firstname OR NEW.lastname <> OLD.lastname - THEN - UPDATE chill_person_person - SET fullnameCanonical=LOWER(UNACCENT(CONCAT(NEW.firstname, ' ', NEW.lastname))) - WHERE id=NEW.id; - END IF; - RETURN NEW; - END; - $BODY$ LANGUAGE PLPGSQL; - SQL + <<<'SQL_WRAP' + CREATE OR REPLACE FUNCTION canonicalize_fullname_on_update() RETURNS TRIGGER AS + $BODY$ + BEGIN + IF NEW.firstname <> OLD.firstname OR NEW.lastname <> OLD.lastname + THEN + UPDATE chill_person_person + SET fullnameCanonical=LOWER(UNACCENT(CONCAT(NEW.firstname, ' ', NEW.lastname))) + WHERE id=NEW.id; + END IF; + RETURN NEW; + END; + $BODY$ LANGUAGE PLPGSQL; +SQL_WRAP ); } diff --git a/src/Bundle/ChillPersonBundle/migrations/Version20230427102309.php b/src/Bundle/ChillPersonBundle/migrations/Version20230427102309.php new file mode 100644 index 000000000..662c11d9a --- /dev/null +++ b/src/Bundle/ChillPersonBundle/migrations/Version20230427102309.php @@ -0,0 +1,191 @@ +addSql(<<<'SQL' + CREATE TEMPORARY TABLE acc_period_info AS + SELECT a.id AS accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod'::text AS relatedentity, + a.id AS relatedentityid, + NULL::integer AS user_id, + a.openingdate AS infodate, + 'accompanying_period_start'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period a + UNION + SELECT w.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork'::text AS relatedentity, + w.id AS relatedentityid, + cpapwr.user_id, + w.enddate AS infodate, + 'accompanying_period_work_end'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work w + LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON w.id = cpapwr.accompanyingperiodwork_id + WHERE w.enddate IS NOT NULL + UNION + SELECT cpapw.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation'::text AS relatedentity, + e.id AS relatedentityid, + e.updatedby_id AS user_id, + e.updatedat AS infodate, + 'accompanying_period_work_evaluation_updated_at'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work_evaluation e + JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id + WHERE e.updatedat IS NOT NULL + UNION + SELECT cpapw.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation'::text AS relatedentity, + e.id AS relatedentityid, + cpapwr.user_id, + e.maxdate AS infodate, + 'accompanying_period_work_evaluation_start'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work_evaluation e + JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id + LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON cpapw.id = cpapwr.accompanyingperiodwork_id + WHERE e.maxdate IS NOT NULL + UNION + SELECT cpapw.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation'::text AS relatedentity, + e.id AS relatedentityid, + cpapwr.user_id, + e.startdate AS infodate, + 'accompanying_period_work_evaluation_start'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work_evaluation e + JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id + LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON cpapw.id = cpapwr.accompanyingperiodwork_id + UNION + SELECT cpapw.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocument'::text AS relatedentity, + doc.id AS relatedentityid, + doc.updatedby_id AS user_id, + doc.updatedat AS infodate, + 'accompanying_period_work_evaluation_document_updated_at'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work_evaluation_document doc + JOIN chill_person_accompanying_period_work_evaluation e ON doc.accompanyingperiodworkevaluation_id = e.id + JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id + WHERE doc.updatedat IS NOT NULL + UNION + SELECT cpapw.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation'::text AS relatedentity, + e.id AS relatedentityid, + cpapwr.user_id, + e.maxdate AS infodate, + 'accompanying_period_work_evaluation_max'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work_evaluation e + JOIN chill_person_accompanying_period_work cpapw ON cpapw.id = e.accompanyingperiodwork_id + LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON cpapw.id = cpapwr.accompanyingperiodwork_id + WHERE e.maxdate IS NOT NULL + UNION + SELECT w.accompanyingperiod_id, + 'Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork'::text AS relatedentity, + w.id AS relatedentityid, + cpapwr.user_id, + w.startdate AS infodate, + 'accompanying_period_work_start'::text AS discriminator, + '{}'::jsonb AS metadata + FROM chill_person_accompanying_period_work w + LEFT JOIN chill_person_accompanying_period_work_referrer cpapwr ON w.id = cpapwr.accompanyingperiodwork_id + UNION + SELECT activity.accompanyingperiod_id, + 'Chill\ActivityBundle\Entity\Activity'::text AS relatedentity, + activity.id AS relatedentityid, + au.user_id, + activity.date AS infodate, + 'activity_date'::text AS discriminator, + '{}'::jsonb AS metadata + FROM activity + LEFT JOIN activity_user au ON activity.id = au.activity_id + WHERE activity.accompanyingperiod_id IS NOT NULL; + SQL); + + // create a table to store oldest inactives + $this->addSql(<<<'SQL' + CREATE TEMPORARY TABLE inactive_long AS + SELECT a.accompanyingperiod_id, MAX(infodate) AS last_date + FROM acc_period_info a JOIN chill_person_accompanying_period acp ON acp.id = a.accompanyingperiod_id + WHERE + NOT EXISTS (SELECT 1 FROM acc_period_info WHERE infodate > (NOW() - '2 years'::interval) AND acc_period_info.accompanyingperiod_id = a.accompanyingperiod_id) + AND acp.step LIKE 'CONFIRMED' + GROUP BY accompanyingperiod_id; + SQL); + + $this->addSql(<<<'SQL' + UPDATE chill_person_accompanying_period_step_history SET enddate = GREATEST(last_date + '2 years'::interval, startdate) + FROM inactive_long WHERE inactive_long.accompanyingperiod_id = period_id AND enddate IS NULL; + SQL); + + $this->addSql(<<<'SQL' + INSERT INTO chill_person_accompanying_period_step_history (id, period_id, enddate, startdate, step, createdat, updatedat) + SELECT nextval('chill_person_accompanying_period_step_history_id_seq'), period_id, NULL, sq.g, 'CONFIRMED_INACTIVE_LONG', NOW(), NOW() + FROM (SELECT GREATEST(MAX(startdate), MAX(enddate)) AS g, period_id FROM chill_person_accompanying_period_step_history GROUP BY period_id) AS sq + JOIN inactive_long ON sq.period_id = inactive_long.accompanyingperiod_id + SQL); + + $this->addSql(<<<'SQL' + UPDATE chill_person_accompanying_period a SET step = 'CONFIRMED_INACTIVE_LONG' FROM inactive_long inactive WHERE a.id = inactive.accompanyingperiod_id; + SQL); + + $this->addSql(<<<'SQL' + DROP TABLE inactive_long + SQL); + + $this->addSql(<<<'SQL' + CREATE TEMPORARY TABLE inactive_long AS + SELECT a.accompanyingperiod_id, MAX(infodate) AS last_date + FROM acc_period_info a JOIN chill_person_accompanying_period acp ON acp.id = a.accompanyingperiod_id + WHERE + NOT EXISTS (SELECT 1 FROM acc_period_info WHERE infodate > (NOW() - '6 months'::interval) AND acc_period_info.accompanyingperiod_id = a.accompanyingperiod_id) + AND acp.step LIKE 'CONFIRMED' + GROUP BY accompanyingperiod_id; + SQL); + + $this->addSql(<<<'SQL' + UPDATE chill_person_accompanying_period_step_history SET enddate = GREATEST(last_date + '6 months'::interval, startdate) + FROM inactive_long WHERE inactive_long.accompanyingperiod_id = period_id AND enddate IS NULL; + SQL); + + $this->addSql(<<<'SQL' + INSERT INTO chill_person_accompanying_period_step_history (id, period_id, enddate, startdate, step, createdat, updatedat) + SELECT nextval('chill_person_accompanying_period_step_history_id_seq'), period_id, NULL, sq.g, 'CONFIRMED_INACTIVE_SHORT', NOW(), NOW() + FROM (SELECT GREATEST(MAX(startdate), MAX(enddate)) AS g, period_id FROM chill_person_accompanying_period_step_history GROUP BY period_id) AS sq + JOIN inactive_long ON sq.period_id = inactive_long.accompanyingperiod_id + SQL); + + $this->addSql(<<<'SQL' + UPDATE chill_person_accompanying_period a SET step = 'CONFIRMED_INACTIVE_SHORT' FROM inactive_long inactive WHERE a.id = inactive.accompanyingperiod_id; + SQL); + } + + public function down(Schema $schema): void + { + $this->throwIrreversibleMigrationException(); + } +} diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index d33957ea7..9b9f1fde2 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -57,7 +57,7 @@ Add new phone: Ajouter un numéro de téléphone Remove phone: Supprimer 'Notes on contact information': 'Remarques sur les informations de contact' 'Remarks': 'Remarques' -'Spoken languages': 'Langues parlées' +Spoken languages': 'Langues parlées' 'Unknown spoken languages': 'Langues parlées inconnues' Male: Homme Female: Femme @@ -237,8 +237,12 @@ No referrer: Pas d'agent traitant Some peoples does not belong to any household currently. Add them to an household soon: Certains usagers n'appartiennent à aucun ménage actuellement. Renseignez leur ménage dès que possible. Add to household now: Ajouter à un ménage Any resource for this accompanying course: Aucun interlocuteur privilégié pour ce parcours -course.draft: Brouillon -course.closed: Clôturé +course: + draft: Brouillon + closed: Clôturé + inactive_short: Hors file active + inactive_long: Pré-archivé + confirmed: Confirmé Origin: Origine de la demande Delete accompanying period: Supprimer le parcours d'accompagnement Are you sure you want to remove the accompanying period "%id%" ?: Êtes-vous sûr de vouloir supprimer le parcours d'accompagnement %id% ? @@ -1072,6 +1076,16 @@ export: Status: Statut course: + having_info_within_interval: + title: Filter les parcours ayant reçu une intervention entre deux dates + start_date: Début de la période + end_date: Fin de la période + Only course with events between %startDate% and %endDate%: Seulement les parcours ayant reçu une intervention entre le %startDate% et le %endDate% + by_user_working: + title: Filter les parcours par intervenant + 'Filtered by user working on course: only %users%': 'Filtré par intervenants sur le parcours: seulement %users%' + by_step: + date_calc: Date de prise en compte du statut by_user_scope: Computation date for referrer: Date à laquelle le référent était actif by_referrer: @@ -1095,12 +1109,15 @@ export: id: Identifiant du parcours openingDate: Date d'ouverture du parcours closingDate: Date de fermeture du parcours + closingMotive: Motif de cloture + job: Métier confidential: Confidentiel emergency: Urgent intensity: Intensité createdAt: Créé le updatedAt: Dernière mise à jour le acpOrigin: Origine du parcours + origin: Origine du parcourse acpClosingMotive: Motif de fermeture acpJob: Métier du parcours createdBy: Créé par @@ -1120,6 +1137,8 @@ export: acprequestorPerson: Nom du demandeur usager scopes: Services socialIssues: Problématiques sociales + requestorPerson: Demandeur (personne) + requestorThirdParty: Demandeur (tiers) eval: List of evaluations: Liste des évaluations Generate a list of evaluations, filtered on different parameters: Génère une liste des évaluations, filtrée sur différents paramètres. diff --git a/src/Bundle/ChillReportBundle/Controller/ReportController.php b/src/Bundle/ChillReportBundle/Controller/ReportController.php index 0a62a4b33..da39aedec 100644 --- a/src/Bundle/ChillReportBundle/Controller/ReportController.php +++ b/src/Bundle/ChillReportBundle/Controller/ReportController.php @@ -344,7 +344,7 @@ class ReportController extends AbstractController } $cFGroups = $em->getRepository(\Chill\CustomFieldsBundle\Entity\CustomFieldsGroup::class) - ->findByEntity('Chill\ReportBundle\Entity\Report'); + ->findByEntity(\Chill\ReportBundle\Entity\Report::class); if (count($cFGroups) === 1) { return $this->redirect( @@ -403,7 +403,7 @@ class ReportController extends AbstractController $em = $this->getDoctrine()->getManager(); $cFGroups = $em->getRepository(\Chill\CustomFieldsBundle\Entity\CustomFieldsGroup::class) - ->findByEntity('Chill\ReportBundle\Entity\Report'); + ->findByEntity(\Chill\ReportBundle\Entity\Report::class); if (count($cFGroups) === 1) { return $this->redirect( diff --git a/src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadCustomField.php b/src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadCustomField.php index 5eebbaad1..a9b8edc30 100644 --- a/src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadCustomField.php +++ b/src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadCustomField.php @@ -68,15 +68,15 @@ class LoadCustomField extends AbstractFixture implements OrderedFixtureInterface ]; for ($i = 0; 25 >= $i; ++$i) { - $cFType = $cFTypes[mt_rand(0, count($cFTypes) - 1)]; + $cFType = $cFTypes[random_int(0, count($cFTypes) - 1)]; $customField = (new CustomField()) ->setSlug("cf_report_{$i}") ->setType($cFType['type']) ->setOptions($cFType['options']) ->setName(['fr' => "CustomField {$i}"]) - ->setOrdering(mt_rand(0, 1000) / 1000) - ->setCustomFieldsGroup($this->getReference('cf_group_report_' . (mt_rand(0, 3)))); + ->setOrdering(random_int(0, 1000) / 1000) + ->setCustomFieldsGroup($this->getReference('cf_group_report_' . (random_int(0, 3)))); $manager->persist($customField); } diff --git a/src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadCustomFieldsGroup.php b/src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadCustomFieldsGroup.php index 47cc2511d..32bd5c346 100644 --- a/src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadCustomFieldsGroup.php +++ b/src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadCustomFieldsGroup.php @@ -66,7 +66,7 @@ class LoadCustomFieldsGroup extends AbstractFixture implements OrderedFixtureInt $cFGroup = (new CustomFieldsGroup()) ->setName($name) - ->setEntity('Chill\ReportBundle\Entity\Report') + ->setEntity(\Chill\ReportBundle\Entity\Report::class) ->setOptions($options); $manager->persist($cFGroup); diff --git a/src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadReports.php b/src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadReports.php index 2148a370a..db4646eed 100644 --- a/src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadReports.php +++ b/src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadReports.php @@ -88,7 +88,7 @@ class LoadReports extends AbstractFixture implements ContainerAwareInterface, Or $report = (new Report()) ->setPerson($person) ->setCFGroup( - mt_rand(0, 10) > 5 ? + random_int(0, 10) > 5 ? $this->getReference('cf_group_report_logement') : $this->getReference('cf_group_report_education') ) @@ -111,7 +111,7 @@ class LoadReports extends AbstractFixture implements ContainerAwareInterface, Or //set date. 30% of the dates are 2015-05-01 $expectedDate = new DateTime('2015-01-05'); - if (mt_rand(0, 100) < 30) { + if (random_int(0, 100) < 30) { $report->setDate($expectedDate); } else { $report->setDate($this->faker->dateTimeBetween('-1 year', 'now') @@ -155,7 +155,7 @@ class LoadReports extends AbstractFixture implements ContainerAwareInterface, Or $selectedPeople = []; foreach ($people as $person) { - if (mt_rand(0, 100) < $percentage) { + if (random_int(0, 100) < $percentage) { $selectedPeople[] = $person; } } @@ -183,7 +183,7 @@ class LoadReports extends AbstractFixture implements ContainerAwareInterface, Or $picked = []; if ($multiple) { - $numberSelected = mt_rand(1, count($choices) - 1); + $numberSelected = random_int(1, count($choices) - 1); for ($i = 0; $i < $numberSelected; ++$i) { $picked[] = $this->pickChoice($choices); diff --git a/src/Bundle/ChillReportBundle/DependencyInjection/ChillReportExtension.php b/src/Bundle/ChillReportBundle/DependencyInjection/ChillReportExtension.php index 9d8bf8fbe..8f1c5d0d4 100644 --- a/src/Bundle/ChillReportBundle/DependencyInjection/ChillReportExtension.php +++ b/src/Bundle/ChillReportBundle/DependencyInjection/ChillReportExtension.php @@ -41,7 +41,7 @@ class ChillReportExtension extends Extension implements PrependExtensionInterfac 'chill_custom_fields', ['customizables_entities' => [ [ - 'class' => 'Chill\ReportBundle\Entity\Report', + 'class' => \Chill\ReportBundle\Entity\Report::class, 'name' => 'ReportEntity', 'options' => [ 'summary_fields' => [ diff --git a/src/Bundle/ChillReportBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillReportBundle/DependencyInjection/Configuration.php index 565ff08a7..70c9f532b 100644 --- a/src/Bundle/ChillReportBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillReportBundle/DependencyInjection/Configuration.php @@ -24,7 +24,7 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('chill_report'); - $rootNode = $treeBuilder->getRootNode('chill_report'); + $rootNode = $treeBuilder->getRootNode(); // Here you should define the parameters that are allowed to // configure your bundle. See the documentation linked above for diff --git a/src/Bundle/ChillReportBundle/Export/Export/ReportList.php b/src/Bundle/ChillReportBundle/Export/Export/ReportList.php index 21606d807..9adae0097 100644 --- a/src/Bundle/ChillReportBundle/Export/Export/ReportList.php +++ b/src/Bundle/ChillReportBundle/Export/Export/ReportList.php @@ -276,7 +276,7 @@ class ReportList implements ExportElementValidatedInterface, ListInterface return ''; } - return $this->translatableStringHelper->localize(json_decode($value, true)); + return $this->translatableStringHelper->localize(json_decode($value, true, 512, JSON_THROW_ON_ERROR)); }; default: @@ -306,7 +306,7 @@ class ReportList implements ExportElementValidatedInterface, ListInterface } // add the key from slugs and return - return array_merge($fields, array_keys($this->slugs)); + return [...$fields, ...array_keys($this->slugs)]; } public function getResult($query, $data) @@ -331,9 +331,7 @@ class ReportList implements ExportElementValidatedInterface, ListInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { - $centers = array_map(static function ($el) { - return $el['center']; - }, $acl); + $centers = array_map(static fn ($el) => $el['center'], $acl); // throw an error if any fields are present if (!array_key_exists('fields', $data)) { @@ -505,9 +503,7 @@ class ReportList implements ExportElementValidatedInterface, ListInterface private function getCustomFields() { return array_filter($this->customfieldsGroup - ->getCustomFields()->toArray(), static function (CustomField $cf) { - return $cf->getType() !== 'title'; - }); + ->getCustomFields()->toArray(), static fn (CustomField $cf) => $cf->getType() !== 'title'); } private function getLabelForCustomField($key, array $values, $data) @@ -526,13 +522,13 @@ class ReportList implements ExportElementValidatedInterface, ListInterface return $this->customFieldProvider ->getCustomFieldByType($cf->getType()) - ->render(json_decode($value, true), $cf, 'csv'); + ->render(json_decode($value, true, 512, JSON_THROW_ON_ERROR), $cf, 'csv'); }; if ($cfType instanceof CustomFieldChoice && $cfType->isMultiple($cf)) { return function ($value) use ($cf, $cfType, $key) { $slugChoice = $this->extractInfosFromSlug($key)['additionnalInfos']['choiceSlug']; - $decoded = json_decode($value, true); + $decoded = json_decode($value, true, 512, JSON_THROW_ON_ERROR); if ('_header' === $value) { $label = $cfType->getChoices($cf)[$slugChoice]; diff --git a/src/Bundle/ChillReportBundle/Form/ReportType.php b/src/Bundle/ChillReportBundle/Form/ReportType.php index 435d894d9..8d6551443 100644 --- a/src/Bundle/ChillReportBundle/Form/ReportType.php +++ b/src/Bundle/ChillReportBundle/Form/ReportType.php @@ -88,14 +88,14 @@ class ReportType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'Chill\ReportBundle\Entity\Report', + 'data_class' => \Chill\ReportBundle\Entity\Report::class, ]); $resolver->setRequired([ 'cFGroup', ]); - $resolver->setAllowedTypes('cFGroup', 'Chill\CustomFieldsBundle\Entity\CustomFieldsGroup'); + $resolver->setAllowedTypes('cFGroup', \Chill\CustomFieldsBundle\Entity\CustomFieldsGroup::class); $this->appendScopeChoicesOptions($resolver); } diff --git a/src/Bundle/ChillReportBundle/Search/ReportSearch.php b/src/Bundle/ChillReportBundle/Search/ReportSearch.php index 55bbe9f66..b08e01ee5 100644 --- a/src/Bundle/ChillReportBundle/Search/ReportSearch.php +++ b/src/Bundle/ChillReportBundle/Search/ReportSearch.php @@ -97,9 +97,7 @@ class ReportSearch extends AbstractSearch implements ContainerAwareInterface foreach ($reachableCenters as $center) { $reachableScopesId = array_map( - static function (Scope $scope) { - return $scope->getId(); - }, + static fn (Scope $scope) => $scope->getId(), $this->helper->getReachableScopes($this->user, $role, $center) ); $whereElement->add( @@ -167,7 +165,7 @@ class ReportSearch extends AbstractSearch implements ContainerAwareInterface ->orderBy('r.date', 'desc'); $reportQuery = $qb->getQuery(); - $reportQuery->setFetchMode('Chill\\ReportBundle\\Entity\\Report', 'person', \Doctrine\ORM\Mapping\ClassMetadata::FETCH_EAGER); + $reportQuery->setFetchMode(\Chill\ReportBundle\Entity\Report::class, 'person', \Doctrine\ORM\Mapping\ClassMetadata::FETCH_EAGER); return $reportQuery->getResult(); } diff --git a/src/Bundle/ChillReportBundle/Tests/Controller/ReportControllerNextTest.php b/src/Bundle/ChillReportBundle/Tests/Controller/ReportControllerNextTest.php index ea30084ae..5c25861b1 100644 --- a/src/Bundle/ChillReportBundle/Tests/Controller/ReportControllerNextTest.php +++ b/src/Bundle/ChillReportBundle/Tests/Controller/ReportControllerNextTest.php @@ -64,13 +64,11 @@ final class ReportControllerNextTest extends WebTestCase $customFieldsGroups = self::$kernel->getContainer() ->get('doctrine.orm.entity_manager') ->getRepository(\Chill\CustomFieldsBundle\Entity\CustomFieldsGroup::class) - ->findBy(['entity' => 'Chill\ReportBundle\Entity\Report']); + ->findBy(['entity' => \Chill\ReportBundle\Entity\Report::class]); //filter customFieldsGroup to get only "situation de logement" $filteredCustomFieldsGroupHouse = array_filter( $customFieldsGroups, - static function (CustomFieldsGroup $group) { - return in_array('Situation de logement', $group->getName(), true); - } + static fn (CustomFieldsGroup $group) => in_array('Situation de logement', $group->getName(), true) ); $this->group = $filteredCustomFieldsGroupHouse[0]; } diff --git a/src/Bundle/ChillReportBundle/Tests/Controller/ReportControllerTest.php b/src/Bundle/ChillReportBundle/Tests/Controller/ReportControllerTest.php index 6a6ee99f1..69ccd3d54 100644 --- a/src/Bundle/ChillReportBundle/Tests/Controller/ReportControllerTest.php +++ b/src/Bundle/ChillReportBundle/Tests/Controller/ReportControllerTest.php @@ -82,13 +82,11 @@ final class ReportControllerTest extends WebTestCase $customFieldsGroups = self::$kernel->getContainer() ->get('doctrine.orm.entity_manager') ->getRepository(\Chill\CustomFieldsBundle\Entity\CustomFieldsGroup::class) - ->findBy(['entity' => 'Chill\ReportBundle\Entity\Report']); + ->findBy(['entity' => \Chill\ReportBundle\Entity\Report::class]); //filter customFieldsGroup to get only "situation de logement" $filteredCustomFieldsGroupHouse = array_filter( $customFieldsGroups, - static function (CustomFieldsGroup $group) { - return in_array('Situation de logement', $group->getName(), true); - } + static fn (CustomFieldsGroup $group) => in_array('Situation de logement', $group->getName(), true) ); self::$group = $filteredCustomFieldsGroupHouse[0]; @@ -132,7 +130,7 @@ final class ReportControllerTest extends WebTestCase $form = $crawlerAddAReportPage->selectButton('Créer un nouveau rapport')->form(); $this->assertInstanceOf( - 'Symfony\Component\DomCrawler\Form', + \Symfony\Component\DomCrawler\Form::class, $form, 'I can see a form with a button "add a new report" ' ); @@ -251,7 +249,7 @@ final class ReportControllerTest extends WebTestCase $link = $crawlerPersonPage->selectLink("AJOUT D'UN RAPPORT")->link(); $this->assertInstanceOf( - 'Symfony\Component\DomCrawler\Link', + \Symfony\Component\DomCrawler\Link::class, $link, 'There is a "add a report" link in menu' ); @@ -278,7 +276,7 @@ final class ReportControllerTest extends WebTestCase ->form(); $this->assertInstanceOf( - 'Symfony\Component\DomCrawler\Form', + \Symfony\Component\DomCrawler\Form::class, $addForm, 'I have a report form' ); diff --git a/src/Bundle/ChillReportBundle/Tests/DependencyInjection/ChillReportExtensionTest.php b/src/Bundle/ChillReportBundle/Tests/DependencyInjection/ChillReportExtensionTest.php index 2b02159ca..e480ca960 100644 --- a/src/Bundle/ChillReportBundle/Tests/DependencyInjection/ChillReportExtensionTest.php +++ b/src/Bundle/ChillReportBundle/Tests/DependencyInjection/ChillReportExtensionTest.php @@ -32,7 +32,7 @@ final class ChillReportExtensionTest extends KernelTestCase $reportFounded = false; foreach ($customizablesEntities as $customizablesEntity) { - if ('Chill\ReportBundle\Entity\Report' === $customizablesEntity['class']) { + if (\Chill\ReportBundle\Entity\Report::class === $customizablesEntity['class']) { $reportFounded = true; } } diff --git a/src/Bundle/ChillReportBundle/Tests/Security/Authorization/ReportVoterTest.php b/src/Bundle/ChillReportBundle/Tests/Security/Authorization/ReportVoterTest.php index be32edc8d..4179df56d 100644 --- a/src/Bundle/ChillReportBundle/Tests/Security/Authorization/ReportVoterTest.php +++ b/src/Bundle/ChillReportBundle/Tests/Security/Authorization/ReportVoterTest.php @@ -167,7 +167,7 @@ final class ReportVoterTest extends KernelTestCase { $token = $this->prophet->prophesize(); $token - ->willImplement('\Symfony\Component\Security\Core\Authentication\Token\TokenInterface'); + ->willImplement('\\' . \Symfony\Component\Security\Core\Authentication\Token\TokenInterface::class); if (null === $user) { $token->getUser()->willReturn(null); diff --git a/src/Bundle/ChillReportBundle/Tests/Timeline/TimelineProviderTest.php b/src/Bundle/ChillReportBundle/Tests/Timeline/TimelineProviderTest.php index 9f39fb87e..95f85ed1f 100644 --- a/src/Bundle/ChillReportBundle/Tests/Timeline/TimelineProviderTest.php +++ b/src/Bundle/ChillReportBundle/Tests/Timeline/TimelineProviderTest.php @@ -67,9 +67,7 @@ final class TimelineProviderTest extends WebTestCase self::$em ->getRepository(\Chill\MainBundle\Entity\Scope::class) ->findAll(), - static function (Scope $scope) { - return $scope->getName()['en'] === 'social'; - } + static fn (Scope $scope) => $scope->getName()['en'] === 'social' ); $report = (new Report()) @@ -191,6 +189,6 @@ final class TimelineProviderTest extends WebTestCase } } - return $groups[mt_rand(0, count($groups) - 1)]; + return $groups[random_int(0, count($groups) - 1)]; } } diff --git a/src/Bundle/ChillReportBundle/Timeline/TimelineReportProvider.php b/src/Bundle/ChillReportBundle/Timeline/TimelineReportProvider.php index 900920a7f..0e28fffa9 100644 --- a/src/Bundle/ChillReportBundle/Timeline/TimelineReportProvider.php +++ b/src/Bundle/ChillReportBundle/Timeline/TimelineReportProvider.php @@ -267,7 +267,7 @@ class TimelineReportProvider implements TimelineProviderInterface '{scopes_ids}' => implode(', ', array_fill(0, count($scopeIds), '?')), ]); // append $scopeIds to parameters - $parameters = array_merge($parameters, $scopeIds); + $parameters = [...$parameters, ...$scopeIds]; } if (0 === count($formattedClauses)) { diff --git a/src/Bundle/ChillTaskBundle/Controller/TaskController.php b/src/Bundle/ChillTaskBundle/Controller/TaskController.php index 6525d5572..435c9eaa2 100644 --- a/src/Bundle/ChillTaskBundle/Controller/TaskController.php +++ b/src/Bundle/ChillTaskBundle/Controller/TaskController.php @@ -94,9 +94,7 @@ class TaskController extends AbstractController $transitionInstance = array_values( // array_values needed to reset keys (array_filter preserves keys) array_filter( $workflow->getEnabledTransitions($task), - static function (Transition $t) use ($transition) { - return $t->getName() === $transition; - } + static fn (Transition $t) => $t->getName() === $transition ) )[0]; diff --git a/src/Bundle/ChillTaskBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillTaskBundle/DependencyInjection/Configuration.php index 8c57ef0f6..f01050684 100644 --- a/src/Bundle/ChillTaskBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillTaskBundle/DependencyInjection/Configuration.php @@ -24,7 +24,7 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('chill_task'); - $rootNode = $treeBuilder->getRootNode('chill_task'); + $rootNode = $treeBuilder->getRootNode(); // Here you should define the parameters that are allowed to // configure your bundle. See the documentation linked above for diff --git a/src/Bundle/ChillTaskBundle/Form/SingleTaskListType.php b/src/Bundle/ChillTaskBundle/Form/SingleTaskListType.php index 4020eeef3..2af71810d 100644 --- a/src/Bundle/ChillTaskBundle/Form/SingleTaskListType.php +++ b/src/Bundle/ChillTaskBundle/Form/SingleTaskListType.php @@ -218,13 +218,9 @@ class SingleTaskListType extends AbstractType $users = $this->getUsersAssigneedToTask($options); $choices = array_combine( // get usernames - array_map(static function (User $user) { - return $user->getUsername(); - }, $users), + array_map(static fn (User $user) => $user->getUsername(), $users), // get ids - array_map(static function (User $user) { - return $user->getId(); - }, $users) + array_map(static fn (User $user) => $user->getId(), $users) ); $choices['Unassigned'] = '_unassigned'; diff --git a/src/Bundle/ChillTaskBundle/Menu/MenuBuilder.php b/src/Bundle/ChillTaskBundle/Menu/MenuBuilder.php index 4933b063c..2ecd2f5de 100644 --- a/src/Bundle/ChillTaskBundle/Menu/MenuBuilder.php +++ b/src/Bundle/ChillTaskBundle/Menu/MenuBuilder.php @@ -71,7 +71,7 @@ class MenuBuilder implements LocalMenuBuilderInterface break; case 'section': - $menu->setExtras('icons', 'tasks'); + $menu->setExtras('icons'); break; diff --git a/src/Bundle/ChillTaskBundle/Tests/Controller/SingleTaskControllerTest.php b/src/Bundle/ChillTaskBundle/Tests/Controller/SingleTaskControllerTest.php index c51eb9ed4..2ff7092f0 100644 --- a/src/Bundle/ChillTaskBundle/Tests/Controller/SingleTaskControllerTest.php +++ b/src/Bundle/ChillTaskBundle/Tests/Controller/SingleTaskControllerTest.php @@ -92,9 +92,7 @@ final class SingleTaskControllerTest extends WebTestCase $center = array_filter( $centers, - static function (Center $c) use ($centerName) { - return $c->getName() === $centerName; - } + static fn (Center $c) => $c->getName() === $centerName )[0]; $ids = $em diff --git a/src/Bundle/ChillTaskBundle/Timeline/SingleTaskTaskLifeCycleEventTimelineProvider.php b/src/Bundle/ChillTaskBundle/Timeline/SingleTaskTaskLifeCycleEventTimelineProvider.php index b29c1818e..9a8fcf6bd 100644 --- a/src/Bundle/ChillTaskBundle/Timeline/SingleTaskTaskLifeCycleEventTimelineProvider.php +++ b/src/Bundle/ChillTaskBundle/Timeline/SingleTaskTaskLifeCycleEventTimelineProvider.php @@ -86,9 +86,7 @@ class SingleTaskTaskLifeCycleEventTimelineProvider implements TimelineProviderIn ->findBy(['id' => $ids]); return array_combine( - array_map(static function ($e) { - return $e->getId(); - }, $events), + array_map(static fn ($e) => $e->getId(), $events), $events ); } diff --git a/src/Bundle/ChillTaskBundle/Timeline/TaskLifeCycleEventTimelineProvider.php b/src/Bundle/ChillTaskBundle/Timeline/TaskLifeCycleEventTimelineProvider.php index e5414cac1..aa8776aa2 100644 --- a/src/Bundle/ChillTaskBundle/Timeline/TaskLifeCycleEventTimelineProvider.php +++ b/src/Bundle/ChillTaskBundle/Timeline/TaskLifeCycleEventTimelineProvider.php @@ -97,9 +97,7 @@ class TaskLifeCycleEventTimelineProvider implements TimelineProviderInterface ->findBy(['id' => $ids]); return array_combine( - array_map(static function ($e) { - return $e->getId(); - }, $events), + array_map(static fn ($e) => $e->getId(), $events), $events ); } @@ -108,7 +106,7 @@ class TaskLifeCycleEventTimelineProvider implements TimelineProviderInterface { $workflow = $this->registry->get( $entity->getTask(), - (isset($entity->getData()['workflow'])) ? $entity->getData()['workflow'] : null + $entity->getData()['workflow'] ?? null ); // sf4 check: prevent error message: // `Notice: Undefined property: Chill\TaskBundle\Entity\Task\SingleTaskPlaceEvent::$getData` diff --git a/src/Bundle/ChillThirdPartyBundle/DataFixtures/ORM/LoadThirdParty.php b/src/Bundle/ChillThirdPartyBundle/DataFixtures/ORM/LoadThirdParty.php index 6b40f01b9..e813cbd7f 100644 --- a/src/Bundle/ChillThirdPartyBundle/DataFixtures/ORM/LoadThirdParty.php +++ b/src/Bundle/ChillThirdPartyBundle/DataFixtures/ORM/LoadThirdParty.php @@ -69,9 +69,7 @@ class LoadThirdParty extends Fixture implements DependentFixtureInterface private function getCenters(): Iterator { $references = array_map( - static function ($a) { - return $a['ref']; - }, + static fn ($a) => $a['ref'], LoadCenters::$centers ); $number = random_int(1, count($references)); diff --git a/src/Bundle/ChillThirdPartyBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillThirdPartyBundle/DependencyInjection/Configuration.php index 3248f58d7..d4c2cd598 100644 --- a/src/Bundle/ChillThirdPartyBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillThirdPartyBundle/DependencyInjection/Configuration.php @@ -24,7 +24,7 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('chill_third_party'); - $rootNode = $treeBuilder->getRootNode('chill_third_party'); + $rootNode = $treeBuilder->getRootNode(); // Here you should define the parameters that are allowed to // configure your bundle. See the documentation linked above for diff --git a/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php b/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php index ca24d2442..09b8ba516 100644 --- a/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php +++ b/src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php @@ -189,7 +189,7 @@ class ThirdParty implements TrackCreationInterface, TrackUpdateInterface * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User") * @ORM\JoinColumn(name="created_by", referencedColumnName="id") */ - private ?User $createdBy; + private ?User $createdBy = null; /** * @ORM\Column(name="email", type="string", length=255, nullable=true) @@ -272,13 +272,13 @@ class ThirdParty implements TrackCreationInterface, TrackUpdateInterface /** * @ORM\Column(name="updated_at", type="datetime_immutable", nullable=true) */ - private ?DateTimeImmutable $updatedAt; + private ?DateTimeImmutable $updatedAt = null; /** * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User") * @ORM\JoinColumn(name="updated_by", referencedColumnName="id") */ - private ?User $updatedBy; + private ?User $updatedBy = null; /** * ThirdParty constructor. diff --git a/src/Bundle/ChillThirdPartyBundle/Export/Helper/LabelThirdPartyHelper.php b/src/Bundle/ChillThirdPartyBundle/Export/Helper/LabelThirdPartyHelper.php index f87fe41b4..2e7a20840 100644 --- a/src/Bundle/ChillThirdPartyBundle/Export/Helper/LabelThirdPartyHelper.php +++ b/src/Bundle/ChillThirdPartyBundle/Export/Helper/LabelThirdPartyHelper.php @@ -54,7 +54,7 @@ class LabelThirdPartyHelper return ''; } - $decoded = json_decode($value); + $decoded = json_decode($value, null, 512, JSON_THROW_ON_ERROR); if (0 === count($decoded)) { return ''; diff --git a/src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyType.php b/src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyType.php index ed4b3c1e7..0dd4f16e6 100644 --- a/src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyType.php +++ b/src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyType.php @@ -103,15 +103,11 @@ class PickThirdPartyType extends AbstractType $resolver ->setDefault('class', ThirdParty::class) - ->setDefault('choice_label', static function (ThirdParty $tp) { - return $tp->getName(); - }) - ->setDefault('choice_loader', function (Options $options) { - return new ThirdPartyChoiceLoader( - $options['center'], - $this->em->getRepository(ThirdParty::class) - ); - }); + ->setDefault('choice_label', static fn (ThirdParty $tp) => $tp->getName()) + ->setDefault('choice_loader', fn (Options $options) => new ThirdPartyChoiceLoader( + $options['center'], + $this->em->getRepository(ThirdParty::class) + )); } public function getParent(): string diff --git a/src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyTypeCategoryType.php b/src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyTypeCategoryType.php index eb7966084..26cb0ae2e 100644 --- a/src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyTypeCategoryType.php +++ b/src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyTypeCategoryType.php @@ -77,9 +77,7 @@ class PickThirdPartyTypeCategoryType extends \Symfony\Component\Form\AbstractTyp return self::PREFIX_TYPE . $item; }, - 'choice_value' => function ($item) { - return $this->reverseTransform($item); - }, + 'choice_value' => fn ($item) => $this->reverseTransform($item), ]); }