# -*- coding: utf8 -*- from sqlalchemy import text from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import ( scoped_session, sessionmaker, ) from zope.sqlalchemy import ( ZopeTransactionExtension, mark_changed ) from datetime import * import transaction import os from ..views.default import ( to_int, ) def execute_query(request, query, params): """Execute query and mark session as changed""" request.dbsession.execute(query, params) mark_changed(request.dbsession) transaction.commit() def get_devis_byName(request, societe, name): numero = to_int(name) 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 FROM devis WHERE societe=:societe AND no_id >=:name AND web = 'W' LIMIT 300;;""" % (societe, name) 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 FROM devis WHERE societe=:societe AND web = 'W' ORDER BY no_id DESC LIMIT 300;""" 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 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() return results def get_devfac_by_no(request,nodossier): # lire devis, facture ou proforma 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_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 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): societe = nodossier[0:2] no_id = nodossier[3:] query = "CALL spINS_DEVIS_FROM_DOSSIER(:societe, 'DDW', :no_id, :logged_in);" results = request.dbsession.execute(query,{'societe': societe, 'no_id': no_id, 'logged_in': logged_in}).first() return results def get_devis_by_no(request,nodossier): # lire devis, facture ou proforma societe = nodossier[0:2] no_id = nodossier[5:] query = """ SELECT d.*, c.*, s.libelle, 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 INNER JOIN p_statuts s ON d.STATUS = s.code 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_facture_by_no(request,nodossier): # lire facture societe = nodossier[0:2] no_id = nodossier[5:] query = """ SELECT d.*, c.*, s.libelle, 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 INNER JOIN p_statuts s ON d.STATUS = s.code 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_proforma_by_no(request,nodossier): # lire facture societe = nodossier[0:2] no_id = nodossier[5:] 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 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) def sum_devis_totaux(request, nodossier): societe = nodossier[0:2] no_id = nodossier[5:] query = """UPDATE devis SET totalht = (SELECT SUM(mtht) FROM devis_lignes WHERE societe=:societe AND no_id=:no_id), totaltva = ROUND(totalht * tauxtva / 100,2), 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}) def update_devis_cloture(request, nodevis, status, logged_in): societe = nodevis[0:2] nochantier = int(nodevis[5:]) # met le montant regle à 1 centime pour terminé le dossier query = "UPDATE devis SET STATUS = :status, USERMAJ = :logged_in WHERE societe=:societe AND no_id=:nochantier;" execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'status': status, 'logged_in': logged_in}) def get_devis_en_att(request, societe): query = """SELECT d.date, LPAD(d.no_id,6,'0') AS numero, d.nomcli, CONCAT(d.c_nom,'; ',d.c_adr,'; ',d.c_ville) AS chantier, d.totalht AS montant, d.status, s.libelle, d.nosin, d.nopol, d.usermaj FROM devis d JOIN p_statuts s ON d.STATUS = s.CODE WHERE d.societe=:societe AND d.STATUS < 4 ORDER BY d.societe, d.STATUS, d.nomcli;""" results = request.dbsession.execute(query, {'societe': societe}).fetchall() return results