Rename and implement form data normalization for filters

The `StepFilterTest` was renamed to `StepFilterOnDateTest` for improved clarity. Added `normalizeFormData` and `denormalizeFormData` methods to `UserJobFilter` and `StepFilterOnDate` for handling form data conversions. Also introduced `ExportDataNormalizerTrait` to enhance consistency in data normalization processes.
This commit is contained in:
Julien Fastré 2025-03-10 21:08:32 +01:00
parent 2c91d2e10f
commit 4fc433cd63
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
5 changed files with 79 additions and 4 deletions

View File

@ -0,0 +1,42 @@
<?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\MainBundle\Export;
use Doctrine\Persistence\ObjectRepository;
trait ExportDataNormalizerTrait
{
/**
* @param object|list<object> $entity
*/
public function normalizeDoctrineEntity(object|array $entity): array|int
{
if (is_array($entity)) {
return array_values(array_map(static fn (object $entity) => $entity->getId(), $entity));
}
return $entity->getId();
}
public function denormalizeDoctrineEntity(array|int $id, ObjectRepository $repository): object|array
{
if (is_array($id)) {
return $repository->findBy(['id' => $id]);
}
if (null === $object = $repository->find($id)) {
throw new \UnexpectedValueException(sprintf('Object with id "%s" does not exist.', $id));
}
return $object;
}
}

View File

@ -92,7 +92,7 @@ class CountAccompanyingCourse implements ExportInterface, GroupedExportInterface
return ['export_result']; return ['export_result'];
} }
public function getResult($query, $data, \Chill\MainBundle\Export\ExportGenerationContext $context) public function getResult($query, $data, ExportGenerationContext $context)
{ {
return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); return $query->getQuery()->getResult(Query::HYDRATE_SCALAR);
} }

View File

@ -11,6 +11,7 @@ declare(strict_types=1);
namespace Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters; namespace Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters;
use Chill\MainBundle\Export\ExportDataNormalizerTrait;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickRollingDateType; use Chill\MainBundle\Form\Type\PickRollingDateType;
use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDate;
@ -25,6 +26,8 @@ use Symfony\Contracts\Translation\TranslatorInterface;
class StepFilterOnDate implements FilterInterface class StepFilterOnDate implements FilterInterface
{ {
use ExportDataNormalizerTrait;
private const A = 'acp_filter_bystep_stephistories'; private const A = 'acp_filter_bystep_stephistories';
private const DEFAULT_CHOICE = [ private const DEFAULT_CHOICE = [
@ -94,12 +97,18 @@ class StepFilterOnDate implements FilterInterface
public function normalizeFormData(array $formData): array public function normalizeFormData(array $formData): array
{ {
// TODO: Implement normalizeFormData() method. return [
'accepted_steps_multi' => $formData['accepted_steps_multi'],
'calc_date' => $formData['calc_date']->normalize(),
];
} }
public function denormalizeFormData(array $formData, int $fromVersion): array public function denormalizeFormData(array $formData, int $fromVersion): array
{ {
// TODO: Implement denormalizeFormData() method. return [
'accepted_steps_multi' => $formData['accepted_steps_multi'],
'calc_date' => RollingDate::fromNormalized($formData['calc_date']),
];
} }
public function getVersion(): int public function getVersion(): int

View File

@ -22,6 +22,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\MainBundle\Templating\TranslatableStringHelper;
use Chill\PersonBundle\Entity\AccompanyingPeriod\UserHistory; use Chill\PersonBundle\Entity\AccompanyingPeriod\UserHistory;
use Chill\PersonBundle\Export\Declarations; use Chill\PersonBundle\Export\Declarations;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\Form\Type\EntityType;
@ -125,6 +126,29 @@ final readonly class UserJobFilter implements FilterInterface, DataTransformerIn
]; ];
} }
public function normalizeFormData(array $formData): array
{
return [
'jobs' => array_map(static fn (UserJob $job) => $job->getId(), (array) $formData['jobs']),
'start_date' => $formData['start_date']->normalize(),
'end_date' => $formData['end_date']->normalize(),
];
}
public function denormalizeFormData(array $formData, int $fromVersion): array
{
return [
'jobs' => new ArrayCollection(array_filter(array_map(static fn (int $id) => $this->userJobRepository->find($id), $formData['jobs']), fn (?UserJob $job) => null !== $job)),
'start_date' => RollingDate::fromNormalized($formData['start_date']),
'end_date' => RollingDate::fromNormalized($formData['end_date']),
];
}
public function getVersion(): int
{
return 1;
}
public function transformData(?array $before): array public function transformData(?array $before): array
{ {
$default = $this->getFormDefaultData(); $default = $this->getFormDefaultData();

View File

@ -22,7 +22,7 @@ use Doctrine\ORM\EntityManagerInterface;
* *
* @coversNothing * @coversNothing
*/ */
final class StepFilterTest extends AbstractFilterTest final class StepFilterOnDateTest extends AbstractFilterTest
{ {
private StepFilterOnDate $filter; private StepFilterOnDate $filter;