From 6c37d798bf93738465b057e3c8d2a13da1983e78 Mon Sep 17 00:00:00 2001 From: Christophe Siraut Date: Wed, 27 Nov 2024 17:05:50 +0100 Subject: [PATCH 1/5] ChillPersonBundle: add administrativeStatus property to Person --- .../AdministrativeStatusController.php | 26 ++++++ .../ORM/LoadAdministrativeStatus.php | 43 ++++++++++ .../ChillPersonExtension.php | 25 ++++++ .../DependencyInjection/Configuration.php | 1 + .../Entity/AdministrativeStatus.php | 80 +++++++++++++++++++ .../ChillPersonBundle/Entity/Person.php | 19 +++++ .../Form/AdministrativeStatusType.php | 44 ++++++++++ .../ChillPersonBundle/Form/PersonType.php | 6 ++ .../Type/PickAdministrativeStatusType.php | 50 ++++++++++++ .../Menu/AdminPersonMenuBuilder.php | 6 ++ .../views/AdministrativeStatus/edit.html.twig | 11 +++ .../AdministrativeStatus/index.html.twig | 42 ++++++++++ .../views/AdministrativeStatus/new.html.twig | 11 +++ .../Resources/views/Person/edit.html.twig | 3 + .../Resources/views/Person/view.html.twig | 16 +++- .../migrations/Version20241127160628.php | 43 ++++++++++ .../translations/messages.fr.yml | 7 ++ 17 files changed, 431 insertions(+), 2 deletions(-) create mode 100644 src/Bundle/ChillPersonBundle/Controller/AdministrativeStatusController.php create mode 100644 src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadAdministrativeStatus.php create mode 100644 src/Bundle/ChillPersonBundle/Entity/AdministrativeStatus.php create mode 100644 src/Bundle/ChillPersonBundle/Form/AdministrativeStatusType.php create mode 100644 src/Bundle/ChillPersonBundle/Form/Type/PickAdministrativeStatusType.php create mode 100644 src/Bundle/ChillPersonBundle/Resources/views/AdministrativeStatus/edit.html.twig create mode 100644 src/Bundle/ChillPersonBundle/Resources/views/AdministrativeStatus/index.html.twig create mode 100644 src/Bundle/ChillPersonBundle/Resources/views/AdministrativeStatus/new.html.twig create mode 100644 src/Bundle/ChillPersonBundle/migrations/Version20241127160628.php diff --git a/src/Bundle/ChillPersonBundle/Controller/AdministrativeStatusController.php b/src/Bundle/ChillPersonBundle/Controller/AdministrativeStatusController.php new file mode 100644 index 000000000..0b854ce43 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Controller/AdministrativeStatusController.php @@ -0,0 +1,26 @@ +addOrderBy('e.order', 'ASC'); + + return parent::orderQuery($action, $query, $request, $paginator); + } +} diff --git a/src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadAdministrativeStatus.php b/src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadAdministrativeStatus.php new file mode 100644 index 000000000..b9de3990a --- /dev/null +++ b/src/Bundle/ChillPersonBundle/DataFixtures/ORM/LoadAdministrativeStatus.php @@ -0,0 +1,43 @@ + ['fr' => 'situation administrative régulière']], + ['name' => ['fr' => 'sans papier']], + ['name' => ['fr' => 'séjour provisoire']], + ]; + + foreach ($status as $val) { + $administrativeStatus = (new AdministrativeStatus()) + ->setName($val['name']) + ->setActive(true); + $manager->persist($administrativeStatus); + } + + $manager->flush(); + } +} diff --git a/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php b/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php index 9320a1246..8fddd477d 100644 --- a/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php +++ b/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php @@ -15,12 +15,15 @@ use Chill\MainBundle\DependencyInjection\MissingBundleException; use Chill\MainBundle\Security\Authorization\ChillExportVoter; use Chill\PersonBundle\Controller\AccompanyingPeriodCommentApiController; use Chill\PersonBundle\Controller\AccompanyingPeriodResourceApiController; +use Chill\PersonBundle\Controller\AdministrativeStatusController; use Chill\PersonBundle\Controller\EmploymentStatusController; use Chill\PersonBundle\Controller\HouseholdCompositionTypeApiController; use Chill\PersonBundle\Controller\RelationApiController; use Chill\PersonBundle\Doctrine\DQL\AddressPart; use Chill\PersonBundle\Entity\AccompanyingPeriod; +use Chill\PersonBundle\Entity\AdministrativeStatus; use Chill\PersonBundle\Entity\EmploymentStatus; +use Chill\PersonBundle\Form\AdministrativeStatusType; use Chill\PersonBundle\Form\EmploymentStatusType; use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodCommentVoter; use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodResourceVoter; @@ -195,6 +198,28 @@ class ChillPersonExtension extends Extension implements PrependExtensionInterfac ], ], ], + [ + 'class' => AdministrativeStatus::class, + 'name' => 'administrative_status', + 'base_path' => '/admin/administrative', + 'base_role' => 'ROLE_ADMIN', + 'form_class' => AdministrativeStatusType::class, + 'controller' => AdministrativeStatusController::class, + 'actions' => [ + 'index' => [ + 'role' => 'ROLE_ADMIN', + 'template' => '@ChillPerson/AdministrativeStatus/index.html.twig', + ], + 'new' => [ + 'role' => 'ROLE_ADMIN', + 'template' => '@ChillPerson/AdministrativeStatus/new.html.twig', + ], + 'edit' => [ + 'role' => 'ROLE_ADMIN', + 'template' => '@ChillPerson/AdministrativeStatus/edit.html.twig', + ], + ], + ], [ 'class' => EmploymentStatus::class, 'name' => 'employment_status', diff --git a/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php index 5f75f0d69..c0cdee8fa 100644 --- a/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php @@ -86,6 +86,7 @@ class Configuration implements ConfigurationInterface ->append($this->addFieldNode('acceptEmail')) ->append($this->addFieldNode('deathdate')) ->append($this->addFieldNode('employment_status', 'hidden')) + ->append($this->addFieldNode('administrative_status', 'hidden')) ->arrayNode('alt_names') ->defaultValue([]) ->arrayPrototype() diff --git a/src/Bundle/ChillPersonBundle/Entity/AdministrativeStatus.php b/src/Bundle/ChillPersonBundle/Entity/AdministrativeStatus.php new file mode 100644 index 000000000..35260ae56 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Entity/AdministrativeStatus.php @@ -0,0 +1,80 @@ + AdministrativeStatus::class])] +#[ORM\Entity] +#[ORM\Table(name: 'chill_person_administrative_status')] +class AdministrativeStatus +{ + #[Serializer\Groups(['read', 'docgen:read'])] + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: \Doctrine\DBAL\Types\Types::INTEGER)] + private ?int $id = null; + + #[Serializer\Groups(['read', 'docgen:read'])] + #[ORM\Column(type: \Doctrine\DBAL\Types\Types::JSON)] + #[Serializer\Context(['is-translatable' => true], groups: ['docgen:read'])] + private array $name = []; + + #[Serializer\Groups(['read'])] + #[ORM\Column(type: \Doctrine\DBAL\Types\Types::BOOLEAN)] + private bool $active = true; + + #[ORM\Column(type: \Doctrine\DBAL\Types\Types::FLOAT, name: 'ordering', nullable: true, options: ['default' => '0.0'])] + private float $order = 0; + + public function getId(): ?int + { + return $this->id; + } + + public function getActive(): ?bool + { + return $this->active; + } + + public function getName(): ?array + { + return $this->name; + } + + public function getOrder(): ?float + { + return $this->order; + } + + public function setActive(bool $active): self + { + $this->active = $active; + + return $this; + } + + public function setName(array $name): self + { + $this->name = $name; + + return $this; + } + + public function setOrder(float $order): self + { + $this->order = $order; + + return $this; + } +} diff --git a/src/Bundle/ChillPersonBundle/Entity/Person.php b/src/Bundle/ChillPersonBundle/Entity/Person.php index 04607a0e0..5d57f11af 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person.php @@ -304,6 +304,13 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI #[ORM\Column(type: \Doctrine\DBAL\Types\Types::TEXT)] private string $memo = ''; + /** + * The person's administrative status. + */ + #[ORM\ManyToOne(targetEntity: AdministrativeStatus::class)] + #[ORM\JoinColumn(nullable: true)] + private ?AdministrativeStatus $administrativeStatus = null; + /** * The person's mobile phone number. */ @@ -777,6 +784,11 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI return $this->addresses; } + public function getAdministrativeStatus(): ?AdministrativeStatus + { + return $this->administrativeStatus; + } + /** * Return the age of a person, calculated at the date 'now'. * @@ -1420,6 +1432,13 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI return $this; } + public function setAdministrativeStatus(?AdministrativeStatus $administrativeStatus): self + { + $this->administrativeStatus = $administrativeStatus; + + return $this; + } + public function setAcceptSMS(bool $acceptSMS): self { $this->acceptSMS = $acceptSMS; diff --git a/src/Bundle/ChillPersonBundle/Form/AdministrativeStatusType.php b/src/Bundle/ChillPersonBundle/Form/AdministrativeStatusType.php new file mode 100644 index 000000000..81f299538 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Form/AdministrativeStatusType.php @@ -0,0 +1,44 @@ +add('name', TranslatableStringFormType::class, [ + 'required' => true, + ]) + ->add('active', ChoiceType::class, [ + 'choices' => [ + 'Active' => true, + 'Inactive' => false, + ], + ]) + ->add('order', NumberType::class); + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => AdministrativeStatus::class, + ]); + } +} diff --git a/src/Bundle/ChillPersonBundle/Form/PersonType.php b/src/Bundle/ChillPersonBundle/Form/PersonType.php index c03221f04..21d56dde7 100644 --- a/src/Bundle/ChillPersonBundle/Form/PersonType.php +++ b/src/Bundle/ChillPersonBundle/Form/PersonType.php @@ -26,6 +26,7 @@ use Chill\PersonBundle\Entity\Person; use Chill\PersonBundle\Entity\PersonPhone; use Chill\PersonBundle\Form\Type\PersonAltNameType; use Chill\PersonBundle\Form\Type\PersonPhoneType; +use Chill\PersonBundle\Form\Type\PickAdministrativeStatusType; use Chill\PersonBundle\Form\Type\PickEmploymentStatusType; use Chill\PersonBundle\Form\Type\PickGenderType; use Chill\PersonBundle\Form\Type\Select2MaritalStatusType; @@ -108,6 +109,11 @@ class PersonType extends AbstractType ->add('employmentStatus', PickEmploymentStatusType::class, ['required' => false]); } + if ('visible' === $this->config['administrative_status']) { + $builder + ->add('administrativeStatus', PickAdministrativeStatusType::class, ['required' => false]); + } + if ('visible' === $this->config['place_of_birth']) { $builder->add('placeOfBirth', TextType::class, [ 'required' => false, diff --git a/src/Bundle/ChillPersonBundle/Form/Type/PickAdministrativeStatusType.php b/src/Bundle/ChillPersonBundle/Form/Type/PickAdministrativeStatusType.php new file mode 100644 index 000000000..126c260f5 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Form/Type/PickAdministrativeStatusType.php @@ -0,0 +1,50 @@ +setDefault('label', 'Administrative Status') + ->setDefault( + 'choice_label', + fn (AdministrativeStatus $administrativeStatus): string => $this->translatableStringHelper->localize($administrativeStatus->getName()) + ) + ->setDefault( + 'query_builder', + static fn (EntityRepository $er): QueryBuilder => $er->createQueryBuilder('c') + ->where('c.active = true') + ->orderBy('c.order'), + ) + ->setDefault('placeholder', $this->translatableStringHelper->localize(['Select an option…'])) + ->setDefault('class', AdministrativeStatus::class); + } + + public function getParent() + { + return EntityType::class; + } +} diff --git a/src/Bundle/ChillPersonBundle/Menu/AdminPersonMenuBuilder.php b/src/Bundle/ChillPersonBundle/Menu/AdminPersonMenuBuilder.php index bfcb5e436..a361b107d 100644 --- a/src/Bundle/ChillPersonBundle/Menu/AdminPersonMenuBuilder.php +++ b/src/Bundle/ChillPersonBundle/Menu/AdminPersonMenuBuilder.php @@ -65,6 +65,12 @@ class AdminPersonMenuBuilder implements LocalMenuBuilderInterface ])->setExtras(['order' => 2035]); } + if ('visible' == $this->fields_visibility['administrative_status']) { + $menu->addChild('Administrative status', [ + 'route' => 'chill_crud_administrative_status_index', + ])->setExtras(['order' => 2036]); + } + $menu->addChild('person_admin.person_resource_kind', [ 'route' => 'chill_crud_person_resource-kind_index', ])->setExtras(['order' => 2040]); diff --git a/src/Bundle/ChillPersonBundle/Resources/views/AdministrativeStatus/edit.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/AdministrativeStatus/edit.html.twig new file mode 100644 index 000000000..4d55c480c --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/views/AdministrativeStatus/edit.html.twig @@ -0,0 +1,11 @@ +{% extends '@ChillMain/CRUD/Admin/index.html.twig' %} + +{% block title %} + {% include('@ChillMain/CRUD/_edit_title.html.twig') %} +{% endblock %} + +{% block admin_content %} + {% embed '@ChillMain/CRUD/_edit_content.html.twig' %} + {% block content_form_actions_save_and_show %}{% endblock %} + {% endembed %} +{% endblock admin_content %} diff --git a/src/Bundle/ChillPersonBundle/Resources/views/AdministrativeStatus/index.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/AdministrativeStatus/index.html.twig new file mode 100644 index 000000000..82f96c490 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/views/AdministrativeStatus/index.html.twig @@ -0,0 +1,42 @@ +{% extends '@ChillMain/CRUD/Admin/index.html.twig' %} + +{% block admin_content %} + {% embed '@ChillMain/CRUD/_index.html.twig' %} + {% block table_entities_thead_tr %} + id + {{ 'name'|trans }} + {{ 'active'|trans }} + {{ 'ordering'|trans }} + + {% endblock %} + {% block table_entities_tbody %} + {% for entity in entities %} + + {{ entity.id }} + {{ entity.name|localize_translatable_string }} + + {%- if entity.active -%} + + {%- else -%} + + {%- endif -%} + + {{ entity.order }} + + + + + {% endfor %} + {% endblock %} + + {% block actions_before %} +
  • + {{'Back to the admin'|trans}} +
  • + {% endblock %} + {% endembed %} +{% endblock %} diff --git a/src/Bundle/ChillPersonBundle/Resources/views/AdministrativeStatus/new.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/AdministrativeStatus/new.html.twig new file mode 100644 index 000000000..7c204dddd --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/views/AdministrativeStatus/new.html.twig @@ -0,0 +1,11 @@ +{% extends '@ChillMain/CRUD/Admin/index.html.twig' %} + +{% block title %} + {% include('@ChillMain/CRUD/_new_title.html.twig') %} +{% endblock %} + +{% block admin_content %} + {% embed '@ChillMain/CRUD/_new_content.html.twig' %} + {% block content_form_actions_save_and_show %}{% endblock %} + {% endembed %} +{% endblock admin_content %} diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Person/edit.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Person/edit.html.twig index cd856fb61..cb2d867c4 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/Person/edit.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/Person/edit.html.twig @@ -107,6 +107,9 @@ {%- if form.spokenLanguages is defined -%} {{ form_row(form.spokenLanguages, {'label' : 'Spoken languages'}) }} {%- endif -%} + {%- if form.administrativeStatus is defined -%} + {{ form_row(form.administrativeStatus, {'label' : 'Administrative status'}) }} + {%- endif -%} {%- if form.employmentStatus is defined -%} {{ form_row(form.employmentStatus, {'label' : 'Employment status'}) }} {%- endif -%} diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Person/view.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Person/view.html.twig index 144018627..74585c5f1 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/Person/view.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/Person/view.html.twig @@ -170,8 +170,20 @@ This view should receive those arguments: {%- endif -%} + {% if chill_person.fields.administrative_status == 'visible' %} +
    +
    {{ 'Administrative status'|trans }} :
    +
    + {% if person.administrativeStatus is not empty %} + {{ person.administrativeStatus.name|localize_translatable_string }} + {% else %} + {{ 'No data given'|trans }} + {% endif %} +
    +
    + {% endif %} + {% if chill_person.fields.employment_status == 'visible' %}
    - {% if chill_person.fields.employment_status == 'visible' %}
    {{ 'Employment status'|trans }} :
    {% if person.employmentStatus is not empty %} @@ -180,8 +192,8 @@ This view should receive those arguments: {{ 'No data given'|trans }} {% endif %}
    - {% endif %}
    + {% endif %} {%- if chill_person.fields.number_of_children == 'visible' -%}
    {{'Number of children'|trans}} :
    diff --git a/src/Bundle/ChillPersonBundle/migrations/Version20241127160628.php b/src/Bundle/ChillPersonBundle/migrations/Version20241127160628.php new file mode 100644 index 000000000..5e657f6ce --- /dev/null +++ b/src/Bundle/ChillPersonBundle/migrations/Version20241127160628.php @@ -0,0 +1,43 @@ +addSql('CREATE SEQUENCE chill_person_administrative_status_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE chill_person_administrative_status (id INT NOT NULL, name JSON NOT NULL, active BOOLEAN NOT NULL, ordering DOUBLE PRECISION DEFAULT \'0.0\', PRIMARY KEY(id))'); + $this->addSql('ALTER TABLE chill_person_person ADD administrativeStatus_id INT DEFAULT NULL'); + $this->addSql('ALTER TABLE chill_person_person ADD CONSTRAINT FK_BF210A146E64B00C FOREIGN KEY (administrativeStatus_id) REFERENCES chill_person_administrative_status (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('CREATE INDEX IDX_BF210A146E64B00C ON chill_person_person (administrativeStatus_id)'); + } + + public function down(Schema $schema): void + { + $this->addSql('DROP SEQUENCE chill_person_administrative_status_id_seq CASCADE'); + $this->addSql('ALTER TABLE chill_person_person DROP CONSTRAINT FK_BF210A146E64B00C'); + $this->addSql('DROP TABLE chill_person_administrative_status'); + $this->addSql('ALTER TABLE chill_person_person DROP administrativeStatus_id'); + } +} diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 6b3c5cd0e..269196f41 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -100,6 +100,7 @@ numberOfChildren: Nombre d'enfants contactInfo: Commentaire des contacts spokenLanguages: Langues parlées Employment status: Situation professionelle +Administrative status: Situation administrative # dédoublonnage @@ -648,6 +649,12 @@ Group people by country of birth: Grouper les usagers par pays de naissance Similar persons: Usagers similaires crud: + administrative_status: + index: + title: Situations administratives + add_new: Ajouter une nouvelle + title_new: Ajouter une situation administrative + title_edit: Modifier cette situation administrative closing_motive: index: title: Liste des motifs de clotûre From 98cf16704070bb6cd23652f60ff302ea1dccf83a Mon Sep 17 00:00:00 2001 From: Christophe Siraut Date: Wed, 18 Dec 2024 18:45:27 +0100 Subject: [PATCH 2/5] ChillPersonBundle: add aggregators for administrative status and employment status --- .../AdministrativeStatusAggregator.php | 76 +++++++++++++++++++ .../EmploymentStatusAggregator.php | 76 +++++++++++++++++++ .../AdministrativeStatusRepository.php | 51 +++++++++++++ ...dministrativeStatusRepositoryInterface.php | 27 +++++++ .../Repository/EmploymentStatusRepository.php | 51 +++++++++++++ .../EmploymentStatusRepositoryInterface.php | 27 +++++++ .../config/services/exports_person.yaml | 14 ++++ .../translations/messages.fr.yml | 2 + 8 files changed, 324 insertions(+) create mode 100644 src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/AdministrativeStatusAggregator.php create mode 100644 src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/EmploymentStatusAggregator.php create mode 100644 src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepository.php create mode 100644 src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepositoryInterface.php create mode 100644 src/Bundle/ChillPersonBundle/Repository/EmploymentStatusRepository.php create mode 100644 src/Bundle/ChillPersonBundle/Repository/EmploymentStatusRepositoryInterface.php diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/AdministrativeStatusAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/AdministrativeStatusAggregator.php new file mode 100644 index 000000000..8bdc74f7f --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/AdministrativeStatusAggregator.php @@ -0,0 +1,76 @@ +leftJoin('person.administrativeStatus', 'admin_status'); + $qb->addSelect('admin_status.id as administrative_status_aggregator'); + + $qb->addGroupBy('administrative_status_aggregator'); + } + + public function applyOn() + { + return Declarations::PERSON_TYPE; + } + + public function buildForm(FormBuilderInterface $builder) {} + + public function getFormDefaultData(): array + { + return []; + } + + public function getLabels($key, array $values, $data) + { + return function ($value): string { + if ('_header' === $value) { + return 'Administrative status'; + } + + if (null === $value || '' === $value) { + return ''; + } + + $g = $this->administrativeStatusRepository->find($value); + + return $this->translatableStringHelper->localize($g->getName()); + }; + } + + public function getQueryKeys($data) + { + return ['administrative_status_aggregator']; + } + + public function getTitle() + { + return 'Group people by administrative status'; + } +} diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/EmploymentStatusAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/EmploymentStatusAggregator.php new file mode 100644 index 000000000..359e48cf3 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/EmploymentStatusAggregator.php @@ -0,0 +1,76 @@ +leftJoin('person.employmentStatus', 'es'); + $qb->addSelect('es.id as employment_status_aggregator'); + + $qb->addGroupBy('employment_status_aggregator'); + } + + public function applyOn() + { + return Declarations::PERSON_TYPE; + } + + public function buildForm(FormBuilderInterface $builder) {} + + public function getFormDefaultData(): array + { + return []; + } + + public function getLabels($key, array $values, $data) + { + return function ($value): string { + if ('_header' === $value) { + return 'Employment status'; + } + + if (null === $value || '' === $value) { + return ''; + } + + $g = $this->employmentStatusRepository->find($value); + + return $this->translatableStringHelper->localize($g->getName()); + }; + } + + public function getQueryKeys($data) + { + return ['employment_status_aggregator']; + } + + public function getTitle() + { + return 'Group people by employment status'; + } +} diff --git a/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepository.php b/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepository.php new file mode 100644 index 000000000..40254c395 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepository.php @@ -0,0 +1,51 @@ +repository = $entityManager->getRepository(AdministrativeStatus::class); + } + + public function find($id): ?AdministrativeStatus + { + return $this->repository->find($id); + } + + public function findAll(): array + { + return $this->repository->findAll(); + } + + public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null): array + { + return $this->repository->findBy($criteria, $orderBy, $limit, $offset); + } + + public function findOneBy(array $criteria): ?AdministrativeStatus + { + return $this->findOneBy($criteria); + } + + public function getClassName(): string + { + return AdministrativeStatus::class; + } +} diff --git a/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepositoryInterface.php b/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepositoryInterface.php new file mode 100644 index 000000000..da40a117b --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepositoryInterface.php @@ -0,0 +1,27 @@ +repository = $entityManager->getRepository(EmploymentStatus::class); + } + + public function find($id): ?EmploymentStatus + { + return $this->repository->find($id); + } + + public function findAll(): array + { + return $this->repository->findAll(); + } + + public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null): array + { + return $this->repository->findBy($criteria, $orderBy, $limit, $offset); + } + + public function findOneBy(array $criteria): ?EmploymentStatus + { + return $this->findOneBy($criteria); + } + + public function getClassName(): string + { + return EmploymentStatus::class; + } +} diff --git a/src/Bundle/ChillPersonBundle/Repository/EmploymentStatusRepositoryInterface.php b/src/Bundle/ChillPersonBundle/Repository/EmploymentStatusRepositoryInterface.php new file mode 100644 index 000000000..5d696cc9c --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Repository/EmploymentStatusRepositoryInterface.php @@ -0,0 +1,27 @@ + Date: Thu, 19 Dec 2024 10:31:14 +0100 Subject: [PATCH 3/5] ChillMainBundle: optionnaly mask aggegators in ExportType --- .../Form/Type/Export/ExportType.php | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Bundle/ChillMainBundle/Form/Type/Export/ExportType.php b/src/Bundle/ChillMainBundle/Form/Type/Export/ExportType.php index e5d0887f3..fe4c43830 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/Export/ExportType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/Export/ExportType.php @@ -18,6 +18,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; class ExportType extends AbstractType { @@ -29,7 +30,15 @@ class ExportType extends AbstractType final public const PICK_FORMATTER_KEY = 'pick_formatter'; - public function __construct(private readonly ExportManager $exportManager, private readonly SortExportElement $sortExportElement) {} + private array $personFieldsConfig; + + public function __construct( + private readonly ExportManager $exportManager, + private readonly SortExportElement $sortExportElement, + protected ParameterBagInterface $parameterBag, + ) { + $this->personFieldsConfig = $parameterBag->get('chill_person.person_fields'); + } public function buildForm(FormBuilderInterface $builder, array $options) { @@ -77,6 +86,17 @@ class ExportType extends AbstractType ); foreach ($aggregators as $alias => $aggregator) { + /* + * eventually mask aggregator + */ + if (str_starts_with((string) $alias, 'person_') and str_ends_with((string) $alias, '_aggregator')) { + $field = preg_replace(['/person_/', '/_aggregator/'], '', (string) $alias); + if (array_key_exists($field, $this->personFieldsConfig) and 'visible' !== $this->personFieldsConfig[$field]) { + continue; + } + } + + $aggregatorBuilder->add($alias, AggregatorType::class, [ 'aggregator_alias' => $alias, 'export_manager' => $this->exportManager, From fbdc0d32f070fc853b8906cc0574a7184bb6670b Mon Sep 17 00:00:00 2001 From: Christophe Siraut Date: Fri, 20 Dec 2024 11:28:36 +0100 Subject: [PATCH 4/5] ChillPersonBundle: Add numberOfDependents and numberOfDependentsWithDisabilities --- .../Controller/HouseholdMemberController.php | 9 +++- .../DependencyInjection/Configuration.php | 1 + .../Entity/Household/HouseholdComposition.php | 36 +++++++++++++ .../Form/HouseholdCompositionType.php | 25 ++++++++- .../components/Dates.vue | 51 +++++++++++++++++++ .../vuejs/HouseholdMembersEditor/js/i18n.js | 3 ++ .../HouseholdMembersEditor/store/index.js | 11 ++++ .../views/Household/summary.html.twig | 6 +++ .../HouseholdComposition/index.html.twig | 4 ++ .../Resources/views/Person/view.html.twig | 22 ++++++++ .../Normalizer/MembersEditorNormalizer.php | 4 ++ .../migrations/Version20241127160628.php | 3 -- .../migrations/Version20241220102357.php | 35 +++++++++++++ .../translations/messages+intl-icu.fr.yaml | 14 +++++ .../translations/messages.fr.yml | 2 + 15 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 src/Bundle/ChillPersonBundle/migrations/Version20241220102357.php diff --git a/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php b/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php index 07ab6da70..b9badff8a 100644 --- a/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php +++ b/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php @@ -33,9 +33,12 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Security; use Symfony\Component\Serializer\Exception; use Symfony\Contracts\Translation\TranslatorInterface; +use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; class HouseholdMemberController extends ApiController { + private array $fields_visibility; + public function __construct( private readonly UrlGeneratorInterface $generator, private readonly TranslatorInterface $translator, @@ -45,7 +48,10 @@ class HouseholdMemberController extends ApiController private readonly Security $security, private readonly PositionRepository $positionRepository, private readonly \Doctrine\Persistence\ManagerRegistry $managerRegistry, - ) {} + protected ParameterBagInterface $parameterBag, + ) { + $this->fields_visibility = $parameterBag->get('chill_person.person_fields'); + } #[Route(path: '/{_locale}/person/household/member/{id}/edit', name: 'chill_person_household_member_edit')] public function editMembership(Request $request, HouseholdMember $member): Response @@ -144,6 +150,7 @@ class HouseholdMemberController extends ApiController 'allowHouseholdCreate' => $allowHouseholdCreate ?? true, 'allowHouseholdSearch' => $allowHouseholdSearch ?? true, 'allowLeaveWithoutHousehold' => $allowLeaveWithoutHousehold ?? $request->query->has('allow_leave_without_household'), + 'displayDependents' => ('visible' == $this->fields_visibility['number_of_dependents']) ? true : false, ]; // context diff --git a/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php index c0cdee8fa..d33ddfdc6 100644 --- a/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php @@ -83,6 +83,7 @@ class Configuration implements ConfigurationInterface ->append($this->addFieldNode('accompanying_period')) ->append($this->addFieldNode('memo')) ->append($this->addFieldNode('number_of_children')) + ->append($this->addFieldNode('number_of_dependents', 'hidden')) ->append($this->addFieldNode('acceptEmail')) ->append($this->addFieldNode('deathdate')) ->append($this->addFieldNode('employment_status', 'hidden')) diff --git a/src/Bundle/ChillPersonBundle/Entity/Household/HouseholdComposition.php b/src/Bundle/ChillPersonBundle/Entity/Household/HouseholdComposition.php index 4aea2129c..ac84bb3fd 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Household/HouseholdComposition.php +++ b/src/Bundle/ChillPersonBundle/Entity/Household/HouseholdComposition.php @@ -58,6 +58,18 @@ class HouseholdComposition implements TrackCreationInterface, TrackUpdateInterfa #[ORM\Column(type: \Doctrine\DBAL\Types\Types::INTEGER, nullable: true, options: ['default' => null])] private ?int $numberOfChildren = null; + #[Assert\NotNull] + #[Assert\GreaterThanOrEqual(0, groups: ['Default', 'household_composition'])] + #[Serializer\Groups(['docgen:read'])] + #[ORM\Column(type: \Doctrine\DBAL\Types\Types::INTEGER, nullable: true, options: ['default' => null])] + private ?int $numberOfDependents = null; + + #[Assert\NotNull] + #[Assert\GreaterThanOrEqual(0, groups: ['Default', 'household_composition'])] + #[Serializer\Groups(['docgen:read'])] + #[ORM\Column(type: \Doctrine\DBAL\Types\Types::INTEGER, nullable: true, options: ['default' => null])] + private ?int $numberOfDependentsWithDisabilities = null; + #[Assert\NotNull(groups: ['Default', 'household_composition'])] #[Serializer\Groups(['docgen:read'])] #[ORM\Column(type: \Doctrine\DBAL\Types\Types::DATE_IMMUTABLE, nullable: false)] @@ -98,6 +110,16 @@ class HouseholdComposition implements TrackCreationInterface, TrackUpdateInterfa return $this->numberOfChildren; } + public function getNumberOfDependents(): ?int + { + return $this->numberOfDependents; + } + + public function getNumberOfDependentsWithDisabilities(): ?int + { + return $this->numberOfDependentsWithDisabilities; + } + public function getStartDate(): ?\DateTimeImmutable { return $this->startDate; @@ -142,6 +164,20 @@ class HouseholdComposition implements TrackCreationInterface, TrackUpdateInterfa return $this; } + public function setNumberOfDependents(?int $numberOfDependents): HouseholdComposition + { + $this->numberOfDependents = $numberOfDependents; + + return $this; + } + + public function setNumberOfDependentsWithDisabilities(?int $numberOfDependentsWithDisabilities): HouseholdComposition + { + $this->numberOfDependentsWithDisabilities = $numberOfDependentsWithDisabilities; + + return $this; + } + public function setStartDate(?\DateTimeImmutable $startDate): HouseholdComposition { $this->startDate = $startDate; diff --git a/src/Bundle/ChillPersonBundle/Form/HouseholdCompositionType.php b/src/Bundle/ChillPersonBundle/Form/HouseholdCompositionType.php index 2df66039f..437a209e7 100644 --- a/src/Bundle/ChillPersonBundle/Form/HouseholdCompositionType.php +++ b/src/Bundle/ChillPersonBundle/Form/HouseholdCompositionType.php @@ -19,10 +19,19 @@ use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\IntegerType; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; class HouseholdCompositionType extends AbstractType { - public function __construct(private readonly HouseholdCompositionTypeRepository $householdCompositionTypeRepository, private readonly TranslatableStringHelperInterface $translatableStringHelper) {} + private array $fields_visibility; + + public function __construct( + private readonly HouseholdCompositionTypeRepository $householdCompositionTypeRepository, + private readonly TranslatableStringHelperInterface $translatableStringHelper, + protected ParameterBagInterface $parameterBag, + ) { + $this->fields_visibility = $parameterBag->get('chill_person.person_fields'); + } public function buildForm(FormBuilderInterface $builder, array $options) { @@ -42,7 +51,19 @@ class HouseholdCompositionType extends AbstractType ->add('numberOfChildren', IntegerType::class, [ 'required' => true, 'label' => 'household_composition.numberOfChildren', - ]) + ]); + if ('visible' == $this->fields_visibility['number_of_dependents']) { + $builder + ->add('numberOfDependents', IntegerType::class, [ + 'required' => true, + 'label' => 'household_composition.numberOfDependents', + ]) + ->add('numberOfDependentsWithDisabilities', IntegerType::class, [ + 'required' => true, + 'label' => 'household_composition.numberOfDependentsWithDisabilities', + ]); + } + $builder ->add('comment', CommentType::class, [ 'required' => false, ]); diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Dates.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Dates.vue index 854db2058..b5392d110 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Dates.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Dates.vue @@ -47,6 +47,36 @@ /> +
    + +
    + +
    +
    +
    + +
    + +
    +
    @@ -62,6 +92,11 @@ export default { computed: { ...mapState(["householdCompositionTypes"]), ...mapGetters(["isHouseholdNew"]), + displayDependents: { + get() { + return window.household_members_editor_data.displayDependents; + }, + }, householdCompositionType: { get() { if (this.$store.state.householdCompositionType !== null) { @@ -81,6 +116,22 @@ export default { this.$store.commit("setNumberOfChildren", value); }, }, + numberOfDependents: { + get() { + return this.$store.state.numberOfDependents; + }, + set(value) { + this.$store.commit("setNumberOfDependents", value); + }, + }, + numberOfDependentsWithDisabilities: { + get() { + return this.$store.state.numberOfDependentsWithDisabilities; + }, + set(value) { + this.$store.commit("setNumberOfDependentsWithDisabilities", value); + }, + }, startDate: { get() { return this.$store.state.startDate; diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/js/i18n.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/js/i18n.js index 4afecc448..425088f81 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/js/i18n.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/js/i18n.js @@ -91,6 +91,9 @@ const appMessages = { composition: "Composition familiale", household_composition: "Composition du ménage", number_of_children: "Nombre d'enfants mineurs au sein du ménage", + number_of_dependents: "Nombre de personnes majeures à charge", + number_of_dependents_with_disabilities: + "Nombre de personnes à charge reconnues handicapées", }, confirmation: { save: "Enregistrer", diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js index d0ce9162f..7327d9003 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js @@ -73,6 +73,8 @@ const store = createStore({ window.household_members_editor_expand_suggestions === 1, householdCompositionType: null, numberOfChildren: 0, + numberOfDependents: 0, + numberOfDependentsWithDisabilities: 0, addressesSuggestion: [], showAddressSuggestion: true, householdCompositionTypes: [], @@ -322,6 +324,9 @@ const store = createStore({ start_date: { datetime: datetimeToISO(ISOToDate(state.startDate)), }, + number_of_dependents: state.numberOfDependents, + number_of_dependents_with_disabilities: + state.numberOfDependentsWithDisabilities, }; } @@ -455,6 +460,12 @@ const store = createStore({ setNumberOfChildren(state, number) { state.numberOfChildren = Number.parseInt(number); }, + setNumberOfDependents(state, number) { + state.numberOfDependents = Number.parseInt(number); + }, + setNumberOfDependentsWithDisabilities(state, number) { + state.numberOfDependentsWithDisabilities = Number.parseInt(number); + }, addAddressesSuggestion(state, addresses) { let existingIds = state.addressesSuggestion.map((a) => a.address_id); diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Household/summary.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Household/summary.html.twig index 4f4a0841d..a142ffd5f 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/Household/summary.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/Household/summary.html.twig @@ -63,6 +63,12 @@

    {{ 'household_composition.numberOfChildren children in household'|trans({'numberOfChildren': currentComposition.numberOfChildren}) }} + {% if chill_person.fields.number_of_dependents == 'visible' %} +
    + {{ 'household_composition.numberOfDependents adult dependents'|trans({'numberOfDependents': currentComposition.numberOfDependents}) }} +
    + {{ 'household_composition.numberOfDependentsWithDisabilities dependents with disabilities'|trans({'numberOfDependentsWithDisabilities': currentComposition.numberOfDependentsWithDisabilities}) }} + {% endif %}

    {{ 'household_composition.Since'|trans({'startDate': currentComposition.startDate}) }} diff --git a/src/Bundle/ChillPersonBundle/Resources/views/HouseholdComposition/index.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/HouseholdComposition/index.html.twig index 7d3adc04a..2b0b8946b 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/HouseholdComposition/index.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/HouseholdComposition/index.html.twig @@ -21,6 +21,10 @@

    {{ c.householdCompositionType.label|localize_translatable_string }}

    {{ 'household_composition.numberOfChildren'|trans }}: {{ c.numberOfChildren }}

    + {% if chill_person.fields.number_of_dependents == 'visible' %} +

    {{ 'household_composition.numberOfDependents'|trans }}: {{ c.numberOfDependents }}

    +

    {{ 'household_composition.numberOfDependentsWithDisabilities'|trans }}: {{ c.numberOfDependentsWithDisabilities }}

    + {% endif %}
    {{ 'household_composition.Since'|trans({'startDate': c.startDate}) }}
    diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Person/view.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Person/view.html.twig index 74585c5f1..c8f4da3ec 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/Person/view.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/Person/view.html.twig @@ -206,6 +206,28 @@ This view should receive those arguments:
    {%- endif -%} + {%- if chill_person.fields.number_of_dependents == 'isible' -%} +
    +
    {{'Number of dependents'|trans}} :
    +
    + {% if person.numberOfDependents is not null %} + {{ person.numberOfDependents }} + {% else %} + {{ 'No data given'|trans }} + {% endif %} +
    +
    +
    +
    {{'Number of dependents with disabilities'|trans}} :
    +
    + {% if person.numberOfDependents is not null %} + {{ person.numberOfDependentsWithDisabilities }} + {% else %} + {{ 'No data given'|trans }} + {% endif %} +
    +
    + {%- endif -%} {%- if chill_person.fields.marital_status == 'visible' -%}
    {{'Marital status'|trans}} :
    diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/MembersEditorNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/MembersEditorNormalizer.php index 0e358483e..956bdf03c 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/MembersEditorNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/MembersEditorNormalizer.php @@ -147,6 +147,8 @@ class MembersEditorNormalizer implements DenormalizerAwareInterface, Denormalize if (null !== $data['composition']) { $compositionType = $this->denormalizer->denormalize($data['composition']['household_composition_type'], HouseholdCompositionType::class, $format, $context); $numberOfChildren = $data['composition']['number_of_children']; + $numberOfDependents = $data['composition']['number_of_dependents']; + $numberOfDependentsWithDisabilities = $data['composition']['number_of_dependents_with_disabilities']; $startDate = $this->denormalizer->denormalize($data['composition']['start_date'], \DateTimeImmutable::class, $format, $context); if (null === $compositionType) { @@ -156,6 +158,8 @@ class MembersEditorNormalizer implements DenormalizerAwareInterface, Denormalize $householdComposition = (new HouseholdComposition()) ->setHouseholdCompositionType($compositionType) ->setNumberOfChildren($numberOfChildren) + ->setNumberOfDependents($numberOfDependents) + ->setNumberOfDependentsWithDisabilities($numberOfDependentsWithDisabilities) ->setStartDate($startDate); $household->addComposition($householdComposition); diff --git a/src/Bundle/ChillPersonBundle/migrations/Version20241127160628.php b/src/Bundle/ChillPersonBundle/migrations/Version20241127160628.php index 5e657f6ce..cd6a67b6d 100644 --- a/src/Bundle/ChillPersonBundle/migrations/Version20241127160628.php +++ b/src/Bundle/ChillPersonBundle/migrations/Version20241127160628.php @@ -14,9 +14,6 @@ namespace Chill\Migrations\Person; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; -/** - * Auto-generated Migration: Please modify to your needs! - */ final class Version20241127160628 extends AbstractMigration { public function getDescription(): string diff --git a/src/Bundle/ChillPersonBundle/migrations/Version20241220102357.php b/src/Bundle/ChillPersonBundle/migrations/Version20241220102357.php new file mode 100644 index 000000000..123efdb1a --- /dev/null +++ b/src/Bundle/ChillPersonBundle/migrations/Version20241220102357.php @@ -0,0 +1,35 @@ +addSql('ALTER TABLE chill_person_household_composition ADD numberOfDependents INT DEFAULT NULL'); + $this->addSql('ALTER TABLE chill_person_household_composition ADD numberOfDependentsWithDisabilities INT DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE chill_person_household_composition DROP numberOfDependents'); + $this->addSql('ALTER TABLE chill_person_household_composition DROP numberOfDependentsWithDisabilities'); + } +} diff --git a/src/Bundle/ChillPersonBundle/translations/messages+intl-icu.fr.yaml b/src/Bundle/ChillPersonBundle/translations/messages+intl-icu.fr.yaml index 76a8606af..830e21d2d 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages+intl-icu.fr.yaml +++ b/src/Bundle/ChillPersonBundle/translations/messages+intl-icu.fr.yaml @@ -116,6 +116,20 @@ household_composition: few {# enfants dans le ménage} other {# enfants dans le ménage} } + numberOfDependents adult dependents: >- + {numberOfDependents, plural, + =0 {Aucune personne majeure à charge} + one {1 personne majeure à charge} + few {# personnes majeures à charge} + other {# personnes majeures à charge} + } + numberOfDependentsWithDisabilities dependents with disabilities: >- + {numberOfDependentsWithDisabilities, plural, + =0 {Aucune personne à charge reconnue handicapée} + one {1 personne à charge reconnue handicapée} + few {# personnes à charge reconnue handicapée} + other {# personnes à charge reconnue handicapée} + } periods: title: Parcours d'accompagnement (n°{id}) diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 1759cedc3..c33b6be4a 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -963,6 +963,8 @@ household_composition: Add a composition: Ajouter une composition familiale Update composition: Modifier la composition familiale Create: Créér une nouvelle composition familiale + numberOfDependents: Nombre de personnes majeures à charges + numberOfDependentsWithDisabilities: Nombre de personnes à charge reconnues handicapées # docgen Linked evaluations: Évaluations associées From 03717a1a878a1336b1d68989b0b9abade58d6c2a Mon Sep 17 00:00:00 2001 From: Christophe Siraut Date: Fri, 20 Dec 2024 11:28:36 +0100 Subject: [PATCH 5/5] ChillPersonBundle: move numberOfDependents configuration to a new household node; extend AdministrativeStatusRepository and EmploymentStatusRepository from ServiceEntityRepository --- .../Controller/HouseholdMemberController.php | 6 +-- .../ChillPersonExtension.php | 21 +++++++++++ .../DependencyInjection/Configuration.php | 6 +++ .../Entity/AdministrativeStatus.php | 3 +- .../Entity/EmploymentStatus.php | 3 +- .../Form/HouseholdCompositionType.php | 6 +-- .../AdministrativeStatusRepository.php | 37 +++---------------- ...dministrativeStatusRepositoryInterface.php | 27 -------------- .../Repository/EmploymentStatusRepository.php | 37 +++---------------- .../EmploymentStatusRepositoryInterface.php | 27 -------------- .../views/Household/summary.html.twig | 2 +- .../HouseholdComposition/index.html.twig | 2 +- 12 files changed, 49 insertions(+), 128 deletions(-) delete mode 100644 src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepositoryInterface.php delete mode 100644 src/Bundle/ChillPersonBundle/Repository/EmploymentStatusRepositoryInterface.php diff --git a/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php b/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php index b9badff8a..fd35ef31b 100644 --- a/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php +++ b/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php @@ -37,7 +37,7 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; class HouseholdMemberController extends ApiController { - private array $fields_visibility; + private array $household_fields_visibility; public function __construct( private readonly UrlGeneratorInterface $generator, @@ -50,7 +50,7 @@ class HouseholdMemberController extends ApiController private readonly \Doctrine\Persistence\ManagerRegistry $managerRegistry, protected ParameterBagInterface $parameterBag, ) { - $this->fields_visibility = $parameterBag->get('chill_person.person_fields'); + $this->household_fields_visibility = $parameterBag->get('chill_person.household_fields'); } #[Route(path: '/{_locale}/person/household/member/{id}/edit', name: 'chill_person_household_member_edit')] @@ -150,7 +150,7 @@ class HouseholdMemberController extends ApiController 'allowHouseholdCreate' => $allowHouseholdCreate ?? true, 'allowHouseholdSearch' => $allowHouseholdSearch ?? true, 'allowLeaveWithoutHousehold' => $allowLeaveWithoutHousehold ?? $request->query->has('allow_leave_without_household'), - 'displayDependents' => ('visible' == $this->fields_visibility['number_of_dependents']) ? true : false, + 'displayDependents' => ('visible' == $this->household_fields_visibility['number_of_dependents']) ? true : false, ]; // context diff --git a/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php b/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php index 8fddd477d..40393f79e 100644 --- a/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php +++ b/src/Bundle/ChillPersonBundle/DependencyInjection/ChillPersonExtension.php @@ -60,6 +60,7 @@ class ChillPersonExtension extends Extension implements PrependExtensionInterfac $this->handlePersonFieldsParameters($container, $config['person_fields']); $this->handleAccompanyingPeriodsFieldsParameters($container, $config['accompanying_periods_fields']); + $this->handleHouseholdFieldsParameters($container, $config['household_fields']); $container->setParameter( 'chill_person.allow_multiple_simultaneous_accompanying_periods', @@ -135,6 +136,9 @@ class ChillPersonExtension extends Extension implements PrependExtensionInterfac 'chill_accompanying_periods' => [ 'fields' => $config['accompanying_periods_fields'], ], + 'chill_household' => [ + 'fields' => $config['household_fields'], + ], ], 'form_themes' => ['@ChillPerson/Export/ListPersonFormFields.html.twig'], ]; @@ -1142,6 +1146,23 @@ class ChillPersonExtension extends Extension implements PrependExtensionInterfac } } + private function handleHouseholdFieldsParameters(ContainerBuilder $container, $config) + { + $container->setParameter('chill_person.household_fields', $config); + + foreach ($config as $key => $value) { + switch ($key) { + case 'enabled': + break; + + default: + $container->setParameter('chill_person.household_fields.'.$key, $value); + + break; + } + } + } + private function handlePersonFieldsParameters(ContainerBuilder $container, $config) { if (\array_key_exists('enabled', $config)) { diff --git a/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php index d33ddfdc6..12c8b4c5b 100644 --- a/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php @@ -110,6 +110,12 @@ class Configuration implements ConfigurationInterface ->end() ->end() // children for 'person_fields', parent = array 'person_fields' ->end() // person_fields, parent = children of root + ->arrayNode('household_fields') + ->canBeDisabled() + ->children() + ->append($this->addFieldNode('number_of_dependents', 'hidden')) + ->end() + ->end() ->arrayNode('accompanying_periods_fields') ->canBeDisabled() ->children() diff --git a/src/Bundle/ChillPersonBundle/Entity/AdministrativeStatus.php b/src/Bundle/ChillPersonBundle/Entity/AdministrativeStatus.php index 35260ae56..23d451f48 100644 --- a/src/Bundle/ChillPersonBundle/Entity/AdministrativeStatus.php +++ b/src/Bundle/ChillPersonBundle/Entity/AdministrativeStatus.php @@ -11,11 +11,12 @@ declare(strict_types=1); namespace Chill\PersonBundle\Entity; +use Chill\PersonBundle\Repository\AdministrativeStatusRepository; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Serializer\Annotation as Serializer; #[Serializer\DiscriminatorMap(typeProperty: 'type', mapping: ['chill_person_administrative_status' => AdministrativeStatus::class])] -#[ORM\Entity] +#[ORM\Entity(repositoryClass: AdministrativeStatusRepository::class)] #[ORM\Table(name: 'chill_person_administrative_status')] class AdministrativeStatus { diff --git a/src/Bundle/ChillPersonBundle/Entity/EmploymentStatus.php b/src/Bundle/ChillPersonBundle/Entity/EmploymentStatus.php index 08b1f45ac..83b3c65f5 100644 --- a/src/Bundle/ChillPersonBundle/Entity/EmploymentStatus.php +++ b/src/Bundle/ChillPersonBundle/Entity/EmploymentStatus.php @@ -11,11 +11,12 @@ declare(strict_types=1); namespace Chill\PersonBundle\Entity; +use Chill\PersonBundle\Repository\EmploymentStatusRepository; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Serializer\Annotation as Serializer; #[Serializer\DiscriminatorMap(typeProperty: 'type', mapping: ['chill_person_employment_status' => EmploymentStatus::class])] -#[ORM\Entity] +#[ORM\Entity(repositoryClass: EmploymentStatusRepository::class)] #[ORM\Table(name: 'chill_person_employment_status')] class EmploymentStatus { diff --git a/src/Bundle/ChillPersonBundle/Form/HouseholdCompositionType.php b/src/Bundle/ChillPersonBundle/Form/HouseholdCompositionType.php index 437a209e7..b0b7fbef5 100644 --- a/src/Bundle/ChillPersonBundle/Form/HouseholdCompositionType.php +++ b/src/Bundle/ChillPersonBundle/Form/HouseholdCompositionType.php @@ -23,14 +23,14 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; class HouseholdCompositionType extends AbstractType { - private array $fields_visibility; + private array $household_fields_visibility; public function __construct( private readonly HouseholdCompositionTypeRepository $householdCompositionTypeRepository, private readonly TranslatableStringHelperInterface $translatableStringHelper, protected ParameterBagInterface $parameterBag, ) { - $this->fields_visibility = $parameterBag->get('chill_person.person_fields'); + $this->household_fields_visibility = $parameterBag->get('chill_person.household_fields'); } public function buildForm(FormBuilderInterface $builder, array $options) @@ -52,7 +52,7 @@ class HouseholdCompositionType extends AbstractType 'required' => true, 'label' => 'household_composition.numberOfChildren', ]); - if ('visible' == $this->fields_visibility['number_of_dependents']) { + if ('visible' == $this->household_fields_visibility['number_of_dependents']) { $builder ->add('numberOfDependents', IntegerType::class, [ 'required' => true, diff --git a/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepository.php b/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepository.php index 40254c395..637db23c5 100644 --- a/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepository.php +++ b/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepository.php @@ -12,40 +12,13 @@ declare(strict_types=1); namespace Chill\PersonBundle\Repository; use Chill\PersonBundle\Entity\AdministrativeStatus; -use Doctrine\ORM\EntityManagerInterface; -use Doctrine\ORM\EntityRepository; +use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\Persistence\ManagerRegistry; -class AdministrativeStatusRepository implements AdministrativeStatusRepositoryInterface +class AdministrativeStatusRepository extends ServiceEntityRepository { - private readonly EntityRepository $repository; - - public function __construct(EntityManagerInterface $entityManager) + public function __construct(ManagerRegistry $registry) { - $this->repository = $entityManager->getRepository(AdministrativeStatus::class); - } - - public function find($id): ?AdministrativeStatus - { - return $this->repository->find($id); - } - - public function findAll(): array - { - return $this->repository->findAll(); - } - - public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null): array - { - return $this->repository->findBy($criteria, $orderBy, $limit, $offset); - } - - public function findOneBy(array $criteria): ?AdministrativeStatus - { - return $this->findOneBy($criteria); - } - - public function getClassName(): string - { - return AdministrativeStatus::class; + parent::__construct($registry, AdministrativeStatus::class); } } diff --git a/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepositoryInterface.php b/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepositoryInterface.php deleted file mode 100644 index da40a117b..000000000 --- a/src/Bundle/ChillPersonBundle/Repository/AdministrativeStatusRepositoryInterface.php +++ /dev/null @@ -1,27 +0,0 @@ -repository = $entityManager->getRepository(EmploymentStatus::class); - } - - public function find($id): ?EmploymentStatus - { - return $this->repository->find($id); - } - - public function findAll(): array - { - return $this->repository->findAll(); - } - - public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null): array - { - return $this->repository->findBy($criteria, $orderBy, $limit, $offset); - } - - public function findOneBy(array $criteria): ?EmploymentStatus - { - return $this->findOneBy($criteria); - } - - public function getClassName(): string - { - return EmploymentStatus::class; + parent::__construct($registry, EmploymentStatus::class); } } diff --git a/src/Bundle/ChillPersonBundle/Repository/EmploymentStatusRepositoryInterface.php b/src/Bundle/ChillPersonBundle/Repository/EmploymentStatusRepositoryInterface.php deleted file mode 100644 index 5d696cc9c..000000000 --- a/src/Bundle/ChillPersonBundle/Repository/EmploymentStatusRepositoryInterface.php +++ /dev/null @@ -1,27 +0,0 @@ -

    {{ 'household_composition.numberOfChildren children in household'|trans({'numberOfChildren': currentComposition.numberOfChildren}) }} - {% if chill_person.fields.number_of_dependents == 'visible' %} + {% if chill_household.fields.number_of_dependents == 'visible' %}
    {{ 'household_composition.numberOfDependents adult dependents'|trans({'numberOfDependents': currentComposition.numberOfDependents}) }}
    diff --git a/src/Bundle/ChillPersonBundle/Resources/views/HouseholdComposition/index.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/HouseholdComposition/index.html.twig index 2b0b8946b..f3c931707 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/HouseholdComposition/index.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/HouseholdComposition/index.html.twig @@ -21,7 +21,7 @@

    {{ c.householdCompositionType.label|localize_translatable_string }}

    {{ 'household_composition.numberOfChildren'|trans }}: {{ c.numberOfChildren }}

    - {% if chill_person.fields.number_of_dependents == 'visible' %} + {% if chill_household.fields.number_of_dependents == 'visible' %}

    {{ 'household_composition.numberOfDependents'|trans }}: {{ c.numberOfDependents }}

    {{ 'household_composition.numberOfDependentsWithDisabilities'|trans }}: {{ c.numberOfDependentsWithDisabilities }}

    {% endif %}