233 lines
11 KiB
Python
233 lines
11 KiB
Python
# -*- 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érieures à 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 VERSEMENTS inutilisés et antérieurs à until_date
|
|
query = "DELETE FROM liv_bnq WHERE date < :until_date AND ABS(MontantRegl - MontantDebit) < 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 factures
|
|
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 DEVIS
|
|
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_proforma_client(request, societe, cd_cli):
|
|
query = "SELECT * FROM proforma 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})
|