Uitwisselprofiel IGJ Contextinformatie t.b.v. onaangekondigd inspectiebezoek

Over Uitwisselprofiel IGJ Contextinformatie t.b.v. onaangekondigd inspectiebezoek

1.2.0


Publicatiedatum:
27-10-2025

Inwerkingtreding:
27-10-2025

1.4.2. Wat is het aantal ingezette uren aan personeel met een zorgverlener functie per dienst?

Concepten

Relaties

Eigenschappen

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: IGJ 1.4.2
2# Parameters: ?peildatum, ?vestiging
3# Ontologie: versie 3.0 of nieuwer
4
5PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
6PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
7PREFIX onz-pers: <http://purl.org/ozo/onz-pers#>
8PREFIX onz-g: <http://purl.org/ozo/onz-g#>
9PREFIX onz-org: <http://purl.org/ozo/onz-org#>
10
11SELECT
12    ?kwalificatie_niveau
13    (SUM(COALESCE(?dag * ?pil, 0.0)) AS ?Aantal_ingezette_uren_ZV_PIL_dag)
14    (SUM(COALESCE(?avond * ?pil, 0.0)) AS ?Aantal_ingezette_uren_ZV_PIL_avond)
15    (SUM(COALESCE(?nacht * ?pil, 0.0)) AS ?Aantal_ingezette_uren_ZV_PIL_nacht)
16    (SUM(COALESCE(?dag * ?pnil, 0.0)) AS ?Aantal_ingezette_uren_ZV_PNIL_dag)
17    (SUM(COALESCE(?avond * ?pnil, 0.0)) AS ?Aantal_ingezette_uren_ZV_PNIL_avond)
18    (SUM(COALESCE(?nacht * ?pnil, 0.0)) AS ?Aantal_ingezette_uren_ZV_PNIL_nacht)
19{
20    {
21        SELECT DISTINCT ?kwalificatie_niveau {
22            {
23                ?functie
24                    a onz-pers:ZorgverlenerFunctie ;
25                    onz-g:hasQuality / onz-g:hasQualityValue ?functie_niveau .
26                ?functie_niveau
27                    a onz-pers:ODBKwalificatieWaarde ;
28                    rdfs:label ?kwalificatie_niveau .
29            } UNION {
30                BIND("Totaal" AS ?kwalificatie_niveau)
31            }
32        }
33    }
34
35    OPTIONAL{
36        {
37            SELECT DISTINCT
38                    ?medewerker
39                    ?kwalificatie_niveau
40                    ?dag
41                    ?avond
42                    ?nacht
43                    ?pil
44                    ?pnil
45                {
46                    # Parameters
47                    # BIND("2024-01-15"^^xsd:date   AS ?peildatum)
48                    # BIND("000001254"              AS ?vestigingsnummer)
49                    BIND(?peildatum as ?peildatum_argument)
50
51                    ?gewerkte_periode 
52                        a onz-pers:GewerktePeriode ;
53                        onz-g:hasBeginTimeStamp ?start_werk ;
54                        onz-g:hasEndTimeStamp ?eind_werk ;
55                        onz-g:hasPerdurantLocation ?werk_locatie ;
56                        onz-g:hasQuality / onz-g:hasQualityValue / onz-g:hasDataValue ?gewerkte_uren ;
57                        onz-g:definedBy ?overeenkomst .
58
59                    ?werk_locatie onz-g:partOf* ?vestiging . # vind Vestiging die hoort bij werk_locatie
60
61                    ?vestiging 
62                        a onz-org:Vestiging ;
63                        onz-g:identifiedBy ?vestigingsnummer_object .
64                    ?vestigingsnummer_object
65                        a onz-org:Vestigingsnummer ;
66                        onz-g:hasDataValue ?vestigingsnummer . # filter vestiging op gegeven vestigingsnummer
67
68                    VALUES ?personeels_overeenkomst { 
69                        onz-pers:ArbeidsOvereenkomst
70                        onz-pers:UitzendOvereenkomst
71                        onz-pers:InhuurOvereenkomst
72                    }
73
74                    ?overeenkomst 
75                        a ?personeels_overeenkomst ;
76                        onz-pers:heeftOpdrachtnemer ?medewerker ;
77                        onz-g:hasPart ?overeenkomst_afspraak .
78
79                    ?overeenkomst_afspraak
80                        a onz-pers:WerkOvereenkomstAfspraak ;
81                        onz-g:startDatum ?start_afspraak ;
82                        onz-g:isAbout ?functie .
83                    OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
84
85                    ?functie
86                        a onz-pers:ZorgverlenerFunctie ;
87                        onz-g:hasQuality/onz-g:hasQualityValue ?kwalificatie .
88                    ?kwalificatie a onz-pers:ODBKwalificatieWaarde .
89
90                    { 
91                        BIND("Totaal" AS ?kwalificatie_niveau)
92                    } UNION {
93                        ?kwalificatie rdfs:label ?kwalificatie_niveau
94                    }
95
96                    # -- DAN-venster: [D 07:00, D+1 07:00] == t/m 06:59 volgende dag
97                    BIND(xsd:dateTime(CONCAT(STR(?peildatum_argument), "T07:00:00")) AS ?dan_start)
98                    BIND(?dan_start + "P1D"^^xsd:dayTimeDuration AS ?dan_end)  # exclusief 07:00 next
99
100                    # Contract actief rond peildatum (ruim, kan wat strakker indien wenselijk)
101                    BIND(xsd:date(?dan_start + "P1D"^^xsd:dayTimeDuration) AS ?peildatum_plus1)
102                    FILTER (
103                        (?start_afspraak <= ?peildatum_argument && (!BOUND(?eind_afspraak) || ?eind_afspraak >= ?peildatum_argument))
104                    )
105
106                    # -- Over-midnight: maak eindtijd 'aware'
107                    BIND(
108                        IF(
109                            ?eind_werk <= ?start_werk,
110                            ?eind_werk + "P1D"^^xsd:dayTimeDuration,
111                            ?eind_werk) AS ?end_dt
112                    )
113
114                    # -- ENIGE benodigde filter: overlap met DAN-venster
115                    FILTER( (?end_dt > ?dan_start) && (?start_werk < ?dan_end))
116
117
118                    # ====== Verdeling in D / A / N binnen het DAN-venster ======
119            
120                    # (1) Projecteer tijden naar '24+ uurnotatie' t.o.v. kalenderdag van peildatum
121                    #     07:00 = 7.0, 14:59 = ~14.9833, 22:59 = ~22.9833, 07:00 next = 31.0 (excl)
122                    BIND(HOURS(?start_werk) + (MINUTES(?start_werk) * 0.0166666667) AS ?start_uur_exact)
123                    BIND(HOURS(?eind_werk)  + (MINUTES(?eind_werk)  * 0.0166666667) AS ?eind_uur_exact)
124
125                    # Herken vormen t.o.v. peildatum: doorlopend vanaf vorige dag / vroege start volgende dag
126                    BIND(xsd:date(?start_werk) <  xsd:date(?dan_start) AS ?is_prev_day)
127                    BIND(xsd:date(?start_werk) =  xsd:date(?dan_start + "P1D"^^xsd:dayTimeDuration) AS ?is_next_day)
128                    BIND(?is_next_day && (?start_uur_exact < 7.0) AS ?is_next_day_early)
129
130                    # (2) Effectieve start/eind in 24+ notatie, daarna clampen aan [7.0, 31.0)
131                    BIND(
132                    IF(?is_prev_day, 7.0,
133                        IF(?is_next_day_early, ?start_uur_exact + 24.0, ?start_uur_exact)
134                    ) AS ?eff_start
135                    )
136                    BIND(
137                    IF(?is_next_day_early, 31.0,                                   # eindigt uiterlijk bij DAN-einde
138                        IF(?eind_uur_exact < ?start_uur_exact, ?eind_uur_exact + 24.0, ?eind_uur_exact)
139                    ) AS ?eff_end_raw
140                    )
141
142                    # Clamp strikt aan DAN-venster: [7.0, 31.0)  (== t/m 06:59 volgende dag)
143                    BIND(IF(?eff_start < 7.0, 7.0, ?eff_start) AS ?c_start)
144                    BIND(IF(?eff_end_raw > 31.0, 31.0, ?eff_end_raw) AS ?c_end)
145            
146                    # Totale duur binnen DAN
147                    BIND(?c_end - ?c_start AS ?dan_duur)
148
149                    # (3) Dag en Avond met exacte eindminuten: dag t/m 14:59, avond t/m 22:59
150                    # Dag: [7.0, 15.0)
151                    BIND(
152                    IF(?c_end > 7.0 && ?c_start < 15.0,
153                        (IF(?c_end > 15.0, 15.0, ?c_end) - IF(?c_start < 7.0, 7.0, ?c_start)),
154                        0.0) AS ?dag_raw)
155            
156                    # Avond: [15.0, 23.0)
157                    BIND(
158                    IF(?c_end > 15.0 && ?c_start < 23.0,
159                        (IF(?c_end > 23.0, 23.0, ?c_end) - IF(?c_start < 15.0, 15.0, ?c_start)),
160                        0.0) AS ?avond_raw)
161
162                    # Nacht = rest binnen DAN
163                    BIND(?dan_duur - ?dag_raw - ?avond_raw AS ?nacht_raw)
164            
165                    # Afronden op tienden uur (desgewenst aanpassen)
166                    BIND(ROUND(?dag_raw   * 10) * 0.1 AS ?dag)
167                    BIND(ROUND(?avond_raw * 10) * 0.1 AS ?avond)
168                    BIND(ROUND(?nacht_raw * 10) * 0.1 AS ?nacht)
169            
170                    # PIL / PNIL
171                    BIND(IF (?personeels_overeenkomst = onz-pers:ArbeidsOvereenkomst, 1, 0) AS ?pil)
172                    BIND(IF (?pil = 0, 1, 0) AS ?pnil)
173                }
174        }
175    }
176}
177GROUP BY ?kwalificatie_niveau
178ORDER BY ?kwalificatie_niveau