From 71305e8002dc32268b011ef47470f93757bccd47 Mon Sep 17 00:00:00 2001 From: Phuoc CAO Date: Fri, 16 Oct 2020 16:39:47 +0200 Subject: [PATCH] move line up and down --- mondumas/models/devis.py | 37 ++++++++++ mondumas/routes.py | 1 + mondumas/templates/devis/devis_preview.pt | 11 ++- mondumas/templates/devis/devis_web.pt | 15 +++- mondumas/views/devis.py | 87 +++++++++++++++++------ 5 files changed, 122 insertions(+), 29 deletions(-) diff --git a/mondumas/models/devis.py b/mondumas/models/devis.py index 76f47ed..15d7dd1 100644 --- a/mondumas/models/devis.py +++ b/mondumas/models/devis.py @@ -156,3 +156,40 @@ def sum_devis_totaux(request, nodossier): totalttc = totalht + totaltva WHERE societe=:societe AND no_id=:no_id;""" execute_query(request, query, {'societe': societe, 'no_id': no_id}) + +def delete_devis_ligne(request, nodossier, nolig): + societe = nodossier[0:2] + no_id = nodossier[5:] + + query = "DELETE FROM devis_lignes WHERE societe = :societe and no_id=:no_id and nolig=%s;" + execute_query(request, query, {'societe': societe, 'no_id': no_id}) + +def move_devis_ligne(request, nodossier, nolig, move): + societe = nodossier[0:2] + no_id = nodossier[5:] + + # get max no ligne du devis + query = "SELECT count(*) AS max_no FROM devis_lignes WHERE societe = :societe and no_id=:no_id;" + results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first() + max_no = results.max_no + 1 + + step = 0 + if move == 'up': + # déplacement vers le haut + if nolig > 1: + step = -1 + else: + # déplacement vers le haut + if nolig < max_no: + step = +1 + + if step != 0: + # déplacer le suivant ou précédent vers la fin + query = """UPDATE devis_lignes SET nolig = :max_no WHERE societe = :societe and no_id=:no_id and nolig = :nolig + :step;""" + execute_query(request, query, {'societe': societe, 'no_id': no_id, 'nolig': nolig, 'max_no': max_no, 'step': step}) + # permuter avec le suivant ou précédent + query = """UPDATE devis_lignes SET nolig = nolig + :step WHERE societe = :societe and no_id=:no_id and nolig = :nolig;""" + execute_query(request, query, {'societe': societe, 'no_id': no_id, 'nolig': nolig, 'step': step}) + # remettre le précédent ou suivant à la place de la ligne déplacée + query = """UPDATE devis_lignes SET nolig = :nolig WHERE societe = :societe and no_id=:no_id and nolig = :max_no;""" + execute_query(request, query, {'societe': societe, 'no_id': no_id, 'nolig': nolig, 'max_no': max_no}) diff --git a/mondumas/routes.py b/mondumas/routes.py index e8fd940..9d3170e 100644 --- a/mondumas/routes.py +++ b/mondumas/routes.py @@ -21,6 +21,7 @@ def includeme(config): config.add_route('init_mdp', '/init_mdp/{user}/{lien}') # devis config.add_route('devis_ligne', '/devis_ligne/{type_ligne}/{nodossier}/{nolig}') + config.add_route('devis_lig_mv', '/devis_lig_mv/{move}/{nodossier}/{nolig}') config.add_route('devis_list', '/devis_list') config.add_route('devis_create', '/devis_create/{nodossier}') config.add_route('devis_web', '/devis_web/{nodossier}') diff --git a/mondumas/templates/devis/devis_preview.pt b/mondumas/templates/devis/devis_preview.pt index d8dc88e..df825a6 100644 --- a/mondumas/templates/devis/devis_preview.pt +++ b/mondumas/templates/devis/devis_preview.pt @@ -44,7 +44,7 @@
-

Surface

+

Surf./ Qté

P.U. HT

@@ -52,14 +52,13 @@

Montant HT

-
-
-
-
+
+
Page text goes here.
+
+
-
diff --git a/mondumas/templates/devis/devis_web.pt b/mondumas/templates/devis/devis_web.pt index c30a850..1fc1d04 100644 --- a/mondumas/templates/devis/devis_web.pt +++ b/mondumas/templates/devis/devis_web.pt @@ -52,7 +52,7 @@

- + Prévisualiser

@@ -64,14 +64,23 @@ PU HT Montant HT + - ${detail.ref} - ${detail.libelle} + ${detail.ref} + ${detail.libelle} ${layout.to_decz(detail.qte)} ${layout.to_euroz(detail.prixht)} ${layout.to_euroz(detail.mtht)} ${detail.usermaj} + + + + + +

diff --git a/mondumas/views/devis.py b/mondumas/views/devis.py index ef58610..9151a00 100644 --- a/mondumas/views/devis.py +++ b/mondumas/views/devis.py @@ -139,6 +139,7 @@ def devis_web(request): 'dossier': dossier, 'details': details, 'bg_color': bg_color, + 'max_no': len(details), } @view_config(route_name='devis_ligne', renderer='../templates/devis/devis_ligne.pt', permission='view') @@ -210,24 +211,30 @@ def devis_ligne(request): if param in request.params and request.params[param] != db_value: new_values[param] = request.params[param] - # calcul métrage + # calcul métrage si saisi 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 + saisie = request.params['metrage'] + if len(saisie) > 0: + try: + metrage = eval(saisie) + except (SyntaxError, NameError, TypeError, ZeroDivisionError): + message = "Erreur de syntaxe dans la formule de calcul" + + # calcul deduction si saisi + saisie = request.params['deduction'] + if len(saisie) > 0: + deduc = 0 + try: + deduc = eval(saisie) + except (SyntaxError, NameError, TypeError, ZeroDivisionError): + message = "Erreur de syntaxe dans la formule de calcul" + if deduc < 0 : + metrage += deduc + else: + metrage -= deduc + # si metrage saisi, le mettre dans qte + if metrage > 0: + new_values['qte'] = metrage new_values['type_ligne'] = type_ligne new_values['usermaj'] = logged_in new_values['societe'] = societe @@ -239,6 +246,12 @@ def devis_ligne(request): 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)) + + # -- ajouter une ligne + if 'form.deleted' in request.params: + delete_devis_ligne(request, nodossier, nolig) + request.session.flash(u"La ligne de devis a été supprimée avec succès.", 'success') + return HTTPFound(location=request.route_url("devis_web", nodossier=nodossier)) return { @@ -249,7 +262,7 @@ def devis_ligne(request): 'nolig': nolig, 'dossier': dossier, 'ligne': ligne, - 'type_ligne': type_ligne, + 'type_ligne': type_ligne, } @view_config(route_name='devis_preview', renderer='../templates/devis/devis_preview.pt', permission='view') @@ -262,6 +275,8 @@ def devis_preview(request): # calculer les totaux HT et TTC sum_devis_totaux(request, nodossier) + # select logo according to society + logo_url = request.static_url('mondumas:static/img/Logo-%s.jpg' % societe) dossier = get_devis_by_no(request, nodossier) # import pdb;pdb.set_trace() @@ -271,8 +286,27 @@ def devis_preview(request): # 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) + + # générer les détails en HTML + dt_html = '' + for ligne in details: + if ligne.ref == 'T1': + dt_html += '

%s

' % ligne.libelle + elif ligne.ref == 'T2': + dt_html += '

%s

' % ligne.libelle + elif ligne.ref == 'TX': + dt_html += '

%s

' % ligne.libelle + elif ligne.type_ligne == 'AR': + dt_html += '

%s
' % ligne.libelle + if ligne.metrage: + dt_html += '%s
' % ligne.metrage + if ligne.deduction: + dt_html += 'déduction :
' + dt_html += '%s
' % ligne.deduction + dt_html += '

' + dt_html += '

%s

' % ligne.qte + dt_html += '

%s

' % ligne.prixht + dt_html += '

%s

' % ligne.mtht return { 'page_title': '', @@ -281,5 +315,18 @@ def devis_preview(request): 'nodossier': nodossier, 'dossier': dossier, 'details': details, + 'dt_html': dt_html, } +@view_config(route_name='devis_lig_mv', permission='view') +def devis_lig_mv(request): + move = request.matchdict['move'] + nodossier = request.matchdict['nodossier'] + nolig = request.matchdict['nolig'] + societe = nodossier[0:2] + no_id = nodossier[5:] + logged_in = request.authenticated_userid.upper() + + move_devis_ligne(request, nodossier, int(nolig), move) + request.session.flash(u"La ligne de devis a été déplacée avec succès.", 'success') + return HTTPFound(location=request.route_url("devis_web", nodossier=nodossier))