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.

kerapu.lbz.ZorgActiviteit   B
last analyzed

Complexity

Total Complexity 47

Size/Duplication

Total Lines 378
Duplicated Lines 0 %

Test Coverage

Coverage 89.36%

Importance

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