ajout devis_preview.pt

This commit is contained in:
2020-10-16 10:27:05 +02:00
parent 9b6f016c32
commit 50fea4710e
14 changed files with 221 additions and 33 deletions

View File

@@ -58,7 +58,7 @@ class GlobalLayout(object):
def isWebPage(self):
# test view name
if self.request.matched_route:
if self.request.matched_route.name == 'rdf_rapport':
if self.request.matched_route.name in ['rdf_rapport', 'devis_preview']:
# oui, page PDF
return False
else:
@@ -67,3 +67,4 @@ class GlobalLayout(object):
else:
# non, page web
return True

View File

@@ -144,5 +144,15 @@ def update_devis_ligne(request, nodossier, nolig, new_values):
new_values['no_id'] = no_id
new_values['nolig'] = nolig
query = "UPDATE devis_lignes SET %s WHERE societe = :societe and no_id=:no_id and nolig = :nolig;" % s
import pdb;pdb.set_trace()
# import pdb;pdb.set_trace()
execute_query(request, query, new_values)
def sum_devis_totaux(request, nodossier):
societe = nodossier[0:2]
no_id = nodossier[5:]
query = """UPDATE devis SET totalht = (SELECT SUM(mtht) FROM devis_lignes WHERE societe=:societe AND no_id=:no_id),
totaltva = ROUND(totalht * tauxtva / 100,2),
totalttc = totalht + totaltva
WHERE societe=:societe AND no_id=:no_id;"""
execute_query(request, query, {'societe': societe, 'no_id': no_id})

View File

