From 72008685d0c39af78b92c6abd1de19ddab91233f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Freitag?= Date: Mon, 6 Jan 2025 15:17:45 +0100 Subject: [PATCH] Fix SelectedAdministrativeCriteria.certification_period MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The API particulier computed the dateFin with dateDebut + 3 months. That’s very misleading, as a person who has been a beneficiary since 2009-06-01 would have: ```json { "statut": "beneficiaire", "dateDebut": "2009-06-01", "dateFin": "2009-09-01", } ``` However, the `statut` means the person is beneficiary **today**. The API recently evolved to always set `dateFin` to `null` to avoid suggesting the end date is known and in the past. Fix about 11,000 incorrect records, by using `certified_at`: if the API response for `statut` was "beneficiaire", that person was beneficiary on the day the API was queried. The example from above comes from the production environment and is an example of bad data. --- ...nistrativecriteria_certification_period.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 itou/eligibility/migrations/0009_fix_selectedadministrativecriteria_certification_period.py diff --git a/itou/eligibility/migrations/0009_fix_selectedadministrativecriteria_certification_period.py b/itou/eligibility/migrations/0009_fix_selectedadministrativecriteria_certification_period.py new file mode 100644 index 00000000000..dd4e3fcd086 --- /dev/null +++ b/itou/eligibility/migrations/0009_fix_selectedadministrativecriteria_certification_period.py @@ -0,0 +1,29 @@ +import datetime + +from django.db import migrations +from django.utils import timezone + +from itou.utils.types import InclusiveDateRange + + +def set_certification_period_end_date(apps, editor): + SelectedAdministrativeCriteria = apps.get_model("eligibility", "SelectedAdministrativeCriteria") + crits = [] + for crit in SelectedAdministrativeCriteria.objects.exclude(certification_period=None): + crit.certification_period = InclusiveDateRange( + crit.certification_period.lower, + timezone.localdate(crit.certified_at) + datetime.timedelta(days=92), + ) + crits.append(crit) + updated_objs = SelectedAdministrativeCriteria.objects.bulk_update(crits, fields=["certification_period"]) + print(f"Updated {updated_objs} selected administrative criteria.") + + +class Migration(migrations.Migration): + dependencies = [ + ("eligibility", "0008_alter_eligibilitydiagnosis_expires_at_and_more"), + ] + + operations = [ + migrations.RunPython(set_certification_period_end_date, elidable=True), + ]