# -*- coding: utf8 -*- from pyramid.response import Response from pyramid.renderers import render, get_renderer from pyramid.view import ( view_config, forbidden_view_config, ) from pyramid.httpexceptions import ( HTTPFound, HTTPNotFound, HTTPForbidden, ) from datetime import * import pdfkit from ..views.default import * from ..models.default import * from ..models.dossier import * from ..models.devis import * @view_config(route_name='devis_list', renderer='../templates/devis/devis_list.pt', permission='view') def devis_list(request): url = request.route_url('devis_list') logged_in = request.authenticated_userid.upper() message = '' member = get_member_by_id(request, logged_in) societe_defaut = member.societe societe = societe_defaut access_defaut = member.access liste=[] name = '' cb_tous = "non" if 'form.submitted' in request.params: name = request.params['name'] societe = request.params['societe'] # lire les devis devis = get_devis_byName(request, societe, name) if len(devis) == 0: message = "Devis non trouvé : %s" % name return { 'page_title': "Rechercher un devis", 'url': url, 'message': message, 'devis': devis, 'societe': societe, 'name': name, } @view_config(route_name='devis_create', permission='view') def devis_create(request): nodossier = request.matchdict['nodossier'] societe = nodossier[0:2] logged_in = request.authenticated_userid.upper() # créer un devis à partir d'un dossier no_devis = insert_devis_from_dossier(request, nodossier, logged_in) request.session.flash(u"Le devis %s a été créé avec succès" % no_devis.last_insert_id, 'success') return HTTPFound(location=request.route_url("dossier_view", nodossier=nodossier) + '#tab_documents') @view_config(route_name='devis_view', renderer='../templates/devis/devis_view.pt', permission='view') def devis_view(request): nodevis = request.matchdict['nodevis'] societe = nodevis[0:2] url = request.route_url("devis_view", nodevis=nodevis) type_doc = nodevis[3:5] if type_doc == 'DE': page_title = "Devis no : %s" % (nodevis) entete = get_devis_by_no(request, nodevis) elif type_doc == 'FA': page_title = "Facture no : %s" % (nodevis) entete = get_facture_by_no(request, nodevis) else: page_title = "Proforma no : %s" % (nodevis) entete = get_proforma_by_no(request, nodevis) if entete is None: request.session.flash(u"Le document no %s est introuvable" % (nodevis), 'danger') return HTTPFound(location=request.route_url("dossier_lookup")) # lire tous les lignes du doc details = get_devis_lig_by_no(request, nodevis) # select background color according to society bg_color = "bg-%s" % societe return { 'page_title': page_title, 'nodevis': nodevis, 'entete': entete, 'details': details, 'bg_color': bg_color, } @view_config(route_name='devis_web', renderer='../templates/devis/devis_web.pt', permission='view') def devis_web(request): nodevis = request.matchdict['nodevis'] societe = nodevis[0:2] no_id = nodevis[5:] url = request.route_url("devis_web", nodevis=nodevis) logged_in = request.authenticated_userid.upper() devis = get_devis_by_no(request, nodevis) if devis is None: request.session.flash(u"Le document no %s est introuvable" % (nodevis), 'danger') return HTTPFound(location=request.route_url("dossier_lookup")) nochantier = str(devis.nochantier) # lire tous les lignes du devis details = get_devis_lignes_by_no(request, nodevis, '0') # select background color according to society bg_color = "bg-%s" % societe # -- ajouter une ligne if 'form.submited' in request.params: type_lig = request.params['type_lig'] 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, nodevis, '0', new_values) return HTTPFound(location=url) else: return HTTPFound(request.route_url("devis_ligne", type_ligne=type_lig, nodevis=nodevis, nolig='0')) if 'form.generate' in request.params: # lire la societe soc = get_societes(request, societe) options = { 'page-size': 'A4', 'margin-top': '1cm', 'margin-right': '1cm', 'margin-bottom': '1cm', 'margin-left': '1cm', 'footer-font-size':'7', 'footer-center': soc.code_ape, 'footer-right': '[page] / [topage]', } # créer le répertoire du chantier s'il n'existe pas encore path = '%s/%s/%s' % (request.registry.settings['mondumas.devfac_dir'], societe, nochantier) os.makedirs(path, exist_ok=True) # générer le devis en PDF filename = "%s-DD%s-DE%s-devis.pdf" % (societe, nochantier, no_id) dest = "mondumas/static/DEVFAC/DOCS_ATTACHES/%s/%s/%s" % (societe, nochantier, filename) # import pdb;pdb.set_trace() # supprimer le fichier s'il existe déjà if os.path.exists(dest): os.remove(dest) # on est en developpement ou en production if request.registry.settings["mail.username"] == "sas.dumas@orange.fr": origin = 'https://gestion.entreprise-dumas.com/devis_preview/%s' % nodevis pdfkit.from_url(origin, dest, options=options) else: origin = request.route_url('devis_preview', nodevis=nodevis) config = pdfkit.configuration(wkhtmltopdf="C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe") pdfkit.from_url(origin, dest, configuration=config, options=options) insert_dossier_attaches(request, '%s-%s' % (societe, nochantier), 0, 0, 'CLT', filename, '160 Ko', logged_in) request.session.flash(u"Le devis a été généré avec succès.", 'success') return HTTPFound(location=request.route_url('dossier_view', nodossier='%s-%s' % (societe, nochantier))) return { 'page_title': "Devis no : %s W" % (nodevis), 'url': url, 'nodevis': nodevis, 'devis': devis, 'details': details, 'bg_color': bg_color, 'max_no': len(details), } @view_config(route_name='devis_ligne', renderer='../templates/devis/devis_ligne.pt', permission='view') def devis_ligne(request): type_ligne = request.matchdict['type_ligne'] nodevis = request.matchdict['nodevis'] nolig = request.matchdict['nolig'] societe = nodevis[0:2] no_id = nodevis[5:] url = request.route_url("devis_ligne", type_ligne=type_ligne, nodevis=nodevis, nolig=nolig) logged_in = request.authenticated_userid.upper() message = '' dossier = get_devis_by_no(request, nodevis) if dossier is None: request.session.flash(u"Le document no %s est introuvable" % (nodevis), 'danger') return HTTPFound(location=request.route_url("dossier_lookup")) # lire le nombre total de lignes du devis lignes = get_devis_lignes_by_no(request, nodevis, '0') nb_lignes = len(lignes) if nolig == '0': # nouveau ligne = {} ligne['type_ligne'] = type_ligne ligne['ref'] = '' if type_ligne == 'AR': ligne['qte'] = 1 ligne['metrage'] = '' ligne['deduction'] = '' else: 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, nodevis, 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, nodevis, nolig, new_values) request.session.flash("La ligne de texte a été mis à jour avec succès.", 'success') return HTTPFound(location=request.route_url("devis_web", nodevis=nodevis)) 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] # calcul métrage si saisi metrage = 0 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 new_values['no_id'] = no_id if nolig == '0': new_values['nolig'] = nb_lignes + 1 else: new_values['nolig'] = nolig update_devis_ligne(request, nodevis, 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", nodevis=nodevis)) # -- ajouter une ligne if 'form.deleted' in request.params: delete_devis_ligne(request, nodevis, 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", nodevis=nodevis)) return { 'page_title': page_title, 'url': url, 'message': message, 'nodevis': nodevis, 'nolig': nolig, 'dossier': dossier, 'ligne': ligne, 'type_ligne': type_ligne, } @view_config(route_name='devis_preview', renderer='../templates/devis/devis_preview.pt') def devis_preview(request): nodevis = request.matchdict['nodevis'] societe = nodevis[0:2] no_id = nodevis[5:] # calculer les totaux HT et TTC sum_devis_totaux(request, nodevis) # select logo according to society logo_url = request.static_url('mondumas:static/img/Logo-%s.jpg' % societe) devis = get_devis_by_no(request, nodevis) # import pdb;pdb.set_trace() if devis is None: request.session.flash(u"Le document no %s est introuvable" % (nodevis), 'danger') return HTTPFound(location=request.route_url("dossier_lookup")) # lire tous les lignes du devis details = get_devis_lignes_by_no(request, nodevis, '0') # générer les détails en HTML dt_html = '' for ligne in details: if ligne.ref == 'T1': dt_html += '
%s
%s
%s
' % ligne.libelle
if ligne.metrage:
dt_html += ligne.metrage
if ligne.deduction:
dt_html += '
déduction :
'
dt_html += '%s' % ligne.deduction
dt_html += '