GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( be813a...3d8811 )
by P.R.
06:43 queued 46s
created

kerapu.lbz.ZorgActiviteit   B

Complexity

Total Complexity 47

Size/Duplication

Total Lines 391
Duplicated Lines 0 %

Test Coverage

Coverage 87.92%

Importance

Changes 0
Metric Value
eloc 181
dl 0
loc 391
ccs 131
cts 149
cp 0.8792
rs 8.64
c 0
b 0
f 0
wmc 47

11 Methods

Rating   Name   Duplication   Size   Complexity  
B ZorgActiviteit.__lees_zorg_activiteiten_vertaal_tabel() 0 35 5
B ZorgActiviteit.zorg_activiteit_cluster_aantal() 0 40 7
A ZorgActiviteit.__vertaal_zorgactiviteit_code() 0 23 4
A ZorgActiviteit.__behandel_klasse_referentie() 0 25 4
A ZorgActiviteit.init_static() 0 10 1
B ZorgActiviteit.__lees_behandel_klasse_tabel() 0 37 5
A ZorgActiviteit.behandel_klasse_aantal() 0 34 5
A ZorgActiviteit.__zorg_activiteit_referentie() 0 22 4
B ZorgActiviteit.__lees_zorgactiviteiten_tabel() 0 57 5
A ZorgActiviteit.__init__() 0 16 1
B ZorgActiviteit.zorg_activiteit_aantal() 0 31 6

How to fix   Complexity   

Complexity

Complex classes like kerapu.lbz.ZorgActiviteit often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
"""
2
Kerapu
3
"""
4 1
import csv
5 1
from typing import Optional
6
7 1
from kerapu import clean_code, LEN_ZORG_ACTIVITEIT_CODE, clean_int, clean_str, clean_date, LEN_ZORG_PRODUCT_GROEP_CODE
8
9
10 1
class ZorgActiviteit:
11
    """
12
    Klasse voor zorgactiviteiten.
13
    """
14
    # ------------------------------------------------------------------------------------------------------------------
15 1
    __zorg_activiteiten_tabel = {}
16
    """
17
    De zorgactiviteiten referentietabel.
18
19
    :type: dict[str,list[dict[str,str]]]
20
    """
21
22 1
    __zorg_activiteiten_vertaal_tabel = {}
23
    """
24
    De zorgactiviteiten vertaaltabel.
25
26
    :type: dict[str,list[dict[str,str]]]
27
    """
28
29 1
    __behandel_klassen_tabel = {}
30
    """
31
    De behandelklassen referentietabel.
32
33
    :type: dict[(str,str,str),list[dict[str,str]]]
34
    """
35
36
    # ------------------------------------------------------------------------------------------------------------------
37 1
    def __init__(self, zorg_activiteit_code: str, aantal: int):
38
        """
39
        Object constructor.
40
41
        :param str zorg_activiteit_code: De code van deze zorgactiviteit.
42
        :param int aantal: Het aantal malen dat deze zorgactiviteit is uitgevoerd.
43
        """
44 1
        self.__zorg_activiteit_code = clean_code(zorg_activiteit_code, LEN_ZORG_ACTIVITEIT_CODE)
45
        """
46
        De code van deze zorgactiviteit.
47
48
        :type: str
49
        """
50
51 1
        self.__aantal = clean_int(aantal, 0)
52 1
        """
53
        Het aantal malen dat deze zorgactiviteit is uitgevoerd.
54
55
        :type: int
56
        """
57
58
    # ------------------------------------------------------------------------------------------------------------------
59 1
    @staticmethod
60 1
    def __lees_zorgactiviteiten_tabel(folder: str):
61
        """
62
        Leest de zorgactiviteiten referentietabel (opgeslagen in CSV).
63
64
        :param str folder: De folder met alle goupertabellen.
65
        """
66 1
        with open(folder + '/ZorgActiviteiten.csv', encoding='utf-8') as csv_file:
67 1
            reader = csv.reader(csv_file, )
68 1
            regel_nummer = 0
69 1
            for regel in reader:
70 1
                regel_nummer += 1
71
72
                # Sla de eerste regel met koppen over.
73 1
                if regel_nummer == 1:
74 1
                    continue
