devis_view.pt : affichage devis, facture, proforma

This commit is contained in:
2018-11-29 10:32:24 +01:00
parent d8827bcba8
commit f440168989
8 changed files with 159 additions and 97 deletions

View File

@@ -3,8 +3,10 @@ from pyramid_layout.layout import layout_config
from .security import groupfinder
from .views.default import (
to_euro,
to_euroz,
to_percent,
to_decimal,
to_decz,
)
@layout_config(template='templates/layouts/global_layout.pt')
@@ -22,6 +24,12 @@ class GlobalLayout(object):
def to_euro(self, x):
return to_euro(x)
def to_euroz(self, x):
return to_euroz(x)
def to_decz(self, x):
return to_euroz(x)
def to_percent(self, x):
return to_percent(x)

View File

@@ -37,6 +37,36 @@ where d.societe = '%s' and d.no_id=%s;""" % (societe, no_id);
results = request.dbsession.execute(query).first()
return results
def get_devis_by_no(request,nodossier):
societe = nodossier[0:2]
type_doc = nodossier[3:5]
no_id = nodossier[5:]
if type_doc == 'DE':
query = """
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM devis d
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
INNER JOIN p_cabinet a ON d.cabinet = a.code
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
WHERE d.societe = :societe and d.no_id=:no_id;"""
elif type_doc == 'FA':
query = """
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM facture d
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
INNER JOIN p_cabinet a ON d.cabinet = a.code
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
WHERE d.societe = :societe and d.no_id=:no_id;"""
else:
query = """
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM proforma d
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
INNER JOIN p_cabinet a ON d.cabinet = a.code
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
WHERE d.societe = :societe and d.no_id=:no_id;"""
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
return results
def get_dossier_rdv_by_no(request,nodossier, nolig):
societe = nodossier[0:2]
no_id = nodossier[3:]
@@ -81,3 +111,27 @@ def update_suivi(request, nodossier, nolig, new_values):
execute_query(request, query, new_values)
def get_similaires_byChantier(request, societe, C_NOM, C_ADR, C_CP, C_VILLE):
query = """
SELECT CONCAT(societe,'-',NO_ID) AS nodossier, dem_devis.* FROM dem_devis
WHERE societe<>:societe AND C_NOM=:C_NOM AND C_ADR=:C_ADR AND C_CP=:C_CP AND C_VILLE=:C_VILLE;"""
results = request.dbsession.execute(query, {'societe': societe, 'C_NOM': C_NOM, 'C_ADR': C_ADR, 'C_CP': C_CP, 'C_VILLE': C_VILLE}).fetchall()
return results
def get_devis_lig_by_no(request,nodossier):
societe = nodossier[0:2]
type_doc = nodossier[3:5]
no_id = nodossier[5:]
if type_doc == 'DE':
query = "SELECT * FROM devis_lig WHERE societe = :societe and no_id=:no_id;"
elif type_doc == 'FA':
query = "SELECT * FROM facture_lig WHERE societe = :societe and no_id=:no_id;"
else:
query = "SELECT * FROM proforma_lig WHERE societe = :societe and no_id=:no_id;"
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall()
return results

View File

@@ -7,15 +7,17 @@ def includeme(config):
# default
config.add_route('home', '/')
config.add_route('changer_mdp', '/changer_mdp')
config.add_route('dossier_lookup', '/chantier_lookup')
config.add_route('dossier_select', '/dossier_select/{date}')
config.add_route('dossier_selected', '/dossier_selected/{goto}/{date}/{nodossier}')
config.add_route('dossier_view', '/dossier_view/{nodossier}')
config.add_route('envoyer_mdp', '/envoyer_mdp')
config.add_route('login', '/login')
config.add_route('logout', '/logout')
config.add_route('redefinir_mdp', '/redefinir_mdp/{lien}')
config.add_route('suivi_edit','/suivi_edit/{nodossier}/{nolig}')
# dossier
config.add_route('dossier_lookup', '/chantier_lookup')
config.add_route('dossier_select', '/dossier_select/{date}')
config.add_route('dossier_selected', '/dossier_selected/{goto}/{date}/{nodossier}')
config.add_route('dossier_view', '/dossier_view/{nodossier}')
config.add_route('devis_view', '/devis_view/{nodossier}')
# parametres
config.add_route('parametres', '/parametres')
config.add_route('dashboard', '/dashboard')

View File

@@ -17,7 +17,7 @@
<div class="col-sm-3">
<a href="${request.application_url}/chantier_lookup">
<span class="glyphicon glyphicon-search logo-small"></span>
<h4>RECH. CHANTIER</h4></a>
<h4>RECH. DOSSIER</h4></a>
</div>
</div> <!-- row 1 -->
<br />

View File

@@ -5,7 +5,7 @@
<div class="row">
<!-- CHANTIER -->
<div class="col-md-6">
<table class="table table-condensed ">
<table class="table table-condensed">
<tr>
<td><h4>CHANTIER</h4></td>
<td>
@@ -83,82 +83,23 @@
<h4>Statut : ${dossier.STATUS}</h4>
</div> <!-- row -->
<div class="panel-group" id="accordion">
<!-- PANEL SUIVI -->
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#panel-suivi">
<span class="glyphicon glyphicon-arrow-down"></span>&nbsp;SUIVI</a>
</h4>
</div>
<div id="panel-suivi" class="panel-collapse">
<div class="panel-body">
<p><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></p>
<table class="table table-bordered">
<table class="table table-bordered table-condensed">
<tr>
<th>Date</th>
<th>Action</th>
<th>Rendez-vous</th>
<th>Réf. lettre</th>
<th class="text-center">Par</th>
<th>Réf</th>
<th>Désignation</th>
<th class="text-right">Qté</th>
<th class="text-right">PU HT</th>
<th class="text-right">Montant HT</th>
</tr>
<tr tal:repeat="detail details">
<td>
<a href="${request.route_url('suivi_edit', nodossier=nodossier, nolig=detail.NOLIG)}">
${detail.DATE.strftime('%d-%m-%Y')}</a>
</td>
<td tal:condition="detail.COMMENT.startswith('!!')" class="text-danger">
<b>${detail.COMMENT} ${detail.COMMENTVI}</b>
</td>
<td tal:condition="not detail.COMMENT.startswith('!!')">
${detail.COMMENT} ${detail.COMMENTVI}
</td>
<td>
<span tal:condition="detail.rdv_debut==None"></span>
<span tal:condition="detail.rdv_debut!=None">
${detail.rdv_debut.strftime('%d-%m-%Y %H:%M')} avec ${detail.LISTE}
</span>
</td>
<td class="text-center">${detail.REF_LET}</td>
<td>${detail.REF}</td>
<td>${detail.LIB}</td>
<td class="text-right">${layout.to_decz(detail.QTE)}</td>
<td class="text-right">${layout.to_euroz(detail.PRIXHT)}</td>
<td class="text-right">${layout.to_euroz(detail.MTHT)}</td>
<td class="text-center">${detail.USERMAJ}</td>
</tr>
</table>
</div>
</div>
</div>
<!-- PANEL DOCUMENTS -->
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#panel-documents">
<span class="glyphicon glyphicon-arrow-down"></span>&nbsp;DEVIS - FACTURES</a>
</h4>
</div>
<div id="panel-documents" class="panel-collapse collapse">
<div class="panel-body">
<table class="table table-bordered">
<tr>
<th>Numéro</th>
<th>Date</th>
<th>Client</th>
<th class="text-right">Montant</th>
<th class="text-center">Statut</th>
</tr>
<tr tal:repeat="detail documents">
<td>${detail.TYPE}-${detail.numero}</td>
<td>${detail.date.strftime('%d-%m-%Y')}</td>
<td>${detail.nomcli}</td>
<td class="text-right">${layout.to_euro(detail.montant)}</td>
<td class="text-center">${detail.status}</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</metal:block>

View File

@@ -89,14 +89,14 @@
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#panel-suivi">
<span class="glyphicon glyphicon-arrow-down"></span>&nbsp;SUIVI</a>
<span class="glyphicon glyphicon-plus"></span>&nbsp;SUIVI du DOSSIER</a>
</h4>
</div>
<div id="panel-suivi" class="panel-collapse">
<div id="panel-suivi" class="panel-collapse collapse">
<div class="panel-body">
<p><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></p>
<table class="table table-bordered">
<table class="table table-bordered table-condensed">
<tr>
<th>Date</th>
<th>Action</th>
@@ -133,7 +133,7 @@
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#panel-documents">
<span class="glyphicon glyphicon-arrow-down"></span>&nbsp;DEVIS - FACTURES</a>
<span class="glyphicon glyphicon-plus"></span>&nbsp;DEVIS - FACTURES</a>
</h4>
</div>
<div id="panel-documents" class="panel-collapse collapse">
@@ -159,6 +159,37 @@
</div>
</div>
</div>
<!-- PANEL DOSSIERS SIMILAIRES -->
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#panel-similaires">
<span class="glyphicon glyphicon-plus"></span>&nbsp;DOSSIERS SIMILAIRES</a>
</h4>
</div>
<div id="panel-similaires" class="panel-collapse collapse">
<div class="panel-body">
<table class="table table-bordered">
<tr>
<th>Numéro</th>
<th>Date</th>
<th>Client</th>
<th class="text-right">Montant</th>
<th class="text-center">Statut</th>
</tr>
<tr tal:repeat="detail similaires">
<td>
<a href="/dossier_view/${detail.nodossier}">${detail.nodossier}</a>
</td>
<td>${detail.DATE.strftime('%d-%m-%Y')}</td>
<td>${detail.NOMCLI}</td>
<td class="text-right">${layout.to_euro(detail.MTTRAV)}</td>
<td class="text-center">${detail.STATUS}</td>
</tr>
</table>
</div>
</div>
</div>
</div>

View File

@@ -38,6 +38,21 @@ def to_euro(x):
#else:
return (u"%.2f" % x).replace('.', ',')
def to_euroz(x):
"""Takes a float and returns a string"""
if x == 0:
return ""
else:
return (u"%.2f" % x).replace('.', ',')
def to_decz(x):
"""Takes a decimal and returns a string"""
if x == 0:
return ""
else:
return (u"%.2f" % x).replace('.', ',')
def to_sha1(message):
return hashlib.sha1(message.encode('utf-8')).hexdigest()

View File

@@ -24,6 +24,7 @@ from ..security import groupfinder
import json
from ..views.default import *
from ..models.default import *
from ..models.dossier import *
@@ -87,17 +88,21 @@ def dossier_view(request):
dossier = get_dossier_by_no(request, nodossier)
if dossier is None:
request.session.flash(u"Le dossier no %s est introuvable" % (nodossier), 'danger')
return HTTPFound(location=request.route_url("chantier_lookup"))
return HTTPFound(location=request.route_url("dossier_lookup"))
# lire tous le suivi du dossier
details = get_dossier_rdv_by_no(request, nodossier, '0')
# lire toutes les dossiers du chantiers
documents = get_documents_byChantier(request, nodossier)
# lire toutes les dossiers similaires
similaires = get_similaires_byChantier(request, dossier.societe, dossier.C_NOM, dossier.C_ADR, dossier.C_CP, dossier.C_VILLE)
return {
'page_title': u"Dossier : %s" % (nodossier),
'nodossier': nodossier,
'dossier': dossier,
'details': details,
'documents': documents,
'similaires': similaires,
}
@view_config(route_name='devis_view', renderer='../templates/dossier/devis_view.pt', permission='view')
@@ -105,20 +110,26 @@ def devis_view(request):
nodossier = request.matchdict['nodossier']
url = request.route_url("devis_view", nodossier=nodossier)
dossier = get_dossier_by_no(request, nodossier)
type_doc = nodossier[3:5]
if type_doc == 'DE':
page_title = u"Devis no : %s" % (nodossier)
elif type_doc == 'FA':
page_title = u"Facture no : %s" % (nodossier)
else:
page_title = u"Proforma no : %s" % (nodossier)
dossier = get_devis_by_no(request, nodossier)
if dossier is None:
request.session.flash(u"Le dossier no %s est introuvable" % (nodossier), 'danger')
return HTTPFound(location=request.route_url("chantier_lookup"))
# lire tous le suivi du dossier
details = get_dossier_rdv_by_no(request, nodossier, '0')
# lire toutes les dossiers du chantiers
documents = get_documents_byChantier(request, nodossier)
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_lig_by_no(request, nodossier)
return {
'page_title': u"Dossier : %s" % (nodossier),
'page_title': page_title,
'nodossier': nodossier,
'dossier': dossier,
'details': details,
'documents': documents,
}
@view_config(route_name='dossier_selected', permission='view')