creation ligne devis article

This commit is contained in:
2020-10-04 16:44:57 +02:00
parent 500e07c810
commit 9aa6c8985e
12 changed files with 340 additions and 25 deletions

0
diff.txt Normal file
View File

View File

@@ -113,3 +113,8 @@ def delete_membre(request, cd_uti):
query = "DELETE FROM p_users WHERE cd_uti = :cd_uti ;" query = "DELETE FROM p_users WHERE cd_uti = :cd_uti ;"
execute_query(request, query, {'cd_uti': cd_uti}) execute_query(request, query, {'cd_uti': cd_uti})
def get_article(request, libelle):
query = "SELECT * FROM articles WHERE libart like :libelle;"
results = request.dbsession.execute(query, {'libelle': libelle + "%"})
return results.fetchall()

View File

@@ -30,13 +30,13 @@ def get_devis_byName(request, societe, name):
if numero > 0: if numero > 0:
query = """SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, nopol, nochantier, web query = """SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, nopol, nochantier, web
FROM devis WHERE societe=:societe AND no_id >=:name LIMIT 300;;""" % (societe, name) FROM devis WHERE societe=:societe AND no_id >=:name AND web = 'W' LIMIT 300;;""" % (societe, name)
elif len(name) == 0: elif len(name) == 0:
query = """SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, nopol, nochantier, web query = """SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, nopol, nochantier, web
FROM devis WHERE societe=:societe ORDER BY no_id DESC LIMIT 300;""" FROM devis WHERE societe=:societe AND web = 'W' ORDER BY no_id DESC LIMIT 300;"""
else: else:
query = """(SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, nopol , nochantier, web query = """(SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, nopol , nochantier, web
FROM devis WHERE societe=:societe AND c_nom LIKE ':name%' LIMIT 500)""" FROM devis WHERE societe=:societe AND c_nom LIKE ':name%' AND web = 'W' LIMIT 500)"""
results = request.dbsession.execute(query, {'societe': societe, 'name': name}).fetchall() results = request.dbsession.execute(query, {'societe': societe, 'name': name}).fetchall()
return results return results
@@ -88,6 +88,20 @@ def get_devis_lig_by_no(request,nodossier):
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall() results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall()
return results return results
def get_devis_lignes_by_no(request, nodossier, nolig):
societe = nodossier[0:2]
type_doc = nodossier[3:5]
no_id = nodossier[5:]
if nolig == '0':
query = "SELECT * FROM devis_lignes WHERE societe = :societe and no_id=:no_id;"
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall()
else:
query = "SELECT * FROM devis_lignes WHERE societe = :societe and no_id=:no_id and nolig=:nolig;"
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id, 'nolig': nolig}).first()
return results
def insert_devis_from_dossier(request, nodossier, logged_in): def insert_devis_from_dossier(request, nodossier, logged_in):
societe = nodossier[0:2] societe = nodossier[0:2]
no_id = nodossier[3:] no_id = nodossier[3:]
@@ -111,3 +125,24 @@ def get_devis_by_no(request,nodossier):
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first() results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
return results return results
def update_devis_ligne(request, nodossier, nolig, new_values):
societe = nodossier[0:2]
no_id = nodossier[5:]
# formater les champs
s = ''
for param in new_values.keys():
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if nolig == '0':
query = "INSERT INTO devis_lignes SET %s" % s
else:
new_values['societe'] = societe
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()
execute_query(request, query, new_values)

View File

@@ -10,6 +10,7 @@ def includeme(config):
config.add_route('ajax_client', '/ajax_client') config.add_route('ajax_client', '/ajax_client')
config.add_route('ajax_codepostal', '/ajax_codepostal') config.add_route('ajax_codepostal', '/ajax_codepostal')
config.add_route('ajax_lookup', '/ajax_lookup') config.add_route('ajax_lookup', '/ajax_lookup')
config.add_route('ajax_texte', '/ajax_texte')
config.add_route('changer_mdp', '/changer_mdp') config.add_route('changer_mdp', '/changer_mdp')
config.add_route('envoyer_mdp', '/envoyer_mdp') config.add_route('envoyer_mdp', '/envoyer_mdp')
config.add_route('login', '/login') config.add_route('login', '/login')
@@ -18,9 +19,10 @@ def includeme(config):
config.add_route('redefinir_mdp', '/redefinir_mdp/{lien}') config.add_route('redefinir_mdp', '/redefinir_mdp/{lien}')
config.add_route('init_mdp', '/init_mdp/{user}/{lien}') config.add_route('init_mdp', '/init_mdp/{user}/{lien}')
# devis # devis
config.add_route('devis_ligne', '/devis_ligne/{type_ligne}/{nodossier}/{nolig}')
config.add_route('devis_list', '/devis_list') config.add_route('devis_list', '/devis_list')
config.add_route('devis_create', '/devis_create/{nodossier}') config.add_route('devis_create', '/devis_create/{nodossier}')
config.add_route('devis_lignes', '/devis_lignes/{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}')
# dossier # dossier
config.add_route('demandes','/demandes') config.add_route('demandes','/demandes')

