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 %} +