diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e4262bd --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# Environments +localenv + +# Temporary files +*~ \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9d6ea65 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Sdj Geek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 0c752a1..e0555a4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,104 @@ -# Purge Registres Décés INSEE +# Purge Registres Décès INSEE +Ce programme s'adresse essentiellement aux greffiers des pieux, paroisse et +branches de France, de l'Église de Jésus Christ des Saints des Derniers Jours. + +## Objectif + +La tenue à jour des registres de l'Église n'est pas une tache aisée. Une des +difficultés est liée au fait que lorsqu'un membre s'éloigne de l'Église, ses +informations personnelles (adresse, téléphone, etc) ne sont plus mises à jour. + +L'INSEE tient un fichier des personnes décédées en France de 1970 à +aujourd'hui. Ce fichier est disponible en [données +ouvertes](https://fr.wikipedia.org/wiki/Donn%C3%A9es_ouvertes) sur [le site du +gouvernement](https://www.data.gouv.fr/fr/datasets/fichier-des-personnes-decedees/). +Ce fichier est une aubaine, car il permet de savoir si un membre de l'Église +est décédé sans que nous le sachions. Si une personne figure à la fois dans +les registres de l'Église et dans le fichier de l'INSEE, alors une mise à jour +du registre de l'Église est nécessaire. + +Parcourir à la main le registre de membres de paroisse est une tache longue et +fastidieuse. Ce programme permet de comparer automatiquement le registre de +paroisse avec le fichier de l'INSEE, et donne la liste des membres trouvés +dans le fichier de l'INSEE. + +Le fichier de l'INSEE est actualisé de façon mensuelle. Il semble intéressant +d'utiliser ce programme régulièrement (une fois par an par exemple) pour +s'assurer que les registres restent à jour. + +## Pré-requis + +### Logiciels +- Git +- Python 3.6 +- Virtualenv + +Testé uniquement sur GNU/Linux (Ubuntu 18.4) + +### Données + +Le fichier de l'INSEE tel qu'il est présenté n'est pas facile à exploiter. Je +l'ai donc converti en base de donnée SQLite, plus pratique d'utilisation. Je +n'ai pas encore uploadé ce fichier, mais vous pouvez me le demander par +courriel. + +## Installation + +- Cloner le code + +```bash +git clone -b latest-release https://git.roflcopter.fr/sdjgeek/purge-registres-deces-insee.git +cd purge-registres-deces-insee +``` + +- Mettre en place l'environnement virtuel Python + +```bash +python3 -m venv localenv +. localenv/bin/activate +pip install -r requirements.txt +``` + +## Utilisation + +Le début du fichier ```trouver_deces.py``` contient les paramètres à configurer : + +- chemin_base_donnees : Le chemin vers le fichier téléchargé (me contacter) +- numeros_unites : La liste des unités que le programme doit tester. La liste commence par le caractère '['. Les + numéros d'unités sont séparés par des virgules. La liste se termine par le caractère ']'. Par exemple + [47823, 67745, 31456] +- cookie : Les cookies de la session au compte SDJ. Pour obtenir ces cookies il faut + 1- Ouvrir Firefox + 2- Ouvrir les outils de développement : CTRL + MAJ + E + 3- Aller sur le site des outils pour greffiers : https://lds.org/lcr + 4- Entrer identifiant et mot de passe SDJ + 5- Aller dans la liste des membres + 6- Dans l'outil de développement, cliquer sur la dernière ligne + 7- Dans le panneau de droite, dans la section "En-tête de la requête", rechercher le champ "cookie" + 8- Copier la valeur contenue dans ce champ +- chemin_repertoire_sortie : Le chemin vers le répertoire qui contiendra la fichiers de sortie + +Une fois la configuration effectuée, lancer le script : + +```bash +. localenv/bin/activate +python trouver_deces.py +``` + +Le script mettra un peu de temps à s'exécuter. En fin d'exécution, le fichier +liste_membres_decedes_unite_{unite}.txt contiendra la liste des membres +trouvés dans le fichier de l'INSEE. Il est recommandé de contrôler les +informations du membres avant de le déclarer comme décédé dans les registres +de l'Église. + +## Licence + +Copyright (c) 2020 Sdj Geek + +Ce logiciel est sous licence MIT/X Consortium. Elle donne à toute personne +recevant le logiciel (et ses fichiers) le droit illimité de l'utiliser, le +copier, le modifier, le fusionner, le publier, le distribuer, le vendre et le +"sous-licencier" (l'incorporer dans une autre licence). La seule obligation +est d'incorporer la notice de licence et de copyright dans toutes les +copies. Voir le fichier [LICENSE](LICENSE) pour le texte complet. \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2934903 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +peewee +requests diff --git a/trouver_decedes.py b/trouver_decedes.py new file mode 100755 index 0000000..15ee241 --- /dev/null +++ b/trouver_decedes.py @@ -0,0 +1,191 @@ +""" +Copyright (c) 2020 Sdj Geek + +Voir le fichier LICENSE +------------------------------------------------------------------------------------------------------------------------ + +Ce programme permet de comparer le fichier des personnes décédées établi par l'INSEE avec les registre de membres de +l'Église, afin de déterminer si figurent dans nos registre des personnes décédées. + +L'INSEE reçoit des communes les décès enregistrés. Le fichier des personnes décédées établi par l'INSEE est en accès +libre sur le site https://www.data.gouv.fr. + +Comment utilise ce programme : +1) Demander le ficher de l'INSEE à cette adresse : sdjgeek@protonmail.com +2) Installer les dépendance du programme : "pip install requests peewee" +3) Configurer les paramètres du programme (un peu plus bas) + - chemin_base_donnees : Le chemin vers le fichier téléchargé sur le site data.gouv.fr + - numeros_unites : La liste des unités que le programme doit tester. La liste commence par le caractère '['. Les + numéros d'unités sont séparés par des virgules. La liste se termine par le caractère ']'. Par exemple + [47823, 67745, 31456] + - cookie : Les cookies de la session au compte SDJ. Pour obtenir ces cookies il faut + 1- Ouvrir Firefox + 2- Ouvrir les outils de développement : CTRL + MAJ + E + 3- Aller sur le site des outils pour greffiers : https://lds.org/lcr + 4- Entrer identifiant et mot de passe SDJ + 5- Aller dans la liste des membres + 6- Dans l'outil de développement, cliquer sur la dernière ligne + 7- Dans le paneau de droite, dans la section "En-tête de la requête", rechercher le champ "cookie" + 8- Copier la valeur contenue dans ce champ + - chemin_repertoire_sortie : Le chemin vers le répertoire qui contiendra la fichiers de sortie +4) Exécuter le programme : "python3.6 trouver_decedes.py" + +------------------------------------------------------------------------------------------------------------------------ + +Auteur : SDJ GeeK +Date : 16 mai 2020 +Version : 1.0 + +------------------------------------------------------------------------------------------------------------------------ + +Journal des versions + +v1.0 (2020/05/16) +Première publication + +""" + +### +# Paramètres + +# Chemin complet vers le fichier contenant les registres de l'INSEE +chemin_base_donnees = "/chemin/vers/fichier-des-personnes-decedees.sqlite" + +# Numéro des l'unités à contrôler (par exemple [47823, 67745, 31456]) +# Beziers 63789, Carcassonne 85774, Montauban 226122, Montpellier 83895, Nimes 72850, Perpignan 75698, Rodez 333824, Tarbes 65471, Capitole 111848, Concorde 263923 +numeros_unites = [63789, 111848] + +# Cookie de session compte SDJ +cookie = "" + +# Chemin vers le répertoire de sortie +chemin_repertoire_sortie = "/chemin/vers/repertoire-de-sortie" + +# Fin des paramètres. Ne pas modifier plus loin. +### + +import os +import peewee +import requests + +## +# Texte inscrit dans le fichier de sortie +output_template = """ +{full_name} dans nos registres +{last_name}, {first_name} dans la liste des décés +né{feminin} le {jour_naissance:0>2}/{mois_naissance:0>2}/{annee_naissance:0>4} +décédé{feminin} le {jour_deces:0>2}/{mois_deces:0>2}/{annee_deces:0>4} +""" + +### +# Base de donnée INSEE +database = peewee.SqliteDatabase(chemin_base_donnees) + + +class Person(peewee.Model): + last_name = peewee.CharField() + first_name = peewee.CharField() + is_woman = peewee.BooleanField() + annee_naissance = peewee.IntegerField() + mois_naissance = peewee.IntegerField() + jour_naissance = peewee.IntegerField() + code_lieu_naissance = peewee.CharField() + commune_naissance = peewee.CharField() + pays_naissance = peewee.CharField() + annee_deces = peewee.IntegerField() + mois_deces = peewee.IntegerField() + jour_deces = peewee.IntegerField() + code_lieu_deces = peewee.CharField() + numero_act_deces = peewee.CharField() + + class Meta: + database = database + + +def find_person(first_name, last_name, maiden_name, annee_naissance, mois_naissance, jour_naissance): + if maiden_name: + return Person.select().where((Person.annee_naissance == int(annee_naissance)) + & (Person.mois_naissance == int(mois_naissance)) + & (Person.jour_naissance == int(jour_naissance)) + & (Person.first_name.contains(first_name.upper())) + & ((Person.last_name.contains(last_name.upper())) + | Person.last_name.contains(maiden_name.upper()))) + else: + return Person.select().where((Person.annee_naissance == int(annee_naissance)) + & (Person.mois_naissance == int(mois_naissance)) + & (Person.jour_naissance == int(jour_naissance)) + & (Person.first_name.contains(first_name.upper())) + & (Person.last_name.contains(last_name.upper()))) + + +### +# Registres de l'Église +def get_member_list(unit_number, cookie): + r = requests.get('https://lcr.churchofjesuschrist.org/services/umlu/report/member-list', + params={'lang': "fra", 'unitNumber': unit_number}, + headers={'Accept': "application/json", + 'Cookie': cookie}) + r.raise_for_status() + return r.json() + + +def get_member_profile(member_id, cookie): + r = requests.get(f'https://lcr.churchofjesuschrist.org/records/member-profile/service/{member_id}', + params={'lang': "fra"}, + headers={'Accept': "application/json", + 'Cookie': cookie, + 'Referer': f"https://lcr.churchofjesuschrist.org/records/member-profile/{member_id}?lang=fra"}) + r.raise_for_status() + return r.json() + + +### +# Programme principal + +# Boucler sur la liste des unités +for unite in numeros_unites: + print(f"Unité {unite}") + # Récupérer la liste des membres + members = get_member_list(111848, cookie=cookie) + + # Préparer le fichier de sortie + output_file = os.path.join(chemin_repertoire_sortie, f"liste_membres_decedes_unite_{unite}.txt") + with open(output_file, 'w') as out_file: + # Boucler sur la liste des membres + for member in members: + # Lire les noms et date de naissance + full_name = member['nameListPreferredLocal'] + full_birthdate = member['birth']['date']['date'] + maiden_name = None + # S'il s'agit d'une femme mariée, trouver son nom de jeune fille + if member['isSpouse']: + member_profile = get_member_profile(member['legacyCmisId'], cookie=cookie) + maiden_name = member_profile['individual']['maidenNameGroup']['name1']['family'] + try: + last_name, first_name = full_name.split(',') + annee_naissance, mois_naissance, jour_naissance = full_birthdate.split('-') + except ValueError: + print(f"Error with member [{full_name}, {full_birthdate}]") + continue + first_name = first_name.strip().split(' ')[0] + last_name = last_name.strip().split(' ')[0] + query = find_person(first_name, last_name, maiden_name, annee_naissance, mois_naissance, jour_naissance) + if maiden_name: + full_name = f"{full_name} née {maiden_name}" + if member['sex'] == "F": + feminin = "e" + else: + feminin = "" + for person in query: + text = output_template.format(full_name=full_name, + last_name=person.last_name.capitalize(), + first_name=person.first_name.capitalize(), + jour_naissance=person.jour_naissance, + mois_naissance=person.mois_naissance, + annee_naissance=person.annee_naissance, + jour_deces=person.jour_deces, + mois_deces=person.mois_deces, + annee_deces=person.annee_deces, + feminin=feminin) + print(text) + out_file.write(text)