|
1158 | 1158 | ], |
1159 | 1159 | "evaluation-template": [ |
1160 | 1160 | { |
1161 | | - "slug": "template-bestuurlijke-effectiviteit-nl-cgc", |
| 1161 | + "slug": "template-bestuurlijke-effectiviteit", |
1162 | 1162 | "title": "Board effectiveness self-evaluation (NL Corporate Governance Code)", |
1163 | 1163 | "description": "Default reusable annual board self-evaluation (zelfevaluatie) covering the five standard effectiveness dimensions. Editable per body.", |
1164 | 1164 | "dimensions": [ |
|
1265 | 1265 | "secretaryUserId": "jan.devries", |
1266 | 1266 | "scoreSummary": "{\"overallScore\":3.6,\"respondentCount\":2,\"invitedMemberCount\":3,\"minRespondentThreshold\":3,\"thresholdMet\":false,\"suppressed\":true,\"dimensionScores\":null,\"themes\":null,\"computedAt\":\"2025-12-20T17:05:00Z\"}", |
1267 | 1267 | "governanceBody": "rvc-waterschap-amstel", |
1268 | | - "template": "template-bestuurlijke-effectiviteit-nl-cgc" |
| 1268 | + "template": "template-bestuurlijke-effectiviteit" |
1269 | 1269 | }, |
1270 | 1270 | { |
1271 | 1271 | "slug": "evaluatie-acme-rvc-2026", |
|
1289 | 1289 | "chairUserId": "acme.chair", |
1290 | 1290 | "secretaryUserId": "acme.secretary", |
1291 | 1291 | "governanceBody": "raad-van-commissarissen-acme-bv", |
1292 | | - "template": "template-bestuurlijke-effectiviteit-nl-cgc" |
| 1292 | + "template": "template-bestuurlijke-effectiviteit" |
1293 | 1293 | } |
1294 | 1294 | ], |
1295 | 1295 | "evaluation-response": [ |
|
1394 | 1394 | "agenda-item", |
1395 | 1395 | "bevoegdheidstoedeling", |
1396 | 1396 | "board-evaluation", |
| 1397 | + "board-proxy", |
1397 | 1398 | "body-participation", |
1398 | 1399 | "budget-proposal", |
1399 | 1400 | "citizen-panel", |
|
1415 | 1416 | "geheimhouding-grond", |
1416 | 1417 | "geschenk", |
1417 | 1418 | "governance-body", |
| 1419 | + "governance-report", |
1418 | 1420 | "governing-document", |
1419 | 1421 | "governing-document-versie", |
1420 | 1422 | "ingekomen-stuk", |
|
2207 | 2209 | "title": "Opened at", |
2208 | 2210 | "type": "string", |
2209 | 2211 | "format": "date-time", |
2210 | | - "description": "Timestamp of the first 'open' lifecycle transition, stamped server-side by MeetingService (meeting-efficiency). Basis for the live cost calculator and duration analytics.", |
2211 | | - "readOnly": true |
| 2212 | + "description": "Timestamp of the first 'open' lifecycle transition, stamped server-side by MeetingService (meeting-efficiency). Basis for the live cost calculator and duration analytics. NOT readOnly: OpenRegister reads readOnly as immutable-after-create and rejects the UPDATE for every writer, including MeetingService itself — a meeting is created before it is opened, so a readOnly stamp can never be written." |
2212 | 2213 | }, |
2213 | 2214 | "closedAt": { |
2214 | 2215 | "title": "Closed at", |
2215 | 2216 | "type": "string", |
2216 | 2217 | "format": "date-time", |
2217 | | - "description": "Timestamp of the 'close' lifecycle transition, stamped server-side by MeetingService (meeting-efficiency).", |
2218 | | - "readOnly": true |
| 2218 | + "description": "Timestamp of the 'close' lifecycle transition, stamped server-side by MeetingService (meeting-efficiency). NOT readOnly — see openedAt: readOnly made every opened -> closed transition fail with 'Cannot modify readOnly property: closedAt' (422)." |
2219 | 2219 | }, |
2220 | 2220 | "meetingCost": { |
2221 | 2221 | "title": "Meeting cost", |
2222 | 2222 | "type": "number", |
2223 | | - "description": "Total meeting cost in EUR, computed server-side on close from elapsed time x attendee count x the governance body's hourlyRate (meeting-efficiency). Schema.org MonetaryAmount value.", |
2224 | | - "readOnly": true |
| 2223 | + "description": "Total meeting cost in EUR, computed server-side on close from elapsed time x attendee count x the governance body's hourlyRate (meeting-efficiency). Schema.org MonetaryAmount value. NOT readOnly — see openedAt: it is stamped on close, i.e. always after create." |
2225 | 2224 | } |
2226 | 2225 | }, |
2227 | 2226 | "x-openregister-aggregations": { |
|
2704 | 2703 | } |
2705 | 2704 | } |
2706 | 2705 | }, |
| 2706 | + "GovernanceReport": { |
| 2707 | + "slug": "governance-report", |
| 2708 | + "icon": "ChartBoxOutline", |
| 2709 | + "version": "0.1.0", |
| 2710 | + "title": "GovernanceReport", |
| 2711 | + "description": "A generated annual governance report for one board and year (meeting/resolution counts, vote tally, independence ratio, attendance rate, conflict count and the compliance flags derived from them). This is the row GovernanceReportingService persists so /api/governance-reports/{id} and /{id}/export/{format} have something to address.", |
| 2712 | + "type": "object", |
| 2713 | + "x-openregister": { |
| 2714 | + "schemaType": "custom:GovernanceReport", |
| 2715 | + "active": true, |
| 2716 | + "hardDelete": false, |
| 2717 | + "searchable": false, |
| 2718 | + "mailEnabled": false |
| 2719 | + }, |
| 2720 | + "required": [ |
| 2721 | + "boardKoppeling", |
| 2722 | + "year" |
| 2723 | + ], |
| 2724 | + "properties": { |
| 2725 | + "boardKoppeling": { |
| 2726 | + "title": "Board", |
| 2727 | + "type": "string", |
| 2728 | + "description": "Identifier of the governance body the report covers." |
| 2729 | + }, |
| 2730 | + "year": { |
| 2731 | + "title": "Year", |
| 2732 | + "type": "integer", |
| 2733 | + "description": "Calendar year the report covers.", |
| 2734 | + "example": 2026 |
| 2735 | + }, |
| 2736 | + "meetingCount": { |
| 2737 | + "title": "Meeting count", |
| 2738 | + "type": "integer", |
| 2739 | + "description": "Number of meetings held in the reporting year." |
| 2740 | + }, |
| 2741 | + "resolutionCount": { |
| 2742 | + "title": "Resolution count", |
| 2743 | + "type": "integer", |
| 2744 | + "description": "Number of resolutions taken in the reporting year." |
| 2745 | + }, |
| 2746 | + "voteTally": { |
| 2747 | + "title": "Vote tally", |
| 2748 | + "type": "object", |
| 2749 | + "description": "Votes cast in the reporting year, counted per outcome (in-favor, against, abstain, absent, recused-due-to-conflict)." |
| 2750 | + }, |
| 2751 | + "memberCount": { |
| 2752 | + "title": "Member count", |
| 2753 | + "type": "integer", |
| 2754 | + "description": "Number of board members in the reporting year." |
| 2755 | + }, |
| 2756 | + "independenceRatio": { |
| 2757 | + "title": "Independence ratio", |
| 2758 | + "type": "number", |
| 2759 | + "description": "Share of board members classified as independent." |
| 2760 | + }, |
| 2761 | + "attendanceRate": { |
| 2762 | + "title": "Attendance rate", |
| 2763 | + "type": "number", |
| 2764 | + "description": "Share of possible member-meeting attendances actually recorded." |
| 2765 | + }, |
| 2766 | + "conflictCount": { |
| 2767 | + "title": "Conflict count", |
| 2768 | + "type": "integer", |
| 2769 | + "description": "Number of conflict-of-interest declarations in the reporting year." |
| 2770 | + }, |
| 2771 | + "flags": { |
| 2772 | + "title": "Compliance flags", |
| 2773 | + "type": "object", |
| 2774 | + "description": "Compliance verdict for the report: whether every threshold passed, plus the list of thresholds that did not." |
| 2775 | + }, |
| 2776 | + "generatedAt": { |
| 2777 | + "title": "Generated at", |
| 2778 | + "type": "string", |
| 2779 | + "description": "Moment the report was generated." |
| 2780 | + } |
| 2781 | + } |
| 2782 | + }, |
| 2783 | + "BoardProxy": { |
| 2784 | + "slug": "board-proxy", |
| 2785 | + "icon": "AccountArrowRightOutline", |
| 2786 | + "version": "0.1.0", |
| 2787 | + "title": "BoardProxy", |
| 2788 | + "description": "A proxy (volmacht) granted by one board member to another for a single meeting. This is the row ProxyVoteService writes through /api/proxies and the row the per-holder proxy cap counts; the signed-document side of a volmacht lives on ProxyAuthorization.", |
| 2789 | + "type": "object", |
| 2790 | + "x-openregister": { |
| 2791 | + "schemaType": "custom:BoardProxy", |
| 2792 | + "active": true, |
| 2793 | + "hardDelete": false, |
| 2794 | + "searchable": false, |
| 2795 | + "mailEnabled": false |
| 2796 | + }, |
| 2797 | + "required": [ |
| 2798 | + "meetingKoppeling", |
| 2799 | + "grantorKoppeling", |
| 2800 | + "holderKoppeling", |
| 2801 | + "proxyStatus" |
| 2802 | + ], |
| 2803 | + "properties": { |
| 2804 | + "meetingKoppeling": { |
| 2805 | + "title": "Meeting", |
| 2806 | + "type": "string", |
| 2807 | + "description": "Identifier of the meeting this proxy applies to. The per-holder cap is counted per meeting." |
| 2808 | + }, |
| 2809 | + "grantorKoppeling": { |
| 2810 | + "title": "Grantor", |
| 2811 | + "type": "string", |
| 2812 | + "description": "Identifier of the participant delegating their vote (the volmachtgever)." |
| 2813 | + }, |
| 2814 | + "holderKoppeling": { |
| 2815 | + "title": "Holder", |
| 2816 | + "type": "string", |
| 2817 | + "description": "Identifier of the participant receiving the delegation (the gevolmachtigde)." |
| 2818 | + }, |
| 2819 | + "scope": { |
| 2820 | + "title": "Scope", |
| 2821 | + "type": "string", |
| 2822 | + "description": "Which resolutions the delegation covers.", |
| 2823 | + "example": "all-resolutions" |
| 2824 | + }, |
| 2825 | + "expiresAt": { |
| 2826 | + "title": "Expires at", |
| 2827 | + "type": "string", |
| 2828 | + "description": "Optional moment the delegation lapses. Empty when the proxy runs for the whole meeting." |
| 2829 | + }, |
| 2830 | + "proxyStatus": { |
| 2831 | + "title": "Proxy status", |
| 2832 | + "type": "string", |
| 2833 | + "description": "Lifecycle state of the delegation. A freshly registered proxy starts pending-approval; only active proxies count toward the per-holder cap.", |
| 2834 | + "enum": [ |
| 2835 | + "pending-approval", |
| 2836 | + "active", |
| 2837 | + "suspended", |
| 2838 | + "revoked" |
| 2839 | + ], |
| 2840 | + "example": "pending-approval" |
| 2841 | + }, |
| 2842 | + "registeredAt": { |
| 2843 | + "title": "Registered at", |
| 2844 | + "type": "string", |
| 2845 | + "description": "Moment the delegation was registered." |
| 2846 | + } |
| 2847 | + } |
| 2848 | + }, |
2707 | 2849 | "Vote": { |
2708 | 2850 | "slug": "vote", |
2709 | 2851 | "icon": "ThumbUpOutline", |
|
0 commit comments