diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByEndDateAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByEndDateAggregator.php index 40b035a02..2f4275c49 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByEndDateAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByEndDateAggregator.php @@ -14,10 +14,23 @@ namespace Chill\PersonBundle\Export\Aggregator\EvaluationAggregators; use Chill\MainBundle\Export\AggregatorInterface; use Chill\PersonBundle\Export\Declarations; use Doctrine\ORM\QueryBuilder; +use LogicException; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class ByEndDateAggregator implements AggregatorInterface { + private const CHOICES = [ + 'by week' => 'week', + 'by month' => 'month', + 'by year' => 'year', + ]; + + private const DEFAULT_CHOICE = 'year'; + + private TranslatorInterface $translator; + public function addRole(): ?string { return null; @@ -25,8 +38,29 @@ class ByEndDateAggregator implements AggregatorInterface public function alterQuery(QueryBuilder $qb, $data) { - $qb->addSelect('AS eval_by_end_date_aggregator') - ->addGroupBy('eval_by_end_date_aggregator'); + switch ($data['frequency']) { + case 'week': + $fmt = 'YYYY-IW'; + + break; + + case 'month': + $fmt = 'YYYY-MM'; + + break; + + case 'year': + $fmt = 'YYYY'; + + break; + + default: + throw new LogicException(sprintf("The frequency data '%s' is invalid.", $data['frequency'])); + } + + $qb->addSelect(sprintf("TO_CHAR(workeval.endDate, '%s') AS eval_by_end_date_aggregator", $fmt)); + $qb->addGroupBy(' eval_by_end_date_aggregator'); + $qb->addOrderBy(' eval_by_end_date_aggregator', 'ASC'); } public function applyOn(): string @@ -36,15 +70,27 @@ class ByEndDateAggregator implements AggregatorInterface public function buildForm(FormBuilderInterface $builder) { - // No form needed + $builder->add('frequency', ChoiceType::class, [ + 'choices' => self::CHOICES, + 'multiple' => false, + 'expanded' => true, + 'empty_data' => self::DEFAULT_CHOICE, + 'data' => self::DEFAULT_CHOICE, + ]); } public function getLabels($key, array $values, $data) { return static function ($value): string { if ('_header' === $value) { + return 'export.aggregator.eval.by_end_date.End date period'; + } + + if (null === $value) { return ''; } + + return $value; }; } @@ -55,6 +101,6 @@ class ByEndDateAggregator implements AggregatorInterface public function getTitle(): string { - return 'Group by end date evaluations'; + return 'export.aggregator.eval.by_end_date.Group by end date evaluations'; } } diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByMaxDateAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByMaxDateAggregator.php index 36ab0f50b..9283fd9dc 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByMaxDateAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByMaxDateAggregator.php @@ -14,10 +14,23 @@ namespace Chill\PersonBundle\Export\Aggregator\EvaluationAggregators; use Chill\MainBundle\Export\AggregatorInterface; use Chill\PersonBundle\Export\Declarations; use Doctrine\ORM\QueryBuilder; +use LogicException; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Contracts\Translation\TranslatorInterface; class ByMaxDateAggregator implements AggregatorInterface { + private const CHOICES = [ + 'by week' => 'week', + 'by month' => 'month', + 'by year' => 'year', + ]; + + private const DEFAULT_CHOICE = 'year'; + + private TranslatorInterface $translator; + public function addRole(): ?string { return null; @@ -25,8 +38,29 @@ class ByMaxDateAggregator implements AggregatorInterface public function alterQuery(QueryBuilder $qb, $data) { - $qb->addSelect('AS eval_by_max_date_aggregator') - ->addGroupBy('eval_by_max_date_aggregator'); + switch ($data['frequency']) { + case 'week': + $fmt = 'YYYY-IW'; + + break; + + case 'month': + $fmt = 'YYYY-MM'; + + break; + + case 'year': + $fmt = 'YYYY'; + + break; + + default: + throw new LogicException(sprintf("The frequency data '%s' is invalid.", $data['frequency'])); + } + + $qb->addSelect(sprintf("TO_CHAR(workeval.maxDate, '%s') AS eval_by_max_date_aggregator", $fmt)); + $qb->addGroupBy(' eval_by_max_date_aggregator'); + $qb->addOrderBy(' eval_by_max_date_aggregator', 'ASC'); } public function applyOn(): string @@ -36,15 +70,27 @@ class ByMaxDateAggregator implements AggregatorInterface public function buildForm(FormBuilderInterface $builder) { - // No form needed + $builder->add('frequency', ChoiceType::class, [ + 'choices' => self::CHOICES, + 'multiple' => false, + 'expanded' => true, + 'empty_data' => self::DEFAULT_CHOICE, + 'data' => self::DEFAULT_CHOICE, + ]); } public function getLabels($key, array $values, $data) { return static function ($value): string { if ('_header' === $value) { + return 'export.aggregator.eval.by_max_date.Max date'; + } + + if (null === $value) { return ''; } + + return $value; }; } @@ -55,6 +101,6 @@ class ByMaxDateAggregator implements AggregatorInterface public function getTitle(): string { - return 'Group by max date evaluations'; + return 'export.aggregator.eval.by_max_date.Group by max date evaluations'; } } diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByStartDateAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByStartDateAggregator.php index a41fe2451..cd183b25e 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByStartDateAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByStartDateAggregator.php @@ -22,8 +22,8 @@ use Symfony\Contracts\Translation\TranslatorInterface; class ByStartDateAggregator implements AggregatorInterface { private const CHOICES = [ - 'by month' => 'month', 'by week' => 'week', + 'by month' => 'month', 'by year' => 'year', ]; @@ -39,13 +39,13 @@ class ByStartDateAggregator implements AggregatorInterface public function alterQuery(QueryBuilder $qb, $data) { switch ($data['frequency']) { - case 'month': - $fmt = 'YYYY-MM'; + case 'week': + $fmt = 'YYYY-IW'; break; - case 'week': - $fmt = 'YYYY-IW'; + case 'month': + $fmt = 'YYYY-MM'; break; diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 7780c76dd..dca6c91f6 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -587,8 +587,6 @@ end period date: Date de fin de la période "Filtered by end date: between %start_date% and %end_date%": "Filtré par la date de fin: comprise entre %start_date% et %end_date%" Filter by current evaluations: Filtrer les évaluations en cours "Filtered by current evaluations": "Filtré: uniquement les évaluations en cours" -Group by end date evaluations: Grouper les évaluations par semaine/mois/année de la date de fin -Group by max date evaluations: Grouper les évaluations par semaine/mois/année de la date d'échéance ## social actions filters/aggr Filter by treating agent scope: Filtrer les actions par service de l'agent traitant @@ -1022,9 +1020,15 @@ export: Group evaluations having end date: Grouper les évaluations en cours (avec ou sans date de fin) enddate is specified: la date de fin est spécifiée enddate is not specified: la date de fin n'est pas spécifiée + Group by end date evaluations: Grouper les évaluations par semaine/mois/année de la date de fin + End date period: Fin (par periode) by_start_date_period: Start date period: Début (par periode) Group by start date evaluations: Grouper les évaluations par semaine/mois/année de la date de début + by_max_date: + Group by max date evaluations: Grouper les évaluations par semaine/mois/année de la date d'échéance + Max date: Date d'échéance + filter: course: by_user_scope: