Skip to content

Commit

Permalink
Merge pull request #730 from lblod/fix/lmb-table-corrections
Browse files Browse the repository at this point in the history
Additional LMB IV GR corrections
  • Loading branch information
abeforgit authored Oct 17, 2024
2 parents f7f5630 + aaf84f4 commit f927610
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 70 deletions.
6 changes: 6 additions & 0 deletions .changeset/fresh-geese-develop.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'frontend-gelinkt-notuleren': minor
---

**LMB IV GR tables**
Add a `IVGR7-LMB-3-verhindering-schepenen` config which lists the 'schepenen' who have a status of 'verhinderd'
6 changes: 6 additions & 0 deletions .changeset/odd-experts-ring.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'frontend-gelinkt-notuleren': patch
---

**LMB IV GR tables**
Introduce correction in `IVGR7-LMB-2-ontvankelijkheid-schepenen` on start and end of mandate
6 changes: 6 additions & 0 deletions .changeset/odd-terms-buy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'frontend-gelinkt-notuleren': patch
---

**LMB IV GR tables**
Remove erroneous 'mandaat:bekrachtigdAanstellingVan' relationship from `IVGR8-LMB-1-verkozen-schepenen` table
6 changes: 6 additions & 0 deletions .changeset/sixty-ears-jam.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'frontend-gelinkt-notuleren': patch
---

**LMB IV GR tables**
Remove erroneous 'mandaat:bekrachtigdAanstellingVan' relationship from `IVGR7-LMB-1-kandidaat-schepenen` table
11 changes: 11 additions & 0 deletions app/config/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,14 @@ export const BESTUURSPERIODES = {
export const LOKALE_VERKIEZINGEN = {
2024: 'http://data.lblod.info/id/rechtstreekse-verkiezingen/612a57de-7fc2-40af-a7dc-17d544e5de20',
};

export const MANDATARIS_STATUS_CODES = {
EFFECTIEF:
'http://data.vlaanderen.be/id/concept/MandatarisStatusCode/21063a5b-912c-4241-841c-cc7fb3c73e75',
TITELVOEREND:
'http://data.vlaanderen.be/id/concept/MandatarisStatusCode/aacb3fed-b51d-4e0b-a411-f3fa641da1b3',
VERHINDERD:
'http://data.vlaanderen.be/id/concept/MandatarisStatusCode/c301248f-0199-45ca-b3e5-4c596731d5fe',
WAARNEMEND:
'http://data.vlaanderen.be/id/concept/MandatarisStatusCode/e1ca6edd-55e1-4288-92a5-53f4cf71946a',
};
155 changes: 85 additions & 70 deletions app/config/mandatee-table-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
BESTUURSFUNCTIE_CODES,
BESTUURSPERIODES,
LOKALE_VERKIEZINGEN,
MANDATARIS_STATUS_CODES,
} from './constants';
import { promiseProperties } from '../utils/promises';

Expand All @@ -33,6 +34,7 @@ export const IVGR_TAGS = /** @type {const} */ ([
'IVGR5-LMB-3-samenstelling-fracties',
'IVGR7-LMB-1-kandidaat-schepenen',
'IVGR7-LMB-2-ontvankelijkheid-schepenen',
'IVGR7-LMB-3-verhindering-schepenen',
'IVGR8-LMB-1-verkozen-schepenen',
'IVGR8-LMB-2-coalitie',
]);
Expand Down Expand Up @@ -102,7 +104,7 @@ export const mandateeTableConfigIVGR = (meeting) => {
/**
* **IVGR3: Eedaflegging van de verkozen gemeenteraadsleden**
*
* IVGR3-LMB-1: De gemeenteraad neemt kennis van de eedaflegging van de volgende verkozenen op datum van
* IVGR3-LMB-1: De gemeenteraad neemt kennis van de eedaflegging (= datum van de zitting) van de volgende verkozenen op datum van
*/
'IVGR3-LMB-1-eedafleggingen': {
query: () => {
Expand Down Expand Up @@ -535,18 +537,7 @@ export const mandateeTableConfigIVGR = (meeting) => {
return (state) => {
const { doc, schema } = state;
const $pos = doc.resolve(pos);
const decisionUri = findParentNodeClosestToPos($pos, (node) => {
return hasOutgoingNamedNodeTriple(
node.attrs,
RDF('type'),
BESLUIT('Besluit'),
);
})?.node.attrs.subject;
if (!decisionUri) {
throw new Error(
'Could not find decision to sync mandatee table with',
);
}

const tableHeader = row(
schema,
[schema.text('Schepen'), schema.text('Rang')],
Expand All @@ -564,34 +555,20 @@ export const mandateeTableConfigIVGR = (meeting) => {
return (b1.rangnummer ?? Infinity) - (b2.rangnummer ?? Infinity);
});
const rows = bindings.map((binding) => {
const { mandataris, mandataris_naam, mandataris_rang } =
const { mandataris_naam, mandataris_rang } =
bindingToObject(binding);
return row(schema, [
resourceNode(schema, mandataris, mandataris_naam),
schema.text(mandataris_naam),
schema.text(mandataris_rang),
]);
});
const content = schema.nodes.table.create(null, [
tableHeader,
...rows,
]);
const factory = new SayDataFactory();
const result = transactionCombinator(
state,
replaceContent(state.tr, $pos, content),
)(
bindings.map((binding) => {
return addPropertyToNode({
resource: decisionUri,
property: {
predicate: MANDAAT('bekrachtigtAanstellingVan').full,
object: factory.resourceNode(binding['mandataris'].value),
},
});
}),
);
const transaction = replaceContent(state.tr, $pos, content);
return {
transaction: result.transaction,
transaction,
result: true,
initialState: state,
};
Expand All @@ -614,7 +591,7 @@ export const mandateeTableConfigIVGR = (meeting) => {
PREFIX persoon: <http://data.vlaanderen.be/ns/persoon#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT DISTINCT ?mandataris ?mandataris_rang ?mandataris_naam ?mandataris_status ?mandaat_einddatum ?mandataris_opvolger WHERE {
SELECT DISTINCT ?mandataris ?mandataris_rang ?mandataris_naam ?mandataris_status ?mandaat_start ?mandaat_einde ?mandataris_opvolger WHERE {
?bestuursorgaan lmb:heeftBestuursperiode <${BESTUURSPERIODES['2019-2025']}>.
?bestuursorgaan org:hasPost ?mandaat.
Expand All @@ -624,12 +601,15 @@ export const mandateeTableConfigIVGR = (meeting) => {
?mandataris mandaat:isBestuurlijkeAliasVan ?persoon.
?mandataris mandaat:rangorde ?mandataris_rang.
?mandataris mandaat:status/skos:prefLabel ?mandataris_status.
?mandataris mandaat:start ?mandaat_start.
OPTIONAL {
?mandataris mandaat:einde ?mandaat_einde.
}
?persoon persoon:gebruikteVoornaam ?voornaam.
?persoon foaf:familyName ?achternaam.
BIND(CONCAT(?voornaam, " ", ?achternaam) AS ?mandataris_naam)
VALUES ?mandaat_einddatum { undef }
# TODO: unsure how we will fetch the 'opvolger'
VALUES ?mandataris_opvolger { undef }
}
Expand Down Expand Up @@ -684,18 +664,16 @@ export const mandateeTableConfigIVGR = (meeting) => {
mandataris_rang,
mandataris_naam,
mandataris_status,
mandaat_einddatum,
mandaat_start,
mandaat_einde,
mandataris_opvolger,
} = bindingToObject(binding);
const mandaat_begindatum = meeting.gestartOpTijdstip.toISOString();
return row(schema, [
schema.text(mandataris_rang),
resourceNode(schema, mandataris, mandataris_naam),
schema.text(mandataris_status),
dateNode(schema, mandaat_begindatum),
mandaat_einddatum
? dateNode(schema, mandaat_einddatum)
: undefined,
dateNode(schema, mandaat_start),
mandaat_einde ? dateNode(schema, mandaat_einde) : undefined,
mandataris_opvolger
? schema.text(mandataris_opvolger)
: undefined,
Expand Down Expand Up @@ -728,6 +706,70 @@ export const mandateeTableConfigIVGR = (meeting) => {
};
},
},

'IVGR7-LMB-3-verhindering-schepenen': {
query: () => {
const sparqlQuery = /* sparql */ `
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX ext: <http://mu.semte.ch/vocabularies/ext/>
PREFIX lmb: <http://lblod.data.gift/vocabularies/lmb/>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX persoon: <http://data.vlaanderen.be/ns/persoon#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT DISTINCT ?mandataris ?mandataris_naam WHERE {
?bestuursorgaan lmb:heeftBestuursperiode <${BESTUURSPERIODES['2019-2025']}>.
?bestuursorgaan org:hasPost ?mandaat.
?mandaat org:role <${BESTUURSFUNCTIE_CODES.SCHEPEN}>.
?mandataris org:holds ?mandaat.
?mandataris mandaat:isBestuurlijkeAliasVan ?persoon.
?mandataris mandaat:status/skos:prefLabel <${MANDATARIS_STATUS_CODES.VERHINDERD}>.
?persoon persoon:gebruikteVoornaam ?voornaam.
?persoon foaf:familyName ?achternaam.
BIND(CONCAT(?voornaam, " ", ?achternaam) AS ?mandataris_naam)
}
`;
return executeQuery({
query: sparqlQuery,
endpoint: '/vendor-proxy/query',
});
},
updateContent: (pos, queryResult) => {
return (state) => {
const { doc, schema } = state;
const $pos = doc.resolve(pos);
const bindings = queryResult.results.bindings
.map((binding) => {
const { mandataris_rang } = bindingToObject(binding);
return {
...binding,
rangnummer: rangordeStringToNumber(mandataris_rang),
};
})
.sort((b1, b2) => {
return b1.rangnummer - b2.rangnummer;
});
const tableHeader = row(schema, [schema.text('Schepen')], true);
const rows = bindings.map((binding) => {
const { mandataris_naam } = bindingToObject(binding);
return row(schema, [schema.text(mandataris_naam)]);
});
const content = schema.nodes.table.create(null, [
tableHeader,
...rows,
]);
const transaction = replaceContent(state.tr, $pos, content);
return {
transaction: transaction,
result: true,
initialState: state,
};
};
},
},
/**
* **IVGR8: Aanduiding en eedaflegging van de aangewezen-burgemeester**
*
Expand Down Expand Up @@ -771,53 +813,26 @@ export const mandateeTableConfigIVGR = (meeting) => {
return (state) => {
const { doc, schema } = state;
const $pos = doc.resolve(pos);
const decisionUri = findParentNodeClosestToPos($pos, (node) => {
return hasOutgoingNamedNodeTriple(
node.attrs,
RDF('type'),
BESLUIT('Besluit'),
);
})?.node.attrs.subject;
if (!decisionUri) {
throw new Error(
'Could not find decision to sync mandatee table with',
);
}
const bindings = queryResult.results.bindings;
const tableHeader = row(
schema,
[schema.text('Schepen'), schema.text('Fractie')],
true,
);
const rows = bindings.map((binding) => {
const { mandataris, mandataris_naam, fractie_naam } =
bindingToObject(binding);
const { mandataris_naam, fractie_naam } = bindingToObject(binding);
return row(schema, [
resourceNode(schema, mandataris, mandataris_naam),
schema.text(mandataris_naam),
schema.text(fractie_naam ?? ''),
]);
});
const content = schema.nodes.table.create(null, [
tableHeader,
...rows,
]);
const factory = new SayDataFactory();
const result = transactionCombinator(
state,
replaceContent(state.tr, $pos, content),
)(
bindings.map((binding) => {
return addPropertyToNode({
resource: decisionUri,
property: {
predicate: MANDAAT('bekrachtigtAanstellingVan').full,
object: factory.resourceNode(binding['mandataris'].value),
},
});
}),
);
const transaction = replaceContent(state.tr, $pos, content);
return {
transaction: result.transaction,
transaction,
result: true,
initialState: state,
};
Expand Down

0 comments on commit f927610

Please sign in to comment.