ajout Doc techniques dans dossier_view.pt et articles.pt
This commit is contained in:
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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})
|
||||||
|
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -3,99 +3,105 @@
|
|||||||
<!-- 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>
|
||||||
<p tal:condition="devis.NOPOL">N° sinistre : ${devis.NOPOL}</p>
|
<p tal:condition="devis.NOPOL">N° sinistre : ${devis.NOPOL}</p>
|
||||||
<p tal:condition="devis.REF_EXPERT">Réf. expert : ${devis.REF_EXPERT}</p>
|
<p tal:condition="devis.REF_EXPERT">Réf. expert : ${devis.REF_EXPERT}</p>
|
||||||
<p tal:condition="devis.VREF">V/Référence : ${devis.VREF}</p>
|
<p tal:condition="devis.VREF">V/Référence : ${devis.VREF}</p>
|
||||||
<br />
|
<br />
|
||||||
<p>${devis.LIBCOMPL}</p>
|
<p>${devis.LIBCOMPL}</p>
|
||||||
<br/><br/>
|
<br/><br/>
|
||||||
<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 -->
|
<br/><br/>
|
||||||
<div class="col-sm-6">
|
<h4>${devis.C_QUALITE} ${devis.C_NOM}</h4>
|
||||||
<br/><br/>
|
<h4>${devis.C_ADR}</h4>
|
||||||
<h4>${devis.C_QUALITE} ${devis.C_NOM}</h4>
|
<h4 tal:condition="devis.C_ADR2">${devis.C_ADR2}<br /></h4>
|
||||||
<h4>${devis.C_ADR}</h4>
|
<h4>${devis.C_CP} ${devis.C_VILLE}</h4>
|
||||||
<h4 tal:condition="devis.C_ADR2">${devis.C_ADR2}<br /></h4>
|
<br />
|
||||||
<h4>${devis.C_CP} ${devis.C_VILLE}</h4>
|
<br />
|
||||||
<br />
|
<p>Rilieux-la-Pape, le ${devis.DATE.strftime('%d-%m-%Y')}</p>
|
||||||
<br />
|
<br />
|
||||||
<p>Rilieux-la-Pape, le ${devis.DATE.strftime('%d-%m-%Y')}</p>
|
<h4>${devis.QUALITE} ${devis.NOM}</h4>
|
||||||
<br />
|
<h4>${devis.ADRESSE}</h4>
|
||||||
<h4>${devis.QUALITE} ${devis.NOM}</h4>
|
<h4 tal:condition="devis.ADRESSE2">${devis.ADRESSE2}<br /></h4>
|
||||||
<h4>${devis.ADRESSE}</h4>
|
<h4>${devis.CP} ${devis.VILLE}</h4>
|
||||||
<h4 tal:condition="devis.ADRESSE2">${devis.ADRESSE2}<br /></h4>
|
</td>
|
||||||
<h4>${devis.CP} ${devis.VILLE}</h4>
|
</tr>
|
||||||
</div>
|
</table> <!-- row : entête-->
|
||||||
</div> <!-- 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>
|
|
||||||
<div tal:replace="structure dt_html">Page text goes here.</div>
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<div class="row">
|
<tr>
|
||||||
<div class="col-sm-7">
|
<td colspan="3"></td>
|
||||||
</div>
|
</tr>
|
||||||
<div class="col-sm-2">
|
<tr>
|
||||||
<h4>Total HT</h4>
|
<td colspan="2"></td>
|
||||||
<h4>TVA ${layout.to_percent(devis.TAUXTVA)}</h4>
|
<td>Total HT</td>
|
||||||
<h4>Total TTC</h4>
|
<td style="text-align:right">${layout.to_euro(devis.TOTALHT)}</td>
|
||||||
</div>
|
</tr>
|
||||||
<div class="col-sm-3">
|
<tr>
|
||||||
<h4 class="text-right">${layout.to_euro(devis.TOTALHT)}</h4>
|
<td colspan="2"></td>
|
||||||
<h4 class="text-right">${layout.to_euro(devis.TOTALTVA)}</h4>
|
<td>TVA ${layout.to_percent(devis.TAUXTVA)}</td>
|
||||||
<h4 class="text-right">${layout.to_euro(devis.TOTALTTC)}</h4>
|
<td style="text-align:right">${layout.to_euro(devis.TOTALTVA)}</td>
|
||||||
</div>
|
</tr>
|
||||||
<br />
|
<tr>
|
||||||
<div class="col-sm-12">
|
<td colspan="2"></td>
|
||||||
<p>
|
<td><b>Total TTC</b></td>
|
||||||
Si vous acceptez ce devis, veuillez nous en retourner un exemplaire signé et précédé de la mention "Bon pour Accord".
|
<td style="text-align:right"><b>${layout.to_euro(devis.TOTALTTC)}</b></td>
|
||||||
</p>
|
</tr>
|
||||||
</div>
|
<tr>
|
||||||
</div> <!-- row : bas de devis-->
|
<td colspan="3"> </td>
|
||||||
<div class="row">
|
</tr>
|
||||||
<div class="col-sm-6">
|
<tr>
|
||||||
<p tal:condition="devis.TYPECLI == 'P'">
|
<td colspan="3">
|
||||||
<b>Conditions de réglement :</b><br />
|
Si vous acceptez ce devis, veuillez nous en retourner un exemplaire signé et précédé de la mention "Bon pour Accord".
|
||||||
Acompte de 30 % à la commande, Le solde à réception de la facture.
|
</td>
|
||||||
</p>
|
</tr>
|
||||||
<p tal:condition="devis.CODETVA == 4">
|
<tr>
|
||||||
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.
|
<td colspan="3"> </td>
|
||||||
</p>
|
</tr>
|
||||||
</div>
|
<!-- row : bas de devis-->
|
||||||
<div class="col-sm-1">
|
<tr>
|
||||||
</div>
|
<td>
|
||||||
<div class="col-sm-5">
|
<p tal:condition="devis.TYPECLI == 'P'">
|
||||||
<p>
|
<b>Conditions de réglement :</b><br />
|
||||||
Le <br/>
|
Acompte de 30 % à la commande, Le solde à réception de la facture.
|
||||||
Nom et Signature du Client<br/>
|
</p>
|
||||||
BON POUR ACCORD
|
<p tal:condition="devis.CODETVA == 4">
|
||||||
</p>
|
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.
|
||||||
</div>
|
</p>
|
||||||
</div> <!-- row : bon pour accord-->
|
</td>
|
||||||
|
<td></td>
|
||||||
|
<td colspan="2">
|
||||||
|
<p>
|
||||||
|
Le <br/>
|
||||||
|
Nom et Signature du Client<br/>
|
||||||
|
BON POUR ACCORD
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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> Ajouter un document</a>
|
<span class="glyphicon glyphicon-plus"></span> 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> Gérer les photos</a>
|
<span class="glyphicon glyphicon-picture"></span> 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> 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">
|
||||||
@@ -274,6 +310,30 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
</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">×</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>
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
166
mondumas/templates/parametres/article_edit.pt
Normal file
166
mondumas/templates/parametres/article_edit.pt
Normal 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>
|
||||||
70
mondumas/templates/parametres/articles.pt
Normal file
70
mondumas/templates/parametres/articles.pt
Normal 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>
|
||||||
|
|
||||||
|
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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,
|
||||||
@@ -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"
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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': '',
|
||||||
|
|||||||
@@ -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, '')
|
||||||
@@ -121,9 +125,15 @@ def dossier_view(request):
|
|||||||
rapports = []
|
rapports = []
|
||||||
# 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
|
||||||
@@ -603,6 +620,10 @@ def rdf_view(request):
|
|||||||
# générer le rapport en PDF
|
# générer le rapport en PDF
|
||||||
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":
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user