From 7840087bb0ad41a2a4299e6c76557963b4d7de4d Mon Sep 17 00:00:00 2001 From: Phuoc CAO Date: Wed, 9 Dec 2020 11:09:18 +0100 Subject: [PATCH] ajout upload ordre de mission AXA --- mondumas/models/dossier.py | 6 +- mondumas/routes.py | 1 + mondumas/templates/default/home.pt | 5 + mondumas/templates/dossier/upload_doc.pt | 4 +- mondumas/templates/dossier/upload_om.pt | 48 +++++++ mondumas/views/dossier.py | 170 ++++++++++++++++++++++- 6 files changed, 225 insertions(+), 9 deletions(-) create mode 100644 mondumas/templates/dossier/upload_om.pt diff --git a/mondumas/models/dossier.py b/mondumas/models/dossier.py index f910570..4bd8fe9 100644 --- a/mondumas/models/dossier.py +++ b/mondumas/models/dossier.py @@ -278,11 +278,11 @@ def insert_facture_rdf(request, societe, nochantier, cd_cli, nomcli, user, ref, query = "CALL spINS_FACTURE_RDF(:societe, :nochantier, :cd_cli, :nomcli, :user, :ref, :date_rapport)" execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'cd_cli': cd_cli, 'nomcli': nomcli, 'user': user, 'ref': ref, 'date_rapport': date_rapport}) -def insert_dossier(request, societe, cd_cli, c_nom, c_adr, c_adr2, c_cp, c_ville, c_telp, c_email, nosin, c_obs, tx_trav): +def insert_dossier(request, societe, cd_cli, c_nom, c_adr, c_adr2, c_cp, c_ville, c_telp, c_email, nosin, nopol, c_obs, tx_trav): # créer une dem_devis selon l'email de l'OS - query = """CALL spINS_DEMANDES(:societe, :cd_cli, :c_nom, :c_adr, :c_adr2, :c_cp, :c_ville, :c_telp, :c_email, 'MR', 6, :nosin, :c_obs, :tx_trav, 'EMAIL');""" + query = """CALL spINS_DEMANDES(:societe, :cd_cli, :c_nom, :c_adr, :c_adr2, :c_cp, :c_ville, :c_telp, :c_email, 'MR', 6, :nosin, :nopol, :c_obs, :tx_trav, 'EMAIL');""" execute_query(request, query, {'societe': societe, 'cd_cli': cd_cli, 'c_nom': c_nom, 'c_adr': c_adr, 'c_adr2': c_adr2, 'c_cp': c_cp, - 'c_ville': c_ville,'c_telp': c_telp, 'nosin': nosin, 'c_obs': c_obs, 'tx_trav': tx_trav, 'c_email': c_email}) + 'c_ville': c_ville,'c_telp': c_telp, 'nosin': nosin, 'nopol': nopol, 'c_obs': c_obs, 'tx_trav': tx_trav, 'c_email': c_email}) query = "SELECT no_id FROM dem_devis WHERE societe = :societe AND date = curdate() AND cd_cli = :cd_cli ORDER BY no_id desc LIMIT 1;" results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first() diff --git a/mondumas/routes.py b/mondumas/routes.py index 33ff06e..5959311 100644 --- a/mondumas/routes.py +++ b/mondumas/routes.py @@ -44,6 +44,7 @@ def includeme(config): config.add_route('suivi_edit','/suivi_edit/{nodossier}/{nolig}') config.add_route('upload_doc', '/upload_doc/{nodossier}/{origine}') config.add_route('upload_img', '/upload_img/{norapport}/{nosection}') + config.add_route('upload_om', '/upload_om') # parametres config.add_route('parametres', '/parametres') config.add_route('article_edit', '/article_edit/{ref}') diff --git a/mondumas/templates/default/home.pt b/mondumas/templates/default/home.pt index 62eac17..f4335c1 100644 --- a/mondumas/templates/default/home.pt +++ b/mondumas/templates/default/home.pt @@ -39,6 +39,11 @@

EMAILS DOSSIERS

+
+ + +

PDF DOSSIERS

+
diff --git a/mondumas/templates/dossier/upload_doc.pt b/mondumas/templates/dossier/upload_doc.pt index 9f64427..bbabc37 100644 --- a/mondumas/templates/dossier/upload_doc.pt +++ b/mondumas/templates/dossier/upload_doc.pt @@ -1,7 +1,6 @@
-

