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): def isWebPage(self):
# test view name # test view name
if self.request.matched_route: 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 # oui, page PDF
return False return False
else: else:
@@ -67,3 +67,4 @@ class GlobalLayout(object):
else: else:
# non, page web # non, page web
return True 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['no_id'] = no_id
new_values['nolig'] = nolig new_values['nolig'] = nolig
query = "UPDATE devis_lignes SET %s WHERE societe = :societe and no_id=:no_id and nolig = :nolig;" % s 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) 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_create', '/devis_create/{nodossier}')
config.add_route('devis_web', '/devis_web/{nodossier}') config.add_route('devis_web', '/devis_web/{nodossier}')
config.add_route('devis_view', '/devis_view/{nodossier}') config.add_route('devis_view', '/devis_view/{nodossier}')
config.add_route('devis_preview', '/devis_preview/{nodossier}')
# dossier # dossier
config.add_route('demandes','/demandes') config.add_route('demandes','/demandes')
config.add_route('delete_img','/delete_img/{nodossier}/{norapport}/{nosection}/{nomfic}') 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"> data-fv-icon-validating="glyphicon glyphicon-refresh">
<!-- *** TEXTE *** --> <!-- *** TEXTE *** -->
<div tal:condition="type_ligne=='TX'"> <div id="TX" tal:condition="type_ligne=='TX'">
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-2">Type de texte</label> <label class="control-label col-sm-2">Type de texte</label>
<div class="col-sm-10"> <div class="col-sm-10">
@@ -24,44 +24,55 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-2">Texte</label> <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}"> <input class="form-control" type="text" id="libelle" name="libelle" value="${ligne.libelle}">
</div> </div>
</div> </div>
</div> </div>
<!-- *** ARTICLE *** --> <!-- *** ARTICLE *** -->
<div tal:condition="type_ligne=='AR'"> <div id="AR" 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 class="form-group"> <div class="form-group">
<label class="control-label col-sm-2">Référence</label> <label class="control-label col-sm-2">Référence</label>
<div class="col-xs-6"> <div class="col-sm-10">
<input class="form-control" type="text" id="ref" name="ref" value="${ligne.ref}" readonly> <input class="form-control" type="text" id="ref" name="ref" value="${ligne.ref}" >
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-2">Libellé</label> <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}"> <input class="form-control" type="text" id="libelle" name="libelle" value="${ligne.libelle}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-2">Quantité</label> <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}"> <input class="form-control" type="text" id="qte" name="qte" value="${ligne.qte}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-2">Prix HT</label> <label class="control-label col-sm-2">Prix HT</label>
<div class="col-xs-6"> <div class="col-sm-10">
<input class="form-control" type="text" id="prixht" name="prixht" value="${ligne.prixht}"> <div class="input-group">
</div> <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>
<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> </div>
<!-- *** SOUS-TOTAL *** --> <!-- *** SOUS-TOTAL *** -->
<div tal:condition="type_ligne=='ST'"> <div tal:condition="type_ligne=='ST'">
@@ -133,6 +144,8 @@ $(document).ready(function() {
$("#"+cas).show(); $("#"+cas).show();
}); });
$('#libelle').autocomplete({ $('#libelle').autocomplete({
minLength: 3,
appendTo: "#TX",
source: function (request, response) { source: function (request, response) {
$.ajax({ $.ajax({
url:'/ajax_texte', url:'/ajax_texte',
@@ -145,12 +158,10 @@ $(document).ready(function() {
}, },
}); });
}, },
minLength: 3,
appendTo: "#TX"
}); });
$('#article').autocomplete({ $('#ref').autocomplete({
minLength: 3, minLength: 3,
appendTo: "#TX", appendTo: "#AR",
source: function (request, response) { source: function (request, response) {
$.ajax({ $.ajax({
url:'/ajax_texte', url:'/ajax_texte',
@@ -164,7 +175,7 @@ $(document).ready(function() {
}); });
}, },
select: function(event, ui) { 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 // lecture de l'article
$.ajax({ $.ajax({
@@ -180,7 +191,6 @@ $(document).ready(function() {
var prixht = response[0]['prixht']; var prixht = response[0]['prixht'];
// Set value to textboxes // Set value to textboxes
document.getElementById('article').value = ref;
document.getElementById('ref').value = ref; document.getElementById('ref').value = ref;
document.getElementById('libelle').value = libelle; document.getElementById('libelle').value = libelle;
document.getElementById('prixht').value = prixht; 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> </tr>
</table> </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"> <table class="table table-bordered table-condensed">
<tr class="well"> <tr class="well">
<th>Réf</th> <th>Réf</th>

View File

@@ -6,7 +6,7 @@
<!-- ENTETE --> <!-- ENTETE -->
<div tal:condition="pt_name=='rdf_rapport'"> <div tal:condition="pt_name=='rdf_rapport'">
<!-- LOGO --> <!-- 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 />
<br /> <br />
<h1 class="text-center">Rapport de recherche de fuite</h1> <h1 class="text-center">Rapport de recherche de fuite</h1>

View File

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

View File

@@ -167,6 +167,8 @@ def devis_ligne(request):
ligne['ref'] = '' ligne['ref'] = ''
if type_ligne == 'AR': if type_ligne == 'AR':
ligne['qte'] = 1 ligne['qte'] = 1
ligne['metrage'] = ''
ligne['deduction'] = ''
else: else:
ligne['qte'] = 0 ligne['qte'] = 0
ligne['prixht'] = 0 ligne['prixht'] = 0
@@ -178,7 +180,6 @@ def devis_ligne(request):
# 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, nodossier, nolig)
page_title= "Modification de la ligne %s" % (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() # import pdb;pdb.set_trace()
# -- ajouter une ligne # -- ajouter une ligne
@@ -199,7 +200,7 @@ def devis_ligne(request):
else: else:
new_values['nolig'] = nolig new_values['nolig'] = nolig
update_devis_ligne(request, nodossier, nolig, new_values) 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)) return HTTPFound(location=request.route_url("devis_web", nodossier=nodossier))
elif type_ligne == 'AR': elif type_ligne == 'AR':
@@ -209,6 +210,24 @@ def devis_ligne(request):
if param in request.params and request.params[param] != db_value: if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param] 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['type_ligne'] = type_ligne
new_values['usermaj'] = logged_in new_values['usermaj'] = logged_in
new_values['societe'] = societe new_values['societe'] = societe
@@ -230,6 +249,37 @@ def devis_ligne(request):
'nolig': nolig, 'nolig': nolig,
'dossier': dossier, 'dossier': dossier,
'ligne': ligne, '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,
}