ajout Doc techniques dans dossier_view.pt et articles.pt

This commit is contained in:
2020-11-20 09:47:20 +01:00
parent dab24387a2
commit d03e90b7b8
26 changed files with 665 additions and 198 deletions

View File

@@ -9,7 +9,7 @@ from .views.default import (
to_decz, to_decz,
) )
@layout_config(template='templates/layouts/global_layout.pt') @layout_config(template='templates/global_layout.pt')
class GlobalLayout(object): class GlobalLayout(object):
# page_title = "Pagode Tinh-Do" # page_title = "Pagode Tinh-Do"

View File

@@ -120,8 +120,11 @@ def get_article(request, type, libelle):
elif type == 'AR': elif type == 'AR':
query = "SELECT * FROM articles WHERE ref_cli2 like :libelle;" query = "SELECT * FROM articles WHERE ref_cli2 like :libelle;"
results = request.dbsession.execute(query, {'libelle': libelle + "%"}).fetchall() results = request.dbsession.execute(query, {'libelle': libelle + "%"}).fetchall()
elif type == 'REF':
query = "SELECT * FROM articles WHERE ref = :ref;"
results = request.dbsession.execute(query, {'ref': libelle}).first()
else: else:
query = "SELECT * FROM articles WHERE ref_cli2 = :ref_cli2;" query = "SELECT * FROM articles WHERE ref_cli2 = :ref;"
results = request.dbsession.execute(query, {'ref_cli2': libelle}).first() results = request.dbsession.execute(query, {'ref': libelle}).first()
return results return results

View File

@@ -193,3 +193,13 @@ def move_devis_ligne(request, nodossier, nolig, move):
# remettre le précédent ou suivant à la place de la ligne déplacée # remettre le précédent ou suivant à la place de la ligne déplacée
query = """UPDATE devis_lignes SET nolig = :nolig WHERE societe = :societe and no_id=:no_id and nolig = :max_no;""" query = """UPDATE devis_lignes SET nolig = :nolig WHERE societe = :societe and no_id=:no_id and nolig = :max_no;"""
execute_query(request, query, {'societe': societe, 'no_id': no_id, 'nolig': nolig, 'max_no': max_no}) execute_query(request, query, {'societe': societe, 'no_id': no_id, 'nolig': nolig, 'max_no': max_no})
def get_societes(request, societe):
if societe == '0':
query = "SELECT * FROM p_societe;"
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall()
else:
query = "SELECT * FROM p_societe WHERE societe = :societe;"
results = request.dbsession.execute(query, {'societe': societe}).first()
return results

View File

@@ -121,17 +121,17 @@ WHERE societe<>:societe AND C_NOM=:C_NOM AND C_ADR=:C_ADR AND C_CP=:C_CP AND C_V
return results return results
def get_docs_attaches(request, nodossier, norapport, nosection, filename): def get_docs_attaches(request, nodossier, norapport, nosection, origine, filename):
societe = nodossier[0:2] societe = nodossier[0:2]
nochantier = int(nodossier[3:]) nochantier = int(nodossier[3:])
if filename == '': if filename == '':
query = "SELECT * FROM dossier_attaches WHERE nomrep = 'DOCS_ATTACHES' AND societe = :societe AND nochantier = :nochantier AND nodossier=0 ORDER BY cree_le;" query = "SELECT * FROM dossier_attaches WHERE nomrep = 'DOCS_ATTACHES' AND societe = :societe AND nochantier = :nochantier AND nodossier=0 AND origine = :origine ORDER BY cree_le;"
else: else:
query = """SELECT * FROM dossier_attaches WHERE nomrep = 'DOCS_ATTACHES' AND societe = :societe AND nochantier = :nochantier query = """SELECT * FROM dossier_attaches WHERE nomrep = 'DOCS_ATTACHES' AND societe = :societe AND nochantier = :nochantier
AND nodossier = :norapport AND nomfichier = :filename ORDER BY cree_le;""" AND nodossier = :norapport AND origine = :origine AND nomfichier = :filename ORDER BY cree_le;"""
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'filename': filename}).fetchall() results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier,
'norapport': norapport, 'origine': origine, 'filename': filename}).fetchall()
return results return results
def get_photos(request, nodossier, norapport, nosection): def get_photos(request, nodossier, norapport, nosection):
@@ -176,18 +176,26 @@ def update_dossier(request, nodossier, new_values):
query = "CALL spUPD_CHANTIER_COORD(:societe, :nochantier);" query = "CALL spUPD_CHANTIER_COORD(:societe, :nochantier);"
execute_query(request, query, {'societe': societe, 'nochantier': nochantier}) execute_query(request, query, {'societe': societe, 'nochantier': nochantier})
def insert_dossier_attaches(request, nodossier, norapport, nosection, filename, filesize, user): def update_dossier_cloture(request, nodossier, logged_in):
societe = nodossier[0:2]
nochantier = int(nodossier[3:])
# met le montant regle à 1 centime pour terminé le dossier
query = "UPDATE dem_devis SET mtregl = 0.01, USERMAJ = :logged_in WHERE societe=:societe AND no_id=:nochantier"
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'logged_in': logged_in})
def insert_dossier_attaches(request, nodossier, norapport, nosection, origine, filename, filesize, user):
societe = nodossier[0:2] societe = nodossier[0:2]
nochantier = int(nodossier[3:]) nochantier = int(nodossier[3:])
# fichier existe ? # fichier existe ?
item = get_docs_attaches(request, nodossier, norapport, nosection, filename) item = get_docs_attaches(request, nodossier, norapport, nosection, origine, filename)
if item: if item:
return return
# enregistrer dans la table dossier_attaches # enregistrer dans la table dossier_attaches
query = """INSERT INTO dossier_attaches (nomrep, societe, nochantier, nodossier, nosection, nomfichier, taillefichier, cree_le, usermaj) query = """INSERT INTO dossier_attaches (nomrep, societe, nochantier, nodossier, nosection, origine, nomfichier, taillefichier, cree_le, usermaj)
VALUES('DOCS_ATTACHES',:societe,:nochantier,:norapport,:nosection,:filename,:filesize,NOW(),:user);""" VALUES('DOCS_ATTACHES',:societe,:nochantier,:norapport,:nosection,:origine,:filename,:filesize,NOW(),:user);"""
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'nosection': nosection, 'filename': filename, 'filesize': filesize, 'user': user}) execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport,
'nosection': nosection, 'origine': origine, 'filename': filename, 'filesize': filesize, 'user': user})
def get_rapport_by_no(request,nodossier,date_inter): def get_rapport_by_no(request,nodossier,date_inter):
societe = nodossier[0:2] societe = nodossier[0:2]
@@ -205,9 +213,9 @@ def get_rapport_by_no_id(request,no_id):
results = request.dbsession.execute(query, {'no_id': no_id}).first() results = request.dbsession.execute(query, {'no_id': no_id}).first()
return results return results
def get_articles_by_fam(request, fam): def get_articles_rdf(request):
query = "SELECT * FROM articles WHERE FAM = :fam;" query = "SELECT * FROM articles WHERE REF LIKE 'RDF%';"
results = request.dbsession.execute(query, {'fam': fam}).fetchall() results = request.dbsession.execute(query).fetchall()
return results return results
def get_rapport_rdf(request): def get_rapport_rdf(request):

View File

