From d125d9c42d90f60ae23554109f8a0bea49293ceb Mon Sep 17 00:00:00 2001 From: Phuoc CAO Date: Fri, 20 Sep 2019 18:30:01 +0200 Subject: [PATCH] annulation de mission MAIF et DOMUS --- mondumas/models/dossier.py | 28 +- mondumas/templates/dossier/dossier_view.pt | 4 +- mondumas/views/dossier.py | 298 +++++++++++++++------ 3 files changed, 244 insertions(+), 86 deletions(-) diff --git a/mondumas/models/dossier.py b/mondumas/models/dossier.py index 5466018..1f9c24d 100644 --- a/mondumas/models/dossier.py +++ b/mondumas/models/dossier.py @@ -37,6 +37,12 @@ where d.societe = '%s' and d.no_id=%s;""" % (societe, no_id); results = request.dbsession.execute(query).first() return results +def get_dossier_by_sinistre(request,societe, nosin): + query = "SELECT * FROM dem_devis WHERE societe = '%s' and nosin = '%s';" % (societe, nosin); + results = request.dbsession.execute(query).first() + return results + + def get_devis_by_no(request,nodossier): societe = nodossier[0:2] type_doc = nodossier[3:5] @@ -111,6 +117,15 @@ def update_suivi(request, nodossier, nolig, new_values): execute_query(request, query, new_values) +def insert_suivi(request, nodossier, comment): + societe = nodossier[0:2] + no_id = nodossier[3:] + + query = """ + INSERT INTO dem_lig (societe, NO_ID, DATE, COMMENT, USERMAJ) VALUES + (:societe, :no_id, CURRENT_DATE(), :comment, 'AUTO');""" + execute_query(request, query, {'societe': societe, 'no_id': no_id, 'comment': comment}) + def get_similaires_byChantier(request, societe, C_NOM, C_ADR, C_CP, C_VILLE): query = """ @@ -258,18 +273,11 @@ def insert_facture_rdf(request, societe, nochantier, user, ref, date_rapport): query = "CALL spINS_FACTURE_RDF(:societe, :nochantier, :user, :ref, :date_rapport)" execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'user': user, 'ref': ref, 'date_rapport': date_rapport}) -def insert_dossier(request, societe, client, logged_in, c_nom, c_adr, c_adr2, c_cp, c_ville, c_tel1, nosin, c_obs, tx_trav): +def insert_dossier(request, societe, cd_cli, c_nom, c_adr, c_adr2, c_cp, c_ville, c_telp, nosin, c_obs, tx_trav): # créer une dem_devis selon l'email de l'OS - if client == 'MAIF': - cd_cli = 2813 - cabinet = 290 - elif client == 'DOMUS': - cd_cli = 8991 - cabinet = 289 - - query = """CALL spINS_DEMANDES(:societe, :cd_cli, :c_nom, :c_adr, :c_adr2, :c_cp, :c_ville, :c_tel1, 'MR', :cabinet, 6, :nosin, :c_obs, :tx_trav, :logged_in);""" + query = """CALL spINS_DEMANDES(:societe, :cd_cli, :c_nom, :c_adr, :c_adr2, :c_cp, :c_ville, :c_telp, 'MR', 6, :nosin, :c_obs, :tx_trav, :logged_in);""" 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_tel1': c_tel1, 'cabinet': cabinet, 'nosin': nosin, 'c_obs': c_obs, 'tx_trav': tx_trav, 'logged_in': logged_in}) + 'c_ville': c_ville,'c_telp': c_telp, 'nosin': nosin, 'c_obs': c_obs, 'tx_trav': tx_trav, 'logged_in': '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/templates/dossier/dossier_view.pt b/mondumas/templates/dossier/dossier_view.pt index 4c1841a..56effc6 100644 --- a/mondumas/templates/dossier/dossier_view.pt +++ b/mondumas/templates/dossier/dossier_view.pt @@ -68,7 +68,9 @@
- +

CLIENT

CLIENT

+ ${dossier.CD_CLI} +

${dossier.QUALITE} ${dossier.NOM}