75
76 1
                zorg_activiteit_code = clean_code(regel[0], LEN_ZORG_ACTIVITEIT_CODE)
77 1
                zorg_activiteit_cluster01 = clean_str(regel[2])
78 1
                zorg_activiteit_cluster02 = clean_str(regel[3])
79 1
                zorg_activiteit_cluster03 = clean_str(regel[4])
80 1
                zorg_activiteit_cluster04 = clean_str(regel[5])
81 1
                zorg_activiteit_cluster05 = clean_str(regel[6])
82 1
                zorg_activiteit_cluster06 = clean_str(regel[7])
83 1
                zorg_activiteit_cluster07 = clean_str(regel[8])
84 1
                zorg_activiteit_cluster08 = clean_str(regel[9])
85 1
                zorg_activiteit_cluster09 = clean_str(regel[10])
86 1
                zorg_activiteit_cluster10 = clean_str(regel[11])
87 1
                zorg_activiteit_weeg_factor1 = clean_int(regel[12])
88 1
                zorg_activiteit_weeg_factor2 = clean_int(regel[13])
89 1
                begin_datum = clean_date(regel[20])
90 1
                eind_datum = clean_date(regel[21])
91
92 1
                sleutel = zorg_activiteit_code
93
94 1
                rij = {'zorg_activiteit_code':         zorg_activiteit_code,
95
                       'zorg_activiteit_cluster01':    zorg_activiteit_cluster01,
96
                       'zorg_activiteit_cluster02':    zorg_activiteit_cluster02,
97
                       'zorg_activiteit_cluster03':    zorg_activiteit_cluster03,
98
                       'zorg_activiteit_cluster04':    zorg_activiteit_cluster04,
99
                       'zorg_activiteit_cluster05':    zorg_activiteit_cluster05,
100
                       'zorg_activiteit_cluster06':    zorg_activiteit_cluster06,
101
                       'zorg_activiteit_cluster07':    zorg_activiteit_cluster07,
102
                       'zorg_activiteit_cluster08':    zorg_activiteit_cluster08,
103
                       'zorg_activiteit_cluster09':    zorg_activiteit_cluster09,
104
                       'zorg_activiteit_cluster10':    zorg_activiteit_cluster10,
105
                       'zorg_activiteit_weeg_factor1': zorg_activiteit_weeg_factor1,
106
                       'zorg_activiteit_weeg_factor2': zorg_activiteit_weeg_factor2,
107
                       'begin_datum':                  begin_datum,
108
                       'eind_datum':                   eind_datum}
109
110 1
                if sleutel not in ZorgActiviteit.__zorg_activiteiten_tabel:
111 1
                    ZorgActiviteit.__zorg_activiteiten_tabel[sleutel] = []
112
113 1
                ZorgActiviteit.__zorg_activiteiten_tabel[sleutel].append(rij)
114
115 1
        print("Aantal zorgactiviteiten: %d" % (regel_nummer - 1))
116
117
    # ------------------------------------------------------------------------------------------------------------------
118 1
    @staticmethod
119 1
    def __lees_zorg_activiteiten_vertaal_tabel(folder: str):
120
        """
121
        Leest de zorgactiviteiten vertaaltabel (opgeslagen in CSV).
122
123
        :param str folder: De folder met alle goupertabellen.
124
        """
125 1
        with open(folder + '/VertaalZorgActiviteiten.csv', encoding='utf-8') as csv_file:
126 1
            reader = csv.reader(csv_file, )
127 1
            regel_nummer = 0
128 1
            for regel in reader:
129 1
                regel_nummer += 1
130
131
                # Sla de eerste regel met koppen over.
132 1
                if regel_nummer == 1:
133 1
                    continue
134
135 1
                zorg_activiteit_code = clean_code(regel[0], LEN_ZORG_ACTIVITEIT_CODE)
136 1
                zorg_activiteit_code_oud = clean_code(regel[2], LEN_ZORG_ACTIVITEIT_CODE)
137 1
                begin_datum = clean_date(regel[4])
138 1
                eind_datum = clean_date(regel[5])
139
140 1
                sleutel = zorg_activiteit_code
