Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling

Over Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling


Publicatiedatum:
03-10-2025

Inwerkingtreding:
03-10-2025

18.1 Wat is de balans o.b.v. Grootboek?

Concepten

Relaties

Eigenschappen

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: Zorgkantoren 18.1.0
2# Parameters: ?peildatum
3# Ontologie: versie 3.0.0 of nieuwer
4
5PREFIX onz-fin: <http://purl.org/ozo/onz-fin#>
6prefix onz-zorg:  <http://purl.org/ozo/onz-zorg#>
7PREFIX onz-g: <http://purl.org/ozo/onz-g#>
8PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
9
10SELECT
11    ?jaarrekeningpost
12    (SUM(?bedrag_rubriek) AS ?bedrag)
13WHERE
14{
15    # BIND("2024-12-31" AS ?peildatum)
16    BIND(?peildatum AS ?peildatum_argument)
17    {
18        {
19            SELECT  # totaal per rubriek
20                (SUM(?geld_bedrag) + SUM(?saldo_waarde)/count(?saldo_waarde) AS ?bedrag_rubriek) ?rubriek ?categorie
21            WHERE {
22                {
23                    SELECT  # bereken het meest recente saldo per rubriek, 0 indien geen saldo
24                        ?rubriek ?categorie
25                        (IF(BOUND(?saldo_bedrag), ?saldo_bedrag, 0) AS ?saldo_waarde)
26                        ?peildatum_argument
27                        (IF(BOUND(?saldo_datum), ?saldo_datum, ?unbound) AS ?begin_datum)
28                        ?saldo_datum ?saldo
29                    WHERE {
30                        # BIND("2024-12-31"^^xsd:date AS ?peildatum)
31                        BIND(?peildatum as ?peildatum_argument)
32                        # Dynamically identify rubrieken and assign categories
33                        # This assumes ?rubriek instances are findable as subjects/objects in the graph
34                        # and their IRIs start with onz-fin: followed by a 6-digit code.
35                        # For performance, we select ?rubriek instances based on their specific type.
36                        {
37                            SELECT DISTINCT ?rubriek WHERE {
38                                ?rubriek a onz-fin:Grootboekrubriek .
39
40                                # These filters can be kept as a safeguard, but the type-based selection
41                                # is doing the primary work of finding the correct rubrieken.
42                                FILTER(STRSTARTS(STR(?rubriek), STR(onz-fin:)))
43                                FILTER(REGEX(STRAFTER(STR(?rubriek), STR(onz-fin:)), "^[0-9]{6}$"))
44                            }
45                        }
46                        # Re-BIND rubriekCode here as it's outside the subquery's scope for BIND
47                        BIND(STRAFTER(STR(?rubriek), STR(onz-fin:)) AS ?rubriekCode)
48
49                        # Assign category based on the ?rubriekCode pattern
50                        BIND(
51                            COALESCE(
52                                # Rubrieken A.I t/m A.III
53                                IF(STRSTARTS(?rubriekCode, "00"), "A.I", ?unbound),
54                                IF(STRSTARTS(?rubriekCode, "01"), "A.II", ?unbound),
55                                IF(STRSTARTS(?rubriekCode, "03"), "A.III", ?unbound),
56
57                                # Rubrieken B.I t/m B.IV
58                                IF(STRSTARTS(?rubriekCode, "3"), "B.I", ?unbound),
59                                IF(STRSTARTS(?rubriekCode, "12"), "B.II", ?unbound),
60                                IF(STRSTARTS(?rubriekCode, "131"), "B.III", ?unbound),
61                                IF(STRSTARTS(?rubriekCode, "132"), "B.IV", ?unbound),
62
63                                # Rubrieken D.I t/m D.VIII (D.II en D.III bestaan niet in prismant, altijd 0)
64                                IF(STRSTARTS(?rubriekCode, "0511"), "D.I", ?unbound),
65                                IF(STRSTARTS(?rubriekCode, "05413"), "D.IV", ?unbound),
66                                IF(STRSTARTS(?rubriekCode, "05311") || STRSTARTS(?rubriekCode, "05342") || STRSTARTS(?rubriekCode, "05423"), "D.V", ?unbound),
67                                IF(STRSTARTS(?rubriekCode, "05323"), "D.VI", ?unbound),
68                                IF(STRSTARTS(?rubriekCode, "0539") || STRSTARTS(?rubriekCode, "05493") || STRSTARTS(?rubriekCode, "05915"), "D.VII", ?unbound),
69                                IF(STRSTARTS(?rubriekCode, "091"), "D.VIII", ?unbound),
70
71                                # Rubriek E
72                                IF(STRSTARTS(?rubriekCode, "06"), "E", ?unbound),
73
74                                # Rubriek F
75                                IF(STRSTARTS(?rubriekCode, "07"), "F", ?unbound),
76                                
77                                # Rubriek G
78                                IF(STRSTARTS(?rubriekCode, "14") || STRSTARTS(?rubriekCode, "15"), "G", ?unbound),
79                                "other"
80                            ) AS ?categorie
81                        )
82                        # Only process rubrieken that fall into one of the defined categories
83                        FILTER(BOUND(?categorie))
84
85                        OPTIONAL {
86                            ?rubriek onz-g:isAbout ?saldo .
87                            ?saldo
88                                a onz-fin:EindSaldo ;
89                                onz-fin:heeftGeldBedrag ?saldo_bedrag ;
90                                onz-g:hasDate ?saldo_datum .
91                            FILTER (?saldo_datum <= ?peildatum_argument)
92                        }
93                        FILTER NOT EXISTS {
94                            ?rubriek onz-g:isAbout ?saldo2 .
95                            ?saldo2
96                                onz-g:hasDate ?saldo_datum2 ;
97                                a onz-fin:EindSaldo ;.
98                            FILTER(?saldo2 != ?saldo)
99                            FILTER (?saldo_datum2 <= ?peildatum_argument && ?saldo_datum2 > ?saldo_datum)
100                        }
101                    } # End of innermost WHERE
102                } # End of innermost SELECT block
103                OPTIONAL {  # sommige rubrieken hebben misschien geen post
104                ?grootboek_post
105                    a onz-fin:Grootboekpost ;
106                    onz-g:partOf ?rubriek ;
107                    onz-g:hasDate ?datum ;
108                    onz-fin:heeftGeldBedrag ?geld_bedrag_temp .
109                FILTER (?datum <= ?peildatum_argument && (?datum > ?begin_datum || !BOUND(?begin_datum)))
110                }
111                BIND(IF(BOUND(?geld_bedrag_temp), ?geld_bedrag_temp, 0) AS ?geld_bedrag)
112
113            } GROUP BY ?rubriek ?categorie
114        } # End of middle SELECT block
115
116    VALUES (?categorie ?jaarrekeningpost_child){
117        ("A.I"    "A.I Immateriële vaste activa")
118        ("A.II"   "A.II Materiële vaste activa")
119        ("A.III"  "A.III Financiële vaste activa")
120        ("B.I"    "B.I Voorraden")
121        ("B.II"   "B.II Vorderingen")
122        ("B.III"  "B.III Effecten")
123        ("B.IV"   "B.IV Liquide middelen")
124        ("D.I"    "D.I Gestort en opgevraagd kapitaal")
125        ("D.IV"   "D.IV Wettelijke en statutaire reserve")
126        ("D.V"    "D.V Bestemmingsreserve")
127        ("D.VI"   "D.VI Bestemmingsfonds")
128        ("D.VII"  "D.VII Overige reserves")
129        ("D.VIII" "D.VIII Onverdeelde winst")
130        ("E"      "E Voorzieningen")
131        ("F"      "F Langlopende schulden")
132        ("G"      "G Kortlopende schulden")
133    }
134
135    # Determine the parent-level post (A, B, D...) based on the first letter
136    BIND(
137        IF(STRSTARTS(?categorie, "A."), "A Vaste activa",
138        IF(STRSTARTS(?categorie, "B."), "B Vlottende activa",
139        IF(STRSTARTS(?categorie, "D."), "D Eigen vermogen",
140        ?unbound))) AS ?jrp_parent # Fallback naar ?unbound om dubbeltelling te voorkomen
141    )
142
143    BIND(
144        IF(STRSTARTS(?categorie, "A.") || STRSTARTS(?categorie, "B."), "C Totaal activa",
145        IF(STRSTARTS(?categorie, "D.") || ?categorie = "E" || ?categorie = "F" || ?categorie = "G", "H Totaal passiva",
146        ?unbound)) AS ?combi
147    )
148
149    VALUES ?x {1 2 3}
150    BIND(
151        IF(?x = 1, ?jaarrekeningpost_child,
152        IF(?x = 2, ?jrp_parent,
153        IF(?x = 3, ?combi, 
154        ?unbound))) AS ?jaarrekeningpost
155    )
156
157    FILTER(BOUND(?jaarrekeningpost))
158
159    }
160    UNION
161    {
162    # =======================================================================  
163    # Volledige lijst van alle jaarrekeningposten (bedrag 0 als fallback)
164    # =======================================================================
165    BIND(0 AS ?bedrag_rubriek)
166    VALUES (?jaarrekeningpost_child ?jrp_parent ?combi) {
167        # A: Vaste activa
168        ("A.I Immateriële vaste activa"    "A Vaste activa"    "C Totaal activa")
169        ("A.II Materiële vaste activa"     "A Vaste activa"    "C Totaal activa")
170        ("A.III Financiële vaste activa"   "A Vaste activa"    "C Totaal activa")
171        
172        # B: Vlottende activa  
173        ("B.I Voorraden"                   "B Vlottende activa"  "C Totaal activa")
174        ("B.II Vorderingen"                "B Vlottende activa"  "C Totaal activa")
175        ("B.III Effecten"                  "B Vlottende activa"  "C Totaal activa")
176        ("B.IV Liquide middelen"           "B Vlottende activa"  "C Totaal activa")
177        
178        # D: Eigen vermogen
179        ("D.I Gestort en opgevraagd kapitaal"  "D Eigen vermogen"  "H Totaal passiva")
180        ("D.II Agio"                           "D Eigen vermogen"  "H Totaal passiva")
181        ("D.III Herwaarderingsreserve"         "D Eigen vermogen"  "H Totaal passiva")
182        ("D.IV Wettelijke en statutaire reserve" "D Eigen vermogen"  "H Totaal passiva")
183        ("D.V Bestemmingsreserve"              "D Eigen vermogen"  "H Totaal passiva")
184        ("D.VI Bestemmingsfonds"               "D Eigen vermogen"  "H Totaal passiva")
185        ("D.VII Overige reserves"              "D Eigen vermogen"  "H Totaal passiva")
186        ("D.VIII Onverdeelde winst"            "D Eigen vermogen"  "H Totaal passiva")
187        
188        # E, F, G: Overige passiva
189        ("E Voorzieningen"                  "E Voorzieningen"   "H Totaal passiva")
190        ("F Langlopende schulden"           "F Langlopende schulden"  "H Totaal passiva")
191        ("G Kortlopende schulden"           "G Kortlopende schulden"  "H Totaal passiva")
192    }
193
194    VALUES ?post_type { 1 2 3 } # 1=child, 2=parent, 3=combi
195    BIND(
196        IF(?post_type = 1, ?jaarrekeningpost_child,
197        IF(?post_type = 2, ?jrp_parent,
198        IF(?post_type = 3, ?combi, ?unbound))) AS ?jaarrekeningpost
199    )
200    FILTER(BOUND(?jaarrekeningpost))
201    }
202} GROUP BY ?jaarrekeningpost
203ORDER BY ?jaarrekeningpost