${dossier.ADRESSE}
diff --git a/mondumas/views/dossier.py b/mondumas/views/dossier.py index 559a1e5..906ba35 100644 --- a/mondumas/views/dossier.py +++ b/mondumas/views/dossier.py @@ -686,7 +686,7 @@ def demandes(request): logged_in = request.authenticated_userid.upper() url = request.route_url('demandes') - societes = ['PE','ME','PL','PO'] + societes = ['PE','ME','PL'] societe = 'PE' # prendre en compte les paramètres de saisie if 'societe' in request.params: @@ -722,12 +722,12 @@ def demandes(request): if 'form.submitted' in request.params: # traiter les demandes de la MAIF puis de DOMUS - #demandes_generer(request, conn, societe, mbx_search1, liste, logged_in) - demandes_generer(request, conn, societe, mbx_search2, liste, logged_in) + # demandes_generer(request, conn, societe, mbx_search1) + demandes_generer(request, conn, societe, mbx_search2) liste=[] # lire les demandes de la MAIF puis de DOMUS - demandes_afficher(conn, mbx_name, mbx_search1, liste) + # demandes_afficher(conn, mbx_name, mbx_search1, liste) demandes_afficher(conn, mbx_name, mbx_search2, liste) # messages lus msglus = bool(liste) @@ -771,67 +771,73 @@ def demandes_afficher(conn, mbx_name, search_criteria, liste): liste.append(d) return liste -def demandes_generer(request, conn, societe, mbx_search, liste, logged_in): +def demandes_generer(request, conn, societe, mbx_search): - def generer_dossier(request, societe, mbx_search, extracted_file, temp_file_path, logged_in): - # parcourir les lignes pour retrouver les infos utiles - with open(extracted_file) as fp: - cnt = 1 - line = fp.readline() - c_obs = '' - tx_trav = '' - while line: - if line.find('Nos références') == 0: - line = fp.readline() - line = fp.readline() - no_sinistre = line[:-1] - if line.find('Bénéficiaire des travaux :') == 0: - elt = line.split(' : ') - c_nom = elt[1][:-1] - line = fp.readline() - line = fp.readline() - 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 line.find('N° de téléphone :') == 0: - # les 10 derniers caratères - c_tel1 = line[-11:-1] - if 'une franchise de ' in line: - i1 = line.find('franchise de ') - i2 = line.find(' € ') - c_obs = line[i1:i2+2] - if ' pour un montant de ' in line: - i1 = line.find('pour un montsant de ') - tx_trav = line[i1:-2].replace(',', '.') - - # lire ligne suivante - line = fp.readline() - cnt += 1 - - fp.close() + def generer_mission(request, societe, mbx_search, extracted_file, temp_file_path): + + if 'maif.fr' in mbx_search: + # extraire les infos de la demmande MAIF + dem_info = get_pdf_infos1(extracted_file) + if societe == 'PE': + cd_cli = 2813 + elif societe == 'ME': + cd_cli = 3428 + else: + # VERSANIT + cd_cli = 1743 + elif 'domus-services.fr' in mbx_search: + # extraire les infos de la demmande DOMUS + dem_info = get_pdf_infos2(extracted_file) + if societe == 'PE': + cd_cli = 8991 + elif societe == 'ME': + cd_cli = 5276 + else: + # VERSANIT + cd_cli = 3209 - # créer une dem_devis et récupèrer son no_id - nochantier = insert_dossier(request, societe, 'MAIF', logged_in, c_nom, c_adr, c_adr2, c_cp, c_ville, c_tel1, no_sinistre, c_obs, tx_trav) - nodossier = "%s-%s" % (societe, nochantier) + # extraction OK ? oui, créer une dem_devis et récupèrer son no_id + if dem_info['c_nom'] != '': + 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['no_sinistre'], dem_info['c_obs'], dem_info['tx_trav']) + nodossier = "%s-%s" % (societe, nochantier) + + # 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', temp_file_path, filename, 'AUTO') + + return + + def generer_annulation1(request, societe, extracted_file, temp_file_path): + + # extraire les infos de la demmande MAIF + dem_info = get_pdf_infos1(extracted_file) + import pdb;pdb.set_trace() + # extraction OK ? oui, rechercher la dem_devis concerné + if dem_info['c_nom'] != '': + # oui, rechercher la dem_devis concerné par le no de sinistre + dem_devis = get_dossier_by_sinistre(request,societe, nosin) + nodossier = "%s-%s" % (societe, dem_devis.NO_ID) + + # récupère le nom du fichier et ajouter le no de dossier + filename = '%s-DD%s-%s' % (societe, dem_devis.NO_ID, 'ANNULATION.pdf') + tempFile2Dossier(request, societe, dem_devis.NO_ID, '0', temp_file_path, filename, 'AUTO') + # insérer une ligne de suivi ANNULATION + insert_suivi(request, nodossier, '!!MISSION ANNULEE PAR la MAIF') + return + + def generer_annulation2(request, societe, nosin, temp_file_path): + + # oui, rechercher la dem_devis concerné par le no de sinistre + dem_devis = get_dossier_by_sinistre(request,societe, nosin) + nodossier = "%s-%s" % (societe, dem_devis.NO_ID) # 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', temp_file, filename, logged_in) - + filename = '%s-DD%s-%s' % (societe, dem_devis.NO_ID, 'ANNULATION.pdf') + tempFile2Dossier(request, societe, dem_devis.NO_ID, '0', temp_file_path, filename, 'AUTO') + # insérer une ligne de suivi ANNULATION + insert_suivi(request, nodossier, '!!MISSION ANNULEE PAR DOMUS') return # rechercher les emails de demandes dans le INBOX @@ -852,21 +858,34 @@ def demandes_generer(request, conn, societe, mbx_search, liste, logged_in): raw_email_string = raw_email.decode('utf-8') email_message = email.message_from_string(raw_email_string) - email_subject = email_message['subject'] - # demande annulée ? - if email_subject.find('Annulation ') < 0: - # downloading attachment - temp_file_path = download_pdf_to_tmp(email_message) + # get the message's body + body = '' + for part in email_message.walk(): + ctype = part.get_content_type() + cdispo = str(part.get('Content-Disposition')) + + # skip any text/plain (txt) attachments + if ctype == 'text/html' and 'attachment' not in cdispo: + body = part.get_payload(decode=True) # decode + break + # downloading attachment + temp_file_path = download_pdf_to_tmp(email_message) - # convertir le fichier pdf en texte - texte, extracted_file = pdf_convert_to_txt(temp_file_path) - # mission annulée - if 'Objet : ANNULATION MISSION' in texte: - # supprime le pdf - os.remove(temp_file_path) - else: - # genere le dossier d'après le mail - generer_dossier(request, societe, mbx_search, extracted_file, temp_file_path, logged_in) + # convertir le fichier pdf en texte + texte, extracted_file = pdf_convert_to_txt(temp_file_path) + + # mission annulée ? + if 'Objet : ANNULATION MISSION' in texte : + # genere ANNULATION mission MAIF + generer_annulation1(request, societe, extracted_file, temp_file_path) + elif 'ANNULATION ORDRE DE MISSION' in texte: + import pdb;pdb.set_trace() + # genere ANNULATION mission DOMUS + nosin = str(body)[84:95] + generer_annulation2(request, societe, nosin, temp_file_path) + else: + # genere le dossier d'après le mail + generer_mission(request, societe, mbx_search, extracted_file, temp_file_path) return @@ -988,3 +1007,132 @@ def pdf_convert_to_txt(path): return extracted_text, extracted_file +def get_pdf_infos1(extracted_file): + # à partir du fichier texte du pdf + # parcourir les lignes pour retrouver les infos utiles + with open(extracted_file) as fp: + cnt = 1 + line = fp.readline() + # première ligne doit être "MAIF" + if line[:-1] != 'MAIF': + return {'c_nom': ''} + + c_obs = '' + tx_trav = '' + c_telp = '' + while line: + if line.find('Nos références') == 0: + line = fp.readline() + line = fp.readline() + no_sinistre = line[:-1] + if line.find('Bénéficiaire des travaux :') == 0: + elt = line.split(' : ') + c_nom = elt[1][:-1] + line = fp.readline() + line = fp.readline() + 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 ' téléphone : ' in line: + # les 10 derniers caratères + c_tel1 = line[-11:-1] + if 'une franchise de ' in line: + i1 = line.find('franchise de ') + i2 = line.find(' € ') + c_obs = line[i1:i2+2] + if ' pour un montant de ' in line: + i1 = line.find('pour un montsant de ') + tx_trav = line[i1:-2].replace(',', '.') + + # lire ligne suivante + line = fp.readline() + cnt += 1 + + fp.close() + return {'c_nom': c_nom, + 'c_adr': c_adr, + 'c_adr2': c_adr2, + 'c_cp': c_cp, + 'c_ville': c_ville, + 'c_telp': c_telp, + 'c_obs': c_obs, + 'tx_trav': tx_trav, + 'no_sinistre': no_sinistre, + } + +def get_pdf_infos2(extracted_file): + # à partir du fichier texte du pdf de DOMUS + # parcourir les lignes pour retrouver les infos utiles + with open(extracted_file) as fp: + cnt = 1 + line = fp.readline() + import pdb;pdb.set_trace() + # première ligne doit être : + if line[:-1] != 'ORDRE DE MISSION': + fp.close() + return {'c_nom': ''} + + c_obs = '' + tx_trav = '' + c_telp = '' + while line: + if line.find('SINISTRE N°') == 0: + line = fp.readline() + line = fp.readline() + no_sinistre = line[:-1] + if line.find('Adresse du sinistre :') == 0: + line = fp.readline() + c_nom = line[:-1] + line = fp.readline() + c_adr = line[:-1] + line = fp.readline() + c_adr2 = line[:-1] + # début 2ème ligne adr est un code postal ? + if to_int(c_adr2) > 0 : + # oui, mémoriser le code postal et la ville + c_cp = c_adr2 + line = fp.readline() + c_ville = line[:-1] + c_adr2 = '' + else: + # non, le code postal et la ville se trouvent dans la 3è ligne + line = fp.readline() + c_cp = line[:-1] + c_ville = line[:-1] + line = fp.readline() + if 'Gsm : ' in line: + # les 10 derniers caratères + c_telp = line[-11:-1] + + # lire ligne suivante + line = fp.readline() + cnt += 1 + + fp.close() + 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_obs': c_obs, + 'tx_trav': tx_trav, + 'no_sinistre': no_sinistre, + } + + + + \ No newline at end of file