ChillPersonBundle: add aggregators for administrative status and employment status

This commit is contained in:
Christophe Siraut 2024-12-18 18:45:27 +01:00
parent 6c37d798bf
commit 98cf167040
8 changed files with 324 additions and 0 deletions

View File

@ -0,0 +1,76 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\PersonBundle\Export\Aggregator\PersonAggregators;
use Chill\MainBundle\Export\AggregatorInterface;
use Chill\MainBundle\Templating\TranslatableStringHelper;
use Chill\PersonBundle\Export\Declarations;
use Chill\PersonBundle\Repository\AdministrativeStatusRepository;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface;
final readonly class AdministrativeStatusAggregator implements AggregatorInterface
{
public function __construct(private AdministrativeStatusRepository $administrativeStatusRepository, private TranslatableStringHelper $translatableStringHelper) {}
public function addRole(): ?string
{
return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
$qb->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';
}
}

View File

@ -0,0 +1,76 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\PersonBundle\Export\Aggregator\PersonAggregators;
use Chill\MainBundle\Export\AggregatorInterface;
use Chill\MainBundle\Templating\TranslatableStringHelper;
use Chill\PersonBundle\Export\Declarations;
use Chill\PersonBundle\Repository\EmploymentStatusRepository;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface;
final readonly class EmploymentStatusAggregator implements AggregatorInterface
{
public function __construct(private EmploymentStatusRepository $employmentStatusRepository, private TranslatableStringHelper $translatableStringHelper) {}
public function addRole(): ?string
{
return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
$qb->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';
}
}

View File

@ -0,0 +1,51 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\PersonBundle\Repository;
use Chill\PersonBundle\Entity\AdministrativeStatus;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
class AdministrativeStatusRepository implements AdministrativeStatusRepositoryInterface
{
private readonly EntityRepository $repository;
public function __construct(EntityManagerInterface $entityManager)
{
$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;
}
}

View File

@ -0,0 +1,27 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\PersonBundle\Repository;
use Chill\PersonBundle\Entity\AdministrativeStatus;
interface AdministrativeStatusRepositoryInterface
{
public function find($id): ?AdministrativeStatus;
public function findAll(): array;
public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null): array;
public function findOneBy(array $criteria): ?AdministrativeStatus;
public function getClassName(): string;
}

View File

@ -0,0 +1,51 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\PersonBundle\Repository;
use Chill\PersonBundle\Entity\EmploymentStatus;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
class EmploymentStatusRepository implements EmploymentStatusRepositoryInterface
{
private readonly EntityRepository $repository;
public function __construct(EntityManagerInterface $entityManager)
{
$this->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;
}
}

View File

@ -0,0 +1,27 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\PersonBundle\Repository;
use Chill\PersonBundle\Entity\EmploymentStatus;
interface EmploymentStatusRepositoryInterface
{
public function find($id): ?EmploymentStatus;
public function findAll(): array;
public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null): array;
public function findOneBy(array $criteria): ?EmploymentStatus;
public function getClassName(): string;
}

View File

@ -164,6 +164,20 @@ services:
tags:
- { name: chill.export_aggregator, alias: person_marital_status_aggregator }
chill.person.export.aggregator_administrative_status:
class: Chill\PersonBundle\Export\Aggregator\PersonAggregators\AdministrativeStatusAggregator
autowire: true
autoconfigure: true
tags:
- { name: chill.export_aggregator, alias: person_administrative_status_aggregator }
chill.person.export.aggregator_employment_status:
class: Chill\PersonBundle\Export\Aggregator\PersonAggregators\EmploymentStatusAggregator
autowire: true
autoconfigure: true
tags:
- { name: chill.export_aggregator, alias: person_employment_status_aggregator }
chill.person.export.aggregator_household_position:
class: Chill\PersonBundle\Export\Aggregator\PersonAggregators\HouseholdPositionAggregator
autowire: true

View File

@ -637,6 +637,8 @@ Group by country: Grouper par pays
Group people by gender: Grouper les usagers par genre
Group people by their professional situation: Grouper les usagers par situation professionelle
Group people by marital status: Grouper les usagers par état matrimonial
Group people by administrative status: Grouper les usagers par situation administrative
Group people by employment status: Grouper les usagers par situation professionelle
Aggregate by household position: Grouper les usagers par position dans le ménage
Household position in relation to this date: Position dans le ménage par rapport à cette date