From 6c37d798bf93738465b057e3c8d2a13da1983e78 Mon Sep 17 00:00:00 2001 From: Christophe Siraut Date: Wed, 27 Nov 2024 17:05:50 +0100 Subject: [PATCH] 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