Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling

Over Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling


Publicatiedatum:
15-07-2026

Inwerkingtreding:
16-07-2026

21.2 Rentabiliteit - wat is de REV (Resultaat Eigen Vermogen)?

Concepten

Relaties

Eigenschappen

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: Zorgkantoren 21.2
2# Parameters: ?peildatum
3# Ontologie: versie 3.0.0 of nieuwer
4
5PREFIX onz-fin: <http://purl.org/ozo/onz-fin#>
6PREFIX onz-g:   <http://purl.org/ozo/onz-g#>
7PREFIX xsd:     <http://www.w3.org/2001/XMLSchema#>
8
9SELECT
10    ("Winstratio" AS ?Kental)
11    (
12        IF(?eigenvermogen = 0,
13            "Ongedefinieerd"^^xsd:string,
14            ROUND((?s_resultaat / ?eigenvermogen) * 100) / 100 ) AS ?Waarde
15    )
16WHERE {
17    {
18        # Bereken alle benodigde totalen in één scan
19        SELECT
20            (SUM(?p_bedrag) AS ?p_opbrengsten)   # P totaal
21            (SUM(?q_bedrag) AS ?q_totaal)        # Q totaal
22            (SUM(?r_i_bedrag) AS ?r_i_totaal)
23            (SUM(?r_ii_bedrag) AS ?r_ii_totaal)
24            (SUM(?r_iii_bedrag) AS ?r_iii_totaal)
25            (SUM(?r_iv_plus_bedrag) AS ?r_iv_plus_totaal)
26            (SUM(?r_iv_min_bedrag) AS ?r_iv_min_totaal)
27            (SUM(?s_i_bedrag) AS ?s_i_totaal)
28            (SUM(?s_ii_bedrag) AS ?s_ii_totaal)
29            (SUM(?d_bedrag) AS ?d_totaal)
30        WHERE {
31            # BIND("2024-12-31"^^xsd:date AS ?peildatum)
32            
33            # Deze binds zijn geen test-parameterbinds, dus niet uitcommenten:
34            BIND(
35                IF(
36                    MONTH(?peildatum) = 12 && DAY(?peildatum) = 31,
37                    xsd:date(CONCAT(STR(YEAR(?peildatum)), "-01-01")),
38                    xsd:date(CONCAT(STR(YEAR(?peildatum)-1), "-07-01"))
39                )
40                AS ?startperiode
41            )
42            BIND(?peildatum AS ?eindperiode)
43
44            ?grootboek_post a onz-fin:Grootboekpost ;
45            onz-g:partOf ?rubriek ;
46            onz-g:hasDate ?datum ;
47            onz-fin:heeftGeldBedrag ?geld_bedrag .
48
49            # Match directe ouder: Grootboekrekening (RGS) of Grootboekrubriek (Prismant)
50            {
51                { ?rubriek a onz-fin:Grootboekrekening }
52                UNION
53                { ?rubriek a onz-fin:Grootboekrubriek }
54            }
55            # Anti-dubbeltelling: houd alleen het bladniveau (geen transitive ancestors)
56            FILTER NOT EXISTS {
57                ?grootboek_post onz-g:partOf ?child .
58                ?child onz-g:partOf ?rubriek .
59                FILTER(?child != ?rubriek)
60                { { ?child a onz-fin:Grootboekrekening } UNION { ?child a onz-fin:Grootboekrubriek } }
61            }
62            FILTER(STRSTARTS(STR(?rubriek), STR(onz-fin:)))
63            BIND(STRAFTER(STR(?rubriek), STR(onz-fin:)) AS ?rubriekCode)
64
65            FILTER (?datum >= ?startperiode && ?datum <= ?eindperiode)
66
67            # --- P: Bedragen voor eindtotaalberekening ---
68            # Prismant: P.I=81, P.IV=82/83/89/919/920/930
69            # RGS: P.I=WOmz/WRev/WRvi/WRgr/WWvv/WNoa/WLbe/WBat, P.II/III=WWiv, P.IV=WOvb
70            BIND(
71                IF(
72                    STRSTARTS(?rubriekCode, "81") ||
73                    STRSTARTS(?rubriekCode, "82") ||
74                    STRSTARTS(?rubriekCode, "83") ||
75                    STRSTARTS(?rubriekCode, "89") ||
76                    STRSTARTS(?rubriekCode, "919") ||
77                    STRSTARTS(?rubriekCode, "920") ||
78                    STRSTARTS(?rubriekCode, "930") ||
79                    STRSTARTS(?rubriekCode, "WOmz") ||
80                    STRSTARTS(?rubriekCode, "WRev") ||
81                    STRSTARTS(?rubriekCode, "WRvi") ||
82                    STRSTARTS(?rubriekCode, "WRgr") ||
83                    STRSTARTS(?rubriekCode, "WWvv") ||
84                    STRSTARTS(?rubriekCode, "WNoa") ||
85                    STRSTARTS(?rubriekCode, "WLbe") ||
86                    STRSTARTS(?rubriekCode, "WBat") ||
87                    STRSTARTS(?rubriekCode, "WWiv") ||
88                    STRSTARTS(?rubriekCode, "WOvb"),
89                    ?geld_bedrag, 0) AS ?p_bedrag
90            )
91            # --- Q: Diverse kostenrubrieken ---
92            # Prismant: 417/418/411-419/420/4221/4223-4225/4229/4226/480-484/423/43-47/486/489/905/911-915/921/931
93            # RGS: WKpr/WPer/WAfs/WWvi/WBwv/WBed/WOok/WKol/WVkf/WAkf
94            BIND(
95                IF(
96                    STRSTARTS(?rubriekCode, "417") ||
97                    STRSTARTS(?rubriekCode, "418") ||
98                    STRSTARTS(?rubriekCode, "411") ||
99                    STRSTARTS(?rubriekCode, "412") ||
100                    STRSTARTS(?rubriekCode, "413") ||
101                    STRSTARTS(?rubriekCode, "414") ||
102                    STRSTARTS(?rubriekCode, "415") ||
103                    STRSTARTS(?rubriekCode, "416") ||
104                    STRSTARTS(?rubriekCode, "419") ||
105                    STRSTARTS(?rubriekCode, "420") ||
106                    STRSTARTS(?rubriekCode, "4221") ||
107                    STRSTARTS(?rubriekCode, "4223") ||
108                    STRSTARTS(?rubriekCode, "4224") ||
109                    STRSTARTS(?rubriekCode, "4225") ||
110                    STRSTARTS(?rubriekCode, "4229") ||
111                    STRSTARTS(?rubriekCode, "4226") ||
112                    STRSTARTS(?rubriekCode, "480") ||
113                    STRSTARTS(?rubriekCode, "481") ||
114                    STRSTARTS(?rubriekCode, "482") ||
115                    STRSTARTS(?rubriekCode, "483") ||
116                    STRSTARTS(?rubriekCode, "484") ||
117                    STRSTARTS(?rubriekCode, "423") ||
118                    STRSTARTS(?rubriekCode, "43") ||
119                    STRSTARTS(?rubriekCode, "44") ||
120                    STRSTARTS(?rubriekCode, "45") ||
121                    STRSTARTS(?rubriekCode, "46") ||
122                    STRSTARTS(?rubriekCode, "47") ||
123                    STRSTARTS(?rubriekCode, "486") ||
124                    STRSTARTS(?rubriekCode, "489") ||
125                    STRSTARTS(?rubriekCode, "905") ||
126                    STRSTARTS(?rubriekCode, "911") ||
127                    STRSTARTS(?rubriekCode, "912") ||
128                    STRSTARTS(?rubriekCode, "913") ||
129                    STRSTARTS(?rubriekCode, "914") ||
130                    STRSTARTS(?rubriekCode, "915") ||
131                    STRSTARTS(?rubriekCode, "921") ||
132                    STRSTARTS(?rubriekCode, "931") ||
133
134                    STRSTARTS(?rubriekCode, "WKpr") ||
135                    STRSTARTS(?rubriekCode, "WPer") ||
136                    STRSTARTS(?rubriekCode, "WAfs") ||
137                    STRSTARTS(?rubriekCode, "WWvi") ||
138                    STRSTARTS(?rubriekCode, "WBwv") ||
139                    STRSTARTS(?rubriekCode, "WBed") ||
140                    STRSTARTS(?rubriekCode, "WOok") ||
141                    STRSTARTS(?rubriekCode, "WKol") ||
142                    STRSTARTS(?rubriekCode, "WVkf") ||
143                    STRSTARTS(?rubriekCode, "WAkf"),
144                    ?geld_bedrag, 0) AS ?q_bedrag
145            )
146            # R.I: Prismant=904, RGS=WOvt
147            BIND(IF(STRSTARTS(?rubriekCode, "904") || STRSTARTS(?rubriekCode, "WOvt"), ?geld_bedrag, 0) AS ?r_i_bedrag)
148            # R.II: Prismant=900, RGS=WFbeRlm
149            BIND(IF(STRSTARTS(?rubriekCode, "900") || STRSTARTS(?rubriekCode, "WFbeRlm"), ?geld_bedrag, 0) AS ?r_ii_bedrag)
150            # R.III: Prismant=903, RGS=WWfa/WVhe
151            BIND(IF(STRSTARTS(?rubriekCode, "903") || STRSTARTS(?rubriekCode, "WWfa") || STRSTARTS(?rubriekCode, "WVhe"), ?geld_bedrag, 0) AS ?r_iii_bedrag)
152            # R.IV: Prismant=485/901, RGS=WFbe-WFbeRlm
153            BIND(IF(STRSTARTS(?rubriekCode, "485") || STRSTARTS(?rubriekCode, "901") || STRSTARTS(?rubriekCode, "WFbe"), ?geld_bedrag, 0) AS ?r_iv_plus_bedrag)
154            BIND(IF(STRSTARTS(?rubriekCode, "WFbeRlm"), ?geld_bedrag, 0) AS ?r_iv_min_bedrag)
155            # S.I: Prismant=n.v.t., RGS=WBel
156            BIND(IF(STRSTARTS(?rubriekCode, "WBel"), ?geld_bedrag, 0) AS ?s_i_bedrag)
157            # S.II: Prismant=902, RGS=WRed/WAad
158            BIND(IF(STRSTARTS(?rubriekCode, "902") || STRSTARTS(?rubriekCode, "WRed") || STRSTARTS(?rubriekCode, "WAad"), ?geld_bedrag, 0) AS ?s_ii_bedrag)
159        }
160    }
161
162    # Berekening S Resultaat na belastingen
163    BIND(?p_opbrengsten + ?q_totaal + ?r_i_totaal + ?r_ii_totaal + ?r_iii_totaal + (?r_iv_plus_totaal - ?r_iv_min_totaal) + ?s_i_totaal + ?s_ii_totaal AS ?s_resultaat)
164
165    # DEEL 2: D Eigen vermogen (balans op peildatum, uit 18.1)
166    {
167        SELECT
168        	(SUM(IF(?jaarrekeningpost = "D Eigen vermogen", ?bedrag, 0)) AS ?eigenvermogen)
169        WHERE {
170            {
171                SELECT ?jaarrekeningpost (SUM(?bedrag_rubriek) AS ?bedrag)
172                WHERE {
173                    {
174                        # Middle select: totaal per rubriek (saldo + latere mutaties)
175                        SELECT ?rubriek ?categorie (SUM(?geld_bedrag_post) + SUM(?saldo_waarde) / COUNT(?saldo_waarde) AS ?bedrag_rubriek)
176                        WHERE {
177                            {
178                                # Innerste subquery: meest recente saldo per rubriek
179                                SELECT ?rubriek ?categorie
180                                    (IF(BOUND(?saldo_bedrag), ?saldo_bedrag, 0) AS ?saldo_waarde)
181                                    ?peildatum_argument
182                                    (IF(BOUND(?saldo_datum), ?saldo_datum, ?unbound) AS ?begin_datum)
183                                WHERE {
184                                    # BIND("2024-12-31"^^xsd:date AS ?peildatum)
185                                    BIND(?peildatum AS ?peildatum_argument)
186
187                                    # Prismant: prefix-mapping op 6-cijferige Grootboekrubrieken
188                                    {
189                                        { ?rubriek a onz-fin:Grootboekrubriek }
190                                        UNION
191                                        { ?rubriek a onz-fin:Grootboekrekening }
192                                        BIND(STRAFTER(STR(?rubriek), STR(onz-fin:)) AS ?rubriekCode)
193                                        VALUES (?prismantPrefix ?categorie) {
194                                            ("0511"  "D.I")
195                                            ("05413" "D.IV")
196                                            ("05311" "D.V")
197                                            ("05342" "D.V")
198                                            ("05423" "D.V")
199                                            ("05323" "D.VI")
200                                            ("0539"  "D.VII")
201                                            ("05493" "D.VII")
202                                            ("05915" "D.VII")
203                                            ("091"   "D.VIII")
204                                        }
205                                        FILTER(STRSTARTS(?rubriekCode, ?prismantPrefix))
206                                    }
207                                    UNION
208                                    {
209                                        # RGS: exacte mapping
210                                        VALUES (?rubriekCode ?categorie) {
211                                            ("BEivGok" "D.I")
212                                            ("BEivAgi" "D.II")
213                                            ("BEivHer" "D.III")
214                                            ("BEivWer" "D.IV")
215                                            ("BEivStr" "D.IV")
216                                            ("BEivBer" "D.V")
217                                            ("BEivBef" "D.VI")
218                                            ("BEivOvr" "D.VII")
219                                            ("BEivOre" "D.VIII")
220                                        }
221                                        BIND(IRI(CONCAT(STR(onz-fin:), ?rubriekCode)) AS ?rubriek)
222                                        { ?rubriek a onz-fin:Grootboekrubriek }
223                                        UNION
224                                        { ?rubriek a onz-fin:Grootboekrekening }
225                                    }
226
227                                    # Meest recente eindsaldo per rubriek (tiebreaker binnen OPTIONAL)
228                                    OPTIONAL {
229                                        ?rubriek onz-g:isAbout ?saldo .
230                                        ?saldo a onz-fin:EindSaldo ;
231                                        onz-fin:heeftGeldBedrag ?saldo_bedrag ;
232                                        onz-g:hasDate ?saldo_datum .
233                                        FILTER(?saldo_datum <= ?peildatum_argument)
234                                        FILTER NOT EXISTS {
235                                            ?rubriek onz-g:isAbout ?otherSaldo .
236                                            ?otherSaldo a onz-fin:EindSaldo ;
237                                            onz-g:hasDate ?otherDatum .
238                                            FILTER(
239                                                ?otherSaldo != ?saldo
240                                                && ?otherDatum <= ?peildatum_argument
241                                                && (
242                                                    ?otherDatum > ?saldo_datum
243                                                    || (?otherDatum = ?saldo_datum && STR(?otherSaldo) > STR(?saldo))
244                                                )
245                                            )
246                                        }
247                                    }
248                                }
249                            }
250
251                            # Grootboekposten na saldo
252                            OPTIONAL {
253                                ?grootboek_post a onz-fin:Grootboekpost ;
254                                                onz-g:partOf ?rubriek ;
255                                                onz-g:hasDate ?datum ;
256                                                onz-fin:heeftGeldBedrag ?geld_bedrag_temp .
257                                # Anti-dubbeltelling
258                                FILTER NOT EXISTS {
259                                    ?grootboek_post onz-g:partOf ?child .
260                                    ?child onz-g:partOf ?rubriek .
261                                    FILTER(?child != ?rubriek)
262                                    { { ?child a onz-fin:Grootboekrekening } UNION { ?child a onz-fin:Grootboekrubriek } }
263                                }
264                                FILTER(
265                                    ?datum <= ?peildatum_argument
266                                    && (!BOUND(?begin_datum) || ?datum > ?begin_datum)
267                                )
268                            }
269                            BIND(IF(BOUND(?geld_bedrag_temp), ?geld_bedrag_temp, 0) AS ?geld_bedrag_post)
270                        }
271                        GROUP BY ?rubriek ?categorie
272                    }
273                    VALUES (?categorie ?jaarrekeningpost) {
274                        ("D.I"    "D Eigen vermogen")
275                        ("D.II"   "D Eigen vermogen")
276                        ("D.III"  "D Eigen vermogen")
277                        ("D.IV"   "D Eigen vermogen")
278                        ("D.V"    "D Eigen vermogen")
279                        ("D.VI"   "D Eigen vermogen")
280                        ("D.VII"  "D Eigen vermogen")
281                        ("D.VIII" "D Eigen vermogen")
282                    }
283                }
284                GROUP BY ?jaarrekeningpost
285            }
286        }
287    }
288}
289