View File

@@ -88,6 +88,12 @@
.modal-dialog { .modal-dialog {
top:7%; top:7%;
} }
.type-ligne-panel {
padding-left: 25px;
margin-top: 5px;
margin-bottom: 20px;
display: none;
}
.footer { .footer {
background-color: #2f2f2f; background-color: #2f2f2f;

View File

@@ -18,7 +18,7 @@
<div class="col-sm-3"> <div class="col-sm-3">
<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>DEVIS</h4></a> <h4>E-DEVIS</h4></a>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<a href="${request.application_url}/dossier_lookup"> <a href="${request.application_url}/dossier_lookup">

View File

@@ -0,0 +1,148 @@
<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="devis_ligne-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">
<!-- *** TEXTE *** -->
<div 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">
<label class="radio-inline"><input type="radio" name="ref" value="T1"
tal:attributes="checked ligne.ref=='T1'">Titre</label>
<label class="radio-inline"><input type="radio" name="ref" value="T2"
tal:attributes="checked ligne.ref=='T2'">Sous-titre</label>
<label class="radio-inline"><input type="radio" name="ref" value="TX"
tal:attributes="checked ligne.ref=='TX'">Texte libre</label>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Texte</label>
<div class="col-xs-6">
<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="libelle" name="libelle" value="${ligne.libelle}">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">ref</label>
<div class="col-xs-6">
<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">Quantité</label>
<div class="col-xs-6">
<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>
</div>
<!-- *** SOUS-TOTAL *** -->
<div tal:condition="type_ligne=='ST'">
<div class="form-group">
<label class="control-label col-sm-2">Référence</label>
<div class="col-sm-10">
<p class="form-control-static">${ligne.ref}</p>
</div>
<label class="control-label col-sm-2">Libellé</label>
<div class="col-sm-10">
<p class="form-control-static">${ligne.libelle}</p>
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Dern. modif le</label>
<div class="col-sm-10">
<p class="form-control-static">${ligne.datemaj.strftime('%d-%m-%Y %H:%M')} par ${ligne.usermaj}</p>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9">
<div class="form-group">
<a class="btn btn-default" href="${request.route_url('devis_web', nodossier=nodossier)}">
<span class="glyphicon glyphicon-arrow-left"></span> Annuler</a>
<button class="btn btn-primary" type="submit" name="form.submited">
<span class="glyphicon glyphicon-ok"></span> Enregistrer</button>
<button class="btn btn-danger" type="submit" name="form.deleted" tal:condition="nolig != '0'">
<span class="glyphicon glyphicon-remove"></span> Supprimer</button>
</div>
</div>
</div>
</form>
<br />
<br />
<br />
<!-- https://makitweb.com/autocomplete-data-on-multiple-fields-with-jquery-and-ajax/ -->
</div>
<div metal:fill-slot="additional_scripts">
<!-- autocomplete plugin -->
<link href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet">
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script>
$(document).ready(function() {
// validate the form
$('#devis_ligne-form').formValidation({
framework: 'bootstrap',
icon: {
valid: 'glyphicon glyphicon-ok',
invalid: 'glyphicon glyphicon-remove',
validating: 'glyphicon glyphicon-refresh'
},
fields: {
type_ligne: {
validators: {
notEmpty: {
message: 'Veuillez sélectionner un type de ligne.'
}
}
},
}
})
$("input[name=type_ligne]").change(function() {
var cas = $(this).val();
$(".type-ligne-panel").hide();
$("#"+cas).show();
});
$('#libelle').autocomplete({
source: function (request, response) {
$.ajax({
url:'/ajax_texte',
dataType: 'json',
data: {
recherche: request.term,
},
success: function (data) {
response( data );
},
});
},
minLength: 3,
appendTo: "#TX"
});
});
</script>
</div>
</metal:block>

View File

@@ -58,7 +58,7 @@
</tr> </tr>
<tr tal:repeat="detail devis"> <tr tal:repeat="detail devis">
<td> <td>
<a href="/devis_view/${societe}-DE${detail.numero}">${societe}-${detail.numero}</a> <a href="/devis_web/${societe}-DE${detail.numero}">${societe}-${detail.numero}-W</a>
</td> </td>
<td>${detail.date.strftime('%d-%m-%Y')}</td> <td>${detail.date.strftime('%d-%m-%Y')}</td>
<td>${detail.nomcli}</td> <td>${detail.nomcli}</td>

View File

@@ -61,19 +61,21 @@
<th></th> <th></th>
</tr> </tr>
<tr tal:repeat="detail details"> <tr tal:repeat="detail details">
<td>${detail.REF}</td> <td>${detail.ref}</td>
<td>${detail.LIB}</td> <td><a href="/devis_ligne/${detail.type_ligne}/${nodossier}/${detail.nolig}">${detail.libelle}</a></td>
<td class="text-right">${layout.to_decz(detail.QTE)}</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.prixht)}</td>
<td class="text-right">${layout.to_euroz(detail.MTHT)}</td> <td class="text-right">${layout.to_euroz(detail.mtht)}</td>
<td class="text-center">${detail.USERMAJ}</td> <td class="text-center">${detail.usermaj}</td>
</tr> </tr>
</table> </table>
<p> <p>
<a class="btn btn-success" role="button" href="${request.route_url('devis_create', nodossier=nodossier)}" <a class="btn btn-success" role="button" href="#"
data-toggle="modal" data-target="#confirmCreate"><span class="glyphicon glyphicon-plus"></span> Nouvelle ligne</a> data-toggle="modal" data-target="#confirmCreate"><span class="glyphicon glyphicon-plus"></span> Nouvelle ligne</a>
</p> </p>
<br />
<br />
<!-- Modal : Confirmation CREATION --> <!-- Modal : Confirmation CREATION -->
<div class="modal fade" id="confirmCreate" role="dialog" aria-labelledby="confirmCreateLabel" aria-hidden="true"> <div class="modal fade" id="confirmCreate" role="dialog" aria-labelledby="confirmCreateLabel" aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
@@ -87,7 +89,7 @@
<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-framework="bootstrap"
data-fv-icon-valid="glyphicon glyphicon-ok" data-fv-icon-valid="glyphicon glyphicon-ok"
data-fv-icon-invalid="glyphicon glyphicon-remove" data-fv-icon-invalid="glyphicon glyphicon-remove"
data-fv-icon-validating="glyphicon glyphicon-refresh"> data-fv-icon-validating="glyphicon glyphicon-refresh">
<div class="form-group"> <div class="form-group">
@@ -95,13 +97,12 @@
<div class="col-xs-8"> <div class="col-xs-8">
<label class="radio"><input type="radio" name="type_lig" value="TX" checked>Titre, sous-titre, ligne detexte</label> <label class="radio"><input type="radio" name="type_lig" value="TX" checked>Titre, sous-titre, ligne detexte</label>
<label class="radio"><input type="radio" name="type_lig" value="AR">Article</label> <label class="radio"><input type="radio" name="type_lig" value="AR">Article</label>
<label class="radio"><input type="radio" name="type_lig" value="CA">Calcul</label>
<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="form-group">
<div class="col-xs-5 col-xs-offset-3"> <div class="col-xs-5 col-xs-offset-3">
<button type="submit" class="btn btn-danger" name="form.added">Ajouter</button> <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> </div>
</div> </div>
@@ -110,8 +111,6 @@
</div> </div>
</div> </div>
</div> </div>
<br />
<br />
</div> </div>
</metal:block> </metal:block>

