Files
dumas_gestion/mondumas/models/utils.py
2023-04-27 12:57:48 +02:00

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})