@@ -109,3 +109,36 @@ def delete_text(request, text_id):
"""supprimer la text""" """supprimer la text"""
query = "delete from p_texts where text_id = :text_id;" query = "delete from p_texts where text_id = :text_id;"
execute_query(request, query, {'text_id': text_id}) execute_query(request, query, {'text_id': text_id})
def get_articles_byFam(request, fam):
if fam == 'T':
query = "SELECT * FROM articles WHERE FAM = 'T';"
else:
query = "SELECT * FROM articles WHERE FAM != 'T';"
results = request.dbsession.execute(query, ).fetchall()
return results
def update_article(request, ref, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if param == 'FAM':
' ne prend que 2 premiers caractères'
new_values['FAM'] = new_values['FAM'][0:2].upper()
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if ref == '0':
query = "INSERT INTO articles SET %s" % s
else:
new_values['ref'] = ref
query = "UPDATE articles SET %s WHERE ref = :ref;" % s
execute_query(request, query, new_values)
def delete_article(request, ref):
query = "DELETE FROM articles WHERE ref = :ref ;"
execute_query(request, query, {'ref': ref})

View File

@@ -42,10 +42,12 @@ def includeme(config):
config.add_route('rdf_rapport','/rdf_rapport/{no_id}') config.add_route('rdf_rapport','/rdf_rapport/{no_id}')
config.add_route('rdf_view','/rdf_view/{no_id}') config.add_route('rdf_view','/rdf_view/{no_id}')
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}') 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}')
# parametres # parametres
config.add_route('parametres', '/parametres') config.add_route('parametres', '/parametres')
config.add_route('article_edit', '/article_edit/{ref}')
config.add_route('articles', '/articles')
config.add_route('connecter_a', '/connecter_a/{login}') config.add_route('connecter_a', '/connecter_a/{login}')
config.add_route('dashboard', '/dashboard') config.add_route('dashboard', '/dashboard')
config.add_route('emails_msg', '/emails_msg/{nolig}') config.add_route('emails_msg', '/emails_msg/{nolig}')
@@ -54,10 +56,10 @@ def includeme(config):
config.add_route('last_emailing', '/last_emailing') config.add_route('last_emailing', '/last_emailing')
config.add_route('orphans_de', '/orphans_de/{societe}') config.add_route('orphans_de', '/orphans_de/{societe}')
config.add_route('rdf_cause_edit', '/rdf_cause_edit/{code}') config.add_route('rdf_cause_edit', '/rdf_cause_edit/{code}')
config.add_route('rdf_causes_list', '/rdf_causes_list') config.add_route('rdf_causes', '/rdf_causes')
config.add_route('text_edit', '/text_edit/{text_id}') config.add_route('text_edit', '/text_edit/{text_id}')
config.add_route('text_list', '/text_list') config.add_route('text_list', '/text_list')
config.add_route('text_view', '/text_view/{text_id}') config.add_route('text_view', '/text_view/{text_id}')
config.add_route('user_edit', '/user_edit/{cd_uti}') config.add_route('user_edit', '/user_edit/{cd_uti}')
config.add_route('users_list', '/users_list') config.add_route('users', '/users')
config.add_route('users_ua', '/users_ua') config.add_route('users_ua', '/users_ua')

View File

@@ -15,7 +15,7 @@
<span class="glyphicon glyphicon-tint logo-success"></span> <span class="glyphicon glyphicon-tint logo-success"></span>
<h4>RAPPORTS RDF</h4></a> <h4>RAPPORTS RDF</h4></a>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3" tal:condition="logged_in=='CAO'">
<a href="${request.application_url}/devis_list"> <a href="${request.application_url}/devis_list">
<span class="glyphicon glyphicon-text-height logo-small"></span> <span class="glyphicon glyphicon-text-height logo-small"></span>
<h4>E-DEVIS</h4></a> <h4>E-DEVIS</h4></a>

View File

@@ -97,7 +97,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-offset-3 col-sm-9"> <div class="col-sm-offset-3 col-sm-9">
<div class="form-group"> <div class="form-group">
<a class="btn btn-default" href="${request.route_url('devis_web', nodossier=nodossier)}"> <a class="btn btn-default" href="${request.route_url('devis_web', nodevis=nodevis)}">
<span class="glyphicon glyphicon-arrow-left"></span> Annuler</a> <span class="glyphicon glyphicon-arrow-left"></span> Annuler</a>
<button class="btn btn-primary" type="submit" name="form.submited"> <button class="btn btn-primary" type="submit" name="form.submited">
<span class="glyphicon glyphicon-ok"></span> Enregistrer</button> <span class="glyphicon glyphicon-ok"></span> Enregistrer</button>

View File

@@ -3,9 +3,9 @@
<!-- ENTETE --> <!-- ENTETE -->
<img src="${logo_url}" width="100%" /> <img src="${logo_url}" width="100%" />
<br /> <br />
<div class="row"> <table style="width:100%">
<!-- colonne gauche : REFERENCES --> <tr>
<div class="col-sm-6"> <td style="width:55%">
<p tal:condition="devis.no_agrement">N° Agrément : ${devis.no_agrement}</p> <p tal:condition="devis.no_agrement">N° Agrément : ${devis.no_agrement}</p>
<br/><br/> <br/><br/>
<p tal:condition="devis.NOSIN">N° sinistre : ${devis.NOSIN}</p> <p tal:condition="devis.NOSIN">N° sinistre : ${devis.NOSIN}</p>
@@ -18,10 +18,8 @@
<p>N° dossier : ${devis.nochantier}</p> <p>N° dossier : ${devis.nochantier}</p>
<br/><br/> <br/><br/>
<H3>DEVIS N° ${devis.societe}-${devis.NO_ID}<h/H3> <H3>DEVIS N° ${devis.societe}-${devis.NO_ID}<h/H3>
</td>
</div> <td style="width:45%">
<!-- colonne droite : ADRESSES -->
<div class="col-sm-6">
<br/><br/> <br/><br/>
<h4>${devis.C_QUALITE} ${devis.C_NOM}</h4> <h4>${devis.C_QUALITE} ${devis.C_NOM}</h4>
<h4>${devis.C_ADR}</h4> <h4>${devis.C_ADR}</h4>
@@ -35,49 +33,57 @@
<h4>${devis.ADRESSE}</h4> <h4>${devis.ADRESSE}</h4>
<h4 tal:condition="devis.ADRESSE2">${devis.ADRESSE2}<br /></h4> <h4 tal:condition="devis.ADRESSE2">${devis.ADRESSE2}<br /></h4>
<h4>${devis.CP} ${devis.VILLE}</h4> <h4>${devis.CP} ${devis.VILLE}</h4>
</div> </td>
</div> <!-- row : entête--> </tr>
</table> <!-- row : entête-->
<br/> <br/>
<br/> <br/>
<div class="row"> <!-- row : entête tableau-->
<div class="col-sm-8"> <table style="width:100%">
<p class="text-right">Surf./ Qté</p> <tr>
</div> <td style="width:56%"></td>
<div class="col-sm-2"> <td style="width:8%; text-align:right">Surf./ Qté</td>
<p class="text-right">P.U. HT</p> <td style="width:18%; text-align:right">P.U. HT</td>
</div> <td style="width:18%; text-align:right">Montant HT</td>
<div class="col-sm-2"> </tr>
<p class="text-right">Montant HT</p> <tr>
</div> <td colspan="3"><hr></td>
</div> <!-- row : entête tableau--> </tr>
<div tal:replace="structure dt_html">Les lignes du devis ici</div>
<hr> <tr>
<div tal:replace="structure dt_html">Page text goes here.</div> <td colspan="3"></td>
<hr> </tr>
<tr>
<div class="row"> <td colspan="2"></td>
<div class="col-sm-7"> <td>Total HT</td>
</div> <td style="text-align:right">${layout.to_euro(devis.TOTALHT)}</td>
<div class="col-sm-2"> </tr>
<h4>Total HT</h4> <tr>
<h4>TVA ${layout.to_percent(devis.TAUXTVA)}</h4> <td colspan="2"></td>
<h4>Total TTC</h4> <td>TVA ${layout.to_percent(devis.TAUXTVA)}</td>
</div> <td style="text-align:right">${layout.to_euro(devis.TOTALTVA)}</td>
<div class="col-sm-3"> </tr>
<h4 class="text-right">${layout.to_euro(devis.TOTALHT)}</h4> <tr>
<h4 class="text-right">${layout.to_euro(devis.TOTALTVA)}</h4> <td colspan="2"></td>
<h4 class="text-right">${layout.to_euro(devis.TOTALTTC)}</h4> <td><b>Total TTC</b></td>
</div> <td style="text-align:right"><b>${layout.to_euro(devis.TOTALTTC)}</b></td>
<br /> </tr>
<div class="col-sm-12"> <tr>
<p> <td colspan="3">&nbsp;</td>
</tr>
<tr>
<td colspan="3">
Si vous acceptez ce devis, veuillez nous en retourner un exemplaire signé et précédé de la mention "Bon pour Accord". Si vous acceptez ce devis, veuillez nous en retourner un exemplaire signé et précédé de la mention "Bon pour Accord".
</p> </td>
</div> </tr>
</div> <!-- row : bas de devis--> <tr>
<div class="row"> <td colspan="3">&nbsp;</td>
<div class="col-sm-6"> </tr>
<!-- row : bas de devis-->
<tr>
<td>
<p tal:condition="devis.TYPECLI == 'P'"> <p tal:condition="devis.TYPECLI == 'P'">
<b>Conditions de réglement :</b><br /> <b>Conditions de réglement :</b><br />
Acompte de 30 % à la commande, Le solde à réception de la facture. Acompte de 30 % à la commande, Le solde à réception de la facture.
@@ -85,17 +91,17 @@
<p tal:condition="devis.CODETVA == 4"> <p tal:condition="devis.CODETVA == 4">
NOTA : Pour bénéficier du taux réduit de T.V.A. à 7%, vous devez nous fournir en même temps que l'acceptation du devis, une attestation sur papier libre, stipulant que votre habitation est construite depuis plus de deux ans. NOTA : Pour bénéficier du taux réduit de T.V.A. à 7%, vous devez nous fournir en même temps que l'acceptation du devis, une attestation sur papier libre, stipulant que votre habitation est construite depuis plus de deux ans.
</p> </p>
</div> </td>
<div class="col-sm-1"> <td></td>
</div> <td colspan="2">
<div class="col-sm-5">
<p> <p>
Le <br/> Le <br/>
Nom et Signature du Client<br/> Nom et Signature du Client<br/>
BON POUR ACCORD BON POUR ACCORD
</p> </p>
</div> </td>
</div> <!-- row : bon pour accord--> </tr>
</table>
<br /> <br />
<br /> <br />

