Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling

Over Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling


Publicatiedatum:
01-05-2026

Inwerkingtreding:
01-05-2026

11.2 Wat is het kortdurend ziekteverzuimpercentage incl. zwangerschapsverlof?

Concepten

Relaties

Eigenschappen

Instanties

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: ZK 11.2
2# Parameters: ?jaar, ?kwartaal, ?zorgkantoor
3# Ontologie: versie 3.0 of nieuwer
4
5PREFIX onz-g:   <http://purl.org/ozo/onz-g#>
6PREFIX onz-org: <http://purl.org/ozo/onz-org#>
7PREFIX time:    <http://www.w3.org/2006/time#>
8PREFIX onz-pers:<http://purl.org/ozo/onz-pers#>
9PREFIX xsd:     <http://www.w3.org/2001/XMLSchema#>
10
11SELECT (?vestiging AS ?Indeling)
12  		(IF(SUM(?noemer_som_zorg) = 0, "Ongedefinieerd",
13        ROUND( (100.0 * SUM(?ziekte_som_zorg) / SUM(?noemer_som_zorg)) * 100 ) / 100
14        ) AS ?Zorg)
15      (IF(SUM(?noemer_som_niet_zorg) = 0, "Ongedefinieerd",
16        ROUND( (100.0 * SUM(?ziekte_som_niet_zorg) / SUM(?noemer_som_niet_zorg)) * 100 ) / 100
17        ) AS ?Niet_zorg)
18  		(IF(SUM(?noemer_som_totaal) = 0, "Ongedefinieerd",
19        ROUND( (100.0 * SUM(?ziekte_som_totaal) / SUM(?noemer_som_totaal)) * 100 ) / 100
20        ) AS ?Totaal)
21WHERE 
22{
23  {
24    SELECT
25      	?overeenkomst_afspraak 
26      	?persoon 
27      	(SUM(?ziekte_verzuim_zorg) AS ?ziekte_som_zorg) 
28      	(SUM(?noemer_afspraak_zorg) AS ?noemer_som_zorg) 
29      	(SUM(?ziekte_verzuim_niet_zorg) AS ?ziekte_som_niet_zorg) 
30      	(SUM(?noemer_afspraak_niet_zorg) AS ?noemer_som_niet_zorg) 
31      	(SUM(?ziekte_verzuim_totaal) AS ?ziekte_som_totaal) 
32      	(SUM(?noemer_afspraak_totaal) AS ?noemer_som_totaal) 
33    WHERE
34    {
35      # TELLER: selecteer het ?ziekte_verzuim van de medewerkers per persoon per werkovereenkomstafspraak
36      {
37        SELECT    
38          ?overeenkomst_afspraak
39          ?persoon
40          ?ziekte_verzuim_zorg
41          ?ziekte_verzuim_niet_zorg
42          ?ziekte_verzuim_totaal
43          ("0.0"^^xsd:decimal AS ?noemer_afspraak_zorg)
44          ("0.0"^^xsd:decimal AS ?noemer_afspraak_niet_zorg)
45          ("0.0"^^xsd:decimal AS ?noemer_afspraak_totaal)
46        WHERE {
47                 
48		      # BIND(2024 AS ?jaar)  # Parameter
49          # BIND("Q1" AS ?kwartaal)  # Parameter           
50          BIND(IF(?kwartaal = 'Q1', xsd:date(CONCAT(STR(?jaar), '-01-01')),
51                 IF(?kwartaal = 'Q2', xsd:date(CONCAT(STR(?jaar), '-04-01')),
52                 IF(?kwartaal = 'Q3', xsd:date(CONCAT(STR(?jaar), '-07-01')),
53                 IF(?kwartaal = 'Q4', xsd:date(CONCAT(STR(?jaar), '-10-01')),
54                 ?unbound)))) AS ?start_periode)
55            BIND(?start_periode + "P3M"^^xsd:duration + "-P1D"^^xsd:duration AS ?eind_periode)
56
57          # Selecteer alle arbeidsovereenkomsten die geldig zijn
58          ?overeenkomst a onz-pers:ArbeidsOvereenkomst ; onz-g:hasPart ?overeenkomst_afspraak .
59          ?overeenkomst onz-pers:heeftOpdrachtnemer ?persoon .
60          ?overeenkomst_afspraak a onz-pers:WerkOvereenkomstAfspraak ; onz-g:hasPart ?omvang ; onz-g:startDatum ?start_afspraak .
61          OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
62          FILTER (?start_afspraak <= ?eind_periode && (?eind_afspraak >= ?start_periode || !BOUND(?eind_afspraak)))
63
64          # Bepaal per overeenkomstafspraak de ptf en zorg/niet-zorg
65          ?omvang a onz-pers:ContractOmvang ; onz-g:isAbout ?omvang_waarde .
66          ?omvang_waarde a onz-pers:ContractOmvangWaarde ; onz-g:hasDataValue ?omvang_getal ; onz-g:hasUnitOfMeasure ?omvang_eenheid .
67          ?omvang_eenheid onz-g:hasDataValue ?eenheid_factor .
68          BIND(?omvang_getal/(36/?eenheid_factor) AS ?ptf)
69
70          # Check zorg/niet zorg personeel
71          BIND(IF(EXISTS {?overeenkomst_afspraak onz-g:isAbout/a onz-pers:ZorgverlenerFunctie}, 1, 0) AS ?is_zorg)
72          
73          # Clip de afspraak op het kwartaal
74          BIND(IF(?start_afspraak < ?start_periode, ?start_periode, ?start_afspraak) AS ?start_afspraak_corr)
75          BIND(IF(?eind_afspraak > ?eind_periode || !BOUND(?eind_afspraak), ?eind_periode, ?eind_afspraak) AS ?eind_afspraak_corr)
76
77          # Check per afspraak of er ziekteverzuim is en wanneer deze start en eindigt 
78          OPTIONAL {
79            VALUES ?type_verzuim { onz-pers:ZiektePeriode  onz-pers:ZwangerschapsVerlof  }
80            ?ziekte a ?type_verzuim ; onz-g:definedBy ?overeenkomst ; onz-g:startDatum ?start_ziekte_periode .
81            ?start_ziekte_periode ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_ziekte_periode_reken .
82            OPTIONAL { ?ziekte onz-g:eindDatum ?eind_ziekte_periode }
83
84            OPTIONAL {
85              ?ziekte onz-g:hasQuality ?verzuim_tijd .
86              ?verzuim_tijd a onz-pers:VerzuimTijdKwaliteit ; onz-g:hasQualityValue ?verzuim_waarde .
87              ?verzuim_waarde onz-g:hasUnitOfMeasure onz-g:percent ; onz-g:startDatum ?start_verzuim_waarde_temp .
88              OPTIONAL { ?verzuim_waarde onz-g:hasDataValue ?verzuim_percentage }
89              OPTIONAL { ?verzuim_waarde onz-g:eindDatum ?eind_verzuim_waarde_temp }
90            }
91            BIND(IF(!BOUND(?verzuim_waarde), 100, ?verzuim_percentage) AS ?verzuim_percentage_eff)
92            BIND(IF(!BOUND(?verzuim_waarde), ?start_ziekte_periode, ?start_verzuim_waarde_temp) AS ?start_verzuim_waarde_eff)
93            BIND(IF(!BOUND(?verzuim_waarde), ?eind_ziekte_periode, ?eind_verzuim_waarde_temp) AS ?eind_verzuim_waarde_eff)
94          }
95
96          # Zorg ervoor dat ziekteperiodes overlappen met de looptijd van de afspraak en het kwartaal 
97          FILTER((?start_ziekte_periode <= ?eind_afspraak_corr && (?eind_ziekte_periode >= ?start_afspraak_corr || !BOUND(?eind_ziekte_periode))))
98		      FILTER ((?start_ziekte_periode <= ?eind_periode && (?eind_ziekte_periode >= ?start_periode || !BOUND(?eind_ziekte_periode))))
99
100          # Zorg ervoor dat verzuimperiodes overlappen met de looptijd van de afspraak en het kwartaal 
101          FILTER ((?start_verzuim_waarde_eff <= ?eind_periode && (?eind_verzuim_waarde_eff >= ?start_periode || !BOUND(?eind_verzuim_waarde_eff))))
102          FILTER ((?start_verzuim_waarde_eff <= ?eind_afspraak_corr && (!BOUND(?eind_verzuim_waarde_eff) || ?eind_verzuim_waarde_eff >= ?start_afspraak_corr)) )
103
104          # Bepaal de einddatum van de ziekteperiode (als langer doorloopt óf geen einddatum: klip op het einde van het kwartaal)
105          BIND(IF(!BOUND(?ziekte), ?unbound, IF(!BOUND(?eind_ziekte_periode) || ?eind_ziekte_periode > ?eind_periode, ?eind_periode, ?eind_ziekte_periode)) AS ?eind_ziekte_periode_clip)
106          OPTIONAL { FILTER(BOUND(?eind_ziekte_periode_clip)) ?eind_ziekte_periode_clip ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_ziekte_periode_reken }
107
108          # Filter op kortdurende ziekte (<= 28 dagen)
109          BIND(IF( !BOUND(?eind_ziekte_periode_reken) || !BOUND(?start_ziekte_periode_reken), ?unbound, ?eind_ziekte_periode_reken - ?start_ziekte_periode_reken + 1) AS ?dagen_ziekte_periode)
110          FILTER(?dagen_ziekte_periode <= 28)
111
112          # Zorg dat de start- en eind verzuimdatum binnen de meetperiode vallen
113          BIND(IF(?start_verzuim_waarde_eff < ?start_afspraak_corr, ?start_afspraak_corr, ?start_verzuim_waarde_eff) AS ?start_verzuim_waarde_final)
114          BIND(IF(!BOUND(?eind_verzuim_waarde_eff), ?eind_afspraak_corr, IF(?eind_verzuim_waarde_eff > ?eind_afspraak_corr, ?eind_afspraak_corr, ?eind_verzuim_waarde_eff)) AS 
115                        ?eind_verzuim_waarde_final)
116
117          # Bereken per verzuimperiode het aantal zieke dagen
118          OPTIONAL {
119            FILTER(BOUND(?start_verzuim_waarde_final) && BOUND(?eind_verzuim_waarde_final))
120            ?start_verzuim_waarde_final ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_verzuim_waarde_final_reken .
121            ?eind_verzuim_waarde_final  ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_verzuim_waarde_final_reken .
122            BIND(?eind_verzuim_waarde_final_reken - ?start_verzuim_waarde_final_reken + 1 AS ?dagen_verzuim_periode)
123          }
124
125          # Bereken het ziekteverzuim per dag (PTF * ZIEKTEPERCENTAGE * DAGEN VERZUIM PERIODE)
126          BIND(IF(BOUND(?verzuim_percentage_eff), xsd:decimal(?verzuim_percentage_eff), 100.0) AS ?pct)
127          BIND(IF(BOUND(?dagen_verzuim_periode), ?ptf * (?pct / 100.0) * ?dagen_verzuim_periode, ?unbound) AS ?ziekte_verzuim_totaal)
128          BIND(?ziekte_verzuim_totaal * ?is_zorg AS ?ziekte_verzuim_zorg)
129          BIND(?ziekte_verzuim_totaal - ?ziekte_verzuim_zorg AS ?ziekte_verzuim_niet_zorg)
130        } 
131      }   
132      UNION
133      # Noemer: selecteer ptf * dagen afspraak van de medewerkers per persoon per afspraak, ongeacht verzuim
134      {
135        SELECT    
136          ?overeenkomst_afspraak
137          ?persoon
138          ("0.0"^^xsd:decimal AS ?ziekte_verzuim_niet_zorg)
139          ("0.0"^^xsd:decimal AS ?ziekte_verzuim_zorg)
140          ("0.0"^^xsd:decimal AS ?ziekte_verzuim_totaal)
141          ?noemer_afspraak_niet_zorg
142          ?noemer_afspraak_zorg
143          ?noemer_afspraak_totaal
144        WHERE 
145        {
146		      # BIND(2024 AS ?jaar)  # Parameter
147          # BIND("Q1" AS ?kwartaal)  # Parameter             
148          BIND(IF(?kwartaal = 'Q1', xsd:date(CONCAT(STR(?jaar), '-01-01')),
149                 IF(?kwartaal = 'Q2', xsd:date(CONCAT(STR(?jaar), '-04-01')),
150                 IF(?kwartaal = 'Q3', xsd:date(CONCAT(STR(?jaar), '-07-01')),
151                 IF(?kwartaal = 'Q4', xsd:date(CONCAT(STR(?jaar), '-10-01')),
152                 ?unbound)))) AS ?start_periode)
153            BIND(?start_periode + "P3M"^^xsd:duration + "-P1D"^^xsd:duration AS ?eind_periode)
154
155          # Selecteer alle arbeidsovereenkomsten die geldig zijn
156          ?overeenkomst a onz-pers:ArbeidsOvereenkomst ; onz-g:hasPart ?overeenkomst_afspraak .
157          ?overeenkomst onz-pers:heeftOpdrachtnemer ?persoon .
158          ?overeenkomst_afspraak a onz-pers:WerkOvereenkomstAfspraak ; onz-g:hasPart ?omvang ; onz-g:startDatum ?start_afspraak .
159          OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
160          FILTER (?start_afspraak <= ?eind_periode && (?eind_afspraak >= ?start_periode || !BOUND(?eind_afspraak)))
161
162          # Bepaal per overeenkomstafspraak de ptf en zorg/niet-zorg
163          ?omvang a onz-pers:ContractOmvang ; onz-g:isAbout ?omvang_waarde .
164          ?omvang_waarde a onz-pers:ContractOmvangWaarde ; onz-g:hasDataValue ?omvang_getal ; onz-g:hasUnitOfMeasure ?omvang_eenheid .
165          ?omvang_eenheid onz-g:hasDataValue ?eenheid_factor .
166          BIND(?omvang_getal/(36/?eenheid_factor) AS ?ptf)
167          
168          # Check zorg/niet zorg personeel
169          BIND(IF(EXISTS {?overeenkomst_afspraak onz-g:isAbout/a onz-pers:ZorgverlenerFunctie}, 1, 0) AS ?is_zorg)
170
171          # Clip de afspraak op het kwartaal
172          BIND(IF(?start_afspraak < ?start_periode, ?start_periode, ?start_afspraak) AS ?start_afspraak_corr)
173          BIND(IF(?eind_afspraak > ?eind_periode || !BOUND(?eind_afspraak), ?eind_periode, ?eind_afspraak) AS ?eind_afspraak_corr)
174
175          # Bereken hoeveel dagen van de afspraak overlappen met de meetperiode
176          ?start_afspraak_corr ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_afspraak_reken .
177          ?eind_afspraak_corr  ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_afspraak_reken .
178          BIND(?eind_afspraak_reken - ?start_afspraak_reken + 1 AS ?dagen_afspraak)
179          
180          # Noemer per afspraak = PTF * kalenderdagen binnen meetperiode
181          BIND(?ptf * ?dagen_afspraak AS ?noemer_afspraak_totaal)
182          BIND(?noemer_afspraak_totaal * ?is_zorg AS ?noemer_afspraak_zorg)
183          BIND(?noemer_afspraak_totaal - ?noemer_afspraak_zorg AS ?noemer_afspraak_niet_zorg)
184        } 
185      }   
186    } 
187    GROUP BY ?overeenkomst_afspraak ?persoon
188  } 
189  
190  {
191   # Tak 1: echte vestiging + afleiding zorgkantoorregio
192   ?overeenkomst_afspraak onz-g:isAbout ?locatie .
193   ?locatie a onz-g:StationaryArtifact ; 
194     onz-g:partOf* ?vestiging_uri .
195   ?vestiging_uri a onz-org:Vestiging ;
196     onz-g:hasLocalizableArea/onz-g:identifiedBy/onz-g:hasPart/onz-g:hasPart ?postcode_6 .
197   BIND(IRI(SUBSTR(STR(?postcode_6), 1, STRLEN(STR(?postcode_6)) - 2)) AS ?postcode)
198   ?pc_gebied onz-g:identifiedBy ?postcode ; onz-g:partOf+ ?zk_regio .
199   ?zk_regio a onz-org:ZorgkantoorRegio .
200   ?zorgkantoor onz-g:hasOperatingRange ?zk_regio .
201    
202   ?vestiging_uri onz-g:identifiedBy ?vest_nr .
203   ?vest_nr a onz-org:Vestigingsnummer ; onz-g:hasDataValue ?vestiging .
204   }
205   UNION
206   {
207   # Tak 2: totaal organisatie, laat ?zk_regio ongebonden (leeg in output)
208   BIND("Organisatie (gecontracteerd + algemeen)" AS ?vestiging)
209   }
210
211} 
212GROUP BY ?vestiging
213ORDER BY ?vestiging