retouche get tarifs

This commit is contained in:
2021-06-04 12:26:13 +02:00
parent 83860d3c21
commit 1356fc2255
9 changed files with 117 additions and 188 deletions

View File

@@ -108,19 +108,20 @@ 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, type, libelle): def get_article(request, type, groupe, libelle):
if type == 'TX': if type == 'LIB':
query = "SELECT * FROM articles WHERE fam='T' and libart like :libelle;" if groupe == 'TEXTE':
results = request.dbsession.execute(query, {'libelle': libelle + "%"}).fetchall() # lire tous les textes dont le libelle commençe par
elif type == 'AR': query = "SELECT * FROM tarifs WHERE groupe='TEXTE' and libelle like :libelle;"
query = "SELECT * FROM articles WHERE ref_cli2 like :libelle;" results = request.dbsession.execute(query, {'libelle': libelle + "%"}).fetchall()
results = request.dbsession.execute(query, {'libelle': libelle + "%"}).fetchall() else:
elif type == 'REF': # lire tous les tarifs du grupe dont le ref commençe par libelle
query = "SELECT * FROM articles WHERE ref = :ref;" query = "SELECT * FROM tarifs WHERE groupe=:groupe and ref like :libelle;"
results = request.dbsession.execute(query, {'ref': libelle}).first() results = request.dbsession.execute(query, {'groupe': groupe, 'libelle': libelle + "%"}).fetchall()
else: else:
query = "SELECT * FROM articles WHERE ref_cli2 = :ref;" # lire tous les tarif du grupe dont le ref est égale à
results = request.dbsession.execute(query, {'ref': libelle}).first() query = "SELECT * FROM tarifs WHERE groupe=:groupe and ref = :libelle;"
results = request.dbsession.execute(query, {'groupe': groupe, 'libelle': libelle}).first()
return results return results
def get_codespostaux(request, codep): def get_codespostaux(request, codep):

View File

@@ -241,7 +241,16 @@ def update_tarif(request, ref, new_values):
query = "UPDATE tarifs SET %s WHERE ref = :ref;" % s query = "UPDATE tarifs SET %s WHERE ref = :ref;" % s
execute_query(request, query, new_values) execute_query(request, query, new_values)
def delete_tarifs(request, ref): def delete_tarif(request, ref):
query = "DELETE FROM tarifs WHERE ref = :ref ;" query = "DELETE FROM tarifs WHERE ref = :ref ;"
execute_query(request, query, {'ref': ref}) execute_query(request, query, {'ref': ref})
def get_tarifs_byGroupe(request, groupe):
query = "SELECT * FROM tarifs WHERE groupe = :groupe;"
results = request.dbsession.execute(query, {'groupe': groupe}).fetchall()
return results
def get_tarif(request, groupe, ref):
query = "SELECT * FROM tarifs WHERE groupe = :groupe and ref = :ref;"
results = request.dbsession.execute(query, {'groupe': groupe, 'ref': ref}).first()
return results

View File

@@ -68,8 +68,8 @@ def includeme(config):
config.add_route('text_edit', '/text_edit/{text_id}') config.add_route('text_edit', '/text_edit/{text_id}')
config.add_route('text_list', '/text_list') config.add_route('text_list', '/text_list')
config.add_route('text_view', '/text_view/{text_id}') config.add_route('text_view', '/text_view/{text_id}')
config.add_route('tarif_edit', '/tarif_edit/{ref}') config.add_route('tarif_edit', '/tarif_edit/{groupe}/{ref}')
config.add_route('tarifs', '/tarifs') config.add_route('tarifs', '/tarifs/{groupe}')
config.add_route('tarifs_import', '/tarifs_import') config.add_route('tarifs_import', '/tarifs_import')
config.add_route('user_edit', '/user_edit/{cd_uti}') config.add_route('user_edit', '/user_edit/{cd_uti}')
config.add_route('users', '/users') config.add_route('users', '/users')

View File

