fabiocaccamo / python-codicefiscale

:it: :credit_card: italian fiscal codes encoding, decoding and validation - codifica, decodifica e validazione del Codice Fiscale italiano.
MIT License
74 stars 23 forks source link

Decode ritorna GIRGENTI (soppresso) invece di AGRIGENTO #16

Closed AldoErco closed 2 years ago

AldoErco commented 2 years ago

Python version 3.8

Package version 0.3.7

Current behavior (bug description) print(codicefiscale.decode('LNNFNC80A01A089K')) restituisce: {'code': 'LNNFNC80A01A089K', 'omocodes': ['LNNFNC80A01A089K', 'LNNFNC80A01A08VZ', 'LNNFNC80A01A0UVL', 'LNNFNC80A01ALUVO', 'LNNFNC80A0MALUVG', 'LNNFNC80ALMALUVR', 'LNNFNC8LALMALUVC', 'LNNFNCULALMALUVZ'], 'sex': 'M', 'birthdate': datetime.datetime(1980, 1, 1, 0, 0), 'birthplace': {'code': 'A089', 'province': 'AG', 'name': 'GIRGENTI (soppresso)'}, 'raw': {'code': 'LNNFNC80A01A089K', 'surname': 'LNN', 'name': 'FNC', 'birthdate': '80A01', 'birthdate_year': '80', 'birthdate_month': 'A', 'birthdate_day': '01', 'birthplace': 'A089', 'cin': 'K'}}

Expected behavior Mi aspetto come birthplace di trovare AGRIGENTO o al limite una lista con entrambi, non solo il comune soppresso.

Il CF LNNFNC80A01A089K è inventato ma il bug l'ho riscontrato con un CF vero.

AldoErco commented 2 years ago

Se ho capito bene come è stato strutturato data.py e come i soppressi vengono sostituiti dagli attuali, allora in data.py line 5337 dovrebbe andare tra line 152 e 153.

fabiocaccamo commented 2 years ago

@AldoErco in data.py in comuni sono in ordine alfabetico, qui il problema è un altro (per questo motivo ti ho chiuso la PR) e non appena avrò tempo gli darò un'occhiata.

La gestione della lista dei comuni sarebbe completamente da rifare, perchè i comuni cambiano nel tempo, in sostanza bisognerebbe avere una lista dei comuni per ogni anno, in modo tale che in base alla data di nascita si possano ottenere le informazioni corrette e seguire il loro cambiamento nel corso degli anni a venire.

AldoErco commented 2 years ago

@fabiocaccamo io ho rilevato in data.py che il pezzo di codice:

    for municipality in _MUNICIPALITIES:
        code = municipality['code']
        ...
        data['codes'][code] = municipality

prima processa la riga 153 e aggiunge al dictionary l'elemento data['codes']['A089']** = { "code": "A089", "province": "AG", "name": "AGRIGENTO" } poi processa la 5337 e aggiorna per stessa chiave l'elemento data['codes']['A089'] = { "code": "A089", "province": "AG", "name": "GIRGENTI (soppresso)" }

Scusa se insisto, ma guardando il codice non capisco perché devono stare in ordine alfabetico, visto che _MUNICIPALITIES lo usi per costruire due dictionary e spostando quella riga: -il dictionary data['codes'] assegna i valori corretti -il dictionary data['municipalities'] mantiene gli stessi elementi chiave-valore solo spostando i due di GIRGENTI in alto. Ma poi siccome lo leggi per chiave, non cambia nulla.

Lo stesso problema c'è ad esempio su A014 e chissà quanti altri.

fabiocaccamo commented 2 years ago

@AldoErco you can upgrade to 0.3.9 version, this and other problems of the same nature have been fixed.