diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php index dc9fdec67..6086f3964 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php @@ -43,7 +43,6 @@ class GenderFilter implements public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void { - $where = $qb->getDQLPart('where'); $isIn = $qb->expr()->in('person.gender', ':person_gender'); $acceptedGenders = $data['accepted_genders_entity']; @@ -88,11 +87,45 @@ class GenderFilter implements public function normalizeFormData(array $formData): array { + if (array_key_exists('accepted_genders', $formData)) { + $genders = []; + foreach ($formData['accepted_genders'] as $beforeGender) { + foreach ($this->genderRepository->findByGenderTranslation(match ($beforeGender) { + 'both' => 'neutral', default => $beforeGender, + }) as $gender) { + if (null !== $gender) { + if ('null' === $beforeGender) { + $genders[] = null; + } + $genders[] = $gender->getId(); + } + } + } + + return ['accepted_genders_entity' => array_unique($genders)]; + } + return ['accepted_genders_entity' => $formData['accepted_genders_entity']]; } public function denormalizeFormData(array $formData, int $fromVersion): array { + if (array_key_exists('accepted_genders', $formData)) { + $transformedData = []; + foreach ($formData['accepted_genders'] as $genderBefore) { + foreach ($this->genderRepository->findByGenderTranslation( + match ($genderBefore) { + 'both' => 'neutral', + default => $genderBefore, + } + ) as $gender) { + $transformedData[] = $gender; + } + } + + return ['accepted_genders_entity' => $transformedData]; + } + return ['accepted_genders_entity' => $formData['accepted_genders_entity']]; } @@ -130,7 +163,11 @@ class GenderFilter implements if (null === $g) { $genders[] = $this->translator->trans('export.filter.person.gender.no_gender'); } else { - $genders[] = $this->translatableStringHelper->localize($this->genderRepository->find($g)->getLabel()); + $g = $this->genderRepository->find($g); + if (null === $g) { + continue; + } + $genders[] = $this->translatableStringHelper->localize($g->getLabel()); } } diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/PersonFilters/GenderFilterTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/PersonFilters/GenderFilterTest.php index 7273e9abc..4038bd54b 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/PersonFilters/GenderFilterTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/PersonFilters/GenderFilterTest.php @@ -41,17 +41,44 @@ final class GenderFilterTest extends AbstractFilterTest { return [ [ - 'accepted_genders' => ['man'], - ], - [ - 'accepted_genders' => ['woman'], - ], - [ - 'accepted_genders' => ['man', 'both'], + 'accepted_genders_entity' => [null, '1'], ], ]; } + /** + * A list of data to normalize. + * + * @return iterable{array} + */ + public static function dataProviderFormDataToNormalize(): iterable + { + yield [ + ['accepted_genders_entity' => [null, '1']], + 1, + [], + ]; + yield [ + ['accepted_genders' => ['man']], + 1, + [], + ]; + } + + /** + * @dataProvider dataProviderFormDataToNormalize + */ + public function testDataNormalization(array $data, int $version, array $customAssert): void + { + $filter = $this->getFilter(); + + $normalized = $filter->normalizeFormData($data); + $actual = $filter->denormalizeFormData($normalized, $version); + + self::assertIsArray($actual); + self::assertArrayHasKey('accepted_genders_entity', $actual); + } + public static function getQueryBuilders(): iterable { self::bootKernel();