# -*- 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 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_chantiers_byName(request, societe, name): query = "CALL spGET_CHANTIERS_byName('%s','%s');" % (societe, name) results = request.dbsession.execute(query).fetchall() return results def get_dossier_by_no(request,nodossier): societe = nodossier[0:2] no_id = nodossier[3:] query = """ SELECT d.*, s.libelle, a.NOM as nom_cabinet, e.NOM as nom_expert, c.QUALITE AS cli_QUALITE, c.NOM AS cli_NOM, c.ADRESSE AS cli_ADRESSE, c.ADRESSE2 AS cli_ADRESSE2, c.CP AS cli_CP, c.VILLE AS cli_VILLE, c.TEL1 AS cli_TEL1, c.TEL2 AS cli_TEL2, c.TELP AS cli_TELP, c.FAX AS cli_FAX, c.NOMRESP AS cli_NOMRESP FROM dem_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 = '%s' and d.no_id=%s;""" % (societe, no_id); results = request.dbsession.execute(query).first() return results def get_dossier_by_sinistre(request,societe, nosin): query = "SELECT * FROM dem_devis WHERE societe = '%s' and LEFT(REPLACE(nosin,' ', ''),11) = LEFT(REPLACE('%s',' ', ''),11);" % (societe, nosin); results = request.dbsession.execute(query).first() return results def get_dossiers_traites(request): query = "SELECT d.*, s.libelle FROM dem_devis d JOIN p_statuts s ON d.STATUS = s.CODE WHERE d.STATUS < 2 ORDER BY d.societe, d.STATUS, d.nomcli"; results = request.dbsession.execute(query).fetchall() return results def get_clients_byName(request, societe, nom): query = "SELECT * FROM clients WHERE societe = '%s' and nom LIKE '%s';" % (societe, nom + '%'); results = request.dbsession.execute(query).fetchall() return results def get_dossier_rdv_by_no(request,nodossier, nolig): societe = nodossier[0:2] no_id = nodossier[3:] if nolig == '0': query = "SELECT * FROM dem_lig WHERE societe = :societe AND no_id = :no_id;" results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall() else: query = """ SELECT l.*, d.C_QUALITE, d.C_NOM FROM dem_lig l INNER JOIN dem_devis d ON l.societe = d.societe and l.no_id = d.no_id where l.societe = '%s' and l.no_id=%s and l.nolig=%s;""" % (societe, no_id, nolig) results = request.dbsession.execute(query).first() return results def get_documents_byChantier(request,nodossier): societe = nodossier[0:2] no_id = nodossier[3:] query = "CALL spGET_DOSSIERS_byNumeo('%s',%s);" % (societe, no_id) results = request.dbsession.execute(query).fetchall() return results def update_suivi(request, nodossier, nolig, new_values): societe = nodossier[0:2] no_id = nodossier[3:] new_values['societe'] = societe new_values['no_id'] = no_id 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 dem_lig SET %s" % s else: new_values['nolig'] = nolig query = "UPDATE dem_lig SET %s WHERE societe = :societe AND NO_ID = :no_id AND NOLIG = :nolig ;" % s execute_query(request, query, new_values) def insert_suivi(request, nodossier, comment): societe = nodossier[0:2] no_id = nodossier[3:] query = "INSERT INTO dem_lig (societe, NO_ID, DATE, COMMENT, USERMAJ) VALUES (:societe, :no_id, CURRENT_DATE(), :comment, 'EMAIL');" execute_query(request, query, {'societe': societe, 'no_id': no_id, 'comment': comment}) query = "UPDATE dem_devis SET usermaj = 'EMAIL' WHERE SOCIETE=:societe AND NO_ID=:no_id;" execute_query(request, query, {'societe': societe, 'no_id': no_id}) def get_similaires_byChantier(request, societe, C_NOM, C_ADR, C_CP, C_VILLE): query = """ SELECT CONCAT(societe,'-',NO_ID) AS nodossier, dem_devis.* FROM dem_devis WHERE societe<>:societe AND C_NOM=:C_NOM AND C_ADR=:C_ADR AND C_CP=:C_CP AND C_VILLE=:C_VILLE;""" results = request.dbsession.execute(query, {'societe': societe, 'C_NOM': C_NOM, 'C_ADR': C_ADR, 'C_CP': C_CP, 'C_VILLE': C_VILLE}).fetchall() return results def get_docs_attaches(request, nodossier, norapport, origine, filename): societe = nodossier[0:2] nochantier = int(nodossier[3:]) if filename == '': query = "SELECT * FROM dossier_attaches WHERE societe = :societe AND nochantier = :nochantier AND nodossier=0 AND origine = :origine ORDER BY cree_le;" else: query = """SELECT * FROM dossier_attaches WHERE societe = :societe AND nochantier = :nochantier AND nodossier = :norapport AND origine = :origine AND nomfichier = :filename ORDER BY cree_le;""" results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'origine': origine, 'filename': filename}).fetchall() return results def get_photos(request, nodossier, norapport, origine): societe = nodossier[0:2] nochantier = int(nodossier[3:]) query = """SELECT * FROM dossier_attaches WHERE societe = :societe AND nochantier = :nochantier AND nodossier = :norapport AND origine = :origine AND UPPER(RIGHT(nomfichier,3)) <> 'PDF' ORDER BY cree_le;""" results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'origine': origine}).fetchall() return results def delete_photos(request, nodossier, norapport, origine, nomfic): societe = nodossier[0:2] nochantier = int(nodossier[3:]) # supprimer d'abord le fichier if len(origine) > 1: file_path = '%s/%s/%s/%s' % (request.registry.settings['mondumas.devfac_dir'], societe, nochantier, nomfic) else: file_path = '%s/%s/%s/%s/%s' % (request.registry.settings['mondumas.devfac_dir'], societe, nochantier, norapport, nomfic) if os.path.exists(file_path): os.remove(file_path) query = "DELETE FROM dossier_attaches WHERE societe=:societe AND nochantier=:nochantier AND nodossier=:norapport AND origine=:origine AND nomfichier=:nomfic;" execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'origine': origine, 'nomfic': nomfic}) def rename_photos(request, nodossier, norapport, origine, nomfic, new_nomfic): societe = nodossier[0:2] nochantier = int(nodossier[3:]) query = """ UPDATE dossier_attaches SET nomfichier = :new_nomfic WHERE societe=:societe AND nochantier=:nochantier AND nodossier=:norapport AND origine=:origine AND nomfichier=:nomfic; """ execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'origine': origine, 'nomfic': nomfic, 'new_nomfic': new_nomfic}) def update_dossier(request, nodossier, new_values): societe = nodossier[0:2] nochantier = int(nodossier[3:]) s = '' for param in new_values.keys(): if param == 'C_VILLE': new_values['C_VILLE'] = new_values['C_VILLE'].upper() if s: s += ",%s=:%s" % (param, param) else: s = "%s=:%s" % (param, param) new_values['societe'] = societe new_values['nochantier'] = nochantier query = "UPDATE dem_devis SET %s WHERE societe=:societe AND no_id=:nochantier" % s execute_query(request, query, new_values) query = "CALL spUPD_CHANTIER_COORD(:societe, :nochantier);" execute_query(request, query, {'societe': societe, 'nochantier': nochantier}) def update_dossier_cloture(request, nodossier, status, logged_in): societe = nodossier[0:2] nochantier = int(nodossier[3:]) # met le montant regle à 1 centime pour terminé le dossier query = "UPDATE dem_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 insert_dossier_attaches(request, nodossier, norapport, origine, filename, filesize, user): societe = nodossier[0:2] nochantier = int(nodossier[3:]) # fichier existe ? item = get_docs_attaches(request, nodossier, norapport, origine, filename) if item: return # enregistrer dans la table dossier_attaches query = """INSERT INTO dossier_attaches (societe, nochantier, nodossier, origine, nomfichier, taillefichier, cree_le, usermaj) VALUES(:societe,:nochantier,:norapport,:origine,:filename,:filesize,NOW(),:user);""" execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'origine': origine, 'filename': filename, 'filesize': filesize, 'user': user}) def get_rapport_by_no(request,nodossier,date_inter): societe = nodossier[0:2] nochantier = nodossier[3:] if date_inter == '': query = "SELECT * FROM dem_rdf WHERE societe = :societe AND nochantier = :nochantier;" results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).fetchall() else: query = "SELECT * FROM dem_rdf WHERE societe = :societe AND nochantier = :nochantier AND date_inter=:date_inter;" results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier, 'date_inter': date_inter}).first() return results def get_rapport_by_no_id(request,no_id): query = "SELECT * FROM dem_rdf WHERE no_id = :no_id;" results = request.dbsession.execute(query, {'no_id': no_id}).first() return results def get_articles_rdf(request): query = "SELECT * FROM articles WHERE REF LIKE 'RDF%';" results = request.dbsession.execute(query).fetchall() return results def get_rapport_rdf(request): # les rapports de RDF (100 derniers) query = "SELECT * FROM dem_rdf ORDER BY societe, no_id DESC LIMIT 100;" results = request.dbsession.execute(query, ).fetchall() return results def insert_rapport(request,nodossier,logged_in): societe = nodossier[0:2] nochantier = nodossier[3:] query = """INSERT INTO dem_rdf (societe, nochantier, cd_cli, nomcli, c_qualite, c_nom, c_adr, c_adr2, c_cp, c_ville, c_tel1, c_telp, nosin, auteur_code) SELECT societe, no_id, cd_cli, nomcli, c_qualite, c_nom, c_adr, c_adr2, c_cp, c_ville, c_tel1, c_telp, nosin, :auteur_code FROM dem_devis WHERE societe = :societe AND no_id = :nochantier;""" execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'auteur_code': logged_in}) def get_rdf_causes(request, code): query = "SELECT libelle FROM rdf_causes where code LIKE :code;" results = request.dbsession.execute(query, {'code': code + '%'}).fetchall() return results def update_rapport(request, nodossier, dateinter, new_values): societe = nodossier[0:2] nochantier = int(nodossier[3:]) s = '' for param in new_values.keys(): if s: s += ",%s=:%s" % (param, param) else: s = "%s=:%s" % (param, param) new_values['societe'] = societe new_values['nochantier'] = nochantier new_values['dateinter'] = dateinter query = "UPDATE dem_rdf SET %s WHERE societe=:societe AND nochantier=:nochantier AND date_inter=:dateinter;" % s execute_query(request, query, new_values) def delete_rapport(request, no_id): query = "DELETE FROM dem_rdf WHERE no_id = :no_id" execute_query(request, query, {'no_id': no_id}) def update_rapport_validate(request, no_id): query = "UPDATE dem_rdf SET date_relu=CURRENT_DATE WHERE no_id = :no_id" execute_query(request, query, {'no_id': no_id}) def update_rapport_facture(request, no_id): query = "UPDATE dem_rdf SET date_facture=CURRENT_DATE WHERE no_id = :no_id" execute_query(request, query, {'no_id': no_id}) def update_rapport_client(request, norapport, nomClient, codeClient): societe = codeClient[0:2] cd_cli = int(codeClient[3:]) query = "UPDATE dem_rdf SET CD_CLI = :cd_cli, NOMCLI = :nomClient WHERE no_id = :norapport" execute_query(request, query, {'norapport': norapport, 'cd_cli': cd_cli, 'nomClient': nomClient}) def insert_facture_rdf(request, societe, nochantier, cd_cli, nomcli, user, ref, date_rapport): # créer une facture vierge à partir du dossier query = "CALL spINS_FACTURE_RDF(:societe, :nochantier, :cd_cli, :nomcli, :user, :ref, :date_rapport)" execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'cd_cli': cd_cli, 'nomcli': nomcli, 'user': user, 'ref': ref, 'date_rapport': date_rapport}) def insert_dossier(request, societe, cd_cli, c_nom, c_adr, c_adr2, c_cp, c_ville, c_telp, c_email, nosin, nopol, c_obs, tx_trav): # créer une dem_devis selon l'email de l'OS query = """CALL spINS_DEMANDES(:societe, :cd_cli, :c_nom, :c_adr, :c_adr2, :c_cp, :c_ville, :c_telp, :c_email, 'MR', 6, :nosin, :nopol, :c_obs, :tx_trav, 'EMAIL');""" execute_query(request, query, {'societe': societe, 'cd_cli': cd_cli, 'c_nom': c_nom, 'c_adr': c_adr, 'c_adr2': c_adr2, 'c_cp': c_cp, 'c_ville': c_ville,'c_telp': c_telp, 'nosin': nosin, 'nopol': nopol, 'c_obs': c_obs, 'tx_trav': tx_trav, 'c_email': c_email}) query = "SELECT no_id FROM dem_devis WHERE societe = :societe AND date = curdate() AND cd_cli = :cd_cli ORDER BY no_id desc LIMIT 1;" results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first() return results.no_id def get_cabinet(request, code): query = "SELECT * FROM p_cabinet where code = :code;" results = request.dbsession.execute(query, {'code': code}).first() return results def get_experts(request, code_cab, code_exp): if code_exp == 0: query = "SELECT * FROM p_experts where code_cab = :code_cab;" results = request.dbsession.execute(query, {'code_cab': code_cab}).fetchall() else: query = "SELECT * FROM p_experts where code_cab = :code_cab AND code_exp = :code_exp;" results = request.dbsession.execute(query, {'code_cab': code_cab, 'code_exp': code_exp}).first() return results def insert_log_nuit(request, proc, msg, nodossier): query = "INSERT INTO t_log_nuit (proc,msg, nodossier) VALUES (:proc, :msg, :nodossier);" execute_query(request, query, {'proc': proc, 'msg': msg, 'nodossier': nodossier}) def get_log_demandes(request, ): # lire le log de nuit query = """SELECT *, (SELECT usermaj FROM dem_devis WHERE societe=LEFT(nodossier,2) AND no_id=RIGHT(nodossier,6)) AS user FROM t_log_nuit WHERE proc = 'GENERER';""" results = request.dbsession.execute(query, ) return results.fetchall() def get_status_by_id(request, code): if code == '': query = """SELECT * FROM p_statuts;""" results = request.dbsession.execute(query,).fetchall() elif code == 'DE': query = """SELECT * FROM p_statuts WHERE code >= 3;""" results = request.dbsession.execute(query,).fetchall() else: query = """SELECT * FROM p_statuts WHERE code = :code;""" results = request.dbsession.execute(query, {'code': code}).first() return results def get_devis_en_att(request): query = "SELECT d.*, s.libelle FROM devis d JOIN p_statuts s ON d.STATUS = s.CODE WHERE d.STATUS < 4 ORDER BY d.societe, d.STATUS, d.nomcli;" results = request.dbsession.execute(query).fetchall() return results def get_factures_en_att(request): query = "SELECT f.*, s.libelle FROM facture f JOIN p_statuts s ON f.STATUS = s.CODE WHERE f.STATUS < 8 ORDER BY f.societe, f.STATUS, f.nomcli;" results = request.dbsession.execute(query).fetchall() return results