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) +}