View File

@@ -103,12 +103,7 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<!-- The form is placed inside the body of modal --> <!-- The form is placed inside the body of modal -->
<form id="add_justif-form" class="form-horizontal" action="${url}" method="post" <form id="add_justif-form" class="form-horizontal" action="${url}" method="post">
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"> <div class="form-group">
<label class="control-label col-xs-4">Sélectionner le type :</label> <label class="control-label col-xs-4">Sélectionner le type :</label>
<div class="col-xs-8"> <div class="col-xs-8">
@@ -117,11 +112,9 @@
<label class="radio"><input type="radio" name="type_lig" value="ST">Sous-total</label> <label class="radio"><input type="radio" name="type_lig" value="ST">Sous-total</label>
</div> </div>
</div> </div>
<div class="form-group"> <div class="modal-footer">
<div class="col-xs-5 col-xs-offset-3">
<button type="submit" class="btn btn-success" name="form.submited">Ajouter</button>
<button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button> <button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button>
</div> <button type="submit" class="btn btn-success" name="form.submited">Ajouter</button>
</div> </div>
</form> </form>
</div> </div>

View File

@@ -97,7 +97,12 @@
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<h4>Statut : ${dossier.STATUS}</h4> <h4>Statut : ${dossier.STATUS}</h4>
Dernière modif. le <b>${dossier.DATEMAJ.strftime('%d/%m/%Y à %H:%M')}</b> par <b>${dossier.USERMAJ}</b> <p>Dernière modif. le <b>${dossier.DATEMAJ.strftime('%d/%m/%Y à %H:%M')}</b> par <b>${dossier.USERMAJ}</b></p>
<p>
<a class="btn btn-warning" role="button" href="#"
data-toggle="modal" data-target="#confirmCloture"><span class="glyphicon glyphicon-check"></span> Clôturer dossier</a>
</p>
</div> </div>
</div> <!-- row --> </div> <!-- row -->
@@ -137,7 +142,7 @@
<p> <p>
<a class="btn btn-success" role="button" href="${request.route_url('suivi_edit', nodossier=nodossier, nolig='0')}"> <a class="btn btn-success" role="button" href="${request.route_url('suivi_edit', nodossier=nodossier, nolig='0')}">
<span class="glyphicon glyphicon-plus"></span> Nouvelle ligne</a> <span class="glyphicon glyphicon-plus"></span> Nouvelle ligne</a>
<a class="btn btn-warning" role="button" href="${request.route_url('rdv_edit', nodossier=nodossier, nolig='0')}"> <a class="btn btn-success" role="button" href="${request.route_url('rdv_edit', nodossier=nodossier, nolig='0')}">
<span class="glyphicon glyphicon-calendar"></span> Nouveau rendez-vous</a> <span class="glyphicon glyphicon-calendar"></span> Nouveau rendez-vous</a>
</p> </p>
<table class="table table-bordered table-condensed"> <table class="table table-bordered table-condensed">
@@ -210,10 +215,10 @@
<!-- PANEL DOCS ATTACHES --> <!-- PANEL DOCS ATTACHES -->
<div id="tab_attaches" class="tab-pane fade"> <div id="tab_attaches" class="tab-pane fade">
<h3>DOCUMENTS ATTACHES</h3> <h3 class="text-center">DOCUMENTS ATTACHES</h3>
<p> <p>
<a href="${request.application_url}/upload_doc/${nodossier}" class="btn btn-success" role="button"> <a href="${request.application_url}/upload_doc/${nodossier}/CLT" class="btn btn-success" role="button">
<span class="glyphicon glyphicon-cloud-upload"></span>&nbsp;Ajouter un document</a> <span class="glyphicon glyphicon-plus"></span>&nbsp;Ajouter document</a>
<a href="${request.application_url}/upload_img/${nodossier}/0" class="btn btn-primary" role="button"> <a href="${request.application_url}/upload_img/${nodossier}/0" class="btn btn-primary" role="button">
<span class="glyphicon glyphicon-picture"></span>&nbsp;Gérer les photos</a> <span class="glyphicon glyphicon-picture"></span>&nbsp;Gérer les photos</a>
</p> </p>
@@ -242,6 +247,37 @@
<td class="text-center">${detail.usermaj}</td> <td class="text-center">${detail.usermaj}</td>
</tr> </tr>
</table> </table>
<h3 class="text-center">DOCUMENTS TECHNIQUES</h3>
<p>
<a href="${request.application_url}/upload_doc/${nodossier}/FRN" class="btn btn-success" role="button">
<span class="glyphicon glyphicon-plus"></span>&nbsp;Document technique</a>
</p>
<table class="table table-bordered table-condensed">
<tr>
<th></th>
<th>Nom du fichier</th>
<th class="text-right">Taille</th>
<th>Crée le</th>
<th class="text-center">par</th>
</tr>
<tr tal:repeat="detail docs_techniques">
<td class="text-center">
<span class="glyphicon glyphicon-file" tal:condition="detail.nomfichier[-3:]=='pdf'"></span>
<span class="glyphicon glyphicon-picture" tal:condition="detail.nomfichier.lower()[-3:]=='jpg'"></span>
</td>
<td>
<a href="${docs_url}${detail.nomrep}/${detail.societe}/${detail.nochantier}/${detail.nomfichier}"
target="popup"
onclick="window.open('${docs_url}${detail.nomrep}/${detail.societe}/${detail.nochantier}/${detail.nomfichier},'popup','width=900,height=768'); return false;">
${detail.nomfichier}
</a>
</td>
<td class="text-right">${detail.taillefichier}</td>
<td>${detail.cree_le.strftime('%d-%m-%Y')}</td>
<td class="text-center">${detail.usermaj}</td>
</tr>
</table>
</div> </div>
<!-- PANEL RDF --> <!-- PANEL RDF -->
<div id="tab_rdf" class="tab-pane fade"> <div id="tab_rdf" class="tab-pane fade">
@@ -275,5 +311,29 @@
</div> </div>
<!-- Modal : Confirmation CLOTURE -->
<div class="modal fade" id="confirmCloture" role="dialog" aria-labelledby="confirmClotureLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Clôturer le dossier</h4>
</div>
<div class="modal-body">
<!-- The form is placed inside the body of modal -->
<form id="add_justif-form" class="form-horizontal" action="${url}" method="post">
<div class="form-group">
<p class="text-center"><b>Voulez-vous clôturer le dossier ?</b></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button>
<button type="submit" class="btn btn-warning" name="form.close">Clôturer</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div> </div>
</metal:block> </metal:block>

View File

