From 1944f87cb2a70f75921d04ac3a65afa3ab01f9e1 Mon Sep 17 00:00:00 2001 From: Damon Date: Tue, 18 Aug 2026 14:08:55 +0200 Subject: [PATCH] OP-3851: added migrations that remove duplicate rechtswege/grote helft mandates from worship services within the same election cycle --- CHANGELOG.md | 2 + ...bestuurslid-van-rechtswege-mandaten.sparql | 45 +++++++++++++ ...st-bestuurslid-grote-helft-mandaten.sparql | 65 +++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 config/migrations/2026/20260817100000-consolidate-eredienst-bestuurslid-van-rechtswege-mandaten.sparql create mode 100644 config/migrations/2026/20260817101500-consolidate-eredienst-bestuurslid-grote-helft-mandaten.sparql diff --git a/CHANGELOG.md b/CHANGELOG.md index cff6b9e..28497de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,8 @@ - Keep werkingsgebied filter up to date via db-cleanup service [OP-3841] - Restrict available imam roles based on worship organisation status [DL-7485] - IMPORTANT NOTE: Make sure first the [DL-7485] loket migration has completed + data has flown from loket to OP +- fix duplicate van rechtswege/grote helft mandates [OP-3851] + - IMPORTANT NOTE: Make sure first the [OP-3851] loket migration has completed + data has flown from loket to OP ### Deploy notes ``` diff --git a/config/migrations/2026/20260817100000-consolidate-eredienst-bestuurslid-van-rechtswege-mandaten.sparql b/config/migrations/2026/20260817100000-consolidate-eredienst-bestuurslid-van-rechtswege-mandaten.sparql new file mode 100644 index 0000000..b1581f6 --- /dev/null +++ b/config/migrations/2026/20260817100000-consolidate-eredienst-bestuurslid-van-rechtswege-mandaten.sparql @@ -0,0 +1,45 @@ +# Delete duplicate van rechtswege mandaten per governing body +# Must be run AFTER the corresponding loket migration + +PREFIX ere: +PREFIX besluit: +PREFIX org: +PREFIX mandaat: +PREFIX generiek: + +DELETE { + GRAPH { + ?orgaanInTime org:hasPost ?mandaat . + ?mandaat ?p ?o . + } +} +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?canonicalMandaat . + } +} +WHERE { + GRAPH { + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + org:hasPost ?mandaat . + ?mandaat org:role ; + ?p ?o . + + FILTER NOT EXISTS { ?holder org:holds ?mandaat . } + } + + { + SELECT ?orgaan (IRI(MIN(STR(?anyMandaat))) AS ?canonicalMandaat) WHERE { + GRAPH { + ?anyOrgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + org:hasPost ?anyMandaat . + ?anyMandaat org:role . + } + } + GROUP BY ?orgaan + } + + FILTER(?mandaat != ?canonicalMandaat) +} diff --git a/config/migrations/2026/20260817101500-consolidate-eredienst-bestuurslid-grote-helft-mandaten.sparql b/config/migrations/2026/20260817101500-consolidate-eredienst-bestuurslid-grote-helft-mandaten.sparql new file mode 100644 index 0000000..8844989 --- /dev/null +++ b/config/migrations/2026/20260817101500-consolidate-eredienst-bestuurslid-grote-helft-mandaten.sparql @@ -0,0 +1,65 @@ +# Delete duplicate grote helft mandaten within a single election cycle period +# Must be run AFTER the corresponding loket migration + +PREFIX ere: +PREFIX besluit: +PREFIX org: +PREFIX mandaat: +PREFIX generiek: + +DELETE { + GRAPH { + ?orgaanInTime org:hasPost ?mandaat . + ?mandaat ?p ?o . + } +} +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?canonicalMandaat . + } +} +WHERE { + GRAPH { + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart ?start ; + org:hasPost ?mandaat . + ?mandaat org:role ; + ?p ?o . + + FILTER NOT EXISTS { ?holder org:holds ?mandaat . } + } + + BIND(YEAR(?start) AS ?startYear) + VALUES (?startYear ?pairIndex) { + (2017 0) + (2020 1) + (2023 1) + (2026 2) + (2029 2) + } + + { + SELECT ?orgaan ?pairIndex (IRI(MIN(STR(?anyMandaat))) AS ?canonicalMandaat) WHERE { + GRAPH { + ?anyOrgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart ?anyStart ; + org:hasPost ?anyMandaat . + ?anyMandaat org:role . + } + + BIND(YEAR(?anyStart) AS ?anyStartYear) + VALUES (?anyStartYear ?pairIndex) { + (2017 0) + (2020 1) + (2023 1) + (2026 2) + (2029 2) + } + } + GROUP BY ?orgaan ?pairIndex + } + + FILTER(?mandaat != ?canonicalMandaat) +}