Uitwisselprofiel IGJ Contextinformatie t.b.v. aangekondigd inspectiebezoek

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

1.0.0-RC1-acc


Publicatiedatum:
01-09-2025

Inwerkingtreding:
01-09-2025

1.4.2. Wat is het aantal geplande 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, $vestigingsnummer
3# Ontologie: versie 3.0.0 of nieuwer
4 
5PREFIX onz-g:   <http://purl.org/ozo/onz-g#>
6PREFIX onz-pers:<http://purl.org/ozo/onz-pers#>
7PREFIX onz-zorg:<http://purl.org/ozo/onz-zorg#>
8PREFIX onz-org: <http://purl.org/ozo/onz-org#>
9PREFIX onz-plan:<http://purl.org/ozo/onz-plan#>
10PREFIX rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
11PREFIX rdfs:    <http://www.w3.org/2000/01/rdf-schema#>
12PREFIX xsd:     <http://www.w3.org/2001/XMLSchema#>
13 
14SELECT
15  ?kwalificatie_niveau
16  (SUM(COALESCE(?dag * ?pil,  0.0)) AS ?Aantal_geplande_uren_ZV_PIL_dag)
17  (SUM(COALESCE(?avond * ?pil,0.0)) AS ?Aantal_geplande_uren_ZV_PIL_avond)
18  (SUM(COALESCE(?nacht * ?pil,0.0)) AS ?Aantal_geplande_uren_ZV_PIL_nacht)
19  (SUM(COALESCE(?dag * ?pnil, 0.0)) AS ?Aantal_geplande_uren_ZV_PNIL_dag)
20  (SUM(COALESCE(?avond * ?pnil,0.0)) AS ?Aantal_geplande_uren_ZV_PNIL_avond)
21  (SUM(COALESCE(?nacht * ?pnil,0.0)) AS ?Aantal_geplande_uren_ZV_PNIL_nacht)
22{
23  {
24    SELECT DISTINCT ?kwalificatie_niveau {
25      {
26        ?functie
27          a onz-pers:ZorgverlenerFunctie ;
28          onz-g:hasQuality / onz-g:hasQualityValue ?functie_niveau .
29        ?functie_niveau a onz-pers:ODBKwalificatieWaarde ;
30                        rdfs:label ?kwalificatie_niveau .
31      } UNION {
32        BIND("Totaal" AS ?kwalificatie_niveau)
33      }
34    }
35  }
36 
37  OPTIONAL {
38    {
39      SELECT DISTINCT
40        ?medewerker ?kwalificatie_niveau
41        ?dag ?avond ?nacht
42        ?pil ?pnil
43      {
44        # -- Parameters (optioneel extern)
45        #BIND("2024-01-15"^^xsd:date AS ?peildatum)
46        #BIND("000001254"            AS ?vestigingsnummer)
47        BIND(?peildatum AS ?peildatum_argument)
48 
49        # -- Planning / shifts
50        ?planning a onz-plan:PlanInformationObject ;
51                  onz-plan:specifiesPlannedEntity ?geplande_periode ;
52                  onz-plan:hasPlannedStart ?start_gepland ;
53                  onz-plan:hasPlannedEnd   ?eind_gepland .
54 
55        ?geplande_periode a onz-plan:PlannedEntity ;
56                          onz-plan:hasPlannedType onz-pers:GewerktePeriode .
57 
58        # Overeenkomst-koppeling
59        ?overeenkomst_assertion a onz-plan:PlannedEntityAssertion ;
60          onz-plan:hasPlannedSubject  ?geplande_periode ;
61          onz-plan:hasPlannedProperty onz-g:definedBy ;
62          onz-plan:hasPlannedObject   ?overeenkomst .
63 
64        # Locatie-koppeling
65        ?locatie_assertion a onz-plan:PlannedEntityAssertion ;
66          onz-plan:hasPlannedSubject  ?geplande_periode ;
67          onz-plan:hasPlannedProperty onz-g:hasPerdurantLocation ;
68          onz-plan:hasPlannedObject   ?werk_locatie .
69 
70        ?werk_locatie onz-g:partOf* ?vestiging_uri .
71        ?vestiging_uri a onz-org:Vestiging ;
72                       onz-g:identifiedBy ?vestigingsnummer_object .
73        ?vestigingsnummer_object a onz-org:Vestigingsnummer ;
74                                 onz-g:hasDataValue ?vestigingsnummer .
75 
76        VALUES ?personeels_overeenkomst {
77          onz-pers:ArbeidsOvereenkomst
78          onz-pers:UitzendOvereenkomst
79          onz-pers:InhuurOvereenkomst
80        }
81 
82        ?overeenkomst a ?personeels_overeenkomst ;
83                      onz-pers:heeftOpdrachtnemer ?medewerker ;
84                      onz-g:hasPart ?overeenkomst_afspraak .
85 
86        ?overeenkomst_afspraak a onz-pers:WerkOvereenkomstAfspraak ;
87          onz-g:startDatum ?start_afspraak ;
88          onz-g:isAbout ?functie, ?locatie .
89        OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
90 
91        # Functie / kwalificatie
92        ?functie a onz-pers:ZorgverlenerFunctie ;
93                 onz-g:hasQuality/onz-g:hasQualityValue ?kwalificatie .
94        ?kwalificatie a onz-pers:ODBKwalificatieWaarde .
95        { BIND("Totaal" AS ?kwalificatie_niveau) }
96        UNION { ?kwalificatie rdfs:label ?kwalificatie_niveau }
97 
98        # -- DAN-venster: [D 07:00, D+1 07:00)  == t/m 06:59 volgende dag
99        BIND(xsd:dateTime(CONCAT(STR(?peildatum_argument), "T07:00:00")) AS ?dan_start)
100        BIND(?dan_start + "P1D"^^xsd:dayTimeDuration AS ?dan_end)  # exclusief 07:00 next
101 
102        # Contract actief rond peildatum (ruim, kan strakker indien gewenst)
103        BIND(xsd:date(?dan_start + "P1D"^^xsd:dayTimeDuration) AS ?peildatum_plus1)
104        FILTER (
105          (?start_afspraak <= ?peildatum_argument && (!BOUND(?eind_afspraak) || ?eind_afspraak >= ?peildatum_argument))
106        )
107 
108        # -- Over-midnight: maak eindtijd 'aware'
109        BIND(
110          IF(?eind_gepland <= ?start_gepland,
111             ?eind_gepland + "P1D"^^xsd:dayTimeDuration,
112             ?eind_gepland) AS ?end_dt
113        )
114 
115        # -- ENIGE benodigde filter: overlap met DAN-venster
116        FILTER( (?end_dt > ?dan_start) && (?start_gepland < ?dan_end) )
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_gepland) + (MINUTES(?start_gepland) * 0.0166666667) AS ?start_uur_exact)
123        BIND(HOURS(?eind_gepland)  + (MINUTES(?eind_gepland)  * 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_gepland) <  xsd:date(?dan_start) AS ?is_prev_day)
127        BIND(xsd:date(?start_gepland) =  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