La taille de chaque document ne doit pas dépasser 4 Mo. -
- +

Documents déjà téléchargés dans le dossier

    diff --git a/mondumas/templates/dossier/upload_om.pt b/mondumas/templates/dossier/upload_om.pt new file mode 100644 index 0000000..a937d1b --- /dev/null +++ b/mondumas/templates/dossier/upload_om.pt @@ -0,0 +1,48 @@ + +
    + +
    +
    + + +
    + + +
    +
    +
    + + Retour + + +
    + +
      +
    • Seuls les documents au format PDF seront acceptés.
    • +
    • La taille de chaque document ne doit pas dépasser 4 Mo.
    • +
    + +
    +
    +

    Contenu du PDF

    +
    +
    Page text goes here.
    +
    +
    +
    +
    + + +
    + diff --git a/mondumas/views/dossier.py b/mondumas/views/dossier.py index 8864398..201e109 100644 --- a/mondumas/views/dossier.py +++ b/mondumas/views/dossier.py @@ -883,7 +883,7 @@ def demandes(request): else: # dem_devis n'existe pas, creer nouveau dossier nochantier = insert_dossier(request, societe, cd_cli, dem_info['c_nom'], dem_info['c_adr'], dem_info['c_adr2'], \ - dem_info['c_cp'], dem_info['c_ville'], dem_info['c_telp'], dem_info['c_email'], nosin, dem_info['c_obs'], dem_info['tx_trav']) + dem_info['c_cp'], dem_info['c_ville'], dem_info['c_telp'], dem_info['c_email'], nosin, '', dem_info['c_obs'], dem_info['tx_trav']) nodossier = "%s-%s" % (societe, nochantier) # log de nuit print('--> CREER DOSSIER sinistre %s <--' % nodossier) @@ -1150,7 +1150,7 @@ def pdf_convert_to_txt(path): laparams = LAParams() converter = PDFPageAggregator(resource_manager, laparams=laparams) page_interpreter = PDFPageInterpreter(resource_manager, converter) - + extracted_text = "" with open(path, 'rb') as fh: @@ -1318,7 +1318,89 @@ def get_pdf_infos2(extracted_file): 'tx_trav': tx_trav, 'no_sinistre': no_sinistre, } - + +def get_pdf_infos3(extracted_file): + # à partir du fichier texte du pdf de AXA + # parcourir les lignes pour retrouver les infos utiles + with open(extracted_file, encoding="utf-8") as fp: + + cnt = 1 + line = fp.readline() + # première ligne doit être : + if line[:-1] != 'Assurance et Banque': + fp.close() + return {'c_nom': ''} + + c_telp = '' + c_email = '' + while line: + if line[:-1] == 'LibellØ': + # import pdb;pdb.set_trace() + line = fp.readline() + if 'PEINTURE' in line or 'PAPIER PEINT' in line or 'CARRELAGE' in line or 'CERAMIQUE' in line: + societe = 'PE' + elif 'MENUISERIE' in line or 'FERMETURE' in line or 'PARQUET' in line: + societe = 'ME' + else: + societe = '' + + if line[:-1] == 'Contrat': + # import pdb;pdb.set_trace() + line = fp.readline() + no_police = line[:-1] + if line[:-1] == 'RØfØrence sinistre': + # import pdb;pdb.set_trace() + line = fp.readline() + no_sinistre = line[:-1] + if line[:-1] == 'Notre assurØ': + # import pdb;pdb.set_trace() + line = fp.readline() + c_nom = line[:-1] + line = fp.readline() + c_adr = line[:-1] + line = fp.readline() + c_adr2 = line[:-1] + line = fp.readline() + c_adr3 = line[:-1] + # début 3ème ligne adr est un code postal ? + if to_int(c_adr3[0:5]) > 0 : + # oui, mémoriser le code postal et la ville + c_cp = c_adr3[0:5] + c_ville = c_adr3[6:] + else: + # non, le code postal et la ville se trouvent dans la 2è ligne + c_cp = c_adr2[0:5] + c_ville = c_adr2[6:] + c_adr2 = '' + if 'portable ' in line: + # import pdb;pdb.set_trace() + # les 10 derniers caratères + c_telp = line[-11:-1] + line = fp.readline() + # séparer l'émail + # import pdb;pdb.set_trace() + elt = line[:-1].split(': ') + if len(elt) == 2: + c_email = elt[1] + # lire ligne suivante + line = fp.readline() + cnt += 1 + + fp.close() + # import pdb;pdb.set_trace() + + return {'c_nom': c_nom, + 'c_adr': c_adr, + 'c_adr2': c_adr2, + 'c_cp': c_cp[:5], + 'c_ville': c_ville, + 'c_telp': c_telp, + 'c_email': c_email, + 'no_police': no_police, + 'no_sinistre': no_sinistre, + 'societe': societe, + } + def resize_photos(image_file): # using the Python Image Library (PIL) to resize an image img_org = Image.open(image_file) @@ -1348,4 +1430,86 @@ def photos_size(photos): return '%s Mo' % round(sum_size / 1024, 1) +@view_config(route_name='upload_om', renderer='../templates/dossier/upload_om.pt', permission='view') +def upload_om(request): + """ + UPLOAD d'un ordre de mission en PDF + + """ + def generer_mission(request, extracted_file, temp_file_path): + + # extraire les infos de la demmande AXA + dem_info = get_pdf_infos3(extracted_file) + societe = dem_info['societe'] + if societe == 'PE': + cd_cli = 15207 + elif societe == 'ME': + cd_cli = 1190 + else: + return "Descriptif de travaux non prevu par le programme. Prévenir M. CAO." + + # extraction OK ? oui, créer une dem_devis et récupèrer son no_id + message = '' + if dem_info['c_nom'] != '': + # dem_devis n'existe pas, creer nouveau dossier + nochantier = insert_dossier(request, societe, cd_cli, dem_info['c_nom'], dem_info['c_adr'], dem_info['c_adr2'], dem_info['c_cp'], \ + dem_info['c_ville'], dem_info['c_telp'], dem_info['c_email'], dem_info['no_sinistre'], dem_info['no_police'], '', '') + nodossier = "%s-%s" % (societe, nochantier) + # log de nuit + print('--> CREER DOSSIER sinistre %s <--' % nodossier) + + # récupère le nom du fichier et ajouter le no de dossier + filename = os.path.basename(temp_file_path) + filename = '%s-DD%s-%s' % (societe, nochantier, filename) + tempFile2Dossier(request, societe, nochantier, '0', 0, 'CLT', temp_file_path, filename, 'EMAIL') + + return message + + logged_in = request.authenticated_userid.upper() + + url = request.route_url("upload_om") + message = '' + html_text = '' + + if 'form.submitted' in request.params or 'form.previewed' in request.params: + # récupère le fichier download dans le dossier /tmp + input_file = request.POST['filename'].file + input_name = request.POST['filename'].filename + ext_allowed = ['pdf'] + temp_file = downloadFile2Temp(input_file, input_name, ext_allowed) + if temp_file[:8] == 'ERREUR: ': + request.session.flash(temp_file, 'danger') + return HTTPFound(location=url) + + # convertir le fichier pdf en texte + extracted_text, extracted_file = pdf_convert_to_txt(temp_file) + + # prévisualiser le pdf + if 'form.previewed' in request.params: + # convert text to html + html_text = "

    " + extracted_text.replace("\n", "
    ") + "

    " + html_text = html_text.replace("Ø", "é") + + # importer le pdf + if 'form.submitted' in request.params: + # origine du PDF = AXA ? + if 'AXA France GESTION SINISTRES' in extracted_text : + # PDF = ordre de mission AXA ? + if 'bon de commande pour les travaux' in extracted_text : + # genere le dossier d'après le fichier PDF + message = generer_mission(request, extracted_file, temp_file) + if message == '': + request.session.flash("Le fichier PDF a été importé avec succès.", 'success') + return HTTPFound(location=request.route_url('dossier_lookup')) + else: + message = "ERREUR : L'importation de ce document AXA n'est pas prévue." + else: + message = "ERREUR : L'importation de ce type de document n'est pas prévue." + + return { + 'page_title': 'Importer un ordre de mission AXA', + 'url': url, + 'message': message, + 'html_text': html_text, + }