Export: add a export which count persons on accompanying period work

This commit is contained in:
Julien Fastré 2023-11-15 11:56:49 +01:00
parent d5bc9d10d5
commit af585bada3
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
5 changed files with 204 additions and 2 deletions

View File

@ -0,0 +1,5 @@
kind: Feature
body: 'Export: add a export which count persons on accompanying period work'
time: 2023-11-15T11:45:50.540277614+01:00
custom:
Issue: "206"

View File

@ -0,0 +1,139 @@
<?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\Export;
use Chill\MainBundle\Export\AccompanyingCourseExportHelper;
use Chill\MainBundle\Export\ExportInterface;
use Chill\MainBundle\Export\FormatterInterface;
use Chill\MainBundle\Export\GroupedExportInterface;
use Chill\PersonBundle\Entity\AccompanyingPeriod;
use Chill\PersonBundle\Entity\Person\PersonCenterHistory;
use Chill\PersonBundle\Export\Declarations;
use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodVoter;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Form\FormBuilderInterface;
class CountPersonOnAccompanyingPeriodWorkAssociatePersonOnWork implements ExportInterface, GroupedExportInterface
{
private readonly bool $filterStatsByCenters;
public function __construct(
protected EntityManagerInterface $em,
ParameterBagInterface $parameterBag,
) {
$this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center'];
}
public function buildForm(FormBuilderInterface $builder): void
{
// No form necessary?
}
public function getFormDefaultData(): array
{
return [];
}
public function getAllowedFormattersTypes(): array
{
return [FormatterInterface::TYPE_TABULAR];
}
public function getDescription(): string
{
return 'export.export.count_person_on_acpw_associate_person_on_work.description';
}
public function getGroup(): string
{
return 'Exports of social work actions';
}
public function getLabels($key, array $values, $data)
{
if ('export_result' !== $key) {
throw new \LogicException("the key {$key} is not used by this export");
}
$labels = array_combine($values, $values);
$labels['_header'] = 'export.export.count_person_on_acpw_associate_person_on_work.header';
return static fn ($value) => $labels[$value];
}
public function getQueryKeys($data): array
{
return ['export_result'];
}
public function getResult($query, $data)
{
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
}
public function getTitle(): string
{
return 'export.export.count_person_on_acpw_associate_person_on_work.title';
}
public function getType(): string
{
return Declarations::SOCIAL_WORK_ACTION_TYPE;
}
public function initiateQuery(array $requiredModifiers, array $acl, array $data = []): QueryBuilder
{
$centers = array_map(static fn ($el) => $el['center'], $acl);
$qb = $this->em->createQueryBuilder();
$qb
->from(AccompanyingPeriod\AccompanyingPeriodWork::class, 'acpw')
->join('acpw.accompanyingPeriod', 'acp')
->join('acpw.persons', 'person');
if ($this->filterStatsByCenters) {
$qb
->andWhere(
$qb->expr()->exists(
'SELECT 1 FROM '.PersonCenterHistory::class.' acl_count_person_history WHERE acl_count_person_history.person = person
AND acl_count_person_history.center IN (:authorized_centers)
'
)
)
->setParameter('authorized_centers', $centers);
}
$qb->select('COUNT(DISTINCT person.id) as export_result');
AccompanyingCourseExportHelper::addClosingMotiveExclusionClause($qb);
return $qb;
}
public function requiredRole(): string
{
return AccompanyingPeriodVoter::STATS;
}
public function supportsModifiers(): array
{
return [
Declarations::SOCIAL_WORK_ACTION_TYPE,
Declarations::ACP_TYPE,
Declarations::PERSON_TYPE,
];
}
}

View File

@ -0,0 +1,50 @@
<?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\Tests\Export\Export;
use Chill\MainBundle\Test\Export\AbstractExportTest;
use Chill\PersonBundle\Export\Declarations;
use Chill\PersonBundle\Export\Export\CountAccompanyingPeriodWorkAssociatePersonOnWork;
use Doctrine\ORM\EntityManagerInterface;
/**
* @internal
*
* @coversNothing
*/
class CountPersonOnAccompanyingPeriodWorkAssociatePersonOnWorkTest extends AbstractExportTest
{
protected function setUp(): void
{
self::bootKernel();
}
public function getExport()
{
$em = self::$container->get(EntityManagerInterface::class);
yield new CountAccompanyingPeriodWorkAssociatePersonOnWork($em, $this->getParameters(true));
yield new CountAccompanyingPeriodWorkAssociatePersonOnWork($em, $this->getParameters(false));
}
public function getFormData()
{
return [[]];
}
public function getModifiersCombination()
{
return [
[Declarations::SOCIAL_WORK_ACTION_TYPE, Declarations::PERSON_TYPE, Declarations::ACP_TYPE],
];
}
}

View File

@ -22,6 +22,10 @@ services:
tags:
- { name: chill.export, alias: list_social_work_actions_associate_person_work }
Chill\PersonBundle\Export\Export\CountPersonOnAccompanyingPeriodWorkAssociatePersonOnWork:
tags:
- { name: chill.export, alias: count_person_on_acwp_associate_person_work }
Chill\PersonBundle\Export\Export\AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriod:
tags:
- { name: chill.export, alias: avg_duration_social_work_actions_person_associated_on_period }

View File

@ -1003,13 +1003,17 @@ export:
count_accompanying_period_work_associate_person:
title: Nombre d'actions, filtres et regroupements sur les usagers du parcours
description: Compte le nombre d'actions d'accompagnement avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements agissent sur les usagers concernés par le parcours de l'action.
description: Compte le nombre d'actions d'accompagnement avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements relatifs aux usagers agissent sur les usagers concernés par le parcours de l'action.
header: Nombre d'actions
count_accompanying_period_work_associate_work:
title: Nombre d'actions, filtres et regroupements sur les usagers de l'action
description: Compte le nombre d'actions d'accompagnement avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements agissent sur les usagers concernés par l'action.
description: Compte le nombre d'actions d'accompagnement avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements relatifs aux usagers agissent sur les usagers concernés par l'action.
header: Nombre d'actions
count_person_on_acpw_associate_person_on_work:
title: Nombre d'usagers concernés par une action d'accompagnement, filtres et regroupements sur les usagers de l'action
description: Compte le nombre d'usager concernés par une action d'accompagnement, avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements relatifs aux usagers agissent sur les usagers concernés par l'action. Si un usager est concerné par plusieurs actions, il n'est comptabilisé qu'une fois.
header: Nombre d'usagers concernés par une action
avg_duration_acpw_associate_on_period:
title: Durée moyenne des actions d'accompagnements, filtres et regroupement sur les usagers du parcours