ajout upload ordre de mission AXA
This commit is contained in:
@@ -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)"
|
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})
|
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
|
# 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,
|
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;"
|
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()
|
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first()
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ def includeme(config):
|
|||||||
config.add_route('suivi_edit','/suivi_edit/{nodossier}/{nolig}')
|
config.add_route('suivi_edit','/suivi_edit/{nodossier}/{nolig}')
|
||||||
config.add_route('upload_doc', '/upload_doc/{nodossier}/{origine}')
|
config.add_route('upload_doc', '/upload_doc/{nodossier}/{origine}')
|
||||||
config.add_route('upload_img', '/upload_img/{norapport}/{nosection}')
|
config.add_route('upload_img', '/upload_img/{norapport}/{nosection}')
|
||||||
|
config.add_route('upload_om', '/upload_om')
|
||||||
# parametres
|
# parametres
|
||||||
config.add_route('parametres', '/parametres')
|
config.add_route('parametres', '/parametres')
|
||||||
config.add_route('article_edit', '/article_edit/{ref}')
|
config.add_route('article_edit', '/article_edit/{ref}')
|
||||||
|
|||||||
@@ -39,6 +39,11 @@
|
|||||||
<span class="glyphicon glyphicon-download-alt logo-warning"></span>
|
<span class="glyphicon glyphicon-download-alt logo-warning"></span>
|
||||||
<h4>EMAILS <span class="glyphicon glyphicon-arrow-right"></span> DOSSIERS</h4></a>
|
<h4>EMAILS <span class="glyphicon glyphicon-arrow-right"></span> DOSSIERS</h4></a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<a href="${request.application_url}/upload_om" tal:condition="access > 0">
|
||||||
|
<span class="glyphicon glyphicon-download-alt logo-warning"></span>
|
||||||
|
<h4>PDF <span class="glyphicon glyphicon-arrow-right"></span> DOSSIERS</h4></a>
|
||||||
|
</div>
|
||||||
<div class="col-sm-3">
|
<div class="col-sm-3">
|
||||||
<a href="${request.application_url}/emails_sent" tal:condition="access >= 8">
|
<a href="${request.application_url}/emails_sent" tal:condition="access >= 8">
|
||||||
<span class="glyphicon glyphicon-send logo-small"></span>
|
<span class="glyphicon glyphicon-send logo-small"></span>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<metal:block use-macro="main_template">
|
<metal:block use-macro="main_template">
|
||||||
<div metal:fill-slot="content">
|
<div metal:fill-slot="content">
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<br />
|
<br />
|
||||||
<form id="upload_doc-form" action="${url}" method="post" accept-charset="utf-8" enctype="multipart/form-data"
|
<form id="upload_doc-form" action="${url}" method="post" accept-charset="utf-8" enctype="multipart/form-data"
|
||||||
data-fv-framework="bootstrap"
|
data-fv-framework="bootstrap"
|
||||||
@@ -25,8 +24,7 @@
|
|||||||
<li>La taille de chaque document ne doit <b>pas dépasser 4 Mo</b>.</li>
|
<li>La taille de chaque document ne doit <b>pas dépasser 4 Mo</b>.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
</div> <!-- row -->
|
<br />
|
||||||
|
|
||||||
<h3>Documents déjà téléchargés dans le dossier</h3>
|
<h3>Documents déjà téléchargés dans le dossier</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<div tal:repeat="detail docs_attaches">
|
<div tal:repeat="detail docs_attaches">
|
||||||
|
|||||||
48
mondumas/templates/dossier/upload_om.pt
Normal file
48
mondumas/templates/dossier/upload_om.pt
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<metal:block use-macro="main_template">
|
||||||
|
<div metal:fill-slot="content">
|
||||||
|
|
||||||
|
<div class="alert alert-danger" tal:condition="message" tal:content="message" />
|
||||||
|
<br />
|
||||||
|
<form id="upload_doc-form" action="${url}" method="post" accept-charset="utf-8" enctype="multipart/form-data"
|
||||||
|
data-fv-framework="bootstrap"
|
||||||
|
data-fv-icon-valid="glyphicon glyphicon-ok"
|
||||||
|
data-fv-icon-invalid="glyphicon glyphicon-remove"
|
||||||
|
data-fv-icon-validating="glyphicon glyphicon-refresh">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="uploadfile">Veuillez séléctionner un fichier :</label>
|
||||||
|
<input id="uploadfile" name="filename" type="file" value="" required />
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div class="form-group">
|
||||||
|
<a class="btn btn-default" href="/">
|
||||||
|
<span class="glyphicon glyphicon-arrow-left"></span> Retour</a>
|
||||||
|
<button id="uploadButton" class="btn btn-primary" type="submit" name="form.submitted">
|
||||||
|
<i class="glyphicon glyphicon-refresh"></i> Importer</button>
|
||||||
|
<button id="uploadButton" class="btn btn-success" type="submit" name="form.previewed">
|
||||||
|
<i class="glyphicon glyphicon-refresh"></i> Visualiser</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<ul>
|
||||||
|
<li>Seuls les documents au format <b>PDF</b> seront acceptés.</li>
|
||||||
|
<li>La taille de chaque document ne doit <b>pas dépasser 4 Mo</b>.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<div tal:condition="html_text">
|
||||||
|
<h3>Contenu du PDF</h3>
|
||||||
|
<hr>
|
||||||
|
<div tal:replace="structure html_text">Page text goes here.</div>
|
||||||
|
<hr>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
$('#uploadButton').on('click', function(){
|
||||||
|
$('i.gly-spin').removeClass('gly-spin');
|
||||||
|
$('i').addClass('gly-spin');
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</metal:block>
|
||||||
@@ -883,7 +883,7 @@ def demandes(request):
|
|||||||
else:
|
else:
|
||||||
# dem_devis n'existe pas, creer nouveau dossier
|
# 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'], \
|
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)
|
nodossier = "%s-%s" % (societe, nochantier)
|
||||||
# log de nuit
|
# log de nuit
|
||||||
print('--> CREER DOSSIER sinistre %s <--' % nodossier)
|
print('--> CREER DOSSIER sinistre %s <--' % nodossier)
|
||||||
@@ -1319,6 +1319,88 @@ def get_pdf_infos2(extracted_file):
|
|||||||
'no_sinistre': no_sinistre,
|
'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):
|
def resize_photos(image_file):
|
||||||
# using the Python Image Library (PIL) to resize an image
|
# using the Python Image Library (PIL) to resize an image
|
||||||
img_org = Image.open(image_file)
|
img_org = Image.open(image_file)
|
||||||
@@ -1348,4 +1430,86 @@ def photos_size(photos):
|
|||||||
|
|
||||||
return '%s Mo' % round(sum_size / 1024, 1)
|
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 = "<p>" + extracted_text.replace("\n", "<br>") + "</p>"
|
||||||
|
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,
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user