@@ -25,6 +25,7 @@ def includeme(config):
config.add_route('devis_create', '/devis_create/{nodossier}')
config.add_route('devis_web', '/devis_web/{nodossier}')
config.add_route('devis_view', '/devis_view/{nodossier}')
config.add_route('devis_preview', '/devis_preview/{nodossier}')
# dossier
config.add_route('demandes','/demandes')
config.add_route('delete_img','/delete_img/{nodossier}/{norapport}/{nosection}/{nomfic}')

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -10,7 +10,7 @@
data-fv-icon-validating="glyphicon glyphicon-refresh">
<!-- *** TEXTE *** -->
<div tal:condition="type_ligne=='TX'">
<div id="TX" tal:condition="type_ligne=='TX'">
<div class="form-group">
<label class="control-label col-sm-2">Type de texte</label>
<div class="col-sm-10">
@@ -24,44 +24,55 @@
</div>
<div class="form-group">
<label class="control-label col-sm-2">Texte</label>
<div class="col-xs-6">
<div class="col-sm-10">
<input class="form-control" type="text" id="libelle" name="libelle" value="${ligne.libelle}">
</div>
</div>
</div>
<!-- *** ARTICLE *** -->
<div tal:condition="type_ligne=='AR'">
<div class="form-group">
<label class="control-label col-sm-2">Article</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="article" name="article" value="${article}">
</div>
</div>
<div id="AR" tal:condition="type_ligne=='AR'">
<div class="form-group">
<label class="control-label col-sm-2">Référence</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="ref" name="ref" value="${ligne.ref}" readonly>
<div class="col-sm-10">
<input class="form-control" type="text" id="ref" name="ref" value="${ligne.ref}" >
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Libellé</label>
<div class="col-xs-6">
<div class="col-sm-10">
<input class="form-control" type="text" id="libelle" name="libelle" value="${ligne.libelle}">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Quantité</label>
<div class="col-xs-6">
<div class="col-sm-10">
<input class="form-control" type="text" id="qte" name="qte" value="${ligne.qte}">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Prix HT</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="prixht" name="prixht" value="${ligne.prixht}">
</div>
<div class="col-sm-10">
<div class="input-group">
<span class="input-group-addon add-on">
<span class="glyphicon glyphicon-euro"></span>
</span>
<input class="form-control" type="text" id="prixht" name="prixht" value="${ligne.prixht}">
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="metrage">Métrage</label>
<div class="col-sm-10">
<input class="form-control monospace-font" type="text" id="metrage" name="metrage" value="${ligne.metrage}">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="deduction">déduction</label>
<div class="col-sm-10">
<input class="form-control monospace-font" type="text" id="deduction" name="deduction" value="${ligne.deduction}">
</div>
</div>
</div>
<!-- *** SOUS-TOTAL *** -->
<div tal:condition="type_ligne=='ST'">
@@ -133,6 +144,8 @@ $(document).ready(function() {
$("#"+cas).show();
});
$('#libelle').autocomplete({
minLength: 3,
appendTo: "#TX",
source: function (request, response) {
$.ajax({
url:'/ajax_texte',
@@ -145,12 +158,10 @@ $(document).ready(function() {
},
});
},
minLength: 3,
appendTo: "#TX"
});
$('#article').autocomplete({
$('#ref').autocomplete({
minLength: 3,
appendTo: "#TX",
appendTo: "#AR",
source: function (request, response) {
$.ajax({
url:'/ajax_texte',
@@ -164,7 +175,7 @@ $(document).ready(function() {
});
},
select: function(event, ui) {
var ref = ui.item.value.split(' ')[0]; // selected ref
var ref = ui.item.value.split(" ")[0]; // selected ref
// lecture de l'article
$.ajax({
@@ -180,7 +191,6 @@ $(document).ready(function() {
var prixht = response[0]['prixht'];
// Set value to textboxes
document.getElementById('article').value = ref;
document.getElementById('ref').value = ref;
document.getElementById('libelle').value = libelle;
document.getElementById('prixht').value = prixht;

View File

@@ -0,0 +1,108 @@
<metal:block use-macro="main_template">
<div metal:fill-slot="content">
<!-- ENTETE -->
<img src="${logo_url}" width="100%" />
<br />
<div class="row">
<!-- colonne gauche : REFERENCES -->
<div class="col-sm-6">
<p tal:condition="dossier.no_agrement">N° Agrément : ${dossier.no_agrement}</p>
<br/><br/>
<p tal:condition="dossier.NOSIN">N° sinistre : ${dossier.NOSIN}</p>
<p tal:condition="dossier.NOPOL">N° sinistre : ${dossier.NOPOL}</p>
<p tal:condition="dossier.REF_EXPERT">Réf. expert : ${dossier.REF_EXPERT}</p>
<p tal:condition="dossier.VREF">V/Référence : ${dossier.VREF}</p>
<br />
<p>${dossier.LIBCOMPL}</p>
<br/><br/>
<p>N° dossier : ${dossier.nochantier}</p>
<br/><br/>
<H3>DEVIS N° ${dossier.societe}-${dossier.NO_ID}<h/H3>
</div>
<!-- colonne droite : ADRESSES -->
<div class="col-sm-6">
<br/><br/>
<h4>${dossier.C_QUALITE} ${dossier.C_NOM}</h4>
<h4>${dossier.C_ADR}</h4>
<h4 tal:condition="dossier.C_ADR2">${dossier.C_ADR2}<br /></h4>
<br />
<h4>${dossier.C_CP} ${dossier.C_VILLE}</h4>
<br />
<br />
<p>Rilieux-la-Pape, le ${dossier.DATE.strftime('%d-%m-%Y')}</p>
<br />
<h4>${dossier.QUALITE} ${dossier.NOM}</h4>
<h4>${dossier.ADRESSE}</h4>
<h4 tal:condition="dossier.ADRESSE2">${dossier.ADRESSE2}<br /></h4>
<br />
<h4>${dossier.CP} ${dossier.VILLE}</h4>
</div>
</div> <!-- row : entête-->
<br/>
<br/>
<div class="row">
<div class="col-sm-8">
<p class="text-right">Surface</p>
</div>
<div class="col-sm-2">
<p class="text-right">P.U. HT</p>
</div>
<div class="col-sm-2">
<p class="text-right">Montant HT</p>
</div>
<hr>
</div> <!-- row : entête tableau-->
<br/>
<br/>
<br />
<div class="row">
<hr>
<div class="col-sm-7">
</div>
<div class="col-sm-2">
<h4>Total HT</h4>
<h4>TVA ${layout.to_percent(dossier.TAUXTVA)}</h4>
<h4>Total TTC</h4>
</div>
<div class="col-sm-3">
<h4 class="text-right">${layout.to_euro(dossier.TOTALHT)}</h4>
<h4 class="text-right">${layout.to_euro(dossier.TOTALTVA)}</h4>
<h4 class="text-right">${layout.to_euro(dossier.TOTALTTC)}</h4>
</div>
<br />
<div class="col-sm-12">
<p>
Si vous acceptez ce devis, veuillez nous en retourner un exemplaire signé et précédé de la mention "Bon pour Accord".
</p>
</div>
</div> <!-- row : bas de devis-->
<div class="row">
<div class="col-sm-6">
<p tal:condition="dossier.TYPECLI == 'P'">
<b>Conditions de réglement :</b><br />
Acompte de 30 % à la commande, Le solde à réception de la facture.
</p>
<p tal:condition="dossier.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.
</p>
</div>
<div class="col-sm-1">
</div>
<div class="col-sm-5">
<p>
Le <br/>
Nom et Signature du Client<br/>
BON POUR ACCORD
</p>
</div>
</div> <!-- row : bon pour accord-->
<br />
<br />
</div>
<div metal:fill-slot="additional_scripts">
</div>
</metal:block>

View File

@@ -51,6 +51,11 @@
</tr>
</table>
<p>
<a class="btn btn-success" role="button" href="${request.route_url('devis_preview', nodossier=nodossier)}">
<span class="glyphicon glyphicon-plus"></span> Prévisualiser</a>
</p>
<table class="table table-bordered table-condensed">
<tr class="well">
<th>Réf</th>

View File

@@ -6,7 +6,7 @@
<!-- ENTETE -->
<div tal:condition="pt_name=='rdf_rapport'">
<!-- LOGO -->
<img src="${request.static_url('mondumas:static/img/LogoVerSanit.jpg')}" width="100%" />
<img src="${request.static_url('mondumas:static/img/Logo-PL.jpg')}" width="100%" />
<br />
<br />
<h1 class="text-center">Rapport de recherche de fuite</h1>

View File

@@ -47,7 +47,7 @@ def to_euroz(x):
if x == 0:
return ""
else:
return ("%.2f" % x).replace('.', ',')
return ("%9.2f" % x).replace('.', ',')
def to_decz(x):
"""Takes a decimal and returns a string"""
@@ -326,7 +326,10 @@ def ajax_texte(request):
liste=[]
for row in items:
d = '%s | %s | %s' % (row.ref_cli2, row.LIBART, to_euro(row.PRIXHT2))
if type == 'AR':
d = '%s | %s | %s' % (row.ref_cli2, row.LIBART, to_euro(row.PRIXHT2))
else:
d = row.LIBART
liste.append(d)
return Response(json.dumps(liste))
@@ -335,9 +338,9 @@ def ajax_texte(request):
def ajax_article(request):
ref = request.GET['ref']
# lire les articles commencant par
# lire l'article
items = get_article(request, 'REF', ref)
# puis retourne son libellé et son prixht
liste=[]
d = {}
d['ref'] = items.ref_cli2

View File

@@ -167,6 +167,8 @@ def devis_ligne(request):
ligne['ref'] = ''
if type_ligne == 'AR':
ligne['qte'] = 1
ligne['metrage'] = ''
ligne['deduction'] = ''
else:
ligne['qte'] = 0
ligne['prixht'] = 0
@@ -178,7 +180,6 @@ def devis_ligne(request):
# lire la ligne du devis
ligne = get_devis_lignes_by_no(request, nodossier, nolig)
page_title= "Modification de la ligne %s" % (nolig)
article = '%s | %s | %s' % (ligne.ref, ligne.libelle, to_euro(ligne.prixht))
# import pdb;pdb.set_trace()
# -- ajouter une ligne
@@ -199,7 +200,7 @@ def devis_ligne(request):
else:
new_values['nolig'] = nolig
update_devis_ligne(request, nodossier, nolig, new_values)
request.session.flash(u"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))
elif type_ligne == 'AR':
@@ -209,6 +210,24 @@ def devis_ligne(request):
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
# calcul métrage
metrage = 0
try:
metrage = eval(request.params['metrage'])
except SyntaxError:
request.session.flash("Erreur de syntaxe dans la formule de calcul", 'danger')
return HTTPFound(location=url)
deduc = 0
try:
deduc = eval(request.params['deduction'])
except SyntaxError:
request.session.flash("Erreur de syntaxe dans la formule de calcul", 'danger')
return HTTPFound(location=url)
if deduc < 0 :
metrage += deduc
else:
metrage -= deduc
new_values['qte'] = metrage
new_values['type_ligne'] = type_ligne
new_values['usermaj'] = logged_in
new_values['societe'] = societe
@@ -230,6 +249,37 @@ def devis_ligne(request):
'nolig': nolig,
'dossier': dossier,
'ligne': ligne,
'article': article,
'type_ligne': type_ligne,
'type_ligne': type_ligne,
}
@view_config(route_name='devis_preview', renderer='../templates/devis/devis_preview.pt', permission='view')
def devis_preview(request):
nodossier = request.matchdict['nodossier']
societe = nodossier[0:2]
no_id = nodossier[5:]
url = request.route_url("devis_preview", nodossier=nodossier)
logged_in = request.authenticated_userid.upper()
# calculer les totaux HT et TTC
sum_devis_totaux(request, nodossier)
dossier = get_devis_by_no(request, nodossier)
# import pdb;pdb.set_trace()
if dossier is None:
request.session.flash(u"Le document no %s est introuvable" % (nodossier), 'danger')
return HTTPFound(location=request.route_url("dossier_lookup"))
# lire tous les lignes du devis
details = get_devis_lignes_by_no(request, nodossier, '0')
# select logo according to society
logo_url = request.static_url('mondumas:static/img/Logo-%s.jpg' % societe)
return {
'page_title': '',
'url': url,
'logo_url': logo_url,
'nodossier': nodossier,
'dossier': dossier,
'details': details,
}