141
142 1
                rij = {'zorg_activiteit_code':     zorg_activiteit_code,
143
                       'zorg_activiteit_code_oud': zorg_activiteit_code_oud,
144
                       'begin_datum':              begin_datum,
145
                       'eind_datum':               eind_datum}
146
147 1
                if sleutel not in ZorgActiviteit.__zorg_activiteiten_vertaal_tabel:
148 1
                    ZorgActiviteit.__zorg_activiteiten_vertaal_tabel[sleutel] = []
149
150 1
                ZorgActiviteit.__zorg_activiteiten_vertaal_tabel[sleutel].append(rij)
151
152 1
        print("Aantal zorgactiviteit vertalingen: %d" % (regel_nummer - 1))
153
154
    # ------------------------------------------------------------------------------------------------------------------
155 1
    @staticmethod
156 1
    def __lees_behandel_klasse_tabel(folder: str):
157
        """
158
        Leest de behandelklasse tabel (opgeslagen in CSV).
159
160
        :param str folder: De folder met alle goupertabellen.
161
        """
162 1
        with open(folder + '/BehandelKlassen.csv', encoding='utf-8') as csv_file:
163 1
            reader = csv.reader(csv_file, )
164 1
            regel_nummer = 0
165 1
            for regel in reader:
166 1
                regel_nummer += 1
167
168
                # Sla de eerste regel met koppen over.
169 1
                if regel_nummer == 1:
170 1
                    continue
171
172 1
                zorg_product_groep_code = clean_code(regel[0], LEN_ZORG_PRODUCT_GROEP_CODE)
173 1
                zorg_activiteit_code = clean_code(regel[1], LEN_ZORG_ACTIVITEIT_CODE)
174 1
                behandel_klasse_code = clean_str(regel[2])
175 1
                begin_datum = clean_date(regel[4])
176 1
                eind_datum = clean_date(regel[5])
177
178 1
                sleutel = (zorg_product_groep_code, zorg_activiteit_code, behandel_klasse_code)
179
180 1
                rij = {'zorg_product_groep_code': zorg_product_groep_code,
181
                       'zorg_activiteit_code':    zorg_activiteit_code,
182
                       'behandel_klasse_code':    behandel_klasse_code,
183
                       'begin_datum':             begin_datum,
184
                       'eind_datum':              eind_datum}
185
186 1
                if sleutel not in ZorgActiviteit.__behandel_klassen_tabel:
187 1
                    ZorgActiviteit.__behandel_klassen_tabel[sleutel] = []
188
189 1
                ZorgActiviteit.__behandel_klassen_tabel[sleutel].append(rij)
190
191 1
        print("Aantal behandelklassen: %d" % (regel_nummer - 1))
192
193
    # ------------------------------------------------------------------------------------------------------------------
194 1
    @staticmethod
195 1
    def init_static(folder: str):
196
        """
197
        Initialiseert alle statistische data.
198
199
        :param str folder: De folder met alle goupertabellen.
200
        """
201 1
        ZorgActiviteit.__lees_behandel_klasse_tabel(folder)
202 1
        ZorgActiviteit.__lees_zorgactiviteiten_tabel(folder)
203 1
        ZorgActiviteit.__lees_zorg_activiteiten_vertaal_tabel(folder)
204
205
    # ------------------------------------------------------------------------------------------------------------------
206 1
    @staticmethod
207 1
    def __vertaal_zorgactiviteit_code(zorg_activiteit_code: str, datum: str):
208
        """
209
        Vertaalt een "nieuwe" zorgactiviteitcode naar een "oude" zorgactiviteitcode die geldig is ten tijde van het
210
        begin van het subtraject.
211
212
        :param str zorg_activiteit_code: De "nieuwe" zorgactiviteitcode.
213
        :param str datum: De begindatum van het subtraject.
214
        """
215 1
        zorg_activiteit_code = clean_code(zorg_activiteit_code, LEN_ZORG_ACTIVITEIT_CODE)
216
217 1
        if zorg_activiteit_code in ZorgActiviteit.__zorg_activiteiten_vertaal_tabel:
218 1
            for vertaling in ZorgActiviteit.__zorg_activiteiten_vertaal_tabel[zorg_activiteit_code]:
219 1
                if vertaling['begin_datum'] <= datum <= vertaling['eind_datum']:
220
                    # Een geldige vertaling gevonden. geef de "oude" zorgactiviteitcode terug.
221
                    return vertaling['zorg_activiteit_code_oud']
222
223
            # Er is geen vertaling van toepassing ten tijde van het begin van het subtraject. Geef de gegeven
224
            # zorgactiviteitcode terug.
225 1
            return zorg_activiteit_code
226
        else:
227
            # Er is geen enkele vertaling voor de zorgactiviteitcode. Geef de gegeven zorgactiviteitcode terug.
228 1
            return zorg_activiteit_code
229
230
    # ------------------------------------------------------------------------------------------------------------------
231 1
    def __zorg_activiteit_referentie(self, datum: str) -> Optional[dict]:
232
        """
233
        Zoekt de referentie data voor deze zorgactiviteit in de zorgactiviteiten referentietabel.
234
235
        :param datum: De begindatum van het subtraject.
236
237
        :rtype: dict[str,int]
238
        """
239
        # Vertaal de zorgactiviteitcode naar een "oude" zorgactiviteitcode.
240 1
        zorg_activiteit_code = ZorgActiviteit.__vertaal_zorgactiviteit_code(self.__zorg_activiteit_code, datum)
241
242 1
        if zorg_activiteit_code in self.__zorg_activiteiten_tabel:
243 1
            for referentie in self.__zorg_activiteiten_tabel[zorg_activiteit_code]:
244 1
                if referentie['begin_datum'] <= datum <= referentie['eind_datum']:
245
                    # Een geldige referentie rij gevonden.
246 1
                    return referentie
247
248
            # Er is geen geldige referentie rij gevonden.
249
            return None
250
251
        else:
252
            return None
253
254
    # ------------------------------------------------------------------------------------------------------------------
255 1
    def __behandel_klasse_referentie(self,
256
                                     zorg_product_groep_code: str,
257
                                     behandel_klasse_code: str,
258
                                     datum: str) -> Optional[dict]:
259
        """
260
        Zoekt de referentie data voor deze zorgactiviteit in de behandelklasse referentietabel.
261
262
        :param str zorg_product_groep_code: De zorgproductgroepcode van het subtraject.
263
        :param str behandel_klasse_code: De gevraagde behandelklassecode
264
        :param str datum: De begindatum van het subtraject.
265
266
        :rtype: dict[str,int]
267
        """
268
        # Vertaal de zorgactiviteitcode naar een "oude" zorgactiviteitcode.
269 1
        zorg_activiteit_code = ZorgActiviteit.__vertaal_zorgactiviteit_code(self.__zorg_activiteit_code, datum)
270
271 1
        sleutel = (zorg_product_groep_code, zorg_activiteit_code, behandel_klasse_code)
272 1
        if sleutel in self.__behandel_klassen_tabel:
273 1
            for referentie in self.__behandel_klassen_tabel[sleutel]:
274 1
                if referentie['begin_datum'] <= datum <= referentie['eind_datum']:
275
                    # Een geldige referentie rij gevonden.
276 1
                    return referentie
277
278
        # Er is geen geldige referentie rij gevonden.
279 1
        return None
280
281
    # ------------------------------------------------------------------------------------------------------------------
282 1
    def behandel_klasse_aantal(self,
283
                               zorg_product_groep_code: str,
284
                               behandel_klasse_code: str,
285
                               weeg_factor_nummer: int,
286
                               datum: str) -> int:
287
        """
288
        Geeft het aantal malen (met inachtneming van weegfactor) dat deze zorgactiviteit voorkomt in een
289
        behandleklasse op een peildatum.
290
291
        :param str zorg_product_groep_code: De zorgproductgroepcode van het subtraject van deze zorgactiviteit.
292
        :param str behandel_klasse_code: De behandelklasse.
293
        :param int weeg_factor_nummer: Het weegfactornummer (0..2).
294
        :param str datum: De peildatum.
295
296
        :rtype: int
297
        """
298 1
        referentie = self.__behandel_klasse_referentie(zorg_product_groep_code, behandel_klasse_code, datum)
299
300 1
        if not referentie:
