import données sites + correspondants

This commit is contained in:
Arthur ZHU 2022-06-08 21:07:04 +02:00
parent 1ba5954762
commit 835d1d38ed
3 changed files with 261 additions and 57 deletions

View File

@ -30,7 +30,7 @@ import re
import requests import requests
import glob import glob
from flask import redirect, url_for, flash from flask import flash
from flask_login import current_user from flask_login import current_user
from app.entreprises.models import ( 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): def get_excel_book_are(export: bool = False):
"""
Retourne un Excel avec les 3 feuilles "Entreprises", "Sites" et "Correspondants"
"""
entreprises_titles = ENTREPRISES_KEYS[:] entreprises_titles = ENTREPRISES_KEYS[:]
sites_titles = SITES_KEYS[:] sites_titles = SITES_KEYS[:]
correspondants_titles = CORRESPONDANTS_KEYS[:] correspondants_titles = CORRESPONDANTS_KEYS[:]
@ -269,56 +272,10 @@ def get_excel_book_are(export: bool = False):
return wb 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): def check_entreprises_import(m):
"""
Verifie la feuille Excel "Entreprises" de l'importation données
"""
entreprises_import = [] entreprises_import = []
siret_list = [] siret_list = []
ligne = 1 ligne = 1
@ -326,14 +283,14 @@ def check_entreprises_import(m):
flash( flash(
f'Veuillez utilisez la feuille excel à remplir (Feuille "Entreprises", ligne {ligne})' 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:]: for entreprise_data in m[1:]:
ligne += 1 ligne += 1
entreprise_data[0] = entreprise_data[0].strip().replace(" ", "") entreprise_data[0] = entreprise_data[0].strip().replace(" ", "")
siret = entreprise_data[0] siret = entreprise_data[0]
if check_entreprise_import(entreprise_data) and siret not in siret_list: if check_entreprise_import(entreprise_data) and siret not in siret_list:
siret_list.append(siret) 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: if entreprise is None:
entreprise_import = Entreprise( entreprise_import = Entreprise(
siret=siret, siret=siret,
@ -341,7 +298,9 @@ def check_entreprises_import(m):
adresse=entreprise_data[2].strip(), adresse=entreprise_data[2].strip(),
ville=entreprise_data[3].strip(), ville=entreprise_data[3].strip(),
codepostal=entreprise_data[4].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, visible=True,
) )
entreprises_import.append(entreprise_import) entreprises_import.append(entreprise_import)
@ -359,7 +318,7 @@ def check_entreprises_import(m):
flash( flash(
f'Erreur lors de l\'importation (Feuille "Entreprises", ligne {ligne})' f'Erreur lors de l\'importation (Feuille "Entreprises", ligne {ligne})'
) )
return redirect(url_for("entreprises.import_donnees")) return False
if len(entreprises_import) > 0: if len(entreprises_import) > 0:
log = EntrepriseLog( log = EntrepriseLog(
@ -371,7 +330,7 @@ def check_entreprises_import(m):
return entreprises_import 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) Verifie les données d'une ligne Excel (entreprise)
""" """
@ -393,3 +352,157 @@ def check_entreprise_import(entreprise_data):
except requests.ConnectionError: except requests.ConnectionError:
return False return False
return True 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

View File

@ -1426,6 +1426,13 @@ def import_donnees():
flash("Veuillez utilisez la feuille excel à remplir (3 feuilles)") flash("Veuillez utilisez la feuille excel à remplir (3 feuilles)")
return redirect(url_for("entreprises.import_donnees")) return redirect(url_for("entreprises.import_donnees"))
entreprises_import = are.check_entreprises_import(lm[0]) 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: for entreprise in entreprises_import:
db.session.add(entreprise) db.session.add(entreprise)
db.session.commit() db.session.commit()
@ -1439,6 +1446,19 @@ def import_donnees():
pays=entreprise.pays, pays=entreprise.pays,
) )
db.session.add(site) db.session.add(site)
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() db.session.commit()
flash(f"Importation réussie") flash(f"Importation réussie")
return render_template( return render_template(
@ -1446,6 +1466,8 @@ def import_donnees():
title="Importation données", title="Importation données",
form=form, form=form,
entreprises_import=entreprises_import, entreprises_import=entreprises_import,
sites_import=sites_import,
correspondants_import=correspondants,
) )
return render_template( return render_template(
"entreprises/import_donnees.html", title="Importation données", form=form "entreprises/import_donnees.html", title="Importation données", form=form

View File

@ -22,7 +22,7 @@
</div> </div>
</div> </div>
{% if not entreprises_import %} {% if not entreprises_import and not sites_import and not correspondants_import %}
<div>Feuille Entreprises</div> <div>Feuille Entreprises</div>
<table class="table"> <table class="table">
<thead><tr><td><b>Attribut</b></td><td><b>Type</b></td><td><b>Description</b></td></tr></thead> <thead><tr><td><b>Attribut</b></td><td><b>Type</b></td><td><b>Description</b></td></tr></thead>
@ -59,4 +59,73 @@
</table> </table>
{% endif %} {% endif %}
{% if entreprises_import %}
<br><div>Importation de {{ entreprises_import|length }} entreprise(s)</div>
{% for entreprise in entreprises_import %}
<div class="entreprise">
<div>
SIRET : {{ entreprise.siret }}<br>
Nom : {{ entreprise.nom }}<br>
Adresse : {{ entreprise.adresse }}<br>
Code postal : {{ entreprise.codepostal }}<br>
Ville : {{ entreprise.ville }}<br>
Pays : {{ entreprise.pays }}
</div>
{% for site in entreprise.sites %}
<div class="site">
Nom : {{ site.nom }}<br>
Adresse : {{ site.adresse }}<br>
Code postal : {{ site.codepostal }}<br>
Ville : {{ site.ville }}<br>
Pays : {{ site.pays }}
</div>
{% endfor %}
</div>
{% endfor %}
{% endif %}
{% if sites_import %}
<br><div>Importation de {{ sites_import|length }} site(s)</div>
{% for site in sites_import %}
<div class="site">
Nom : {{ site.nom }}<br>
Adresse : {{ site.adresse }}<br>
Code postal : {{ site.codepostal }}<br>
Ville : {{ site.ville }}<br>
Pays : {{ site.pays }}
</div>
{% endfor %}
{% endif %}
{% if correspondants_import %}
<br><div>Importation de {{ correspondants_import|length }} correspondant(s)</div>
{% for correspondant in correspondants_import %}
<div class="correspondant">
<div>
Civilité : {{ correspondant.civilite|get_civilité }}<br>
Nom : {{ correspondant.nom }}<br>
Prénom : {{ correspondant.prenom }}<br>
{% if correspondant.telephone %}
Téléphone : {{ correspondant.telephone }}<br>
{% endif %}
{% if correspondant.mail %}
Mail : {{ correspondant.mail }}<br>
{% endif %}
{% if correspondant.poste %}
Poste : {{ correspondant.poste }}<br>
{% endif %}
{% if correspondant.service %}
Service : {{ correspondant.service }}<br>
{% endif %}
{% if correspondant.origine %}
Origine : {{ correspondant.origine }}<br>
{% endif %}
{% if correspondant.notes %}
Notes : {{ correspondant.notes }}<br>
{% endif %}
</div>
</div>
{% endfor %}
{% endif %}
{% endblock %} {% endblock %}