diff --git a/app/entreprises/app_relations_entreprises.py b/app/entreprises/app_relations_entreprises.py index b854bd69..580e685f 100644 --- a/app/entreprises/app_relations_entreprises.py +++ b/app/entreprises/app_relations_entreprises.py @@ -30,7 +30,7 @@ import re import requests import glob -from flask import redirect, url_for, flash +from flask import flash from flask_login import current_user from app.entreprises.models import ( @@ -184,6 +184,9 @@ def send_email_notifications_entreprise(subject: str, entreprise: Entreprise): def get_excel_book_are(export: bool = False): + """ + Retourne un Excel avec les 3 feuilles "Entreprises", "Sites" et "Correspondants" + """ entreprises_titles = ENTREPRISES_KEYS[:] sites_titles = SITES_KEYS[:] correspondants_titles = CORRESPONDANTS_KEYS[:] @@ -269,56 +272,10 @@ def get_excel_book_are(export: bool = False): return wb -def verif_correspondant_data(correspondant_data): - """ - Verifie les données d'une ligne Excel (correspondant) - correspondant_data[0]: civilite - correspondant_data[1]: nom - correspondant_data[2]: prenom - correspondant_data[3]: telephone - correspondant_data[4]: mail - correspondant_data[5]: poste - correspondant_data[6]: service - correspondant_data[7]: origine - correspondant_data[8]: notes - correspondant_data[9]: entreprise_siret - """ - # champs obligatoires - if ( - correspondant_data[0].strip() == "" - or correspondant_data[1].strip() == "" - or correspondant_data[2].strip() == "" - or correspondant_data[9].strip() == "" - ): - return False - - # civilite entre H ou F - if correspondant_data[0].strip() not in ["H", "F"]: - return False - - # entreprise_id existant - entreprise = Entreprise.query.filter_by(siret=correspondant_data[9].strip()).first() - if entreprise is None: - return False - - # correspondant possède le meme nom et prénom dans la meme entreprise - correspondant = EntrepriseCorrespondant.query.filter_by( - nom=correspondant_data[1].strip(), - prenom=correspondant_data[2].strip(), - entreprise_id=entreprise.id, - ).first() - if correspondant is not None: - return False - - if ( - correspondant_data[3].strip() == "" and correspondant_data[4].strip() == "" - ): # 1 moyen de contact - return False - - return True - - def check_entreprises_import(m): + """ + Verifie la feuille Excel "Entreprises" de l'importation données + """ entreprises_import = [] siret_list = [] ligne = 1 @@ -326,14 +283,14 @@ def check_entreprises_import(m): flash( f'Veuillez utilisez la feuille excel à remplir (Feuille "Entreprises", ligne {ligne})' ) - return redirect(url_for("entreprises.import_donnees")) + return False for entreprise_data in m[1:]: ligne += 1 entreprise_data[0] = entreprise_data[0].strip().replace(" ", "") siret = entreprise_data[0] if check_entreprise_import(entreprise_data) and siret not in siret_list: siret_list.append(siret) - entreprise = Entreprise.query.filter_by(siret=siret).first() + entreprise = Entreprise.query.filter_by(siret=siret, visible=True).first() if entreprise is None: entreprise_import = Entreprise( siret=siret, @@ -341,7 +298,9 @@ def check_entreprises_import(m): adresse=entreprise_data[2].strip(), ville=entreprise_data[3].strip(), codepostal=entreprise_data[4].strip(), - pays=entreprise_data[5].strip(), + pays=entreprise_data[5].strip() + if entreprise_data[5].strip() + else "FRANCE", visible=True, ) entreprises_import.append(entreprise_import) @@ -359,7 +318,7 @@ def check_entreprises_import(m): flash( f'Erreur lors de l\'importation (Feuille "Entreprises", ligne {ligne})' ) - return redirect(url_for("entreprises.import_donnees")) + return False if len(entreprises_import) > 0: log = EntrepriseLog( @@ -371,7 +330,7 @@ def check_entreprises_import(m): return entreprises_import -def check_entreprise_import(entreprise_data): +def check_entreprise_import(entreprise_data: list): """ Verifie les données d'une ligne Excel (entreprise) """ @@ -393,3 +352,157 @@ def check_entreprise_import(entreprise_data): except requests.ConnectionError: return False return True + + +def check_sites_import(m): + """ + Verifie la feuille Excel "Sites" de l'importation données + """ + sites_import = [] + correspondants_import = [] + ligne = 1 + if m[0] != sum(SITES_KEYS, []): + flash( + f'Veuillez utilisez la feuille excel à remplir (Feuille "Sites", ligne {ligne})' + ) + return False, False + for site_data in m[1:]: + ligne += 1 + site_data[0] = site_data[0].strip().replace(" ", "") + if check_site_import(site_data): + correspondant_data = site_data[len(SITES_KEYS[0]) :] + entreprise = Entreprise.query.filter_by( + siret=site_data[0], visible=True + ).first() + if site_data[1].strip() == "": + site_import = EntrepriseSite( + entreprise_id=entreprise.id, + nom=site_data[2].strip(), + adresse=site_data[3].strip(), + codepostal=site_data[4].strip(), + ville=site_data[5].strip(), + pays=site_data[6].strip(), + ) + if correspondant_data == [""] * len(SITES_KEYS[1]): + sites_import.append(site_import) + else: + correspondant_import = EntrepriseCorrespondant( + entreprise_id=entreprise.id, + civilite=correspondant_data[0], + nom=correspondant_data[1], + prenom=correspondant_data[2], + telephone=correspondant_data[3], + mail=correspondant_data[4], + poste=correspondant_data[5], + service=correspondant_data[6], + origine=correspondant_data[7], + notes=correspondant_data[8], + ) + sites_import.append(site_import) + correspondants_import.append([site_import, correspondant_import]) + else: + site_id = site_data[1].strip() + site = EntrepriseSite.query.filter_by(id=site_id).first() + site.nom = site_data[2].strip() + site.adresse = site_data[3].strip() + site.codepostal = site_data[4].strip() + site.ville = site_data[5].strip() + site.pays = site_data[6].strip() + + if correspondant_data != [""] * len(SITES_KEYS[1]): + correspondant_import = EntrepriseCorrespondant( + entreprise_id=entreprise.id, + site_id=site.id, + civilite=correspondant_data[0], + nom=correspondant_data[1], + prenom=correspondant_data[2], + telephone=correspondant_data[3], + mail=correspondant_data[4], + poste=correspondant_data[5], + service=correspondant_data[6], + origine=correspondant_data[7], + notes=correspondant_data[8], + ) + correspondants_import.append([None, correspondant_import]) + else: + flash(f'Erreur lors de l\'importation (Feuille "Sites", ligne {ligne})') + return False, False + + if len(sites_import) > 0: + log = EntrepriseLog( + authenticated_user=current_user.user_name, + text=f"Importation de {len(sites_import)} site(s)", + ) + db.session.add(log) + + if len(correspondants_import) > 0: + log = EntrepriseLog( + authenticated_user=current_user.user_name, + text=f"Importation de {len(correspondants_import)} correspondant(s)", + ) + db.session.add(log) + + return sites_import, correspondants_import + + +def check_site_import(row_data: list): + """ + Verifie les données d'une ligne Excel (sites) + """ + site_data = row_data[: -len(SITES_KEYS[1])] + correspondant_data = row_data[len(SITES_KEYS[0]) :] + for data in [site_data[0]] + site_data[2:]: # champs obligatoires + if data.strip() == "": + return False + + if correspondant_data != [""] * len(SITES_KEYS[1]): + if check_correspondant_import(correspondant_data, site_data) is False: + return False + + entreprise = Entreprise.query.filter_by(siret=site_data[0], visible=True).first() + if entreprise is None: + return False + + site = EntrepriseSite.query.filter_by(nom=site_data[2]).first() + if site_data[1] == "" and site is not None: + return False + + return True + + +def check_correspondant_import(correspondant_data: list, site_data: list = None): + """ + Verifie les données d'une ligne Excel (correspondant) + """ + # champs obligatoires + if ( + correspondant_data[0].strip() == "" + or correspondant_data[1].strip() == "" + or correspondant_data[2].strip() == "" + ): + return False + + # civilite entre H ou F + if correspondant_data[0].strip() not in ["H", "F"]: + return False + + # entreprise_id existant + entreprise = Entreprise.query.filter_by(siret=site_data[0], visible=True).first() + if entreprise is None: + return False + + # correspondant possède le meme nom et prénom dans la meme entreprise + correspondant = EntrepriseCorrespondant.query.filter_by( + nom=correspondant_data[1].strip(), + prenom=correspondant_data[2].strip(), + entreprise_id=entreprise.id, + ).first() + if correspondant is not None: + return False + + if ( + correspondant_data[3].strip() == "" and correspondant_data[4].strip() == "" + ): # 1 moyen de contact + return False + + return True diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index 824a68bb..637d247a 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -1426,6 +1426,13 @@ def import_donnees(): flash("Veuillez utilisez la feuille excel à remplir (3 feuilles)") return redirect(url_for("entreprises.import_donnees")) entreprises_import = are.check_entreprises_import(lm[0]) + sites_import, correspondants_import = are.check_sites_import(lm[1]) + if ( + entreprises_import is False + or sites_import is False + or correspondants_import is False + ): + return redirect(url_for("entreprises.import_donnees")) for entreprise in entreprises_import: db.session.add(entreprise) db.session.commit() @@ -1439,13 +1446,28 @@ def import_donnees(): pays=entreprise.pays, ) db.session.add(site) - db.session.commit() + for site in sites_import: + db.session.add(site) + correspondants = [] + for site, correspondant in correspondants_import: + if site is None: + db.session.add(correspondant) + else: + db.session.add(site) + db.session.commit() + db.session.refresh(site) + correspondant.site_id = site.id + db.session.add(correspondant) + correspondants.append(correspondant) + db.session.commit() flash(f"Importation réussie") return render_template( "entreprises/import_donnees.html", title="Importation données", form=form, entreprises_import=entreprises_import, + sites_import=sites_import, + correspondants_import=correspondants, ) return render_template( "entreprises/import_donnees.html", title="Importation données", form=form diff --git a/app/templates/entreprises/import_donnees.html b/app/templates/entreprises/import_donnees.html index b0c2f7c1..35ed75fb 100644 --- a/app/templates/entreprises/import_donnees.html +++ b/app/templates/entreprises/import_donnees.html @@ -22,7 +22,7 @@ - {% if not entreprises_import %} + {% if not entreprises_import and not sites_import and not correspondants_import %}
Feuille Entreprises
@@ -58,5 +58,74 @@
AttributTypeDescription
nom_sitetextnom du site lié au correspondant
{% endif %} + + {% if entreprises_import %} +
Importation de {{ entreprises_import|length }} entreprise(s)
+ {% for entreprise in entreprises_import %} +
+
+ SIRET : {{ entreprise.siret }}
+ Nom : {{ entreprise.nom }}
+ Adresse : {{ entreprise.adresse }}
+ Code postal : {{ entreprise.codepostal }}
+ Ville : {{ entreprise.ville }}
+ Pays : {{ entreprise.pays }} +
+ {% for site in entreprise.sites %} +
+ Nom : {{ site.nom }}
+ Adresse : {{ site.adresse }}
+ Code postal : {{ site.codepostal }}
+ Ville : {{ site.ville }}
+ Pays : {{ site.pays }} +
+ {% endfor %} +
+ {% endfor %} + {% endif %} + + {% if sites_import %} +
Importation de {{ sites_import|length }} site(s)
+ {% for site in sites_import %} +
+ Nom : {{ site.nom }}
+ Adresse : {{ site.adresse }}
+ Code postal : {{ site.codepostal }}
+ Ville : {{ site.ville }}
+ Pays : {{ site.pays }} +
+ {% endfor %} + {% endif %} + + {% if correspondants_import %} +
Importation de {{ correspondants_import|length }} correspondant(s)
+ {% for correspondant in correspondants_import %} +
+
+ Civilité : {{ correspondant.civilite|get_civilité }}
+ Nom : {{ correspondant.nom }}
+ Prénom : {{ correspondant.prenom }}
+ {% if correspondant.telephone %} + Téléphone : {{ correspondant.telephone }}
+ {% endif %} + {% if correspondant.mail %} + Mail : {{ correspondant.mail }}
+ {% endif %} + {% if correspondant.poste %} + Poste : {{ correspondant.poste }}
+ {% endif %} + {% if correspondant.service %} + Service : {{ correspondant.service }}
+ {% endif %} + {% if correspondant.origine %} + Origine : {{ correspondant.origine }}
+ {% endif %} + {% if correspondant.notes %} + Notes : {{ correspondant.notes }}
+ {% endif %} +
+
+ {% endfor %} + {% endif %} {% endblock %} \ No newline at end of file