From 4d20a46717c49e1f18e5e3221d0d9b8b53084a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 6 Nov 2023 22:03:37 +0100 Subject: [PATCH] Fix geographical unit stat aggregator: date range on association with left join --- .../unreleased/Fixed-20231106-220250.yaml | 5 ++++ .../GeographicalUnitAggregator.php | 30 +++++++++++-------- 2 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 .changes/unreleased/Fixed-20231106-220250.yaml diff --git a/.changes/unreleased/Fixed-20231106-220250.yaml b/.changes/unreleased/Fixed-20231106-220250.yaml new file mode 100644 index 000000000..dee206de1 --- /dev/null +++ b/.changes/unreleased/Fixed-20231106-220250.yaml @@ -0,0 +1,5 @@ +kind: Fixed +body: 'Export: fix aggregator by geographical unit on person: avoid inconsistencies' +time: 2023-11-06T22:02:50.364184265+01:00 +custom: + Issue: "185" diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/GeographicalUnitAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/GeographicalUnitAggregator.php index 5b885eca4..8ce51a3ab 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/GeographicalUnitAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/GeographicalUnitAggregator.php @@ -19,6 +19,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\PersonBundle\Export\Declarations; +use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\QueryBuilder; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\FormBuilderInterface; @@ -35,21 +36,26 @@ class GeographicalUnitAggregator implements AggregatorInterface public function alterQuery(QueryBuilder $qb, $data): void { $qb - ->leftJoin('person.householdAddresses', 'person_geog_agg_current_household_address') - ->leftJoin('person_geog_agg_current_household_address.address', 'person_geog_agg_address') - ->leftJoin('person_geog_agg_address.geographicalUnits', 'person_geog_agg_geog_unit') - ->andWhere( - $qb->expr()->orX( - $qb->expr()->isNull('person_geog_agg_current_household_address'), - $qb->expr()->andX( - $qb->expr()->lte('person_geog_agg_current_household_address.validFrom', ':person_geog_agg_date'), - $qb->expr()->orX( - $qb->expr()->isNull('person_geog_agg_current_household_address.validTo'), - $qb->expr()->gt('person_geog_agg_current_household_address.validTo', ':person_geog_agg_date') - ) + ->leftJoin( + 'person.householdAddresses', + 'person_geog_agg_current_household_address', + Join::WITH, + $qb->expr()->andX( + $qb->expr()->lte('person_geog_agg_current_household_address.validFrom', ':person_geog_agg_date'), + $qb->expr()->orX( + $qb->expr()->isNull('person_geog_agg_current_household_address.validTo'), + $qb->expr()->gt('person_geog_agg_current_household_address.validTo', ':person_geog_agg_date') ) ) ) + ->leftJoin( + 'person_geog_agg_current_household_address.address', + 'person_geog_agg_address' + ) + ->leftJoin( + 'person_geog_agg_address.geographicalUnits', + 'person_geog_agg_geog_unit' + ) ->andWhere( $qb->expr()->orX( $qb->expr()->isNull('person_geog_agg_geog_unit'),