# -*- 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 dateutil.relativedelta import transaction 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 insert_log(request, proc, msg): query = "INSERT t_log_nuit (proc,msg) VALUES (:proc,:msg);" execute_query(request, query, {'proc': proc, 'msg' :msg}) def truncate_log(request): query = "TRUNCATE t_log_nuit;" execute_query(request, query, {}) def get_log(request): # lire les rappels non envoyés query = "SELECT * FROM t_log_nuit;" results = request.dbsession.execute(query, {}).fetchall() return results def get_email_rappels(request): # lire les rappels non envoyés query = """ SELECT r.*, e.c_qualite, e.c_nom, e.c_adr, e.c_adr2, e.c_ville, e.c_email, s.tel, s.nom as nom_societe FROM email_rappels r INNER JOIN dem_devis e ON r.societe = e.societe AND r.nochantier = e.no_id INNER JOIN p_societe s ON r.societe = s.societe WHERE ISNULL(envoye_le) ORDER BY no_id;""" results = request.dbsession.execute(query, {}).fetchall() return results def update_rappels(request): query = "CALL spUPD_RAPPELS();" execute_query(request, query, {}) def update_email_rappels(request, no_id): query = "UPDATE email_rappels SET envoye_le = NOW() WHERE no_id = :no_id;" execute_query(request, query, {'no_id': no_id}) def get_societes(request, societe): if societe == '0': query = "SELECT * FROM p_societe;" results = request.dbsession.execute(query,).fetchall() else: query = "SELECT * FROM p_societe WHERE societe = :societe;" results = request.dbsession.execute(query, {'societe': societe}).first() return results def chantierExiste(request,societe, no_id): query = "SELECT no_id FROM dem_devis WHERE societe = :societe and no_id = :no_id;" results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first() if results: return len(results) > 0 else: return False def get_all_chantiers(request,societe): query = "SELECT * FROM dem_devis WHERE societe = :societe;" results = request.dbsession.execute(query, {'societe': societe}).fetchall() return results def get_chantiers_month(request, societe, date_sel): # lire les chantiers du mois query = """SELECT * FROM dem_devis WHERE societe = :societe AND YEAR(date)=YEAR(:date_sel) AND MONTH(date)=MONTH(:date_sel) AND delai_facture = 0 AND nomcli NOT IN ('DUMAS JEAN MICHEL','DUMAS MENUISERIE','DUMAS PEINTURE'); """ results = request.dbsession.execute(query, {'societe': societe, 'date_sel': date_sel}).fetchall() return results def get_last_facture(request, societe, nochantier): query = "SELECT * FROM facture WHERE societe = :societe AND nochantier = :nochantier order by date DESC LIMIT 1;" results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).first() return results def get_last_devis(request, societe, nochantier): query = "SELECT * FROM devis WHERE societe = :societe AND nochantier = :nochantier order by date DESC LIMIT 1;" results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).first() return results def update_chantier_status(request, societe, no_id, status): query = "UPDATE dem_devis SET status = :status, DATEMAJ = DATEMAJ WHERE societe = :societe AND no_id = :no_id AND status <> :status;" execute_query(request, query, {'societe': societe, 'no_id': no_id, 'status': status}) def update_chantier_delais(request, societe, no_id, delai_contact, delai_rdv, delai_devis, delai_facture): query = """UPDATE dem_devis SET delai_contact = :delai_contact, delai_rdv = :delai_rdv, delai_devis = :delai_devis, delai_facture = :delai_facture, DATEMAJ = DATEMAJ WHERE societe = :societe AND no_id = :no_id;""" execute_query(request, query, {'societe': societe, 'no_id': no_id, 'delai_contact': delai_contact, 'delai_rdv': delai_rdv, 'delai_devis': delai_devis, 'delai_facture': delai_facture}) def get_chantiers_dates(request, societe, nochantier): # lire 1er contact du chantier query = "SELECT date, datevi FROM dem_lig WHERE societe = :societe AND no_id = :nochantier AND datevi IS NOT NULL;" results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).first() if results: date_contact = results.date date_rdv = results.datevi else: date_contact = None date_rdv = None # lire 1er devis du chantier query = "SELECT date FROM devis WHERE societe = :societe AND nochantier = :nochantier order by date LIMIT 1;" results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).first() if results: date_devis = results.date else: date_devis = None # lire 1ere facture du chantier query = "SELECT date FROM facture WHERE societe = :societe AND nochantier = :nochantier order by date LIMIT 1;" results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).first() if results: date_facture = results.date else: date_facture = None return date_contact, date_rdv, date_devis, date_facture def purge_mensuelle(request, until_date): # ----- Purger les DEVIS dont la facture est réglée antérieure à until_date query = """DELETE devis.* FROM devis INNER JOIN facture ON devis.societe = facture.societe and devis.no_id = facture.nodevis WHERE facture.date < :until_date AND ABS(facture.totalttc - facture.mtregl) < 1;""" execute_query(request, query, {'until_date': until_date}) # ----- Purger les FACTURES réglées antérieure à until_date query = """DELETE FROM facture WHERE facture.date < :until_date AND ABS(facture.totalttc - facture.mtregl) < 1;""" execute_query(request, query, {'until_date': until_date}) # ----- Purger les DEVIS n'ayant pas de facture antérieure à until_date query = """DELETE FROM devis WHERE devis.date < :until_date AND nofact=0;""" execute_query(request, query, {'until_date': until_date}) # -- RAZ les liens FACTURE et DEVIS query = "UPDATE dem_devis SET nodevis = 0, nofact = 0, datemaj=datemaj WHERE dem_devis.date < :until_date;" execute_query(request, query, {'until_date': until_date}) # -- recreer les lien DEVIS query = """UPDATE dem_devis INNER JOIN facture ON dem_devis.societe = facture.societe and dem_devis.no_id = facture.nochantier SET dem_devis.nofact = facture.no_id, dem_devis.datemaj=dem_devis.datemaj WHERE dem_devis.date < :until_date;""" execute_query(request, query, {'until_date': until_date}) # -- recreer les lien factures query = """UPDATE dem_devis INNER JOIN devis ON dem_devis.societe = devis.societe and dem_devis.no_id = devis.nochantier SET dem_devis.nodevis = devis.no_id, dem_devis.datemaj=dem_devis.datemaj WHERE dem_devis.date < :until_date""" execute_query(request, query, {'until_date': until_date}) # ---- Purger les DEM_DEVIS n'ayant aucun DEVIS ni FACTURE query = "DELETE FROM dem_devis WHERE date < :until_date AND nodevis = 0 AND nofact = 0;" execute_query(request, query, {'until_date': until_date}) def get_all_clients(request): query = "SELECT * FROM clients;" results = request.dbsession.execute(query, {}).fetchall() return results def get_last_facture_client(request, societe, cd_cli): query = "SELECT * FROM facture WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;" results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first() return results def get_last_payment_client(request, societe, cd_cli): query = "SELECT * FROM liv_bnq WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;" results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first() return results def get_last_devis_client(request, societe, cd_cli): query = "SELECT * FROM devis WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;" results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first() return results def get_last_chantier_client(request, societe, cd_cli): query = "SELECT * FROM dem_devis WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;" results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first() return results def update_client_dern_operation(request, societe, cd_cli, dern_operation): if dern_operation != None: d_operation = dern_operation.strftime('%Y/%m/%d') query = "UPDATE clients SET dern_operation = :dern_operation, modif_le = modif_le WHERE societe=:societe AND cd_cli=:cd_cli;" execute_query(request, query, {'societe': societe, 'cd_cli': cd_cli, 'dern_operation': d_operation}) else: query = "UPDATE clients SET dern_operation = NULL, modif_le = modif_le WHERE societe=:societe AND cd_cli=:cd_cli;" execute_query(request, query, {'societe': societe, 'cd_cli': cd_cli}) def delete_client_unused(request): query = "DELETE FROM clients WHERE cd_cli <> 1 AND dern_operation IS NULL AND YEAR(cree_le) < YEAR(CURRENT_DATE()) - 2;" execute_query(request, query, {}) def update_stats_delais(request, societe, date, groupe): query = "CALL spUPD_STATS_DELAIS(:societe, :date, :groupe);" execute_query(request, query, {'societe': societe, 'date': date, 'groupe': groupe}) def update_devis_statut_4(request): # lire tutes les lignes de dem_devis mentionnant la commande query = "SELECT * FROM dem_lig where comment like '% est COMMANDE %';" devis_cdes = request.dbsession.execute(query, {}).fetchall() for item in devis_cdes: if item.COMMENT.find('!! DE') == 0: # recupère le no de devis commandé nodevis = item.COMMENT[5:11] # maj status de dem_devis concernée query = "UPDATE dem_devis SET status = 4, DATEMAJ = DATEMAJ WHERE societe = :societe AND no_id = :no_id AND status < 4;" execute_query(request, query, {'societe': item.societe, 'no_id': item.NO_ID}) # maj status de devis concerné query = "UPDATE devis SET status = 4, DATEMAJ = DATEMAJ WHERE societe = :societe AND no_id = :no_id AND status < 4;" execute_query(request, query, {'societe': item.societe, 'no_id': nodevis})