@@ -6,7 +6,7 @@
<span class="glyphicon glyphicon-chevron-left"></span> Retour</a> <span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
</p> </p>
<table id="users_list" class="table table-striped table-bordered"> <table id="rdf_list" class="table table-striped table-bordered">
<thead> <thead>
<tr> <tr>
<th>Rapport</th> <th>Rapport</th>
@@ -29,7 +29,7 @@
$(document).ready(function() { $(document).ready(function() {
$.fn.dataTable.moment('DD-MM-YYYY'); $.fn.dataTable.moment('DD-MM-YYYY');
$('#users_list').DataTable({ $('#rdf_list').DataTable({
data: dataSet, data: dataSet,
pageLength: 50, pageLength: 50,
bLengthChange: false, bLengthChange: false,

View File

@@ -2,7 +2,7 @@
<div metal:fill-slot="content"> <div metal:fill-slot="content">
<div class="row"> <div class="row">
<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"
data-fv-icon-valid="glyphicon glyphicon-ok" data-fv-icon-valid="glyphicon glyphicon-ok"

View File

@@ -0,0 +1,166 @@
<metal:block use-macro="main_template">
<div metal:fill-slot="content">
<div tal:condition="message" tal:content="message" class="alert alert-danger" />
<br />
<form id="user_edit-form" class="form-horizontal" action="${url}" method="post" tal:condition="item"
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 id="tarif" class="tab-pane fade in active">
<br />
<div class="form-group">
<label class="control-label col-xs-2" for="REF">Référence</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="REF" name="REF" value="${item.REF}"
placeholder="10 caractères maximum"
data-fv-notempty="true"
data-fv-notempty-message="La référence est obligatoire"
data-fv-stringlength="true"
data-fv-stringlength-max="10"
data-fv-stringlength-message="10 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2">Famille</label>
<div class="col-xs-6">
<select class="form-control" id="FAM" name="FAM">
<tal:block tal:repeat="famille familles">
<option value="${famille}" tal:attributes="selected famille[0]==item.FAM and 'selected' or None">${famille}</option>
</tal:block>
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="LIBART">Libellé</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="LIBART" name="LIBART" value="${item.LIBART}"
placeholder="45 caractères maximum"
data-fv-notempty="true"
data-fv-notempty-message="Le libellé est obligatoire"
data-fv-stringlength="true"
data-fv-stringlength-max="45"
data-fv-stringlength-message="45 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="LIBCOMPL1">Libellé compl. 1</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="LIBCOMPL1" name="LIBCOMPL1" value="${item.LIBCOMPL1}"
placeholder="45 caractères maximum"
data-fv-stringlength="true"
data-fv-stringlength-max="45"
data-fv-stringlength-message="45 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="LIBCOMPL2">Libellé compl. 2</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="LIBCOMPL2" name="LIBCOMPL2" value="${item.LIBCOMPL2}"
placeholder="45 caractères maximum"
data-fv-stringlength="true"
data-fv-stringlength-max="45"
data-fv-stringlength-message="45 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="LIBCOMPL3">Libellé compl. 3</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="LIBCOMPL3" name="LIBCOMPL3" value="${item.LIBCOMPL3}"
placeholder="45 caractères maximum"
data-fv-stringlength="true"
data-fv-stringlength-max="45"
data-fv-stringlength-message="45 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="LIBCOMPL4">Libellé compl. 4</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="LIBCOMPL4" name="LIBCOMPL4" value="${item.LIBCOMPL4}"
placeholder="45 caractères maximum"
data-fv-stringlength="true"
data-fv-stringlength-max="45"
data-fv-stringlength-message="45 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Prix HT 1</label>
<div class="col-xs-6">
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-euro"></i></span>
<input class="form-control" type="text" id="PRIXHT1" name="PRIXHT1" value="${item.PRIXHT1}"
data-fv-numeric="true"
data-fv-numeric-message="Le montant est invalide" />
</div>
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Prix HT 2</label>
<div class="col-xs-6">
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-euro"></i></span>
<input class="form-control" type="text" id="PRIXHT2" name="PRIXHT2" value="${item.PRIXHT2}"
data-fv-numeric="true"
data-fv-numeric-message="Le montant est invalide" />
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="ref_cli1">Réf. client 1</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="ref_cli1" name="ref_cli1" value="${item.ref_cli1}"
placeholder="20 caractères maximum"
data-fv-stringlength="true"
data-fv-stringlength-max="20"
data-fv-stringlength-message="20 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="ref_cli2">Réf. client 2</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="ref_cli2" name="ref_cli2" value="${item.ref_cli2}"
placeholder="20 caractères maximum"
data-fv-stringlength="true"
data-fv-stringlength-max="20"
data-fv-stringlength-message="20 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="access">Dernière modif.</label>
<div class="col-xs-7">
<p class="form-control-static" tal:condition="item.REF != '0'">${item.modif_le.strftime('%d/%m/%Y - %H:%M')}</p>
</div>
</div>
<br />
<div class="form-group">
<div class="col-xs-offset-2 col-xs-10">
<div class="form-group">
<a class="btn btn-default" href="${request.application_url}/articles">
<span class="glyphicon glyphicon-chevron-left"></span> Annuler</a>
<button class="btn btn-primary" type="submit" name="form.submitted">
<span class="glyphicon glyphicon-ok"></span> Enregistrer</button>
<button class="btn btn-warning" type="submit" name="form.deleted"
tal:condition="item.REF != '0'">
<span class="glyphicon glyphicon-remove"></span> Supprimer</button>
</div>
</div>
</div>
</form>
<br />
<br />
<script>
$(document).ready(function() {
$('#user_edit-form').formValidation();
$('form input').on('keypress', function(e) {
return e.which !== 13;
});
});
</script>
</div>
</metal:block>

View File

@@ -0,0 +1,70 @@
<metal:block use-macro="main_template">
<div metal:fill-slot="content">
<form method="POST" id="frm" class="form-horizontal">
<div class="form-group">
<label class="control-label col-md-1">Famille : </label>
<div class="col-md-3">
<select class="form-control" id="famille" name="famille" onChange="$('#frm').submit()">
<tal:block tal:repeat="item familles">
<option value="${item}" tal:attributes="selected famille==item and 'selected' or None">${item}</option>
</tal:block>
</select>
</div>
</div>
</form>
<p>
<a href="${request.application_url}/parametres" class="btn btn-default" role="button">
<span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
<a href="${request.application_url}/article_edit/0" class="btn btn-success" role="button">
<span class="glyphicon glyphicon-plus"></span> Nouvel article</a>
</p>
<table id="articles_list" class="table table-condensed table-striped table-bordered">
<thead>
<tr>
<th>Référence</th>
<th>Libellé</th>
<th>Libellé 2</th>
<th class="text-right">Prix HT 1</th>
<th class="text-right">Prix HT 2</th>
<th>Réf. client 1</th>
<th>Réf. client 2</th>
</tr>
</thead>
</table>
<br />
<br />
<script type="text/javascript">
var dataSet = ${dt_data};
$(document).ready(function() {
$.fn.dataTable.moment('DD-MM-YYYY HH:mm');
$('#articles_list').DataTable({
data: dataSet,
pageLength: 100,
bLengthChange: false,
searching: false,
language: {
url: 'https://cdn.datatables.net/plug-ins/1.10.16/i18n/French.json'
},
columnDefs: [
{ className: "text-right", "targets": [3,4] },
{ targets: 0,
render: function (data, type, full, meta) {
// ajouter un link vers le formulaire
return '<a href="/article_edit/' + data + '">' + data + '</a>';
},
},
]
});
});
</script>
</div><!-- content -->
</metal:block>

View File

@@ -1,18 +1,22 @@
<metal:block use-macro="main_template"> <metal:block use-macro="main_template">
<div metal:fill-slot="content"> <div metal:fill-slot="content">logged_in
<div id="jquery" class="container-fluid"> <div id="jquery" class="container-fluid">
<div class="row text-center"> <div class="row text-center">
<div class="col-sm-3"> <div class="col-sm-3">
<a href="${request.application_url}/users_list"><span class="glyphicon glyphicon-user logo-primary"></span></a> <a href="${request.application_url}/users"><span class="glyphicon glyphicon-user logo-primary"></span></a>
<h4>UTILISATEURS</h4> <h4>UTILISATEURS</h4>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<a href="${request.application_url}/rdf_causes_list"><span class="glyphicon glyphicon-tint logo-primary"></span></a> <a href="${request.application_url}/articles"><span class="glyphicon glyphicon-list logo-primary"></span></a>
<h4>ARTICLES</h4>
</div>
<div class="col-sm-3">
<a href="${request.application_url}/rdf_causes"><span class="glyphicon glyphicon-list logo-primary"></span></a>
<h4>RDF : CAUSES</h4> <h4>RDF : CAUSES</h4>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<a href="${request.application_url}/text_list"><span class="glyphicon glyphicon-list-alt logo-primary"></span></a> <a href="${request.application_url}/text_list"><span class="glyphicon glyphicon-list logo-primary"></span></a>
<h4>TEXTES EMAIL</h4> <h4>TEXTES EMAIL</h4>
</div> </div>
</div> </div>

View File

@@ -44,7 +44,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-offset-3 col-sm-9"> <div class="col-sm-offset-3 col-sm-9">
<a class="btn btn-default" href="${request.route_url('rdf_causes_list')"> <a class="btn btn-default" href="${request.route_url('rdf_causes')">
<span class="glyphicon glyphicon-arrow-left"></span> Annuler</a> <span class="glyphicon glyphicon-arrow-left"></span> Annuler</a>
<button class="btn btn-primary" type="submit" name="form.submitted"> <button class="btn btn-primary" type="submit" name="form.submitted">
<span class="glyphicon glyphicon-ok"></span> Enregistrer</button> <span class="glyphicon glyphicon-ok"></span> Enregistrer</button>

View File

@@ -8,7 +8,7 @@
<span class="glyphicon glyphicon-plus"></span> Nouvelle cause</a> <span class="glyphicon glyphicon-plus"></span> Nouvelle cause</a>
</p> </p>
<table id="rdf_causes_list" class="table table-striped table-bordered"> <table id="rdf_causes" class="table table-striped table-bordered">
<thead> <thead>
<tr> <tr>
<th>Code</th> <th>Code</th>
@@ -26,7 +26,7 @@
$(document).ready(function() { $(document).ready(function() {
$.fn.dataTable.moment('DD/MM/YYYY - HH:mm'); $.fn.dataTable.moment('DD/MM/YYYY - HH:mm');
$('#rdf_causes_list').DataTable({ $('#rdf_causes').DataTable({
data: dataSet, data: dataSet,
pageLength: 50, pageLength: 50,
bLengthChange: false, bLengthChange: false,

View File

@@ -92,7 +92,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-offset-3 col-sm-9"> <div class="col-sm-offset-3 col-sm-9">
<div class="form-group"> <div class="form-group">
<a class="btn btn-default" href="/users_list"><span class="glyphicon glyphicon-chevron-left"></span> Retour</a> <a class="btn btn-default" href="/users"><span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
<button class="btn btn-primary" type="submit" name="form.submitted"> <button class="btn btn-primary" type="submit" name="form.submitted">
<span class="glyphicon glyphicon-ok"></span> Enregistrer</button> <span class="glyphicon glyphicon-ok"></span> Enregistrer</button>
<button class="btn btn-danger" type="submit" name="form.deleted" <button class="btn btn-danger" type="submit" name="form.deleted"

View File

@@ -8,7 +8,7 @@
<span class="glyphicon glyphicon-plus"></span> Nouveau utilisateur</a> <span class="glyphicon glyphicon-plus"></span> Nouveau utilisateur</a>
</p> </p>
<table id="users_list_ua" class="table table-striped table-bordered"> <table id="users_ua" class="table table-striped table-bordered">
<thead> <thead>
<tr> <tr>
<th>Dern cnx</th> <th>Dern cnx</th>
@@ -27,7 +27,7 @@
$(document).ready(function() { $(document).ready(function() {
$.fn.dataTable.moment('DD/MM/YYYY - HH:mm'); $.fn.dataTable.moment('DD/MM/YYYY - HH:mm');
$('#users_list_ua').DataTable({ $('#users_ua').DataTable({
data: dataSet, data: dataSet,
pageLength: 50, pageLength: 50,
bLengthChange: false, bLengthChange: false,

View File

@@ -82,6 +82,7 @@ def home(request):
'page_title': 'Bienvenue sur %s' % request.host, 'page_title': 'Bienvenue sur %s' % request.host,
'project': 'mondumas', 'project': 'mondumas',
'access': access, 'access': access,
'logged_in': logged_in,
} }
@view_config(route_name='envoyer_mdp', renderer='../templates/default/envoyer_mdp.pt') @view_config(route_name='envoyer_mdp', renderer='../templates/default/envoyer_mdp.pt')
@@ -338,12 +339,12 @@ def ajax_article(request):
ref = request.GET['ref'] ref = request.GET['ref']
# lire l'article # lire l'article
items = get_article(request, 'REF', ref) items = get_article(request, 'REF2', ref)
# puis retourne son libellé et son prixht # puis retourne son libellé et son prixht
liste=[] liste=[]
d = {} d = {}
d['ref'] = items.ref_cli2 d['ref'] = items.ref_cli2
d['libelle'] = items.LIBART d['libelle'] = items.libelle
d['prixht'] = "%.2f" % items.PRIXHT2 d['prixht'] = "%.2f" % items.PRIXHT2
liste.append(d) liste.append(d)

View File

@@ -135,6 +135,9 @@ def devis_web(request):
return HTTPFound(request.route_url("devis_ligne", type_ligne=type_lig, nodevis=nodevis, nolig='0')) return HTTPFound(request.route_url("devis_ligne", type_ligne=type_lig, nodevis=nodevis, nolig='0'))
if 'form.generate' in request.params: if 'form.generate' in request.params:
# lire la societe
soc = get_societes(request, societe)
options = { options = {
'page-size': 'A4', 'page-size': 'A4',
'margin-top': '1cm', 'margin-top': '1cm',
@@ -142,7 +145,8 @@ def devis_web(request):
'margin-bottom': '1cm', 'margin-bottom': '1cm',
'margin-left': '1cm', 'margin-left': '1cm',
'footer-font-size':'7', 'footer-font-size':'7',
'footer-right': '[page] of [topage]', 'footer-center': soc.code_ape,
'footer-right': '[page] / [topage]',
} }
# créer le répertoire du chantier s'il n'existe pas encore # créer le répertoire du chantier s'il n'existe pas encore
@@ -151,7 +155,7 @@ def devis_web(request):
# générer le devis en PDF # générer le devis en PDF
filename = "%s-DD%s-DE%s-devis.pdf" % (societe, nochantier, no_id) filename = "%s-DD%s-DE%s-devis.pdf" % (societe, nochantier, no_id)
dest = "mondumas/static/DEVFAC/DOCS_ATTACHES/%s/%s/%s" % (societe, nochantier, filename) dest = "mondumas/static/DEVFAC/DOCS_ATTACHES/%s/%s/%s" % (societe, nochantier, filename)
import pdb;pdb.set_trace() # import pdb;pdb.set_trace()
# supprimer le fichier s'il existe déjà # supprimer le fichier s'il existe déjà
if os.path.exists(dest): if os.path.exists(dest):
@@ -166,10 +170,10 @@ def devis_web(request):
config = pdfkit.configuration(wkhtmltopdf="C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe") config = pdfkit.configuration(wkhtmltopdf="C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe")
pdfkit.from_url(origin, dest, configuration=config, options=options) pdfkit.from_url(origin, dest, configuration=config, options=options)
insert_dossier_attaches(request, '%s-%s' % (societe, nochantier), 0, 0, filename, '160 Ko', logged_in) insert_dossier_attaches(request, '%s-%s' % (societe, nochantier), 0, 0, 'CLT', filename, '160 Ko', logged_in)
request.session.flash(u"Le devis a été généré avec succès.", 'success') request.session.flash(u"Le devis a été généré avec succès.", 'success')
return HTTPFound(location=request.route_url('devis_web', nodevis=nodevis)) return HTTPFound(location=request.route_url('dossier_view', nodossier='%s-%s' % (societe, nochantier)))
return { return {
'page_title': "Devis no : %s W" % (nodevis), 'page_title': "Devis no : %s W" % (nodevis),
@@ -184,20 +188,20 @@ def devis_web(request):
@view_config(route_name='devis_ligne', renderer='../templates/devis/devis_ligne.pt', permission='view') @view_config(route_name='devis_ligne', renderer='../templates/devis/devis_ligne.pt', permission='view')
def devis_ligne(request): def devis_ligne(request):
type_ligne = request.matchdict['type_ligne'] type_ligne = request.matchdict['type_ligne']
nodossier = request.matchdict['nodossier'] nodevis = request.matchdict['nodevis']
nolig = request.matchdict['nolig'] nolig = request.matchdict['nolig']
societe = nodossier[0:2] societe = nodevis[0:2]
no_id = nodossier[5:] no_id = nodevis[5:]
url = request.route_url("devis_ligne", type_ligne=type_ligne, nodossier=nodossier, nolig=nolig) url = request.route_url("devis_ligne", type_ligne=type_ligne, nodevis=nodevis, nolig=nolig)
logged_in = request.authenticated_userid.upper() logged_in = request.authenticated_userid.upper()
message = '' message = ''
dossier = get_devis_by_no(request, nodossier) dossier = get_devis_by_no(request, nodevis)
if dossier is None: if dossier is None:
request.session.flash(u"Le document no %s est introuvable" % (nodossier), 'danger') request.session.flash(u"Le document no %s est introuvable" % (nodevis), 'danger')
return HTTPFound(location=request.route_url("dossier_lookup")) return HTTPFound(location=request.route_url("dossier_lookup"))
# lire le nombre total de lignes du devis # lire le nombre total de lignes du devis
lignes = get_devis_lignes_by_no(request, nodossier, '0') lignes = get_devis_lignes_by_no(request, nodevis, '0')
nb_lignes = len(lignes) nb_lignes = len(lignes)
if nolig == '0': if nolig == '0':
@@ -218,7 +222,7 @@ def devis_ligne(request):
page_title= 'Nouvelle ligne %s' % type_ligne page_title= 'Nouvelle ligne %s' % type_ligne
else: else:
# lire la ligne du devis # lire la ligne du devis
ligne = get_devis_lignes_by_no(request, nodossier, nolig) ligne = get_devis_lignes_by_no(request, nodevis, nolig)
page_title= "Modification de la ligne %s" % (nolig) page_title= "Modification de la ligne %s" % (nolig)
# import pdb;pdb.set_trace() # import pdb;pdb.set_trace()
@@ -239,9 +243,9 @@ def devis_ligne(request):
new_values['nolig'] = nb_lignes + 1 new_values['nolig'] = nb_lignes + 1
else: else:
new_values['nolig'] = nolig new_values['nolig'] = nolig
update_devis_ligne(request, nodossier, nolig, new_values) update_devis_ligne(request, nodevis, nolig, new_values)
request.session.flash("La ligne de texte a été mis à jour avec succès.", 'success') request.session.flash("La ligne de texte a été mis à jour avec succès.", 'success')
return HTTPFound(location=request.route_url("devis_web", nodossier=nodossier)) return HTTPFound(location=request.route_url("devis_web", nodevis=nodevis))
elif type_ligne == 'AR': elif type_ligne == 'AR':
# ajout d'un article # ajout d'un article
@@ -282,22 +286,22 @@ def devis_ligne(request):
new_values['nolig'] = nb_lignes + 1 new_values['nolig'] = nb_lignes + 1
else: else:
new_values['nolig'] = nolig new_values['nolig'] = nolig
update_devis_ligne(request, nodossier, nolig, new_values) update_devis_ligne(request, nodevis, nolig, new_values)
request.session.flash(u"La ligne de devis a été mis à jour avec succès.", 'success') request.session.flash(u"La ligne de devis a été mis à jour avec succès.", 'success')
return HTTPFound(location=request.route_url("devis_web", nodossier=nodossier)) return HTTPFound(location=request.route_url("devis_web", nodevis=nodevis))
# -- ajouter une ligne # -- ajouter une ligne
if 'form.deleted' in request.params: if 'form.deleted' in request.params:
delete_devis_ligne(request, nodossier, nolig) delete_devis_ligne(request, nodevis, nolig)
request.session.flash(u"La ligne de devis a été supprimée avec succès.", 'success') request.session.flash(u"La ligne de devis a été supprimée avec succès.", 'success')
return HTTPFound(location=request.route_url("devis_web", nodossier=nodossier)) return HTTPFound(location=request.route_url("devis_web", nodevis=nodevis))
return { return {
'page_title': page_title, 'page_title': page_title,
'url': url, 'url': url,
'message': message, 'message': message,
'nodossier': nodossier, 'nodevis': nodevis,
'nolig': nolig, 'nolig': nolig,
'dossier': dossier, 'dossier': dossier,
'ligne': ligne, 'ligne': ligne,
@@ -328,22 +332,22 @@ def devis_preview(request):
dt_html = '' dt_html = ''
for ligne in details: for ligne in details:
if ligne.ref == 'T1': if ligne.ref == 'T1':
dt_html += '<h4 class="text-center">%s</h4>' % ligne.libelle dt_html += '<tr><td colspan="3" style="text-align:center;"><h4>%s</h4></td></tr>' % ligne.libelle
elif ligne.ref == 'T2': elif ligne.ref == 'T2':
dt_html += '<p><b>%s</b></p>' % ligne.libelle dt_html += '<tr><td colspan="3"><p><b>%s</b></p></td></tr>' % ligne.libelle
elif ligne.ref == 'TX': elif ligne.ref == 'TX':
dt_html += '<div class="col-sm-7"><p>%s</p></div>' % ligne.libelle dt_html += '<tr><td colspan="3"><p>%s</p></td></tr>' % ligne.libelle
elif ligne.type_ligne == 'AR': elif ligne.type_ligne == 'AR':
dt_html += '<div class="col-sm-7"><p>%s<br />' % ligne.libelle dt_html += '<tr><td><p>%s<br />' % ligne.libelle
if ligne.metrage: if ligne.metrage:
dt_html += '<i>%s</i><br />' % ligne.metrage dt_html += ligne.metrage
if ligne.deduction: if ligne.deduction:
dt_html += 'déduction :<br />' dt_html += '<br />déduction :<br />'
dt_html += '<i>%s</i><br />' % ligne.deduction dt_html += '<i>%s</i>' % ligne.deduction
dt_html += '</p></div>' dt_html += '</td>'
dt_html += '<div class="col-sm-1"><p class="text-right">%s</p></div>' % ligne.qte dt_html += '<td style="text-align:right; vertical-align:top">%s</td>' % ligne.qte
dt_html += '<div class="col-sm-2"><p class="text-right">%s</p></div>' % to_euro(ligne.prixht) dt_html += '<td style="text-align:right; vertical-align:top">%s</td>' % to_euro(ligne.prixht)
dt_html += '<div class="col-sm-2"><p class="text-right">%s</p></div>' % to_euro(ligne.mtht) dt_html += '<td style="text-align:right; vertical-align:top">%s</td></tr>' % to_euro(ligne.mtht)
return { return {
'page_title': '', 'page_title': '',

View File

@@ -96,6 +96,8 @@ def dossier_view(request):
nodossier = request.matchdict['nodossier'] nodossier = request.matchdict['nodossier']
societe = nodossier[0:2] societe = nodossier[0:2]
logged_in = request.authenticated_userid.upper() logged_in = request.authenticated_userid.upper()
url = request.route_url('dossier_view', nodossier=nodossier)
# lire son niveau d'accès # lire son niveau d'accès
member = get_member_by_id(request, logged_in) member = get_member_by_id(request, logged_in)
access = member.access access = member.access
@@ -108,12 +110,14 @@ def dossier_view(request):
return HTTPFound(location=request.route_url("dossier_lookup")) return HTTPFound(location=request.route_url("dossier_lookup"))
# lire tous le suivi du dossier # lire tous le suivi du dossier
details = get_dossier_rdv_by_no(request, nodossier, '0') details = get_dossier_rdv_by_no(request, nodossier, '0')
# lire toutes les dossiers du chantiers # lire toutes les devis et factures du chantier
documents = get_documents_byChantier(request, nodossier) documents = get_documents_byChantier(request, nodossier)
# lire toutes les dossiers similaires # lire toutes les dossiers similaires
similaires = get_similaires_byChantier(request, dossier.societe, dossier.C_NOM, dossier.C_ADR, dossier.C_CP, dossier.C_VILLE) similaires = get_similaires_byChantier(request, dossier.societe, dossier.C_NOM, dossier.C_ADR, dossier.C_CP, dossier.C_VILLE)
# lire tous les documents attachés # lire tous les documents attachés
docs_attaches = get_docs_attaches(request, nodossier, 0, 0, '') docs_attaches = get_docs_attaches(request, nodossier, 0, 0, 'CLT', '')
# lire tous les documents techniques
docs_techniques = get_docs_attaches(request, nodossier, 0, 0, 'FRN', '')
if nodossier.startswith('PL'): if nodossier.startswith('PL'):
# lire rapport de rdf # lire rapport de rdf
rapports = get_rapport_by_no(request, nodossier, '') rapports = get_rapport_by_no(request, nodossier, '')
@@ -122,8 +126,14 @@ def dossier_view(request):
# select background color according to society # select background color according to society
bg_color = "bg-%s" % societe bg_color = "bg-%s" % societe
if 'form.close' in request.params:
update_dossier_cloture(request, nodossier, logged_in)
request.session.flash(u"Le dossier a été cloturé avec succès.", 'success')
return HTTPFound(location=request.route_url('dossier_view', nodossier=nodossier))
return { return {
'page_title': "Dossier : %s" % (nodossier), 'page_title': "Dossier : %s" % (nodossier),
'url': url,
'nodossier': nodossier, 'nodossier': nodossier,
'dossier': dossier, 'dossier': dossier,
'details': details, 'details': details,
@@ -131,6 +141,7 @@ def dossier_view(request):
'documents': documents, 'documents': documents,
'similaires': similaires, 'similaires': similaires,
'docs_attaches': docs_attaches, 'docs_attaches': docs_attaches,
'docs_techniques': docs_techniques,
'docs_url': request.static_url(request.registry.settings['mondumas.devfac_url']), 'docs_url': request.static_url(request.registry.settings['mondumas.devfac_url']),
'bg_color': bg_color, 'bg_color': bg_color,
'access': access, 'access': access,
@@ -264,10 +275,16 @@ def dossier_edit(request):
def upload_doc(request): def upload_doc(request):
logged_in = request.authenticated_userid.upper() logged_in = request.authenticated_userid.upper()
nodossier = request.matchdict['nodossier'] nodossier = request.matchdict['nodossier']
origine = request.matchdict['origine']
if origine == 'CLT':
page_title = "Télécharger un document attaché"
else:
page_title = "Télécharger un document technique"
societe = nodossier[0:2] societe = nodossier[0:2]
nochantier = nodossier[3:] nochantier = nodossier[3:]
url = request.route_url("upload_doc", nodossier=nodossier) url = request.route_url("upload_doc", nodossier=nodossier, origine=origine)
message = "" message = ""
dossier = get_dossier_by_no(request, nodossier) dossier = get_dossier_by_no(request, nodossier)
@@ -276,7 +293,7 @@ def upload_doc(request):
return HTTPFound(location=request.route_url("dossier_lookup")) return HTTPFound(location=request.route_url("dossier_lookup"))
# lire tous les documents attachés # lire tous les documents attachés
docs_attaches = get_docs_attaches(request, nodossier, 0, 0, '') docs_attaches = get_docs_attaches(request, nodossier, 0, 0, origine, '')
if 'form.submitted' in request.params: if 'form.submitted' in request.params:
# récupère le fichier download dans le dossier /tmp # récupère le fichier download dans le dossier /tmp
@@ -290,14 +307,14 @@ def upload_doc(request):
# fabriquer le nom du document # fabriquer le nom du document
filename = '%s-DD%s-%s' % (societe, nochantier, input_name) filename = '%s-DD%s-%s' % (societe, nochantier, input_name)
tempFile2Dossier(request, societe, nochantier, '0', 0, temp_file, filename, logged_in) tempFile2Dossier(request, societe, nochantier, '0', 0, origine, temp_file, filename, logged_in)
request.session.flash('%s : Ce fichier est téléchargé avec succès.' % input_name, 'success') request.session.flash('%s : Ce fichier est téléchargé avec succès.' % input_name, 'success')
# lire tous les documents attachés # lire tous les documents attachés
docs_attaches = get_docs_attaches(request, nodossier, 0, 0, '') docs_attaches = get_docs_attaches(request, nodossier, 0, 0, origine, '')
return { return {
'page_title': "Télécharger un document", 'page_title': page_title,
'url': url, 'url': url,
'nodossier': nodossier, 'nodossier': nodossier,
'dossier': dossier, 'dossier': dossier,
@@ -356,7 +373,7 @@ def upload_img(request):
# fabriquer le nom du rapport # fabriquer le nom du rapport
filename = '%s-DD%s-%s-%s' % (societe, nochantier, norapport, input_name) filename = '%s-DD%s-%s-%s' % (societe, nochantier, norapport, input_name)
tempFile2Dossier(request, societe, nochantier, norapport, nosection, temp_file, filename, logged_in) tempFile2Dossier(request, societe, nochantier, norapport, nosection, 'CLT', temp_file, filename, logged_in)
request.session.flash('%s : Ce fichier est téléchargé avec succès.' % input_name, 'success') request.session.flash('%s : Ce fichier est téléchargé avec succès.' % input_name, 'success')
@@ -594,7 +611,7 @@ def rdf_view(request):
'margin-bottom': '3cm', 'margin-bottom': '3cm',
'margin-left': '2cm', 'margin-left': '2cm',
'footer-font-size':'7', 'footer-font-size':'7',
'footer-right': '[page] of [topage]', 'footer-right': '[page] / [topage]',
} }
# créer le répertoire du rapport s'il n'existe pas encore # créer le répertoire du rapport s'il n'existe pas encore
@@ -604,6 +621,10 @@ def rdf_view(request):
filename = "PL-DD%s-rapport_RDF_no_%s.pdf" % (str(rapport.nochantier), norapport) filename = "PL-DD%s-rapport_RDF_no_%s.pdf" % (str(rapport.nochantier), norapport)
dest = "mondumas/static/DEVFAC/DOCS_ATTACHES/PL/%s/%s" % (str(rapport.nochantier), filename) dest = "mondumas/static/DEVFAC/DOCS_ATTACHES/PL/%s/%s" % (str(rapport.nochantier), filename)
# supprimer le fichier s'il existe déjà
if os.path.exists(dest):
os.remove(dest)
# developpement ou production # developpement ou production
if request.registry.settings["mail.username"] == "sas.dumas@orange.fr": if request.registry.settings["mail.username"] == "sas.dumas@orange.fr":
origin = 'https://gestion.entreprise-dumas.com/rdf_rapport/%s' % norapport origin = 'https://gestion.entreprise-dumas.com/rdf_rapport/%s' % norapport
@@ -613,7 +634,7 @@ def rdf_view(request):
config = pdfkit.configuration(wkhtmltopdf="C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe") config = pdfkit.configuration(wkhtmltopdf="C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe")
pdfkit.from_url(origin, dest, configuration=config, options=options) pdfkit.from_url(origin, dest, configuration=config, options=options)
insert_dossier_attaches(request, nodossier, 0, 0, filename, '160 Ko', logged_in) insert_dossier_attaches(request, nodossier, 0, 0, 'CLT', filename, '160 Ko', logged_in)
# si generation pdf, maj de la date du rapport # si generation pdf, maj de la date du rapport
new_values = {} new_values = {}
new_values['date_rapport'] = date.today() new_values['date_rapport'] = date.today()
@@ -725,7 +746,7 @@ def rdf_bill(request):
return HTTPFound(location=request.route_url('rdf_view', no_id=norapport)) return HTTPFound(location=request.route_url('rdf_view', no_id=norapport))
# lire tous les articles RDF # lire tous les articles RDF
articles = get_articles_by_fam(request, 'RDF') articles = get_articles_rdf(request)
article = 'RDF1' article = 'RDF1'
if 'form.submitted' in request.params: if 'form.submitted' in request.params:
@@ -870,7 +891,7 @@ def demandes(request):
# récupère le nom du fichier et ajouter le no de dossier # récupère le nom du fichier et ajouter le no de dossier
filename = os.path.basename(temp_file_path) filename = os.path.basename(temp_file_path)
filename = '%s-DD%s-%s' % (societe, nochantier, filename) filename = '%s-DD%s-%s' % (societe, nochantier, filename)
tempFile2Dossier(request, societe, nochantier, '0', 0, temp_file_path, filename, 'EMAIL') tempFile2Dossier(request, societe, nochantier, '0', 0, 'CLT', temp_file_path, filename, 'EMAIL')
traite = 1 traite = 1
return traite return traite
@@ -890,7 +911,7 @@ def demandes(request):
# récupère le nom du fichier et ajouter le no de dossier # 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') filename = '%s-DD%s-%s' % (societe, dem_devis.NO_ID, 'ANNULATION.pdf')
tempFile2Dossier(request, societe, dem_devis.NO_ID, '0', 0, temp_file_path, filename, 'EMAIL') tempFile2Dossier(request, societe, dem_devis.NO_ID, '0', 0, 'CLT', temp_file_path, filename, 'EMAIL')
# insérer une ligne de suivi ANNULATION # insérer une ligne de suivi ANNULATION
insert_suivi(request, nodossier, '!!MISSION ANNULEE PAR la MAIF') insert_suivi(request, nodossier, '!!MISSION ANNULEE PAR la MAIF')
# log de nuit # log de nuit
@@ -908,7 +929,7 @@ def demandes(request):
# récupère le nom du fichier et ajouter le no de dossier # 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') filename = '%s-DD%s-%s' % (societe, dem_devis.NO_ID, 'ANNULATION.pdf')
tempFile2Dossier(request, societe, dem_devis.NO_ID, '0', 0, temp_file_path, filename, 'EMAIL') tempFile2Dossier(request, societe, dem_devis.NO_ID, '0', 0, 'CLT', temp_file_path, filename, 'EMAIL')
# insérer une ligne de suivi ANNULATION # insérer une ligne de suivi ANNULATION
insert_suivi(request, nodossier, '!!MISSION ANNULEE PAR DOMUS') insert_suivi(request, nodossier, '!!MISSION ANNULEE PAR DOMUS')
# log de nuit # log de nuit
@@ -1083,7 +1104,7 @@ def downloadFile2Temp(input_file, input_name, ext_allowed):
return temp_file_path return temp_file_path
def tempFile2Dossier(request, societe, nochantier, norapport, nosection, temp_file, filename, logged_in): def tempFile2Dossier(request, societe, nochantier, norapport, nosection, origine, temp_file, filename, logged_in):
# créer le répertoire du chantier # créer le répertoire du chantier
if norapport == '0': if norapport == '0':
path = '%s/%s/%s' % (request.registry.settings['mondumas.devfac_dir'], societe, nochantier) path = '%s/%s/%s' % (request.registry.settings['mondumas.devfac_dir'], societe, nochantier)
@@ -1100,7 +1121,7 @@ def tempFile2Dossier(request, societe, nochantier, norapport, nosection, temp_fi
shutil.move(temp_file, filepath) shutil.move(temp_file, filepath)
filesize = round(os.path.getsize(filepath) / 1024) filesize = round(os.path.getsize(filepath) / 1024)
insert_dossier_attaches(request, '%s-%s' % (societe, nochantier), norapport, nosection, filename, '%s Ko' % str(filesize), logged_in) insert_dossier_attaches(request, '%s-%s' % (societe, nochantier), norapport, nosection, origine, filename, '%s Ko' % str(filesize), logged_in)
def download_pdf_to_tmp(email_message): def download_pdf_to_tmp(email_message):
# downloading attachments # downloading attachments

View File

@@ -43,8 +43,8 @@ def infrastructure(request):
'logged_in': logged_in, 'logged_in': logged_in,
} }
@view_config(route_name='users_list', renderer='../templates/parametres/users_list.pt', permission='manage') @view_config(route_name='users', renderer='../templates/parametres/users.pt', permission='manage')
def users_list(request): def users(request):
# lire les utilisateurs # lire les utilisateurs
items = get_member_by_id(request, '0') items = get_member_by_id(request, '0')
@@ -132,7 +132,7 @@ def user_edit(request):
individu = get_member_by_id(request, cd_uti) individu = get_member_by_id(request, cd_uti)
if not individu: if not individu:
request.session.flash(u"Utilisateur non trouvé : %s" % cd_uti, 'warning') request.session.flash(u"Utilisateur non trouvé : %s" % cd_uti, 'warning')
return HTTPFound(location=request.route_url('users_list')) return HTTPFound(location=request.route_url('users'))
page_title= "Fiche de %s" %(individu.NOM) page_title= "Fiche de %s" %(individu.NOM)
lienmdp = '%s/%s' % (individu.CD_UTI, date.today().strftime('%d%m%Y')) lienmdp = '%s/%s' % (individu.CD_UTI, date.today().strftime('%d%m%Y'))
@@ -151,12 +151,12 @@ def user_edit(request):
if new_values: if new_values:
update_membre(request, cd_uti, new_values) update_membre(request, cd_uti, new_values)
request.session.flash(u"La fiche a été mise à jour avec succès.", 'success') request.session.flash(u"La fiche a été mise à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('users_list')) return HTTPFound(location=request.route_url('users'))
if 'form.deleted' in request.params: if 'form.deleted' in request.params:
delete_membre(request, cd_uti) delete_membre(request, cd_uti)
request.session.flash(u"La fiche a été supprimée avec succès.", 'success') request.session.flash(u"La fiche a été supprimée avec succès.", 'success')
return HTTPFound(location=request.route_url('users_list')) return HTTPFound(location=request.route_url('users'))
return { return {
'page_title': page_title, 'page_title': page_title,
@@ -261,8 +261,8 @@ def orphans_de(request):
'nochantier': nochantier, 'nochantier': nochantier,
} }
@view_config(route_name='rdf_causes_list', renderer='../templates/parametres/rdf_causes_list.pt', permission='manage') @view_config(route_name='rdf_causes', renderer='../templates/parametres/rdf_causes.pt', permission='manage')
def rdf_causes_list(request): def rdf_causes(request):
# lire les causes des RDF # lire les causes des RDF
items = get_rdf_causes_by_id(request, '0') items = get_rdf_causes_by_id(request, '0')
@@ -300,19 +300,19 @@ def rdf_cause_edit(request):
cause = get_rdf_causes_by_id(request, old_code) cause = get_rdf_causes_by_id(request, old_code)
if not cause: if not cause:
request.session.flash(u"Cause non trouvée : %s" % old_code, 'warning') request.session.flash(u"Cause non trouvée : %s" % old_code, 'warning')
return HTTPFound(location=request.route_url('rdf_causes_list')) return HTTPFound(location=request.route_url('rdf_causes'))
if 'form.submitted' in request.params: if 'form.submitted' in request.params:
code = request.params['code'] code = request.params['code']
libelle = request.params['libelle'] libelle = request.params['libelle']
update_rdf_cause(request, old_code, code, libelle) update_rdf_cause(request, old_code, code, libelle)
request.session.flash(u"La cause a été mise à jour avec succès.", 'success') request.session.flash(u"La cause a été mise à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('rdf_causes')) return HTTPFound(location=request.route_url('rdf_causes'))
if 'form.deleted' in request.params: if 'form.deleted' in request.params:
delete_rdf_cause(request, old_code) delete_rdf_cause(request, old_code)
request.session.flash(u"La cause a été supprimée avec succès.", 'success') request.session.flash(u"La cause a été supprimée avec succès.", 'success')
return HTTPFound(location=request.route_url('rdf_causes')) return HTTPFound(location=request.route_url('rdf_causes'))
return { return {
@@ -356,7 +356,7 @@ def emails_msg(request):
# lire le message # lire le message
item = get_emails_sent(request, '', nolig) item = get_emails_sent(request, '', nolig)
if not item: if not item:
request.session.flash("Impossible de lire le message %s" % nolig, 'damger') request.session.flash("Impossible de lire le message %s" % nolig, 'damger')
return HTTPFound(location=request.route_url('rdf_causes')) return HTTPFound(location=request.route_url('rdf_causes'))
return { return {
@@ -442,3 +442,89 @@ def text_view(request):
'page_title': intitule, 'page_title': intitule,
'texte': texte, 'texte': texte,
'text_id': text_id, 'text_id': text_id,
}
@view_config(route_name='articles', renderer='../templates/parametres/articles.pt', permission='manage')
def articles(request):
familles = ["Article", "Texte"]
famille = 'ARticle'
# si table a changé
if 'famille' in request.params:
famille = request.params["famille"]
# lire les articles
items = get_articles_byFam(request, famille[0])
# construire la liste
liste=[]
for item in items:
d = (item.REF, item.LIBART, item.LIBCOMPL1, to_euro(item.PRIXHT1), to_euro(item.PRIXHT2), item.ref_cli1, item.ref_cli2)
liste.append(d)
return {
'page_title': 'Liste des articles',
'dt_data': json.dumps(liste),
'familles': familles,
'famille': famille,
}
@view_config(route_name='article_edit', renderer='../templates/parametres/article_edit.pt', permission='manage')
def article_edit(request):
ref = request.matchdict['ref']
url = request.route_url('article_edit', ref=ref)
logged_in = request.authenticated_userid
message = ''
familles = ["Article", "Texte"]
if ref == '0':
# nouveau
item = {}
item['REF'] = '0'
item['FAM'] = 'A'
item['LIBART'] = ''
item['PRIXHT1'] = 0
item['PRIXHT2'] = 0
item['ref_cli1'] = ''
item['ref_cli2'] = ''
item['LIBCOMPL1'] = ''
item['LIBCOMPL2'] = ''
item['LIBCOMPL3'] = ''
item['LIBCOMPL4'] = ''
page_title= 'Nouvel article'
else:
# lire l'article
item = get_article(request, 'REF', ref)
if not item:
request.session.flash("article non trouvé : %s" % ref, 'warning')
return HTTPFound(location=request.route_url('articles'))
page_title= "article : %s - %s" %(item.REF, item.LIBART)
if 'form.submitted' in request.params:
new_ref = request.params["REF"]
if new_ref == '0':
message = "Veuillez saisir un code article valide."
else:
new_values = {}
for param, db_value in item.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
if new_values:
update_article(request, ref, new_values)
request.session.flash("Le article a été mis à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('articles'))
if 'form.deleted' in request.params:
delete_article(request, ref)
request.session.flash("Le article a été supprimé avec succès.", 'success')
return HTTPFound(location=request.route_url('articles'))
return {
'page_title': page_title,
'url': url,
'message': message,
'item': item,
'familles': familles,