View File

@@ -198,7 +198,7 @@
<a href="/devis_view/${detail.nodossier}">${detail.nodossier}</a> <a href="/devis_view/${detail.nodossier}">${detail.nodossier}</a>
</td> </td>
<td tal:condition="detail.web=='W'"> <td tal:condition="detail.web=='W'">
<a href="/devis_lignes/${detail.nodossier}">${detail.nodossier}-${detail.web}</a> <a href="/devis_web/${detail.nodossier}">${detail.nodossier}-${detail.web}</a>
</td> </td>
<td>${detail.date.strftime('%d-%m-%Y')}</td> <td>${detail.date.strftime('%d-%m-%Y')}</td>
<td>${detail.nomcli}</td> <td>${detail.nomcli}</td>

View File

@@ -314,4 +314,19 @@ def ajax_client(request):
return Response(json.dumps(liste)) return Response(json.dumps(liste))
@view_config(route_name='ajax_texte')
def ajax_texte(request):
recherche = request.GET['recherche']
# lire les codes postaux commencant par
items = get_article(request, recherche)
liste=[]
for row in items:
d = row.LIBART
liste.append(d)
return Response(json.dumps(liste))

View File

@@ -95,25 +95,42 @@ def devis_view(request):
'bg_color': bg_color, 'bg_color': bg_color,
} }
@view_config(route_name='devis_lignes', renderer='../templates/devis/devis_lignes.pt', permission='view') @view_config(route_name='devis_web', renderer='../templates/devis/devis_web.pt', permission='view')
def devis_lignes(request): def devis_web(request):
nodossier = request.matchdict['nodossier'] nodossier = request.matchdict['nodossier']
societe = nodossier[0:2] societe = nodossier[0:2]
url = request.route_url("devis_lignes", nodossier=nodossier) no_id = nodossier[5:]
url = request.route_url("devis_web", nodossier=nodossier)
logged_in = request.authenticated_userid.upper()
dossier = get_devis_by_no(request, nodossier) dossier = get_devis_by_no(request, nodossier)
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" % (nodossier), 'danger')
return HTTPFound(location=request.route_url("dossier_lookup")) return HTTPFound(location=request.route_url("dossier_lookup"))
# lire tous les lignes du devis # lire tous les lignes du devis
details = get_devis_lig_by_no(request, nodossier) details = get_devis_lignes_by_no(request, nodossier, '0')
# select background color according to society # select background color according to society
bg_color = "bg-%s" % societe bg_color = "bg-%s" % societe
# -- ajouter une ligne # -- ajouter une ligne
if 'form.added' in request.params: if 'form.submited' in request.params:
type_lig = request.params['type_lig'] type_lig = request.params['type_lig']
import pdb;pdb.set_trace() if type_lig == 'ST':
# ajout d'un SOUS-TOTAL
new_values = {}
new_values['type_ligne'] = 'ST'
new_values['ref'] = 'ST'
new_values['libelle'] = 'Sous-total'
new_values['usermaj'] = logged_in
new_values['societe'] = societe
new_values['no_id'] = no_id
new_values['nolig'] = len(details) + 1
update_devis_ligne(request, nodossier, '0', new_values)
return HTTPFound(location=url)
else:
return HTTPFound(request.route_url("devis_ligne", type_ligne=type_lig, nodossier=nodossier, nolig='0'))
return { return {
'page_title': "Devis no : %s W" % (nodossier), 'page_title': "Devis no : %s W" % (nodossier),
@@ -123,3 +140,91 @@ def devis_lignes(request):
'details': details, 'details': details,
'bg_color': bg_color, 'bg_color': bg_color,
} }
@view_config(route_name='devis_ligne', renderer='../templates/devis/devis_ligne.pt', permission='view')
def devis_ligne(request):
type_ligne = request.matchdict['type_ligne']
nodossier = request.matchdict['nodossier']
nolig = request.matchdict['nolig']
societe = nodossier[0:2]
no_id = nodossier[5:]
url = request.route_url("devis_ligne", type_ligne=type_ligne, nodossier=nodossier, nolig=nolig)
logged_in = request.authenticated_userid.upper()
message = ''
dossier = get_devis_by_no(request, nodossier)
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 le nombre total de lignes du devis
lignes = get_devis_lignes_by_no(request, nodossier, '0')
nb_lignes = len(lignes)
if nolig == '0':
# nouveau
ligne = {}
ligne['type_ligne'] = type_ligne
ligne['ref'] = ''
ligne['qte'] = 0
ligne['prixht'] = 0
ligne['libelle'] = ''
ligne['usermaj'] = logged_in
ligne['datemaj'] = datetime.now()
page_title= 'Nouvelle ligne %s' % type_ligne
else:
# lire la ligne du devis
ligne = get_devis_lignes_by_no(request, nodossier, nolig)
page_title= "Modification de la ligne %s" % (nolig)
# import pdb;pdb.set_trace()
# -- ajouter une ligne
if 'form.submited' in request.params:
if type_ligne == 'TX':
# ajout d'un TEXTE
new_values = {}
for param, db_value in ligne.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
new_values['type_ligne'] = type_ligne
new_values['usermaj'] = logged_in
new_values['societe'] = societe
new_values['no_id'] = no_id
if nolig == '0':
new_values['nolig'] = nb_lignes + 1
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')
return HTTPFound(location=request.route_url("devis_web", nodossier=nodossier))
elif type_ligne == 'AR':
# ajout d'un article
new_values = {}
for param, db_value in ligne.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
new_values['type_ligne'] = type_ligne
new_values['usermaj'] = logged_in
new_values['societe'] = societe
new_values['no_id'] = no_id
if nolig == '0':
new_values['nolig'] = nb_lignes + 1
else:
new_values['nolig'] = nolig
update_devis_ligne(request, nodossier, nolig, new_values)
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 {
'page_title': page_title,
'url': url,
'message': message,
'nodossier': nodossier,
'nolig': nolig,
'dossier': dossier,
'ligne': ligne,
'type_ligne': type_ligne,
}