exports avg_accompanying_course_duration with closingdate parameter

This commit is contained in:
Mathieu Jaumotte 2022-07-18 14:38:48 +02:00
parent 903ac2ff69
commit 34923df43c
3 changed files with 75 additions and 32 deletions

View File

@ -11,29 +11,46 @@ declare(strict_types=1);
namespace Chill\PersonBundle\Export\Export;
use Chill\MainBundle\Export\ExportElementValidatedInterface;
use Chill\MainBundle\Export\ExportInterface;
use Chill\MainBundle\Export\FormatterInterface;
use Chill\MainBundle\Export\GroupedExportInterface;
use Chill\MainBundle\Export\ListInterface;
use Chill\MainBundle\Form\Type\ChillDateType;
use Chill\PersonBundle\Repository\AccompanyingPeriodRepository;
use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodVoter;
use Doctrine\ORM\Query;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class StatAccompanyingCourseDuration implements ListInterface, ExportElementValidatedInterface, GroupedExportInterface
class StatAccompanyingCourseDuration implements ExportInterface, GroupedExportInterface
{
private AccompanyingPeriodRepository $periodRepository;
/**
* @inheritDoc
* @param AccompanyingPeriodRepository $periodRepository
*/
public function buildForm(FormBuilderInterface $builder)
{
// TODO: Implement buildForm() method.
public function __construct(
AccompanyingPeriodRepository $periodRepository
) {
$this->periodRepository = $periodRepository;
}
/**
* @inheritDoc
*/
public function getTitle()
public function buildForm(FormBuilderInterface $builder): void
{
$builder->add('closingdate', ChillDateType::class, [
'label' => 'Closingdate to apply',
'data' => new \DateTime('now'),
]);
}
/**
* @inheritDoc
*/
public function getTitle(): string
{
return 'Accompanying courses duration';
}
@ -41,15 +58,15 @@ class StatAccompanyingCourseDuration implements ListInterface, ExportElementVali
/**
* @inheritDoc
*/
public function getAllowedFormattersTypes()
public function getAllowedFormattersTypes(): array
{
// TODO: Implement getAllowedFormattersTypes() method.
return [FormatterInterface::TYPE_TABULAR];
}
/**
* @inheritDoc
*/
public function getDescription()
public function getDescription(): string
{
return 'Create an average of accompanying courses duration according to various filters';
}
@ -59,39 +76,67 @@ class StatAccompanyingCourseDuration implements ListInterface, ExportElementVali
*/
public function getLabels($key, array $values, $data)
{
// TODO: Implement getLabels() method.
if ('export_result' !== $key) {
throw new LogicException("the key {$key} is not used by this export");
}
$labels = array_combine($values, $values);
$labels['_header'] = $this->getTitle();
return static function ($value) use ($labels) {
return $labels[$value];
};
}
/**
* @inheritDoc
*/
public function getQueryKeys($data)
public function getQueryKeys($data): array
{
// TODO: Implement getQueryKeys() method.
return ['export_result'];
}
/**
* @inheritDoc
*/
public function getResult($query, $data)
public function getResult($qb, $data)
{
// TODO: Implement getResult() method.
return $qb->getQuery()->getResult(Query::HYDRATE_SCALAR);
}
/**
* @inheritDoc
*/
public function getType()
public function getType(): string
{
// TODO: Implement getType() method.
return 'accompanying_course';
}
/**
* @inheritDoc
*/
public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
public function initiateQuery(array $requiredModifiers, array $acl, array $data = []): QueryBuilder
{
// TODO: Implement initiateQuery() method.
$qb = $this->periodRepository->createQueryBuilder('acp');
$expr = $qb->expr();
$force_closingdate = $data['closingdate']; // parameter from buildForm
$qb
->select('AVG(
( CASE
WHEN acp.closingDate IS NOT NULL
THEN acp.closingDate
ELSE :force_closingDate
END ) - acp.openingDate
) AS export_result')
->where($expr->neq(
'acp.step', $expr->literal('DRAFT')
))
->setParameter('force_closingDate', $force_closingdate)
;
return $qb;
}
/**
@ -105,14 +150,9 @@ class StatAccompanyingCourseDuration implements ListInterface, ExportElementVali
/**
* @inheritDoc
*/
public function supportsModifiers()
public function supportsModifiers(): array
{
// TODO: Implement supportsModifiers() method.
}
public function validateForm($data, ExecutionContextInterface $context)
{
// TODO: Implement validateForm() method.
return [];
}
public function getGroup(): string

View File

@ -33,11 +33,12 @@ services:
tags:
- { name: chill.export, alias: count_accompanying_course }
chill.person.export.sum_accompanying_course_duration:
chill.person.export.avg_accompanying_course_duration:
class: Chill\PersonBundle\Export\Export\StatAccompanyingCourseDuration
arguments:
- '@Chill\PersonBundle\Repository\AccompanyingPeriodRepository'
tags:
- { name: chill.export, alias: sum_accompanying_course_duration }
- { name: chill.export, alias: avg_accompanying_course_duration }
chill.person.export.filter_gender:
class: Chill\PersonBundle\Export\Filter\GenderFilter

View File

@ -337,11 +337,13 @@ Fields to include in export: Champs à inclure dans l'export
Address valid at this date: Addresse valide à cette date
List duplicates: Liste des doublons
Create a list of duplicate people: Créer la liste des personnes détectées comme doublons.
Exports of accompanying courses: Exports des parcours d'accompagnement
Count accompanying courses: Nombre de parcours
Count accompanying courses by various parameters: Compte le nombre de parcours en fonction de différents filtres.
Accompanying courses duration: Durée des parcours
Create an average of accompanying courses duration according to various filters: Moyenne de la durée des parcours selon différents filtres.
Accompanying courses duration: Durée moyenne des parcours
Create an average of accompanying courses duration according to various filters: Moyenne de la durée des parcours en jours, selon différents filtres.
Closingdate to apply: Date de fin à prendre en compte lorsque le parcours n'est pas clotûré
## filters
Filter by person gender: Filtrer par genre de la personne