301
            # De (zorgproductgroepcode,zorgactiviteitcode,behandelklassecode) komt niet voor in de referentie tabel.
302
            # Geef 0 terug.
303 1
            return 0
304
305 1
        if weeg_factor_nummer == 0:
306
            # Weegfactor is niet van toepassing.
307 1
            return self.__aantal
308
309
        if weeg_factor_nummer == 1:
310
            return referentie['zorg_activiteit_weeg_factor1'] * self.__aantal
311
312
        if weeg_factor_nummer == 2:
313
            return referentie['zorg_activiteit_weeg_factor2'] * self.__aantal
314
315
        raise RuntimeError("Onbekend weegfactornummer %d." % weeg_factor_nummer)
316
317
    # ------------------------------------------------------------------------------------------------------------------
318 1
    def zorg_activiteit_aantal(self, zorg_activiteit_code: str, weeg_factor_nummer: int, datum: str) -> int:
319
        """
320
        Geeft het aantal malen (met inachtneming van weegfactor) dat deze zorgactiviteit voldoet aan een
321
        zorgactiviteitcode.
322
323
        :param str zorg_activiteit_code: De zorgactiviteitcode.
324
        :param int weeg_factor_nummer: Het weegfactornummer (0..2).
325
        :param str datum: De peildatum.
326
327
        :rtype: int
328
        """
329 1
        referentie = self.__zorg_activiteit_referentie(datum)
330
331 1
        if not referentie:
332
            # De zorgactiviteitcode komt niet voor in de referentie tabel. Geef 0 terug.
333
            return 0
334
335 1
        if self.__zorg_activiteit_code != clean_code(zorg_activiteit_code, LEN_ZORG_ACTIVITEIT_CODE):
336 1
            return 0
337
338 1
        if weeg_factor_nummer == 0:
339
            # Weegfactor is niet van toepassing.
340 1
            return self.__aantal
341
342
        if weeg_factor_nummer == 1:
343
            return referentie['zorg_activiteit_weeg_factor1'] * self.__aantal
344
345
        if weeg_factor_nummer == 2:
346
            return referentie['zorg_activiteit_weeg_factor2'] * self.__aantal
347
348
        raise RuntimeError("Onbekend weegfactornummer %d." % weeg_factor_nummer)
349
350
    # ------------------------------------------------------------------------------------------------------------------
351 1
    def zorg_activiteit_cluster_aantal(self,
352
                                       cluster_code: str,
353
                                       cluster_nummer: int,
354
                                       weeg_factor_nummer: int,
355
                                       datum: str) -> int:
356
        """
357
        Geeft het aantal malen (met inachtneming van weegfactor) dat deze zorgactiviteit voorkomt in een
358
        zorgactiviteitcluster.
359
360
        :param str cluster_code: De zorgactiviteitclustercode.
361
        :param int cluster_nummer: het cluster nummber (1..10).
362
        :param int weeg_factor_nummer: Het weegfactornummer (0..2).
363
        :param str datum: De peildatum.
364
365
        :rtype: int
366
        """
367 1
        referentie = self.__zorg_activiteit_referentie(datum)
368
369 1
        if not referentie:
370
            # De zorgactiviteitcode komt niet voor in de referentie tabel. Geef 0 terug.
371
            return 0
372
373 1
        if 1 <= cluster_nummer <= 10:
374 1
            if referentie['zorg_activiteit_cluster%02d' % cluster_nummer] != cluster_code:
375
                # Deze zorgactiviteit kom niet voor in het gevraagde cluster.
376 1
                return 0
377
378 1
            if weeg_factor_nummer == 0:
379
                # Weegfactor is niet van toepassing.
380 1
                return self.__aantal
381
382 1
            if weeg_factor_nummer == 1:
383
                return referentie['zorg_activiteit_weeg_factor1'] * self.__aantal
384
385 1
            if weeg_factor_nummer == 2:
386 1
                return referentie['zorg_activiteit_weeg_factor2'] * self.__aantal
387
388
            raise RuntimeError("Onbekend weegfactornummer %d." % weeg_factor_nummer)
389
390
        raise RuntimeError("Onbekend clusternummer %d." % cluster_nummer)
391
392
# ----------------------------------------------------------------------------------------------------------------------
393