devis_view.pt : affichage devis, facture, proforma
This commit is contained in:
@@ -3,8 +3,10 @@ from pyramid_layout.layout import layout_config
|
|||||||
from .security import groupfinder
|
from .security import groupfinder
|
||||||
from .views.default import (
|
from .views.default import (
|
||||||
to_euro,
|
to_euro,
|
||||||
|
to_euroz,
|
||||||
to_percent,
|
to_percent,
|
||||||
to_decimal,
|
to_decimal,
|
||||||
|
to_decz,
|
||||||
)
|
)
|
||||||
|
|
||||||
@layout_config(template='templates/layouts/global_layout.pt')
|
@layout_config(template='templates/layouts/global_layout.pt')
|
||||||
@@ -22,6 +24,12 @@ class GlobalLayout(object):
|
|||||||
def to_euro(self, x):
|
def to_euro(self, x):
|
||||||
return to_euro(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):
|
def to_percent(self, x):
|
||||||
return to_percent(x)
|
return to_percent(x)
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,36 @@ where d.societe = '%s' and d.no_id=%s;""" % (societe, no_id);
|
|||||||
results = request.dbsession.execute(query).first()
|
results = request.dbsession.execute(query).first()
|
||||||
return results
|
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):
|
def get_dossier_rdv_by_no(request,nodossier, nolig):
|
||||||
societe = nodossier[0:2]
|
societe = nodossier[0:2]
|
||||||
no_id = nodossier[3:]
|
no_id = nodossier[3:]
|
||||||
@@ -81,3 +111,27 @@ def update_suivi(request, nodossier, nolig, new_values):
|
|||||||
|
|
||||||
execute_query(request, query, 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
|
||||||
|
|||||||
@@ -7,15 +7,17 @@ def includeme(config):
|
|||||||
# default
|
# default
|
||||||
config.add_route('home', '/')
|
config.add_route('home', '/')
|
||||||
config.add_route('changer_mdp', '/changer_mdp')
|
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('envoyer_mdp', '/envoyer_mdp')
|
||||||
config.add_route('login', '/login')
|
config.add_route('login', '/login')
|
||||||
config.add_route('logout', '/logout')
|
config.add_route('logout', '/logout')
|
||||||
config.add_route('redefinir_mdp', '/redefinir_mdp/{lien}')
|
config.add_route('redefinir_mdp', '/redefinir_mdp/{lien}')
|
||||||
config.add_route('suivi_edit','/suivi_edit/{nodossier}/{nolig}')
|
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
|
# parametres
|
||||||
config.add_route('parametres', '/parametres')
|
config.add_route('parametres', '/parametres')
|
||||||
config.add_route('dashboard', '/dashboard')
|
config.add_route('dashboard', '/dashboard')
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<div class="col-sm-3">
|
<div class="col-sm-3">
|
||||||
<a href="${request.application_url}/chantier_lookup">
|
<a href="${request.application_url}/chantier_lookup">
|
||||||
<span class="glyphicon glyphicon-search logo-small"></span>
|
<span class="glyphicon glyphicon-search logo-small"></span>
|
||||||
<h4>RECH. CHANTIER</h4></a>
|
<h4>RECH. DOSSIER</h4></a>
|
||||||
</div>
|
</div>
|
||||||
</div> <!-- row 1 -->
|
</div> <!-- row 1 -->
|
||||||
<br />
|
<br />
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<!-- CHANTIER -->
|
<!-- CHANTIER -->
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<table class="table table-condensed ">
|
<table class="table table-condensed">
|
||||||
<tr>
|
<tr>
|
||||||
<td><h4>CHANTIER</h4></td>
|
<td><h4>CHANTIER</h4></td>
|
||||||
<td>
|
<td>
|
||||||
@@ -83,82 +83,23 @@
|
|||||||
<h4>Statut : ${dossier.STATUS}</h4>
|
<h4>Statut : ${dossier.STATUS}</h4>
|
||||||
</div> <!-- row -->
|
</div> <!-- row -->
|
||||||
|
|
||||||
<div class="panel-group" id="accordion">
|
<table class="table table-bordered table-condensed">
|
||||||
<!-- 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> 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">
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>Date</th>
|
<th>Réf</th>
|
||||||
<th>Action</th>
|
<th>Désignation</th>
|
||||||
<th>Rendez-vous</th>
|
<th class="text-right">Qté</th>
|
||||||
<th>Réf. lettre</th>
|
<th class="text-right">PU HT</th>
|
||||||
<th class="text-center">Par</th>
|
<th class="text-right">Montant HT</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr tal:repeat="detail details">
|
<tr tal:repeat="detail details">
|
||||||
<td>
|
<td>${detail.REF}</td>
|
||||||
<a href="${request.route_url('suivi_edit', nodossier=nodossier, nolig=detail.NOLIG)}">
|
<td>${detail.LIB}</td>
|
||||||
${detail.DATE.strftime('%d-%m-%Y')}</a>
|
<td class="text-right">${layout.to_decz(detail.QTE)}</td>
|
||||||
</td>
|
<td class="text-right">${layout.to_euroz(detail.PRIXHT)}</td>
|
||||||
<td tal:condition="detail.COMMENT.startswith('!!')" class="text-danger">
|
<td class="text-right">${layout.to_euroz(detail.MTHT)}</td>
|
||||||
<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 class="text-center">${detail.USERMAJ}</td>
|
<td class="text-center">${detail.USERMAJ}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</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> 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>
|
</div>
|
||||||
</metal:block>
|
</metal:block>
|
||||||
|
|||||||
@@ -89,14 +89,14 @@
|
|||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h4 class="panel-title">
|
<h4 class="panel-title">
|
||||||
<a data-toggle="collapse" data-parent="#accordion" href="#panel-suivi">
|
<a data-toggle="collapse" data-parent="#accordion" href="#panel-suivi">
|
||||||
<span class="glyphicon glyphicon-arrow-down"></span> SUIVI</a>
|
<span class="glyphicon glyphicon-plus"></span> SUIVI du DOSSIER</a>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div id="panel-suivi" class="panel-collapse">
|
<div id="panel-suivi" class="panel-collapse collapse">
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<p><a class="btn btn-success" role="button" href="${request.route_url('suivi_edit', nodossier=nodossier, nolig='0')}">
|
<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>
|
<span class="glyphicon glyphicon-plus"></span> Nouvelle ligne</a></p>
|
||||||
<table class="table table-bordered">
|
<table class="table table-bordered table-condensed">
|
||||||
<tr>
|
<tr>
|
||||||
<th>Date</th>
|
<th>Date</th>
|
||||||
<th>Action</th>
|
<th>Action</th>
|
||||||
@@ -133,7 +133,7 @@
|
|||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h4 class="panel-title">
|
<h4 class="panel-title">
|
||||||
<a data-toggle="collapse" data-parent="#accordion" href="#panel-documents">
|
<a data-toggle="collapse" data-parent="#accordion" href="#panel-documents">
|
||||||
<span class="glyphicon glyphicon-arrow-down"></span> DEVIS - FACTURES</a>
|
<span class="glyphicon glyphicon-plus"></span> DEVIS - FACTURES</a>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div id="panel-documents" class="panel-collapse collapse">
|
<div id="panel-documents" class="panel-collapse collapse">
|
||||||
@@ -159,6 +159,37 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</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> 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>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,21 @@ def to_euro(x):
|
|||||||
#else:
|
#else:
|
||||||
return (u"%.2f €" % x).replace('.', ',')
|
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):
|
def to_sha1(message):
|
||||||
return hashlib.sha1(message.encode('utf-8')).hexdigest()
|
return hashlib.sha1(message.encode('utf-8')).hexdigest()
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ from ..security import groupfinder
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
from ..views.default import *
|
||||||
from ..models.default import *
|
from ..models.default import *
|
||||||
from ..models.dossier import *
|
from ..models.dossier import *
|
||||||
|
|
||||||
@@ -87,17 +88,21 @@ def dossier_view(request):
|
|||||||
dossier = get_dossier_by_no(request, nodossier)
|
dossier = get_dossier_by_no(request, nodossier)
|
||||||
if dossier is None:
|
if dossier is None:
|
||||||
request.session.flash(u"Le dossier no %s est introuvable" % (nodossier), 'danger')
|
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
|
# 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 dossiers du chantiers
|
||||||
documents = get_documents_byChantier(request, nodossier)
|
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 {
|
return {
|
||||||
'page_title': u"Dossier : %s" % (nodossier),
|
'page_title': u"Dossier : %s" % (nodossier),
|
||||||
'nodossier': nodossier,
|
'nodossier': nodossier,
|
||||||
'dossier': dossier,
|
'dossier': dossier,
|
||||||
'details': details,
|
'details': details,
|
||||||
'documents': documents,
|
'documents': documents,
|
||||||
|
'similaires': similaires,
|
||||||
}
|
}
|
||||||
|
|
||||||
@view_config(route_name='devis_view', renderer='../templates/dossier/devis_view.pt', permission='view')
|
@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']
|
nodossier = request.matchdict['nodossier']
|
||||||
url = request.route_url("devis_view", nodossier=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:
|
if dossier is None:
|
||||||
request.session.flash(u"Le dossier no %s est introuvable" % (nodossier), 'danger')
|
request.session.flash(u"Le document 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
|
# lire tous les lignes du devis
|
||||||
details = get_dossier_rdv_by_no(request, nodossier, '0')
|
details = get_devis_lig_by_no(request, nodossier)
|
||||||
# lire toutes les dossiers du chantiers
|
|
||||||
documents = get_documents_byChantier(request, nodossier)
|
|
||||||
return {
|
return {
|
||||||
'page_title': u"Dossier : %s" % (nodossier),
|
'page_title': page_title,
|
||||||
'nodossier': nodossier,
|
'nodossier': nodossier,
|
||||||
'dossier': dossier,
|
'dossier': dossier,
|
||||||
'details': details,
|
'details': details,
|
||||||
'documents': documents,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@view_config(route_name='dossier_selected', permission='view')
|
@view_config(route_name='dossier_selected', permission='view')
|
||||||
|
|||||||
Reference in New Issue
Block a user