From 9c3d8d5db2d874a3d3e7bb231088b69a4b2b7660 Mon Sep 17 00:00:00 2001 From: Boris De Vloed Date: Tue, 21 Apr 2026 11:56:52 +0200 Subject: [PATCH 1/2] add governing bodies in time --- CHANGELOG.md | 1 + ...e-missing-organen-in-time-2026-2029.sparql | 48 +++++ ...ositions-worship-services-2026-2029.sparql | 187 ++++++++++++++++++ ...-central-worship-services-2026-2029.sparql | 154 +++++++++++++++ ...nup-malformed-hhttp-secretaris-role.sparql | 19 ++ ...00-create-organen-in-time-2029-2032.sparql | 48 +++++ ...ositions-worship-services-2029-2032.sparql | 187 ++++++++++++++++++ ...-central-worship-services-2029-2032.sparql | 154 +++++++++++++++ 8 files changed, 798 insertions(+) create mode 100644 config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100100-create-missing-organen-in-time-2026-2029.sparql create mode 100644 config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100200-create-missing-positions-worship-services-2026-2029.sparql create mode 100644 config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100300-create-missing-positions-central-worship-services-2026-2029.sparql create mode 100644 config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100400-cleanup-malformed-hhttp-secretaris-role.sparql create mode 100644 config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100500-create-organen-in-time-2029-2032.sparql create mode 100644 config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100600-create-positions-worship-services-2029-2032.sparql create mode 100644 config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100700-create-positions-central-worship-services-2029-2032.sparql diff --git a/CHANGELOG.md b/CHANGELOG.md index 5beca2b..e9046e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Add column to query organizations in Dashboard [OP-3758] - Query list change events of organisations in Dashboard [OP-3760] - Disable SPARQL endpoint +- Prepare worship election period: backfill missing 2026-2029 governing bodies + mandates, seed fresh 2029-2032 period, and clean up `hhttp://` Secretaris typo from the 2022 central-worship migrations ### Deploy notes ``` diff --git a/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100100-create-missing-organen-in-time-2026-2029.sparql b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100100-create-missing-organen-in-time-2026-2029.sparql new file mode 100644 index 0000000..21a0894 --- /dev/null +++ b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100100-create-missing-organen-in-time-2026-2029.sparql @@ -0,0 +1,48 @@ +PREFIX mandaat: +PREFIX ere: +PREFIX besluit: +PREFIX generiek: +PREFIX mu: +PREFIX xsd: +PREFIX regorg: + +INSERT { + GRAPH { + ?orgaanInTime a besluit:Bestuursorgaan ; + mu:uuid ?uuidOrgaanInTime ; + mandaat:bindingStart "2026-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2029-03-31T00:00:00"^^xsd:dateTime ; + generiek:isTijdspecialisatieVan ?bestuursorgaan . + } +} +WHERE { + GRAPH { + VALUES ?type { + ere:BestuurVanDeEredienst + ere:CentraalBestuurVanDeEredienst + } + + ?bestuurseenheid a ?type . + + FILTER NOT EXISTS { + ?bestuurseenheid regorg:orgStatus . + } + + ?bestuursorgaan besluit:bestuurt ?bestuurseenheid . + + FILTER NOT EXISTS { + ?missingOrgaanInTime generiek:isTijdspecialisatieVan ?bestuursorgaan . + ?missingOrgaanInTime mandaat:bindingStart ?start . + FILTER CONTAINS(STR(?start), "2026") + } + + FILTER NOT EXISTS { + ?missingOrgaanInTime generiek:isTijdspecialisatieVan ?bestuursorgaan . + ?missingOrgaanInTime mandaat:bindingEinde ?end . + FILTER CONTAINS(STR(?end), "2029") + } + } + + BIND(MD5(CONCAT(?bestuurseenheid, ?bestuursorgaan, "2026-2029")) as ?uuidOrgaanInTime) + BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaanInTime)) AS ?orgaanInTime) +} diff --git a/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100200-create-missing-positions-worship-services-2026-2029.sparql b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100200-create-missing-positions-worship-services-2026-2029.sparql new file mode 100644 index 0000000..961a781 --- /dev/null +++ b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100200-create-missing-positions-worship-services-2026-2029.sparql @@ -0,0 +1,187 @@ +# Add missing mandates to worship services for period 2026-2029 + +PREFIX ere: +PREFIX besluit: +PREFIX org: +PREFIX mandaat: +PREFIX generiek: +PREFIX mu: +PREFIX xsd: + +## Case LidVanRechtswege : shared mandate for all the organen in time + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?lidVanRechtswege . + + ?lidVanRechtswege a mandaat:Mandaat ; + mu:uuid ?uuidLidVanRechtswege ; + org:role . + } +} WHERE { + GRAPH { + VALUES (?start ?end) { + ("2026-04-01T00:00:00"^^xsd:dateTime "2029-03-31T00:00:00"^^xsd:dateTime) + } + + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart ?start ; + mandaat:bindingEinde ?end . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?lidVanRechtswege . + ?lidVanRechtswege org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Rechtswege")) as ?uuidLidVanRechtswege) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidLidVanRechtswege)) AS ?lidVanRechtswege) +} + +## Case Bestuursleden, small or big half : 2026 is the beginning of a GH + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?bestuurslidGH . + + ?bestuurslidGH a mandaat:Mandaat ; + mu:uuid ?uuidBestuurslidGH ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2026-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2029-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?bestuurslidGH . + ?bestuurslidGH org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "BestuurslidGH 2026-2032")) as ?uuidBestuurslidGH) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidBestuurslidGH)) AS ?bestuurslidGH) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?bestuurslidKH . + + ?bestuurslidKH a mandaat:Mandaat ; + mu:uuid ?uuidBestuurslidKH ; + org:role . + } +} WHERE { + GRAPH { + VALUES (?start ?end) { + ("2026-04-01T00:00:00"^^xsd:dateTime "2029-03-31T00:00:00"^^xsd:dateTime) + } + + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart ?start ; + mandaat:bindingEinde ?end . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?bestuurslidKH . + ?bestuurslidKH org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "BestuurslidKH 2023-2029")) as ?uuidBestuurslidKH) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidBestuurslidKH)) AS ?bestuurslidKH) +} + +; + +## Other cases are simpler, one mandate is linked to only one orgaan in time. Creating them when missing. + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?voorzitter . + + ?voorzitter a mandaat:Mandaat ; + mu:uuid ?uuidVoorzitter ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2026-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2029-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?voorzitter . + ?voorzitter org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Voorzitter 2026-2029")) as ?uuidVoorzitter) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidVoorzitter)) AS ?voorzitter) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?secretaris . + + ?secretaris a mandaat:Mandaat ; + mu:uuid ?uuidSecretaris ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2026-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2029-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?secretaris . + ?secretaris org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Secretaris 2026-2029")) as ?uuidSecretaris) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidSecretaris)) AS ?secretaris) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?penningmeester . + + ?penningmeester a mandaat:Mandaat ; + mu:uuid ?uuidPenningmeester ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2026-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2029-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?penningmeester . + ?penningmeester org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Penningmeester 2026-2029")) as ?uuidPenningmeester) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidPenningmeester)) AS ?penningmeester) +} diff --git a/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100300-create-missing-positions-central-worship-services-2026-2029.sparql b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100300-create-missing-positions-central-worship-services-2026-2029.sparql new file mode 100644 index 0000000..4499a7c --- /dev/null +++ b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100300-create-missing-positions-central-worship-services-2026-2029.sparql @@ -0,0 +1,154 @@ +# Add missing mandates to central worship services + +## 2026 - 2029 + +PREFIX ere: +PREFIX besluit: +PREFIX org: +PREFIX mandaat: +PREFIX generiek: +PREFIX mu: +PREFIX xsd: +PREFIX regorg: + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?expert . + + ?expert a mandaat:Mandaat ; + mu:uuid ?uuidExpert ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:CentraalBestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2026-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2029-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?expert . + ?expert org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Expert 2026-2029")) as ?uuidExpert) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidExpert)) AS ?expert) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?vertegenwoordiger . + + ?vertegenwoordiger a mandaat:Mandaat ; + mu:uuid ?uuidVertegenwoordiger ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:CentraalBestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2026-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2029-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?vertegenwoordiger . + ?vertegenwoordiger org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Vertegenwoordiger 2026-2029")) as ?uuidVertegenwoordiger) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidVertegenwoordiger)) AS ?vertegenwoordiger) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?secretaris . + + ?secretaris a mandaat:Mandaat ; + mu:uuid ?uuidSecretaris ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:CentraalBestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2026-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2029-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?secretaris . + ?secretaris org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Secretaris 2026-2029")) as ?uuidSecretaris) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidSecretaris)) AS ?secretaris) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?voorzitter . + + ?voorzitter a mandaat:Mandaat ; + mu:uuid ?uuidVoorzitter ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:CentraalBestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2026-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2029-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?voorzitter . + ?voorzitter org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Voorzitter 2026-2029")) as ?uuidVoorzitter) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidVoorzitter)) AS ?voorzitter) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?bestuurslid . + + ?bestuurslid a mandaat:Mandaat ; + mu:uuid ?uuidBestuurslid ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:CentraalBestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2026-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2029-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?worshipService regorg:orgStatus . + } + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?bestuurslid . + ?bestuurslid org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Bestuurslid 2026-2029")) as ?uuidBestuurslid) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidBestuurslid)) AS ?bestuurslid) +} diff --git a/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100400-cleanup-malformed-hhttp-secretaris-role.sparql b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100400-cleanup-malformed-hhttp-secretaris-role.sparql new file mode 100644 index 0000000..d0b8d65 --- /dev/null +++ b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100400-cleanup-malformed-hhttp-secretaris-role.sparql @@ -0,0 +1,19 @@ +# Cleanup leftover `hhttp://` malformed Secretaris org:role triples introduced by +# the 2022 migrations `20220929092641-create-central-worship-organen-2023-2026.sparql` +# and `20220929104939-create-central-worship-organen-2026-2029.sparql` (line 31). +# +# By this point migration C (20260420100300) has already inserted the correct +# Secretaris `org:role` triple on the same mandate IRI, so removing the malformed +# one leaves each central-worship Secretaris mandate with exactly one valid role. + +PREFIX org: + +DELETE { + GRAPH { + ?s org:role . + } +} WHERE { + GRAPH { + ?s org:role . + } +} diff --git a/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100500-create-organen-in-time-2029-2032.sparql b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100500-create-organen-in-time-2029-2032.sparql new file mode 100644 index 0000000..c8f580d --- /dev/null +++ b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100500-create-organen-in-time-2029-2032.sparql @@ -0,0 +1,48 @@ +PREFIX mandaat: +PREFIX ere: +PREFIX besluit: +PREFIX generiek: +PREFIX mu: +PREFIX xsd: +PREFIX regorg: + +INSERT { + GRAPH { + ?orgaanInTime a besluit:Bestuursorgaan ; + mu:uuid ?uuidOrgaanInTime ; + mandaat:bindingStart "2029-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2032-03-31T00:00:00"^^xsd:dateTime ; + generiek:isTijdspecialisatieVan ?bestuursorgaan . + } +} +WHERE { + GRAPH { + VALUES ?type { + ere:BestuurVanDeEredienst + ere:CentraalBestuurVanDeEredienst + } + + ?bestuurseenheid a ?type . + + FILTER NOT EXISTS { + ?bestuurseenheid regorg:orgStatus . + } + + ?bestuursorgaan besluit:bestuurt ?bestuurseenheid . + + FILTER NOT EXISTS { + ?missingOrgaanInTime generiek:isTijdspecialisatieVan ?bestuursorgaan . + ?missingOrgaanInTime mandaat:bindingStart ?start . + FILTER CONTAINS(STR(?start), "2029") + } + + FILTER NOT EXISTS { + ?missingOrgaanInTime generiek:isTijdspecialisatieVan ?bestuursorgaan . + ?missingOrgaanInTime mandaat:bindingEinde ?end . + FILTER CONTAINS(STR(?end), "2032") + } + } + + BIND(MD5(CONCAT(?bestuurseenheid, ?bestuursorgaan, "2029-2032")) as ?uuidOrgaanInTime) + BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaanInTime)) AS ?orgaanInTime) +} diff --git a/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100600-create-positions-worship-services-2029-2032.sparql b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100600-create-positions-worship-services-2029-2032.sparql new file mode 100644 index 0000000..b49b76b --- /dev/null +++ b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100600-create-positions-worship-services-2029-2032.sparql @@ -0,0 +1,187 @@ +# Create mandates for worship services for period 2029-2032 + +PREFIX ere: +PREFIX besluit: +PREFIX org: +PREFIX mandaat: +PREFIX generiek: +PREFIX mu: +PREFIX xsd: + +## Case LidVanRechtswege : shared mandate for all the organen in time + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?lidVanRechtswege . + + ?lidVanRechtswege a mandaat:Mandaat ; + mu:uuid ?uuidLidVanRechtswege ; + org:role . + } +} WHERE { + GRAPH { + VALUES (?start ?end) { + ("2029-04-01T00:00:00"^^xsd:dateTime "2032-03-31T00:00:00"^^xsd:dateTime) + } + + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart ?start ; + mandaat:bindingEinde ?end . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?lidVanRechtswege . + ?lidVanRechtswege org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Rechtswege")) as ?uuidLidVanRechtswege) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidLidVanRechtswege)) AS ?lidVanRechtswege) +} + +## Case Bestuursleden, small or big half : 2029 is the beginning of a KH (cycle 2029-2035); GH continues its 2026-2032 cycle. + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?bestuurslidGH . + + ?bestuurslidGH a mandaat:Mandaat ; + mu:uuid ?uuidBestuurslidGH ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2029-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2032-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?bestuurslidGH . + ?bestuurslidGH org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "BestuurslidGH 2026-2032")) as ?uuidBestuurslidGH) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidBestuurslidGH)) AS ?bestuurslidGH) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?bestuurslidKH . + + ?bestuurslidKH a mandaat:Mandaat ; + mu:uuid ?uuidBestuurslidKH ; + org:role . + } +} WHERE { + GRAPH { + VALUES (?start ?end) { + ("2029-04-01T00:00:00"^^xsd:dateTime "2032-03-31T00:00:00"^^xsd:dateTime) + } + + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart ?start ; + mandaat:bindingEinde ?end . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?bestuurslidKH . + ?bestuurslidKH org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "BestuurslidKH 2029-2035")) as ?uuidBestuurslidKH) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidBestuurslidKH)) AS ?bestuurslidKH) +} + +; + +## Other cases are simpler, one mandate is linked to only one orgaan in time. Creating them when missing. + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?voorzitter . + + ?voorzitter a mandaat:Mandaat ; + mu:uuid ?uuidVoorzitter ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2029-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2032-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?voorzitter . + ?voorzitter org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Voorzitter 2029-2032")) as ?uuidVoorzitter) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidVoorzitter)) AS ?voorzitter) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?secretaris . + + ?secretaris a mandaat:Mandaat ; + mu:uuid ?uuidSecretaris ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2029-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2032-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?secretaris . + ?secretaris org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Secretaris 2029-2032")) as ?uuidSecretaris) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidSecretaris)) AS ?secretaris) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?penningmeester . + + ?penningmeester a mandaat:Mandaat ; + mu:uuid ?uuidPenningmeester ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:BestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2029-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2032-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?penningmeester . + ?penningmeester org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Penningmeester 2029-2032")) as ?uuidPenningmeester) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidPenningmeester)) AS ?penningmeester) +} diff --git a/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100700-create-positions-central-worship-services-2029-2032.sparql b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100700-create-positions-central-worship-services-2029-2032.sparql new file mode 100644 index 0000000..e347397 --- /dev/null +++ b/config/migrations/2026/20260420100000-prepare-worship-election-period-2026/20260420100700-create-positions-central-worship-services-2029-2032.sparql @@ -0,0 +1,154 @@ +# Create mandates for central worship services + +## 2029 - 2032 + +PREFIX ere: +PREFIX besluit: +PREFIX org: +PREFIX mandaat: +PREFIX generiek: +PREFIX mu: +PREFIX xsd: +PREFIX regorg: + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?expert . + + ?expert a mandaat:Mandaat ; + mu:uuid ?uuidExpert ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:CentraalBestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2029-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2032-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?expert . + ?expert org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Expert 2029-2032")) as ?uuidExpert) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidExpert)) AS ?expert) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?vertegenwoordiger . + + ?vertegenwoordiger a mandaat:Mandaat ; + mu:uuid ?uuidVertegenwoordiger ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:CentraalBestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2029-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2032-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?vertegenwoordiger . + ?vertegenwoordiger org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Vertegenwoordiger 2029-2032")) as ?uuidVertegenwoordiger) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidVertegenwoordiger)) AS ?vertegenwoordiger) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?secretaris . + + ?secretaris a mandaat:Mandaat ; + mu:uuid ?uuidSecretaris ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:CentraalBestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2029-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2032-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?secretaris . + ?secretaris org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Secretaris 2029-2032")) as ?uuidSecretaris) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidSecretaris)) AS ?secretaris) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?voorzitter . + + ?voorzitter a mandaat:Mandaat ; + mu:uuid ?uuidVoorzitter ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:CentraalBestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2029-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2032-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?voorzitter . + ?voorzitter org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Voorzitter 2029-2032")) as ?uuidVoorzitter) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidVoorzitter)) AS ?voorzitter) +} + +; + +INSERT { + GRAPH { + ?orgaanInTime org:hasPost ?bestuurslid . + + ?bestuurslid a mandaat:Mandaat ; + mu:uuid ?uuidBestuurslid ; + org:role . + } +} WHERE { + GRAPH { + ?worshipService a ere:CentraalBestuurVanDeEredienst . + ?orgaan besluit:bestuurt ?worshipService . + ?orgaanInTime generiek:isTijdspecialisatieVan ?orgaan ; + mandaat:bindingStart "2029-04-01T00:00:00"^^xsd:dateTime ; + mandaat:bindingEinde "2032-03-31T00:00:00"^^xsd:dateTime . + + FILTER NOT EXISTS { + ?worshipService regorg:orgStatus . + } + + FILTER NOT EXISTS { + ?orgaanInTime org:hasPost ?bestuurslid . + ?bestuurslid org:role . + } + } + + BIND(MD5(CONCAT(?worshipService, ?orgaan, "Bestuurslid 2029-2032")) as ?uuidBestuurslid) + BIND(IRI(CONCAT("http://data.lblod.info/id/mandaten/", ?uuidBestuurslid)) AS ?bestuurslid) +} From 9cdd931af3531d5814babb4a9a4de58c96d749a6 Mon Sep 17 00:00:00 2001 From: Boris De Vloed Date: Tue, 21 Apr 2026 12:13:30 +0200 Subject: [PATCH 2/2] add ticket nrs --- CHANGELOG.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9046e7..7a9b8e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ - Add column to query organizations in Dashboard [OP-3758] - Query list change events of organisations in Dashboard [OP-3760] - Disable SPARQL endpoint -- Prepare worship election period: backfill missing 2026-2029 governing bodies + mandates, seed fresh 2029-2032 period, and clean up `hhttp://` Secretaris typo from the 2022 central-worship migrations +- Prepare worship election period: backfill missing 2026-2029 governing bodies + mandates, seed fresh 2029-2032 period, and clean up `hhttp://` Secretaris typo from the 2022 central-worship migrations [OP-3776] and [DL-7294] ### Deploy notes ``` @@ -75,7 +75,7 @@ drc pull report-generation; drc up -d report-generation ### Deploy instructions #### For error-alert and deliver-email-service -Per environment a specfic configuration for the email service similar to loket config. +Per environment a specfic configuration for the email service similar to loket config. Ask colleague for specfic credentials. ``` @@ -84,13 +84,13 @@ Ask colleague for specfic credentials. EMAIL_PROTOCOL: "smtp" #WELL_KNOWN_SERVICE: "smtp" EMAIL_HOST: "Fill in Email host adress" - EMAIL_ADDRESS: "Fill in email" + EMAIL_ADDRESS: "Fill in email" EMAIL_PASSWORD: "Fill in email password" EMAIL_PORT: "Fill in port" SECURE_CONNECTION: "true" EMAIL_CRON_PATTERN: "*/1 * * * *" restart: "no" - + error-alert: environment: EMAIL_FROM: "Fill in email adress of sender @@ -107,7 +107,7 @@ drc up -d error-alert deliver-email-service frontend ### General - [OP-3590]: OP is now master of "aantal houders" of mandates - [OP-3699]: Update aantal houders for some mandates Hasselt and Antwerp - - [OP-3680]: Indicate whether a worship service is a customer of ReligioPoint or Loket voor Lokale Besturen + - [OP-3680]: Indicate whether a worship service is a customer of ReligioPoint or Loket voor Lokale Besturen - Bump frontend to v1.36.2 [OP-3623] [OP-3681] [OP-3703] [OP-2712] ### Deploy instructions