diff --git a/src/Bundle/ChillPersonBundle/Export/Export/StatAccompanyingCourseDuration.php b/src/Bundle/ChillPersonBundle/Export/Export/StatAccompanyingCourseDuration.php index 9a9319c20..1241c7f88 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/StatAccompanyingCourseDuration.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/StatAccompanyingCourseDuration.php @@ -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 diff --git a/src/Bundle/ChillPersonBundle/config/services/exports.yaml b/src/Bundle/ChillPersonBundle/config/services/exports.yaml index 4b1db59a0..19ed9174b 100644 --- a/src/Bundle/ChillPersonBundle/config/services/exports.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/exports.yaml @@ -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 diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 89d77ab6b..b2cd212e6 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -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