@@ -119,6 +119,7 @@
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script> <script>
$(document).ready(function() { $(document).ready(function() {
groupe = "${dossier.groupe}"
// validate the form // validate the form
$('#devis_ligne-form').formValidation({ $('#devis_ligne-form').formValidation({
framework: 'bootstrap', framework: 'bootstrap',
@@ -146,12 +147,14 @@ $(document).ready(function() {
$('#libelle').autocomplete({ $('#libelle').autocomplete({
minLength: 3, minLength: 3,
appendTo: "#TX", appendTo: "#TX",
source: function (request, response) { source: function (request, response) {
$.ajax({ $.ajax({
url:'/ajax_texte', url:'/ajax_texte',
dataType: 'json', dataType: 'json',
data: { data: {
recherche: 'TX' + request.term, groupe: 'TEXTE',
libelle: request.term,
}, },
success: function (data) { success: function (data) {
response( data ); response( data );
@@ -167,7 +170,8 @@ $(document).ready(function() {
url:'/ajax_texte', url:'/ajax_texte',
dataType: 'json', dataType: 'json',
data: { data: {
recherche: 'AR' + request.term, groupe: groupe,
libelle: request.term,
}, },
success: function (data) { success: function (data) {
response( data ); response( data );
@@ -180,7 +184,10 @@ $(document).ready(function() {
// lecture de l'article // lecture de l'article
$.ajax({ $.ajax({
url: '/ajax_article', url: '/ajax_article',
data: {ref:ref}, data: {
groupe: groupe,
ref:ref
},
dataType: 'json', dataType: 'json',
success:function(response){ success:function(response){
var len = response.length; var len = response.length;

View File

@@ -12,7 +12,7 @@
<h4>ARTICLES</h4> <h4>ARTICLES</h4>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<a href="${request.application_url}/tarifs"><span class="glyphicon glyphicon-list-alt logo-primary"></span></a> <a href="${request.application_url}/tarifs/AXA"><span class="glyphicon glyphicon-list-alt logo-primary"></span></a>
<h4>TARIFS</h4> <h4>TARIFS</h4>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">

View File

@@ -12,125 +12,44 @@
<div id="tarif" class="tab-pane fade in active"> <div id="tarif" class="tab-pane fade in active">
<br /> <br />
<div class="form-group"> <div class="form-group">
<label class="control-label col-xs-2" for="REF">Référence</label> <label class="control-label col-xs-2" for="access">Groupe</label>
<div class="col-xs-7">
<p class="form-control-static">${item.groupe}</p>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="ref">Référence</label>
<div class="col-xs-6"> <div class="col-xs-6">
<input class="form-control" type="text" id="REF" name="REF" value="${item.REF}" <input class="form-control" type="text" id="ref" name="ref" value="${item.ref}"
placeholder="10 caractères maximum" placeholder="20 caractères maximum"
data-fv-notempty="true" data-fv-notempty="true"
data-fv-notempty-message="La référence est obligatoire" data-fv-notempty-message="La référence est obligatoire"
data-fv-stringlength="true" data-fv-stringlength="true"
data-fv-stringlength-max="10"
data-fv-stringlength-message="10 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2">Famille</label>
<div class="col-xs-6">
<select class="form-control" id="FAM" name="FAM">
<tal:block tal:repeat="famille familles">
<option value="${famille}" tal:attributes="selected famille[0]==item.FAM and 'selected' or None">${famille}</option>
</tal:block>
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="LIBART">Libellé</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="LIBART" name="LIBART" value="${item.LIBART}"
placeholder="45 caractères maximum"
data-fv-notempty="true"
data-fv-notempty-message="Le libellé est obligatoire"
data-fv-stringlength="true"
data-fv-stringlength-max="45"
data-fv-stringlength-message="45 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="LIBCOMPL1">Libellé compl. 1</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="LIBCOMPL1" name="LIBCOMPL1" value="${item.LIBCOMPL1}"
placeholder="45 caractères maximum"
data-fv-stringlength="true"
data-fv-stringlength-max="45"
data-fv-stringlength-message="45 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="LIBCOMPL2">Libellé compl. 2</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="LIBCOMPL2" name="LIBCOMPL2" value="${item.LIBCOMPL2}"
placeholder="45 caractères maximum"
data-fv-stringlength="true"
data-fv-stringlength-max="45"
data-fv-stringlength-message="45 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="LIBCOMPL3">Libellé compl. 3</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="LIBCOMPL3" name="LIBCOMPL3" value="${item.LIBCOMPL3}"
placeholder="45 caractères maximum"
data-fv-stringlength="true"
data-fv-stringlength-max="45"
data-fv-stringlength-message="45 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="LIBCOMPL4">Libellé compl. 4</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="LIBCOMPL4" name="LIBCOMPL4" value="${item.LIBCOMPL4}"
placeholder="45 caractères maximum"
data-fv-stringlength="true"
data-fv-stringlength-max="45"
data-fv-stringlength-message="45 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Prix HT 1</label>
<div class="col-xs-6">
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-euro"></i></span>
<input class="form-control" type="text" id="PRIXHT1" name="PRIXHT1" value="${item.PRIXHT1}"
data-fv-numeric="true"
data-fv-numeric-message="Le montant est invalide" />
</div>
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Prix HT 2</label>
<div class="col-xs-6">
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-euro"></i></span>
<input class="form-control" type="text" id="PRIXHT2" name="PRIXHT2" value="${item.PRIXHT2}"
data-fv-numeric="true"
data-fv-numeric-message="Le montant est invalide" />
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="ref_cli1">Réf. client 1</label>
<div class="col-xs-6">
<input class="form-control" type="text" id="ref_cli1" name="ref_cli1" value="${item.ref_cli1}"
placeholder="20 caractères maximum"
data-fv-stringlength="true"
data-fv-stringlength-max="20" data-fv-stringlength-max="20"
data-fv-stringlength-message="20 caractères maximum" /> data-fv-stringlength-message="20 caractères maximum" />
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="control-label col-xs-2" for="ref_cli2">Réf. client 2</label> <label class="control-label col-xs-2" for="libelle">Libellé</label>
<div class="col-xs-6"> <div class="col-xs-8">
<input class="form-control" type="text" id="ref_cli2" name="ref_cli2" value="${item.ref_cli2}" <textarea class="form-control" rows="6" cols="40" id="libelle" name="libelle">${item.libelle}</textarea>
placeholder="20 caractères maximum"
data-fv-stringlength="true"
data-fv-stringlength-max="20"
data-fv-stringlength-message="20 caractères maximum" />
</div> </div>
</div> </div>
<div class="form-group">
<label class="col-xs-2 control-label">Prix HT</label>
<div class="col-xs-6">
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-euro"></i></span>
<input class="form-control" type="text" id="prixht" name="prixht" value="${item.prixht}"
data-fv-numeric="true"
data-fv-numeric-message="Le montant est invalide" />
</div>
</div>
</div>
<div class="form-group"> <div class="form-group">
<label class="control-label col-xs-2" for="access">Dernière modif.</label> <label class="control-label col-xs-2" for="access">Dernière modif.</label>
<div class="col-xs-7"> <div class="col-xs-7">
<p class="form-control-static" tal:condition="item.REF != '0'">${item.modif_le.strftime('%d/%m/%Y - %H:%M')}</p> <p class="form-control-static" tal:condition="item.ref != '0'">${item.modif_le.strftime('%d/%m/%Y - %H:%M')}</p>
</div> </div>
</div> </div>
<br /> <br />
@@ -138,12 +57,12 @@
<div class="form-group"> <div class="form-group">
<div class="col-xs-offset-2 col-xs-10"> <div class="col-xs-offset-2 col-xs-10">
<div class="form-group"> <div class="form-group">
<a class="btn btn-default" href="${request.application_url}/articles"> <a class="btn btn-default" href="${request.application_url}/tarifs/${item.groupe}">
<span class="glyphicon glyphicon-chevron-left"></span> Annuler</a> <span class="glyphicon glyphicon-chevron-left"></span> Annuler</a>
<button class="btn btn-primary" type="submit" name="form.submitted"> <button class="btn btn-primary" type="submit" name="form.submitted">
<span class="glyphicon glyphicon-ok"></span> Enregistrer</button> <span class="glyphicon glyphicon-ok"></span> Enregistrer</button>
<button class="btn btn-warning" type="submit" name="form.deleted" <button class="btn btn-warning" type="submit" name="form.deleted"
tal:condition="item.REF != '0'"> tal:condition="item.ref != '0'">
<span class="glyphicon glyphicon-remove"></span> Supprimer</button> <span class="glyphicon glyphicon-remove"></span> Supprimer</button>
</div> </div>
</div> </div>

View File

@@ -3,11 +3,11 @@
<form method="POST" id="frm" class="form-horizontal"> <form method="POST" id="frm" class="form-horizontal">
<div class="form-group"> <div class="form-group">
<label class="control-label col-md-1">Famille : </label> <label class="control-label col-md-1">groupe : </label>
<div class="col-md-3"> <div class="col-md-3">
<select class="form-control" id="famille" name="famille" onChange="$('#frm').submit()"> <select class="form-control" id="groupe" name="groupe" onChange="$('#frm').submit()">
<tal:block tal:repeat="item familles"> <tal:block tal:repeat="item groupes">
<option value="${item}" tal:attributes="selected famille==item and 'selected' or None">${item}</option> <option value="${item}" tal:attributes="selected groupe==item and 'selected' or None">${item}</option>
</tal:block> </tal:block>
</select> </select>
</div> </div>
@@ -16,7 +16,7 @@
<p> <p>
<a href="${request.application_url}/parametres" class="btn btn-default" role="button"> <a href="${request.application_url}/parametres" class="btn btn-default" role="button">
<span class="glyphicon glyphicon-chevron-left"></span> Retour</a> <span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
<a href="${request.application_url}/article_edit/0" class="btn btn-success" role="button"> <a href="${request.application_url}/tarif_edit/${groupe}/0" class="btn btn-success" role="button">
<span class="glyphicon glyphicon-plus"></span> Nouvel tarif</a> <span class="glyphicon glyphicon-plus"></span> Nouvel tarif</a>
<a href="${request.application_url}/tarifs_import" class="btn btn-primary" role="button"> <a href="${request.application_url}/tarifs_import" class="btn btn-primary" role="button">
<span class="glyphicon glyphicon-import"></span> Import tarifs</a> <span class="glyphicon glyphicon-import"></span> Import tarifs</a>
@@ -27,11 +27,9 @@
<tr> <tr>
<th>Référence</th> <th>Référence</th>
<th>Libellé</th> <th>Libellé</th>
<th>Libellé 2</th> <th>Unité</th>
<th class="text-right">Prix HT 1</th> <th class="text-right">Prix HT 1</th>
<th class="text-right">Prix HT 2</th> <th>Modif le</th>
<th>Réf. client 1</th>
<th>Réf. client 2</th>
</tr> </tr>
</thead> </thead>
</table> </table>
@@ -41,23 +39,24 @@
<script type="text/javascript"> <script type="text/javascript">
var dataSet = ${dt_data}; var dataSet = ${dt_data};
var groupe = '${groupe}';
$(document).ready(function() { $(document).ready(function() {
$.fn.dataTable.moment('DD-MM-YYYY HH:mm'); $.fn.dataTable.moment('DD-MM-YYYY HH:mm');
$('#articles_list').DataTable({ $('#articles_list').DataTable({
data: dataSet, data: dataSet,
pageLength: 100, pageLength: 100,
bLengthChange: false, bLengthChange: false,
searching: false, searching: true,
language: { language: {
url: 'https://cdn.datatables.net/plug-ins/1.10.16/i18n/French.json' url: 'https://cdn.datatables.net/plug-ins/1.10.16/i18n/French.json'
}, },
columnDefs: [ columnDefs: [
{ className: "text-right", "targets": [3,4] }, { className: "text-right", "targets": [3] },
{ targets: 0, { targets: 0,
render: function (data, type, full, meta) { render: function (data, type, full, meta) {
// ajouter un link vers le formulaire // ajouter un link vers le formulaire
return '<a href="/article_edit/' + data + '">' + data + '</a>'; return '<a href="/tarif_edit/' + groupe + '/' + data + '">' + data + '</a>';
}, },
}, },
] ]

View File

@@ -302,36 +302,37 @@ def ajax_client(request):
@view_config(route_name='ajax_texte') @view_config(route_name='ajax_texte')
def ajax_texte(request): def ajax_texte(request):
recherche = request.GET['recherche'] groupe = request.GET['groupe']
type = recherche[:2] libelle = request.GET['libelle']
lib = recherche[2:]
# import pdb;pdb.set_trace() # import pdb;pdb.set_trace()
# lire les articles commencant par # lire les articles commencant par
items = get_article(request, type, lib) items = get_article(request, 'LIB', groupe, libelle)
liste=[] liste=[]
for row in items: for row in items:
if type == 'AR': if groupe == 'TEXTE':
d = '%s | %s | %s' % (row.ref_cli2, row.LIBART, to_euro(row.PRIXHT2)) d = row.libelle
else: else:
d = row.LIBART d = '%s | %s | %s' % (row.ref, row.libelle, to_euro(row.prixht))
liste.append(d) liste.append(d)
return Response(json.dumps(liste)) return Response(json.dumps(liste))
@view_config(route_name='ajax_article') @view_config(route_name='ajax_article')
def ajax_article(request): def ajax_article(request):
groupe = request.GET['groupe']
ref = request.GET['ref'] ref = request.GET['ref']
# lire l'article # lire l'article
items = get_article(request, 'REF2', ref) items = get_article(request, 'REF', groupe, ref)
# puis retourne son libellé et son prixht # puis retourne son libellé et son prixht
liste=[] liste=[]
d = {} d = {}
d['ref'] = items.ref_cli2 d['ref'] = items.ref
d['libelle'] = items.libelle d['libelle'] = items.libelle
d['prixht'] = "%.2f" % items.PRIXHT2 d['prixht'] = "%.2f" % items.prixht
liste.append(d) liste.append(d)
return Response(json.dumps(liste)) return Response(json.dumps(liste))

View File

@@ -805,87 +805,80 @@ def societe_edit(request):
@view_config(route_name='tarifs', renderer='../templates/parametres/tarifs.pt', permission='manage') @view_config(route_name='tarifs', renderer='../templates/parametres/tarifs.pt', permission='manage')
def tarifs(request): def tarifs(request):
familles = ["Article", "Texte"] groupe = request.matchdict['groupe']
groupes = ["AXA", "MAIF", "TEXTE"] groupes = ["AXA", "MAIF", "TEXTE"]
# si table a changé # si table a changé
if 'famille' in request.params: if 'groupe' in request.params:
groupe = request.params["groupe"] groupe = request.params["groupe"]
# lire les articles # lire les articles
items = get_tarifs_byGroupe(request, groupe) items = get_tarifs_byGroupe(request, groupe)
# construire la liste # construire la liste
liste=[] liste=[]
for item in items: for item in items:
d = (item.ref, item.libelle, item.unite, to_euro(item.prixht), item.modif_le.strftime("%d-%m-%Y")) d = (item.ref, item.libelle, item.unite, to_euro(item.prixht), item.modif_le.strftime("%d-%m-%Y"))
liste.append(d) liste.append(d)
return { return {
'page_title': 'Liste des tarifs', 'page_title': 'Liste des tarifs',
'dt_data': json.dumps(liste), 'dt_data': json.dumps(liste),
'familles': familles, 'groupes': groupes,
'groupe': groupe, 'groupe': groupe,
} }
@view_config(route_name='tarif_edit', renderer='../templates/parametres/tarif_edit.pt', permission='manage') @view_config(route_name='tarif_edit', renderer='../templates/parametres/tarif_edit.pt', permission='manage')
def tarif_edit(request):
groupe = request.matchdict['groupe'] groupe = request.matchdict['groupe']
ref = request.matchdict['ref'] ref = request.matchdict['ref']
url = request.route_url('tarif_edit', groupe=groupe, ref=ref) url = request.route_url('tarif_edit', groupe=groupe, ref=ref)
logged_in = request.authenticated_userid logged_in = request.authenticated_userid
message = '' message = ''
familles = ["Article", "Texte"]
if ref == '0': if ref == '0':
# nouveau # nouveau
item = {} item = {}
item['REF'] = '0' item['groupe'] = groupe
item['FAM'] = 'A' item['ref'] = '0'
item['LIBART'] = '' item['libelle'] = ''
item['PRIXHT1'] = 0 item['prixht'] = 0
item['PRIXHT2'] = 0
item['ref_cli1'] = ''
item['ref_cli2'] = ''
item['LIBCOMPL1'] = ''
item['LIBCOMPL2'] = ''
item['LIBCOMPL3'] = ''
item['LIBCOMPL4'] = ''
page_title= 'Nouveau tarif' page_title= 'Nouveau tarif'
else: else:
# lire l'article # lire le tarif
item = get_tarif(request, groupe, ref) item = get_tarif(request, groupe, ref)
if not item: if not item:
request.session.flash("article non trouvé : %s" % ref, 'warning') request.session.flash("Tarif non trouvé : %s" % ref, 'warning')
return HTTPFound(location=request.route_url('articles')) return HTTPFound(location=request.route_url('tarifs', groupe=groupe))
page_title= "Tarif : %s" %(item.ref) page_title= "Tarif : %s" %(item.ref)
if 'form.submitted' in request.params: if 'form.submitted' in request.params:
new_ref = request.params["ref"] new_ref = request.params["ref"]
if new_ref == '0': if new_ref == '0':
message = "Veuillez saisir un code tarif valide." message = "Veuillez saisir un code tarif valide."
else: else:
new_values = {} new_values = {}
for param, db_value in item.items(): for param, db_value in item.items():
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]
if new_values: if new_values:
update_article(request, ref, new_values) new_values['groupe'] = groupe
request.session.flash("Le article a été mis à jour avec succès.", 'success') update_tarif(request, ref, new_values)
request.session.flash("Le tarif a été mis à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('tarifs', groupe=groupe)) return HTTPFound(location=request.route_url('tarifs', groupe=groupe))
if 'form.deleted' in request.params: if 'form.deleted' in request.params:
delete_tarif(request, ref) delete_tarif(request, ref)
request.session.flash("Le article a été supprimé avec succès.", 'success') request.session.flash("Le article a été supprimé avec succès.", 'success')
return HTTPFound(location=request.route_url('tarifs', groupe=groupe)) return HTTPFound(location=request.route_url('tarifs', groupe=groupe))
return { return {
'page_title': page_title, 'page_title': page_title,
'url': url, 'url': url,
'message': message, 'message': message,
'item': item,
'item': item, 'item': item,
} }