Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling

Over Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling


Publicatiedatum:
11-07-2025

Inwerkingtreding:
11-07-2025

1.1 Gemiddeld aantal personeelsleden

Concepten

Relaties

Eigenschappen

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: Zorgkantoren 1.1
2# Parameters: ?jaar, ?kwartaal, ?zorgkantoor
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-org: <http://purl.org/ozo/onz-org#>
8PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
9PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
10PREFIX time: <http://www.w3.org/2006/time#>
11
12# Hoofdquery: Aggregeert resultaten per vestiging voor de uiteindelijke output
13SELECT
14    ?vestiging
15    # ?zorgkantoor_vestiging
16    # Bereken het gemiddeld aantal FTE voor zorg en niet-zorg
17    # met bescherming tegen delen door nul en een maximum van 1,0 FTE per persoon
18    # Dit zorgt ervoor dat een persoon nooit meer dan 1x meetelt, zelfs bij meerdere contracten
19    (SUM(IF(?dagen_periode <= 0, 0, IF(?zorg_aandeel / ?dagen_periode > 1, 1, ?zorg_aandeel / ?dagen_periode))) AS ?zorg)
20    (SUM(IF(?dagen_periode <= 0, 0, IF(?niet_zorg_aandeel / ?dagen_periode > 1, 1, ?niet_zorg_aandeel / ?dagen_periode))) AS ?niet_zorg)
21    (SUM(IF(?dagen_periode <= 0, 0, IF((?zorg_aandeel + ?niet_zorg_aandeel) / ?dagen_periode > 1, 1, (?zorg_aandeel + ?niet_zorg_aandeel) / ?dagen_periode))) AS ?totaal)
22WHERE {
23    # Middelste query: Aggregeert per persoon, vestiging
24    SELECT
25        ?vestiging
26        ?zorgkantoor_vestiging
27        ?persoon
28        ?dagen_periode
29        # Bereken het aandeel zorg- en niet-zorgdagen binnen de persoon
30        # Dit voorkomt dubbeltelling van medewerkers met gemengde rollen
31        (SUM(?zorg_dagen) AS ?zorg_aandeel)
32        (SUM(?niet_zorg_dagen) AS ?niet_zorg_aandeel)
33    WHERE {
34        # Binnenste query: Voegt datumbereiken samen per persoon en vestiging
35        {
36            SELECT
37                ?vestiging
38                ?zorgkantoor_vestiging
39                ?persoon
40                ?zorg_boolean
41                # Bepaal vroegste start en laatste einddatum voor alle contracten van een persoon
42                (MIN(?start_afspraak_corr) AS ?vroegste_start)
43                (MAX(?eind_afspraak_corr) AS ?laatste_eind)
44                ?dagen_periode
45            WHERE {
46                # Parameters en periode-instellingen
47                # BIND(2024 AS ?jaar)
48                # BIND("Q1" AS ?kwartaal)
49                BIND(IF(?kwartaal = 'Q1', xsd:date(CONCAT(STR(?jaar), '-01-01')),
50                    IF(?kwartaal = 'Q2', xsd:date(CONCAT(STR(?jaar), '-04-01')),
51                    IF(?kwartaal = 'Q3', xsd:date(CONCAT(STR(?jaar), '-07-01')),
52                    IF(?kwartaal = 'Q4', xsd:date(CONCAT(STR(?jaar), '-10-01')),
53                    '')))) AS ?start_periode)
54                BIND(?start_periode + "P3M"^^xsd:duration + "-P1D"^^xsd:duration AS ?eind_periode)
55                ?start_periode ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_periode_numeriek .
56                ?eind_periode ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_periode_numeriek .
57                BIND(?eind_periode_numeriek - ?start_periode_numeriek + 1 AS ?dagen_periode)
58
59                # Werkovereenkomsten
60                VALUES ?personeels_overeenkomst 
61                { 
62                    onz-pers:ArbeidsOvereenkomst
63                    onz-pers:UitzendOvereenkomst
64                    onz-pers:InhuurOvereenkomst
65                }
66                ?overeenkomst 
67                    a ?personeels_overeenkomst ;
68                    onz-pers:heeftOpdrachtnemer ?persoon ;
69                    onz-g:startDatum ?overeenkomst_start ;
70                    onz-g:hasPart ?overeenkomst_afspraak .
71                OPTIONAL {
72                    ?overeenkomst onz-g:eindDatum ?overeenkomst_eind
73                }
74                ?overeenkomst_afspraak
75                    a onz-pers:WerkOvereenkomstAfspraak ;
76                    onz-g:startDatum ?start_afspraak .
77                OPTIONAL {
78                    ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak
79                }
80                
81                # Filteren op basis van de overeenkomstperiode (niet de afspraakperiode)
82                FILTER (?overeenkomst_start <= ?eind_periode && (?overeenkomst_eind >= ?start_periode || !BOUND(?overeenkomst_eind)))
83                
84                # Gebruik de gecorrigeerde start- en einddatums van de overeenkomst
85                BIND(IF(?overeenkomst_start < ?start_periode, ?start_periode, ?overeenkomst_start) AS ?start_corr)
86                BIND(IF(!BOUND(?overeenkomst_eind) || ?overeenkomst_eind > ?eind_periode, ?eind_periode, ?overeenkomst_eind) AS ?eind_corr)
87                
88                # Corrigeer de afspraakdatums binnen de overeenkomstperiode
89                BIND(IF(?start_afspraak > ?start_corr, ?start_afspraak, ?start_corr) AS ?start_afspraak_corr)
90                BIND(IF(BOUND(?eind_afspraak) && ?eind_afspraak < ?eind_corr, ?eind_afspraak, ?eind_corr) AS ?eind_afspraak_corr)
91                
92                # Alleen doorgaan als de gecorrigeerde afspraak geldig is binnen de periode
93                FILTER (?start_afspraak_corr <= ?eind_afspraak_corr)
94
95                # Functie en locatie informatie
96                ?overeenkomst_afspraak onz-g:isAbout ?functie .
97                ?functie a onz-g:OccupationalPositionRole .
98                ?overeenkomst_afspraak onz-g:isAbout ?locatie .
99                ?locatie 
100                    a onz-g:StationaryArtifact ;
101                    onz-g:partOf* ?vestiging_uri .
102                ?vestiging_uri a onz-org:Vestiging ;
103                    onz-g:hasLocalizableArea/onz-g:identifiedBy/onz-g:hasPart/onz-g:hasPart ?postcode_6 .
104                BIND(IRI(SUBSTR(STR(?postcode_6), 1, STRLEN(STR(?postcode_6)) - 2)) AS ?postcode)
105                ?pc_gebied 
106                    onz-g:identifiedBy ?postcode ;
107                    onz-g:partOf+ ?zk_regio .
108                ?zk_regio a onz-org:ZorgkantoorRegio .
109                ?zorgkantoor onz-g:hasOperatingRange ?zk_regio .
110
111                # Vestigingsgegevens
112                {
113                    ?vestiging_uri onz-g:identifiedBy ?vest_nr .
114                    ?vest_nr a onz-org:Vestigingsnummer ;
115                        onz-g:hasDataValue ?vestiging .
116                } UNION {
117                    # Includeer ook de organisatie als geheel en label deze als vestiging
118                    ?vestiging_uri onz-org:vestigingVan ?organisatie_uri .
119                    BIND("Totaal organisatie" AS ?vestiging)
120                    BIND("n.v.t." AS ?zk_vestiging)
121                }
122                BIND(IF(!BOUND(?zk_vestiging), ?zorgkantoor, ?zk_vestiging) AS ?zorgkantoor_vestiging)
123                    
124                # Bepaal of functie zorg- of niet-zorg gerelateerd is
125                BIND(IF(EXISTS {?functie a onz-pers:ZorgverlenerFunctie}, 1, 0) AS ?zorg_boolean)
126            }
127            # Groepeer om de vroegste start en laatste einddatum per persoon en vestiging te vinden
128            GROUP BY ?vestiging ?zorgkantoor_vestiging ?persoon ?zorg_boolean ?dagen_periode
129        }
130        
131        # Converteer samengevoegde datums naar numerieke waarden voor berekeningen
132        ?vroegste_start ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?vroegste_start_numeriek .
133        ?laatste_eind ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?laatste_eind_numeriek .
134        
135        # Bereken het aantal dagen voor deze samengevoegde periode
136        BIND(?laatste_eind_numeriek - ?vroegste_start_numeriek + 1 AS ?samengevoegde_dagen)
137        
138        # Bereken zorg- en niet-zorgdagen op basis van de samengevoegde dagen
139        BIND(IF(?zorg_boolean = 1, ?samengevoegde_dagen, 0) AS ?zorg_dagen)
140        BIND(IF(?zorg_boolean = 0, ?samengevoegde_dagen, 0) AS ?niet_zorg_dagen)
141    }
142    # Groepeer op persoonsniveau per vestiging
143    GROUP BY ?vestiging ?zorgkantoor_vestiging ?persoon ?dagen_periode
144}
145# Groepeer uiteindelijk per vestiging voor de eindresultaten
146GROUP BY ?vestiging ?zorgkantoor_vestiging
147ORDER BY ?vestiging
148