initial upload

This commit is contained in:
2023-06-22 10:26:17 +02:00
parent 14dc417203
commit 11304c5b8a
306 changed files with 83527 additions and 49 deletions

82
monaem/models/__init__.py Normal file
View File

@@ -0,0 +1,82 @@
from sqlalchemy import engine_from_config
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import configure_mappers
import zope.sqlalchemy
from pyramid.security import (
Allow,
Authenticated,
DENY_ALL,
)
# run configure_mappers after defining all of the models to ensure
# all relationships can be setup
configure_mappers()
class RootFactory(object):
"""Defines an ACL for groups/permissions mapping"""
__acl__ = [ (Allow, Authenticated, 'view'),
(Allow, 'group:administrators', 'manage'),
DENY_ALL,
]
def __init__(self, request):
pass
def get_engine(settings, prefix='sqlalchemy.'):
return engine_from_config(settings, prefix)
def get_session_factory(engine):
factory = sessionmaker()
factory.configure(bind=engine)
return factory
def get_tm_session(session_factory, transaction_manager):
"""
Get a ``sqlalchemy.orm.Session`` instance backed by a transaction.
This function will hook the session to the transaction manager which
will take care of committing any changes.
- When using pyramid_tm it will automatically be committed or aborted
depending on whether an exception is raised.
- When using scripts you should wrap the session in a manager yourself.
For example::
import transaction
engine = get_engine(settings)
session_factory = get_session_factory(engine)
with transaction.manager:
dbsession = get_tm_session(session_factory, transaction.manager)
"""
dbsession = session_factory()
zope.sqlalchemy.register(
dbsession, transaction_manager=transaction_manager)
return dbsession
def includeme(config):
"""
Initialize the model for a Pyramid app.
Activate this setup using ``config.include('td_members.models')``.
"""
settings = config.get_settings()
# use pyramid_tm to hook the transaction lifecycle to the request
config.include('pyramid_tm')
session_factory = get_session_factory(get_engine(settings))
config.registry['dbsession_factory'] = session_factory
# make request.dbsession available for use in Pyramid
config.add_request_method(
# r.tm is the transaction manager used by pyramid_tm
lambda r: get_tm_session(session_factory, r.tm),
'dbsession',
reify=True
)

381
monaem/models/default.py Normal file
View File

@@ -0,0 +1,381 @@
# -*- coding: utf8 -*-
import json
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
import transaction
from datetime import *
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_agences(request, code):
if code == 0:
query = "SELECT * FROM p_agences ORDER BY CODE;"
results = request.dbsession.execute(query)
return results.fetchall()
else:
query = "SELECT * FROM p_agences WHERE code = :code;"
results = request.dbsession.execute(query, {'code': code})
return results.first()
def get_date_examen(request, logged_in):
# lire la date examen de l'eleve
query = "call spGet_EXAMENS_AFF_PREVU(:logged_in)"
results = request.dbsession.execute(query, {'logged_in': logged_in}).first()
return results
def get_dates_fin_validite(request, logged_in):
query = """SELECT
DATE_FORMAT(fin_forfait_code_le,'%d-%m-%Y') AS date_fin_code,
DATE_FORMAT(visite_med_fin_le,'%d-%m-%Y') AS date_fin_vm
FROM eleves WHERE cd_cli=:logged_in;"""
results = request.dbsession.execute(query, {'logged_in': logged_in}).fetchall()
return results
def get_eleve_agence(request, logged_in):
# lire l'adresse email de l'agence de l'eleve
query = "SELECT a.* FROM p_agences a INNER JOIN eleves e ON e.agence = a.code WHERE e.cd_cli=:logged_in"
results = request.dbsession.execute(query, {'logged_in': logged_in}).first()
return results
def get_eleve_stage(request, logged_in):
# lire les donnees de l'eleve
query = "call spGet_ELEVES_INFOS(:logged_in)"
results = request.dbsession.execute(query, {'logged_in': logged_in}).fetchall()
return results
def get_eleve_info(request, userid):
query = "select nompren, email, permis_demande, formule from eleves where cd_cli=:userid"
result = request.dbsession.execute(query, {'userid': userid}).first()
return {'fullname': result[0],
'email': result[1],
'permis': result[2],
'formule': result[3]
}
def get_eleves_by_code(request, login):
# lire l'eleve connecte
query = """SELECT e.* FROM eleves e INNER JOIN permis p ON e.permis_demande = p.cat
WHERE cd_cli=:login """
results = request.dbsession.execute(query, {'login': login}).first()
return results
def get_eleve_justifs(request, cd_cli):
# lire tous les justifs téléchargés ou non
query = """SELECT * FROM eleves_upload
WHERE cd_cli = :cd_cli and type='JUST' ORDER BY no_tri;"""
results = request.dbsession.execute(query, {'cd_cli': cd_cli}).fetchall()
return results
def get_eleves_by_date_nais(request, login, date_nais):
# lire l'eleve connecte
query = """SELECT e.* FROM eleves e INNER JOIN permis p ON e.permis_demande = p.cat
WHERE cd_cli=:login AND DATE_NAIS = STR_TO_DATE(:date_nais, '%d/%m/%Y');"""
results = request.dbsession.execute(query, {'login': login, 'date_nais': date_nais}).first()
return results
def get_eleves_by_name_date_nais(request, name, forname, date_nais):
# lire l'eleve connecte
nomprenom = "%s %s" % (name, forname)
query = """SELECT e.* FROM eleves e INNER JOIN permis p ON e.permis_demande = p.cat
WHERE NOMPREN=:nomprenom AND DATE_NAIS = STR_TO_DATE(:date_nais, '%d/%m/%Y');"""
results = request.dbsession.execute(query, {'nomprenom': nomprenom, 'date_nais': date_nais}).first()
return results
def get_horaires_dispo(request, agence, date_debut):
query = """
SELECT c.date, c.noplan, c.qte, m.nom, c.intitule, to_SEMAINE(DATE_FORMAT(c.date, '%a %d %b')) AS DATE_CLAIR, TIME_FORMAT(SEC_TO_TIME(c.noplan * 3600), '%Hh%i') AS HEURE_CLAIR
FROM eleves_cpt c
LEFT JOIN moniteurs m ON c.cd_mon = m.cd_mon
WHERE c.agence = :agence AND c.date = :date_debut AND cd_cli > 1 AND cd_cli < 100000 AND c.noplan > 0 ORDER BY noplan;
"""
results = request.dbsession.execute(query, {'agence': agence, 'date_debut': date_debut}).fetchall()
return results
def update_last_connection(request, login, ua_string):
"""Update last connection for login """
query = "UPDATE eleves SET dern_cnx_le=NOW(), device_used=:ua_string, mdp_oublie = NULL, mdp_oublie_date = NULL WHERE cd_cli=:login;"
execute_query(request, query, {'login': login, 'ua_string': ua_string})
def update_details(request, login, new_values):
s = ''
for param in new_values.keys():
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
new_values['login'] = login
query = "UPDATE eleves SET %s WHERE CD_CLI=:login" % s
execute_query(request, query, new_values)
def update_password(request, login, password):
"""Update password for member login"""
query = "UPDATE eleves SET mdp_hash=SHA1(:password), mdp_oublie=NULL, mdp_oublie_date=NULL WHERE CD_CLI=:login"
execute_query(request, query, {'login': login, 'password': password})
def is_lien_mdp_oublie(request, lien):
query = "SELECT mdp_oublie FROM eleves WHERE mdp_oublie=:lien;"
results = request.dbsession.execute(query, {'lien': lien}).fetchall()
return len(results) > 0
def get_mdp_oublie_infos(request, lien):
query = "SELECT * FROM eleves WHERE mdp_oublie=:lien;"
results = request.dbsession.execute(query, {"lien": lien}).first()
return results
def update_membre_mdp_oublie(request, cd_cli):
import uuid, base64
# get a UUID - URL safe, Base64
uid = uuid.uuid1()
urlslug = base64.urlsafe_b64encode(uid.bytes).decode("utf-8").rstrip('=\n').replace('/', '_')
query = "UPDATE eleves SET mdp_oublie=:urlslug, mdp_oublie_date=now() WHERE cd_cli=:cd_cli;"
execute_query(request, query, {'urlslug': urlslug, 'cd_cli': cd_cli})
return urlslug
def to_int(x):
try:
number = int(x.replace(',', '.'))
return number
except ValueError:
return 0
def get_faqs(request, faq_id):
"""Lire les FAQ"""
if faq_id == 0:
query = "SELECT * FROM p_faq ORDER BY theme, intitule;"
results = request.dbsession.execute(query).fetchall()
elif faq_id == -1:
query = "SELECT * FROM p_faq where theme != 'INTERNE' ORDER BY theme, intitule;"
results = request.dbsession.execute(query).fetchall()
else:
query = "SELECT * FROM p_faq where faq_id = :faq_id;"
results = request.dbsession.execute(query, {'faq_id': faq_id}).first()
return results
def get_eleves_by_name(request, name):
if to_int(name) > 0:
# lire l'eleve par son code
query = """SELECT e.nompren, e.cd_cli, e.permis_demande, e.formule, e.cree_le, e.statut
FROM eleves e INNER JOIN permis p ON e.permis_demande = p.cat
WHERE e.cd_cli=:name ;"""
else:
# lire l'eleve par son nom
query = """SELECT e.nompren, e.cd_cli, e.permis_demande, e.formule, e.cree_le, e.statut
FROM eleves e INNER JOIN permis p ON e.permis_demande = p.cat
WHERE e.nom like :name ORDER BY e.nompren;"""
results = request.dbsession.execute(query, {'name': name + "%"}).fetchall()
return results
def get_departements(request, libelle):
""" Lire toutes les départements """
query = "SELECT * FROM p_departements WHERE libelle like :name order by libelle;"
results = request.dbsession.execute(query, {'name': libelle + "%"}).fetchall()
return results
def get_codespostaux(request, code):
query = "SELECT * FROM p_codespostaux WHERE code_postal like :code;"
results = request.dbsession.execute(query, {'code': code + "%"})
return results.fetchall()
def get_messageConformation(request, ref):
""" Lire le tarif seleon la référence """
query = "select confirmation_md from tarifs where ref = :ref;"
results = request.dbsession.execute(query, {'ref': ref}).first()
if results:
return results.confirmation_md
else:
return "<blockquote>Rappel de rendez-vous " + ref + "</blockquote>"
def get_eleve_docs(request, cd_cli, type):
# lire les docs téléchargés du client
query = """SELECT *, j.libelle FROM eleves_upload e INNER JOIN p_justifs j ON e.code = j.code
WHERE e.cd_cli = :cd_cli AND e.type = :type AND (LENGTH(e.nom_fic) > 0 OR e.libelle_fic IS NOT NULL) ORDER BY j.libelle;"""
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'type': type}).fetchall()
return results
def get_eleve_justifs_byligne(request, no_ligne):
# Lire le justif dans élève
query = """SELECT p.*, j.LIBELLE, j.conditions FROM eleves_upload p
INNER JOIN p_justifs j ON j.code = p.code
WHERE p.no_ligne = :no_ligne;"""
results = request.dbsession.execute(query, {'no_ligne': no_ligne}).first()
return results
def get_eleve_justifs_manquant(request, cd_cli):
# Lire les justifs manquant dans élève
query = """SELECT e.* ,j.libelle, j.conditions FROM eleves_upload e, p_justifs j
WHERE e.cd_cli = :cd_cli and e.code=j.code AND e.type='JUST' AND LENGTH(e.nom_fic)=0 AND e.libelle_fic IS NULL ORDER BY e.no_tri;"""
results = request.dbsession.execute(query, {'cd_cli': cd_cli}).fetchall()
return results
def update_eleve_justif(request, no_ligne, new_values):
# mettre à jour justifs de l'élève
s = ''
for param in new_values.keys():
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
new_values['no_ligne'] = no_ligne
query = "UPDATE eleves_upload SET %s WHERE no_ligne=:no_ligne" % s
execute_query(request, query, new_values)
def delete_eleve_justif(request, no_ligne):
query = "DELETE FROM eleves_upload WHERE no_ligne = :no_ligne ;"
execute_query(request, query, {'no_ligne': no_ligne})
def init_eleve_justifs(request, cd_cli):
# la liste des justifs de l'élève est-elle remplie ?
justifs = get_eleve_justifs(request, cd_cli)
if not justifs:
# non, lire la fiche de l'élève
eleve = get_eleves_by_code(request, cd_cli)
# et créer les justifs à partir du permis demandé
query = """INSERT INTO eleves_upload (cd_cli, code, type)
SELECT :cd_cli, code, 'JUST' FROM permis_justifs WHERE cat=:permis_demande;"""
execute_query(request, query, {'cd_cli': cd_cli, 'permis_demande': eleve.PERMIS_DEMANDE})
def get_stages_by_type(request, stage_type,stage_debut,day_diff):
condition = """;"""
if day_diff < 15 :
condition = """ and debut <= :stage_debut ;"""
if stage_type == 'POINT':
""" Lire tous les stage PAP dispo a partir de damain """
query = """
SELECT
concat(type,semaine,groupe) as stage_id,
type,
semaine,
groupe,
debut, fin,
dispo,
CASE
WHEN groupe = 'A' THEN 'CHARPENNES'
ELSE 'VAUGNERAY'
END as lieu,
total
FROM pla_stage where type='C' and dispo > 0 and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d') """ + condition
results = request.dbsession.execute(query,{"stage_debut":stage_debut}).fetchall()
elif stage_type == 'PEM125':
""" Lire tous les stage PEM dispo a partir de damain """
query = """
SELECT
concat(type,semaine,groupe) as stage_id,
debut, fin,dispo,
'VAUGNERAY' as lieu,
total
FROM pla_stage where type='M' and dispo > 0 and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d') and libelle like 'pem%' """ + condition
results = request.dbsession.execute(query,{"stage_debut":stage_debut}).fetchall()
elif stage_type == 'PASSERELLE':
""" Lire tous les stage PAS A2 dispo a partir de damain """
query = """
SELECT
concat(type,semaine,groupe) as stage_id,
debut, fin,
'RD 30 - LES AIGUILLONS ou 69670 VAUGNERAY' as lieu,dispo,
total
FROM pla_stage where type='M' and dispo > 0 and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d') and libelle like 'pas%' """ + condition
results = request.dbsession.execute(query,{"stage_debut":stage_debut}).fetchall()
elif stage_type == 'B96':
""" Lire tous les stage B96 dispo a partir de demain """
query = """
SELECT
concat(type,semaine,groupe) as stage_id,
debut, fin,
'RD 30 - LES AIGUILLONS ou 69670 VAUGNERAY' as lieu,
dispo,
total
FROM pla_stage where type='B' and dispo > 0 and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d') and groupe ='G' """ + condition
results = request.dbsession.execute(query,{"stage_debut":stage_debut}).fetchall()
else:
results = list()
return results
def get_stage_by_id(request, stage_id):
""" Lire le stage demandé """
type = stage_id[0:1]
semaine = stage_id[1:7]
groupe = stage_id[7:8]
query = """
SELECT
concat(type,semaine,groupe) as stage_id,
debut, fin,
getLieu_PAP(groupe, 2) as lieu1,
getLieu_PAP(groupe, 3) as lieu2,
dispo,
total
FROM pla_stage where type=:type and semaine=:semaine and groupe=:groupe;"""
results = request.dbsession.execute(query, {'type': type, 'semaine': semaine, 'groupe': groupe}).first()
return results
def get_stage_ligne_by_cd_cli(request,cd_cli,groupe):
query = """SELECT * FROM pla_stage_lignes where cd_cli=:cd_cli and groupe=:groupe"""
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'groupe': groupe}).first()
return results
def ins_stage_eleve(request, ref, stage_id, cd_cli, nom, prenom):
# inscrire un élève dans un stage PAP
type = stage_id[0:1]
semaine = stage_id[1:7]
groupe = stage_id[7:8]
# controler inscription en double ?
query = """SELECT s.debut FROM pla_stage_lignes l
INNER JOIN pla_stage s on s.type = l.type AND s.semaine = l.semaine AND s.groupe = l.groupe
WHERE l.type=:type AND l.cd_cli=:cd_cli and l.VALIDE ='N'"""
results = request.dbsession.execute(query, {'type': type, 'cd_cli': cd_cli}).first()
if results:
return results.debut
else:
# insérer l'élève dans le stage
query = """CALL spUpd_PLA_STAGE_LIG(:type, :semaine, :groupe, 0, :cd_cli, :nompren, '', :ref, 0, 6, 1, 0, 'WEB')"""
execute_query(request, query, {'type': type, 'semaine': semaine, 'groupe': groupe, 'cd_cli': cd_cli, 'nompren': nom + ' ' + prenom, 'ref': ref})
return None

View File

@@ -0,0 +1,415 @@
# -*- 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 *
from jours_feries_france.compute import JoursFeries
import transaction
from .default import (
execute_query,
)
from ..views.default import (
to_age,
)
def nextWorkingDay(date):
# si date est un jour ferié, retourne le jour suivant
workDay = date
jf = JoursFeries.for_year(date.year)
for jferie, dferie in jf.items():
if date == dferie:
workDay = date + timedelta(days = 1) # incrément = 1 jour
return workDay
return workDay
def isHolidayDay(date):
# si date est un jour ferié, retourne True
jf = JoursFeries.for_year(date.year)
for jferie, dferie in jf.items():
if date == dferie:
return jferie
return ''
def get_departements(request):
""" Lire toutes les départements """
query = "SELECT * FROM p_departements order by no_tri;"
results = request.dbsession.execute(query).fetchall()
return results
def get_origines(request):
""" Lire toutes les origines """
query = "SELECT * FROM p_origines where affiche_web order by libelle;"
results = request.dbsession.execute(query).fetchall()
return results
def get_stage_by_id(request, stage_id):
""" Lire le stage demandé """
type = stage_id[0:1]
semaine = stage_id[1:7]
groupe = stage_id[7:8]
query = """
SELECT
concat(type,semaine,groupe) as stage_id,
debut, fin,
getLieu_PAP(groupe, 2) as lieu1,
getLieu_PAP(groupe, 3) as lieu2,
dispo,
total
FROM bd_aem.pla_stage where type=:type and semaine=:semaine and groupe=:groupe;"""
results = request.dbsession.execute(query, {'type': type, 'semaine': semaine, 'groupe': groupe}).first()
return results
def get_stages_by_type(request, stage_type):
if stage_type == 'PAP':
""" Lire tous les stage PAP dispo a partir de damain """
query = """
SELECT
concat(type,semaine,groupe) as stage_id,
groupe,
debut, fin,
CASE
WHEN dispo <= 0 THEN 'Complet'
WHEN dispo =1 THEN '1 place restante'
WHEN dispo > 5 THEN 'Disponible'
ELSE concat(dispo, ' places restantes')
END as dispo,
total
FROM bd_aem.pla_stage where type='C' and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d');"""
results = request.dbsession.execute(query).fetchall()
elif stage_type == 'PEM125':
""" Lire tous les stage PEM dispo a partir de damain """
query = """
SELECT
concat(type,semaine,groupe) as stage_id,
debut, fin,
CASE
WHEN dispo <= 0 THEN 'Complet'
WHEN dispo =1 THEN '1 place restante'
WHEN dispo > 5 THEN 'Disponible'
ELSE concat(dispo, ' places restantes')
END as dispo,
total
FROM bd_aem.pla_stage where type='M' and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d') and libelle like 'pem%';"""
results = request.dbsession.execute(query).fetchall()
elif stage_type == 'PASA2':
""" Lire tous les stage PAS A2 dispo a partir de damain """
query = """
SELECT
concat(type,semaine,groupe) as stage_id,
debut, fin,
'RD 30 - LES AIGUILLONS' as lieu1, '69670 VAUGNERAY' as lieu2,
CASE
WHEN dispo <= 0 THEN 'Complet'
WHEN dispo =1 THEN '1 place restante'
WHEN dispo > 5 THEN 'Disponible'
ELSE concat(dispo, ' places restantes')
END as dispo,
total
FROM bd_aem.pla_stage where type='M' and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d') and libelle like 'pas%';"""
results = request.dbsession.execute(query).fetchall()
elif stage_type == 'B96':
""" Lire tous les stage B96 dispo a partir de demain """
query = """
SELECT
concat(type,semaine,groupe) as stage_id,
debut, fin,
'RD 30 - LES AIGUILLONS' as lieu1, '69670 VAUGNERAY' as lieu2,
CASE
WHEN dispo <= 0 THEN 'Complet'
WHEN dispo =1 THEN '1 place restante'
WHEN dispo > 5 THEN 'Disponible'
ELSE concat(dispo, ' places restantes')
END as dispo,
total
FROM bd_aem.pla_stage where type='B' and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d') and groupe ='G';"""
results = request.dbsession.execute(query).fetchall()
elif stage_type == 'POST':
""" Lire tous les stages POST PERMIS dispo a partir de demain """
query = """
SELECT
concat(type,semaine,groupe) as stage_id,
debut, fin,
libelle,
CASE
WHEN dispo <= 0 THEN 'Complet'
WHEN dispo =1 THEN '1 place restante'
WHEN dispo > 5 THEN 'Disponible'
ELSE concat(dispo, ' places restantes')
END as dispo,
total
FROM bd_aem.pla_stage where type='B' and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d') and libelle like 'POST %';"""
results = request.dbsession.execute(query).fetchall()
else:
results = None
return results
def get_tarifs(request, ref):
""" Lire le tarif seleon la référence """
query = "select puttc from tarifs where ref = :ref;"
results = request.dbsession.execute(query, {'ref': ref}).first()
return results.puttc
def get_permis(request):
""" Lire les permis demandés """
query = "SELECT * FROM permis WHERE type_examen != 'GL' AND agecode > 0;"
results = request.dbsession.execute(query, ).fetchall()
return results
def ins_eleve_by_formule(request, formule, civilite, nom, nom_jf, prenom, date_nais, lieu_nais, dept_nais, adres1, adres2, codpost, ville, no_tel_dom, no_tel_bur, no_tel_gsm, mail, no_permis, obtenu_le, lieu_permis, cas, origine, infraction_lieu, infraction_le, infraction_a, NePasSpammer, agence):
# controler que l'élève n'est pas déjà créé
cd_cli = isEleveCreated(request, civilite, nom, nom_jf, prenom, date_nais, lieu_nais, dept_nais, formule)
if cd_cli > 0:
# insérer une ligne de SUIVI
source = 'BIS - Orgine : %s' % origine
query = "CALL spUpd_ELEVES_SUIVI('SUIVI',0,:cd_cli,1,0,:source,'WEB')"
execute_query(request, query, {'cd_cli': cd_cli, 'source':source})
return cd_cli
missing = 0
if formule == 'POINT':
permis = 'POINT'
permis_obtenu = 'B'
elif formule == 'PEM125':
permis = 'AL'
permis_obtenu = 'B'
elif formule == 'PASSERELLE':
permis = 'A'
permis_obtenu = 'A2'
elif formule == 'ST_CODE_3J':
permis = 'NR'
permis_obtenu = ''
# cocher toutes les cases
missing = -1
elif formule == 'B96':
permis = 'B'
permis_obtenu = 'B'
# recherche agence de suivi selon le code postal
# agence_suivi = get_agence_suivi(request, codpost)
# if agence_suivi:
# agence = agence_suivi.agence
# else:
# agence = 6
elif formule == 'ROUSSEAU':
permis = no_permis # permis demandé
permis_obtenu = ''
agence = 9
else:
return 0
# créer une fiche élève selon formule
query = """CALL spUpd_ELEVES_ETATCIVIL(0, :civilite, :nom, :prenom, :nom_jf, '', '', '', :adres1, :adres2, :codpost, :ville, :no_tel_dom, :no_tel_gsm, :no_tel_bur, '', '', 'FR', :date_nais, :lieu_nais, :dept_nais ,'FR', 'P', '', :NePasSpammer, 0, 0, :mail, 0, :agence, 'WEB')"""
results = request.dbsession.execute(query, {'civilite':civilite, 'nom':nom, 'nom_jf':nom_jf, 'prenom':prenom, 'date_nais':date_nais.strftime("%Y/%m/%d"),
'lieu_nais':lieu_nais, 'dept_nais':dept_nais, 'adres1':adres1, 'adres2':adres2, 'codpost':codpost, 'ville':ville,
'no_tel_dom':no_tel_dom, 'no_tel_bur':no_tel_bur, 'no_tel_gsm':no_tel_gsm,
'mail':mail, 'NePasSpammer':NePasSpammer, 'agence':agence}).first()
cd_cli = results.newcode
# mise à jour onglet INSCRIPTION
query = """
CALL spUpd_ELEVES_INSCRIT(:cd_cli,:permis,:formule,0,0,0,0,'',-1,-1,:missing,:missing,-1,:missing,:missing,:missing,:missing,0,0,0, \
:cas, :lieu_permis, :infraction_lieu,NOW(),'','','NR','NR', '', '','','','','',0,'','','','','','',0,0,'WEB')"""
execute_query(request, query, {'cd_cli': cd_cli, 'lieu_permis':lieu_permis, 'cas':cas[:5], 'infraction_lieu':infraction_lieu, 'permis':permis, \
'formule':formule, 'missing':missing})
if formule == 'POINT':
# mise à jour date d'infraction
query = """
UPDATE ELEVES SET permis_delivre_le=:obtenu_le, infraction_le=:infraction_le, infraction_a=:infraction_a
WHERE cd_cli=:cd_cli"""
execute_query(request, query, {'cd_cli': cd_cli, 'obtenu_le':obtenu_le.strftime("%Y/%m/%d"), 'infraction_le':infraction_le, 'infraction_a':infraction_a})
# génére les écritures d'inscription selon la formule
query = "CALL spINS_ELEVES_DEBIT_INSCRIPTION(:formule, :cd_cli, NOW(), :agence, 'WEB')"
execute_query(request, query, {'cd_cli': cd_cli, 'formule':formule, 'agence':agence})
# ajouter le permis déjà obtenu_le
if len(permis_obtenu) > 0:
query = """
INSERT INTO eleves_permis (cd_cli, permis, obtenu_le, numero, lieu, cd_uti)
VALUES (:cd_cli, :permis_obtenu, :obtenu_le, :no_permis, :lieu_permis, 'WWW');"""
execute_query(request, query, {'cd_cli': cd_cli, 'permis_obtenu': permis_obtenu, 'obtenu_le': obtenu_le.strftime("%Y/%m/%d"), 'no_permis': no_permis, 'lieu_permis': lieu_permis})
# mise à jour un coup pour le CERFA 02 (dernier permis obtenu)
query = "UPDATE eleves_permis SET cd_uti='WEB' WHERE cd_cli=:cd_cli"
execute_query(request, query, {'cd_cli': cd_cli})
# mettre une date de fin résa pour le PASS ROUSSEAU
if formule == 'ROUSSEAU':
query = "UPDATE eleves_cpt SET date_valeur=CURRENT_DATE(),fin_reservation=CURRENT_DATE() WHERE cd_cli = :cd_cli AND ref = 'PASS_ROUSS';"
execute_query(request, query, {'cd_cli': cd_cli})
# créer éventuellement un prospect selon le code postal
ins_prospect(request, cd_cli, civilite, nom, prenom, adres1, adres2, codpost, ville, no_tel_gsm, email, permis, \
'Pass_Rousseau', 'Pass Rousseau', 'Achat de Pass Rousseau via le web')
# insérer une ligne de SUIVI
source = 'Orgine : %s' % origine
query = "CALL spUpd_ELEVES_SUIVI('SUIVI',0,:cd_cli,1,0,:source,'WEB')"
execute_query(request, query, {'cd_cli': cd_cli, 'source':source})
return cd_cli
def ins_stage_eleve(request, ref, stage_id, cd_cli, nom, prenom):
# inscrire un élève dans un stage PAP
type = stage_id[0:1]
semaine = stage_id[1:7]
groupe = stage_id[7:8]
# controler inscription en double ?
query = """SELECT s.debut FROM pla_stage_lignes l
INNER JOIN pla_stage s on s.type = l.type AND s.semaine = l.semaine AND s.groupe = l.groupe
WHERE l.type=:type AND l.cd_cli=:cd_cli"""
results = request.dbsession.execute(query, {'type': type, 'cd_cli': cd_cli}).first()
if results:
return results.debut
else:
# insérer l'élève dans le stage
query = """CALL spUpd_PLA_STAGE_LIG(:type, :semaine, :groupe, 0, :cd_cli, :nompren, '', :ref, 0, 6, 1, 0, 'WEB')"""
execute_query(request, query, {'type':type, 'semaine': semaine, 'groupe': groupe, 'cd_cli': cd_cli, 'nompren':nom + ' ' + prenom, 'ref':ref})
return None
def isEleveCreated(request, civilite, nom, nom_jf, prenom, date_nais, lieu_nais, dept_nais, formule):
# vérifier que l'élève n'est pas déjà créé
query = """SELECT cd_cli as cd_cli FROM eleves
WHERE nom=:nom AND prenom=:prenom AND nom_jf=:nom_jf AND date_nais=:date_nais AND lieu_nais=:lieu_nais AND dept_nais=:dept_nais
AND formule=:formule AND cloture_le IS NULL AND DATEDIFF(cree_le,CURRENT_DATE) < 15;"""
results = request.dbsession.execute(query, {'nom':nom, 'prenom':prenom, 'nom_jf':nom_jf, 'date_nais':date_nais, 'lieu_nais':lieu_nais, 'dept_nais':dept_nais, 'formule':formule}).first()
if results:
return results.cd_cli
else:
return 0
def get_pass_dispo(request):
# lire les pass rousseau dosponibles
query = """SELECT * FROM pass_rousseau WHERE cd_cli IS NULL;"""
results = request.dbsession.execute(query, )
return results.first()
def get_agence_suivi(request, cp):
""" Lire l'agence de suivi de l'élève """
query = "SELECT * FROM p_cp_agence WHERE code = :cp;"
results = request.dbsession.execute(query, {'cp': cp}).first()
return results
def get_prospects_by_code(request, code):
# lire le contact par son code
query = """SELECT * FROM prospects e WHERE e.cd_prospect=:code;"""
results = request.dbsession.execute(query, {'code': code}).first()
return results
def update_prospect_gagne(request, cd_prospect, cd_cli, cd_uti, agence):
query = "UPDATE prospects SET cd_cli=:cd_cli, statut='Gagné', cloture_le=CURRENT_DATE, a_relancer_le=NULL, cd_uti=:cd_uti WHERE cd_prospect=:cd_prospect;"
execute_query(request, query, {'cd_prospect': cd_prospect, 'cd_cli': cd_cli, 'cd_uti': cd_uti, 'agence': agence})
query = "DELETE FROM prospects_rdv where cd_prospect = :cd_prospect AND debut_rdv > CURRENT_DATE;"
execute_query(request, query, {'cd_prospect': cd_prospect})
def get_stages_code(request):
" Lire tous les stage CODE dispo a partir de demain "
query = """
SELECT date, groupe,
CONCAT(type,date,groupe) as stage_id,
CASE
WHEN DAYOFWEEK(DATE) = 7 THEN 'Stage 3 jours les samedis'
ELSE 'Stage 3 jours en semaine'
END as jour,
CASE
WHEN DAYOFWEEK(DATE) = 7 THEN 'samedis'
ELSE 'semaine'
END as type,
getLieu_CODE(groupe, 1) as lieu1,
getLieu_CODE(groupe, 2) as lieu2,
getLieu_CODE(groupe, 3) as lieu3,
CASE
WHEN dispo <= 0 THEN 'Complet'
WHEN dispo =1 THEN '1 place restante'
WHEN dispo > 5 THEN 'Places disponibles'
ELSE concat(dispo, ' places restantes')
END as dispo
FROM bd_aem.pla_moto where type = 'D' AND date > CURRENT_DATE() AND date < DATE_ADD(CURRENT_DATE(),INTERVAL 3 MONTH) AND libelle like 'J1%' AND total > 0;"""
results = request.dbsession.execute(query).fetchall()
return results
def get_moto_by_id(request, moto_id):
""" Lire le stage demandé """
type = moto_id[0:1]
date = moto_id[1:11]
groupe = moto_id[11:12]
query = """
SELECT *,
CASE
WHEN DAYOFWEEK(DATE) = 7 THEN 'Stage 3 jours les samedis'
ELSE 'Stage 3 jours en semaine'
END as jour,
TO_SEMAINE(DATE_FORMAT(date, "%a %e")) as date1,
CASE
WHEN DAYOFWEEK(DATE) = 7 THEN TO_SEMAINE(CONCAT(DATE_FORMAT(DATE_ADD(date, INTERVAL 7 DAY), "%a %e")))
ELSE TO_SEMAINE(CONCAT(DATE_FORMAT(DATE_ADD(date, INTERVAL 1 DAY), "%a %e")))
END as date2,
CASE
WHEN DAYOFWEEK(DATE) = 7 THEN TO_SEMAINE(DATE_FORMAT(DATE_ADD(date, INTERVAL 14 DAY), "%a %e %b %Y"))
ELSE TO_SEMAINE(DATE_FORMAT(DATE_ADD(date, INTERVAL 2 DAY), "%a %e %b %Y"))
END as date3,
getLieu_CODE(groupe, 1) as lieu1,
getLieu_CODE(groupe, 2) as lieu2,
getLieu_CODE(groupe, 3) as lieu3
FROM bd_aem.pla_moto where type=:type and date=:date and groupe=:groupe;"""
results = request.dbsession.execute(query, {'type': type, 'date': date, 'groupe': groupe}).first()
return results
def ins_stage_code(request, ref, moto_id, cd_cli):
# inscrire un élève dans un stage PAP
type = moto_id[0:1]
dateCode = datetime.strptime(moto_id[1:11], '%Y-%m-%d')
groupe = moto_id[11:12]
n = 0
dcode = dateCode.date()
if dateCode.weekday() == 5 :
# dateCode = samedi ? ajout sur 3 SAMEDIS
while n < 3:
# insérer l'élève dans le stage CODE
query = "CALL spINS_PLA_CODE_LIG(:type, :dateCode, :groupe, :cd_cli, :ref);"
execute_query(request, query, {'type':type, 'dateCode': dcode.strftime('%Y-%m-%d'), 'groupe': groupe, 'cd_cli': cd_cli, 'ref':ref})
dcode = dcode + timedelta(days = 7) # incrément = 1 semaine
n = n + 1
else:
# dateCode = lundi ? ajout sur 3 jours consécutifs
import pdb;pdb.set_trace()
while n < 3:
# insérer l'élève dans le stage CODE
query = "CALL spINS_PLA_CODE_LIG(:type, :dateCode, :groupe, :cd_cli, :ref);"
execute_query(request, query, {'type':type, 'dateCode': dcode.strftime('%Y-%m-%d'), 'groupe': groupe, 'cd_cli': cd_cli, 'ref':ref})
n = n + 1
dcode = dcode + timedelta(days = 1) # incrément = 1 jour
dcode = nextWorkingDay(dcode) # saute 1 jour si jour férié
return
def ins_prospect(request, cd_cli, civilite, nom, prenom, adres1, adres2, codpost, ville, no_tel_gsm, mail, permis, type, origine, obs):
# recherche agence de suivi
agence_suivi = get_agence_suivi(request, codpost)
if agence_suivi :
query = "CALL spINS_PROSPECTS(:cd_cli,:civilite,:nom,:prenom,:ville,:no_tel_gsm,:email,:permis,:age, :agence_suivi)"
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'civilite': civilite, 'nom':nom, 'prenom': prenom, 'ville':ville,
'no_tel_gsm': no_tel_gsm, 'email':mail, 'permis': permis, 'age': to_age(date_nais, '>'), 'agence_suivi':agence_suivi.agence})
cd_prospect = results.newcode
query = "UPDATE prospects SET cp=:codpost, type_contact=:type, origine=:origine, observation=:obs WHERE cd_prospect = :cd_prospect;"
execute_query(request, query, {'cd_prospect': cd_prospect, 'codpost':codpost, 'type':type, 'origine':origine, 'obs':obs})

View File

@@ -0,0 +1,94 @@
# -*- 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
import transaction
from dateutil.relativedelta import relativedelta
from .default import (
execute_query,
get_eleves_by_code,
)
from ..views.default import (
envoyerMail,
)
def get_tarifs(request, permis):
"""Lire les tarifs selon le permis"""
if permis == "B":
query = "SELECT REF, LIB, PUTTC FROM tarifs WHERE ref IN ('HCB','INTERNET','ECHECT','EXAM_CODE','RVP','CIRCUIT') order by fam, lib;"
elif permis == "B78":
query = "SELECT REF, LIB, PUTTC FROM tarifs WHERE ref IN ('HCB78','INTERNET','ECHECT','EXAM_CODE','RVP','CIRCUIT') order by fam, lib;"
else:
query = "SELECT REF, LIB, PUTTC FROM tarifs WHERE ref IN ('HCA3','TA','INTERNET','ECHECT','EXAM_CODE') order by fam, lib;"
results = request.dbsession.execute(query, {})
return results.fetchall()
def ins_tickets(request, cd_cli, date_ope, reference, montant, autorisation, erreur, prochain_montant, reconduction):
# ajout d'une ligne dans la table tickets_cb
query = """INSERT INTO tickets_cb (date, cd_cli, ref_commande, montant, prochain_montant, autorisation, erreur)
VALUES (:date_ope, :cd_cli, :reference, :montant, :prochain_montant, :autorisation, :erreur);"""
execute_query(request, query, {'cd_cli':cd_cli, 'date_ope': date_ope.strftime('%Y-%m-%d %H:%M'), 'reference':reference,
'montant': montant, 'autorisation':autorisation, 'erreur':erreur, 'prochain_montant': prochain_montant})
#2e ou 3e réglement d'un abonnement ? oui, on ne créé pas d'écriture
if reconduction == '' and erreur == '00000':
# non, Créer une écriture de crédit dans le compte du client si OK
query = "CALL spINS_ELEVES_CREDIT_WEB(:cd_cli, :date_ope, :montant, :reference);"
execute_query(request, query, {'cd_cli':cd_cli, 'date_ope': date_ope.strftime('%Y-%m-%d'), 'montant': montant, 'reference':reference})
# réglement comptant ?
if prochain_montant > 0:
# non, créer 2e écriture de crédit dans le compte du client
date_suivante = date_ope + relativedelta(months=+1)
query = "CALL spINS_ELEVES_CREDIT_WEB(:cd_cli, :date_ope, :montant, :reference);"
execute_query(request, query, {'cd_cli':cd_cli, 'date_ope': date_suivante.strftime('%Y-%m-%d'), 'montant': prochain_montant, 'reference':reference})
# 3ème écriture
date_suivante = date_ope + relativedelta(months=+2)
query = "CALL spINS_ELEVES_CREDIT_WEB(:cd_cli, :date_ope, :montant, :reference);"
execute_query(request, query, {'cd_cli':cd_cli, 'date_ope': date_suivante.strftime('%Y-%m-%d'), 'montant': prochain_montant, 'reference':reference})
return None
def confirmerPass(request, cd_cli):
# controler la disponibilité des PASS
query = "SELECT * FROM pass_rousseau WHERE cd_cli IS NULL order by no_id;"
results = request.dbsession.execute(query, {}).first()
if results :
# lire le nom & prenom de l'élève
eleve = get_eleves_by_code(request, cd_cli)
nompren = "%s %s %s" % (eleve.CIVILITE, eleve.NOM, eleve.PRENOM)
# affecter le PASS au client
query = "UPDATE pass_rousseau SET cd_cli=:cd_cli, nom=:nom, code_postal=:code_postal, vendu_le=CURRENT_DATE() WHERE no_id=:no_id;"
execute_query(request, query, {'cd_cli':cd_cli, 'nom': eleve.NOMPREN, 'code_postal': eleve.CODEPOST, 'no_id': results.no_id})
# confirmer l'inscription du client
query = "UPDATE eleves_cpt SET fin_reservation = NULL WHERE cd_cli = :cd_cli AND ref = 'PASS_ROUSS';"
execute_query(request, query, {'cd_cli':cd_cli})
# cloturer la fiche du client
query = "UPDATE eleves SET cloture_le = CURRENT_DATE, statut = 90 WHERE cd_cli = :cd_cli;"
execute_query(request, query, {'cd_cli':cd_cli})
body = getMessageText(request, 'envoiPassRousseau', nompren, '', '', results.identifiant, results.mdp)
destinataires=[eleve.email, request.registry.settings['monaem.comm_email'],]
envoyerMail(request, destinataires, "Votre inscription au code en ligne : vos identifiants", body)
else:
# lire le nom & prenom de l'élève
eleve = get_eleves_by_code(request, cd_cli)
nompren = "%s %s %s" % (eleve.CIVILITE, eleve.NOM, eleve.PRENOM)
body = getMessageText(request, 'dispoPassRousseau', nompren, '', '', '', '')
destinataires=[eleve.email, request.registry.settings['monaem.comm_email'],]
envoyerMail(request, destinataires, "Votre inscription au code en ligne EN ATTENTE", body)
return None

View File

@@ -0,0 +1,391 @@
# -*- 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 *
from dateutil.relativedelta import relativedelta
import transaction
from .default import (
execute_query,
)
from ..models.default import (
get_agences
)
def ctl_solde_resa(request, cd_cli, ref):
# Controler le solde de l'élève
query = "CALL spCTL_SOLDE_RESA(:cd_cli, :ref)"
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'ref': ref}).first()
return results.resultat
def get_rdv_by_code(request, logged_in):
query = "CALL spGet_ELEVES_RDV(:logged_in)"
results = request.dbsession.execute(query, {'logged_in': logged_in}).fetchall()
return results
def get_rdvB_by_no(request, no_ligne):
query = """SELECT eleves_cpt.*, moniteurs.nom AS moniteur
FROM eleves_cpt LEFT JOIN moniteurs ON eleves_cpt.cd_mon = moniteurs.cd_mon
WHERE no_ligne=:no_ligne"""
results = request.dbsession.execute(query, {'no_ligne': no_ligne}).first()
return results
def get_rdvA_by_no(request, no_ligne):
query = """SELECT s.LIBELLE, l.* FROM pla_moto_lignes l
INNER JOIN pla_moto s on s.type = l.type AND s.date = l.date AND s.groupe = l.groupe
WHERE l.no_ligne=:no_ligne;"""
results = request.dbsession.execute(query, {'no_ligne': no_ligne}).first()
return results
def get_rdvA_by_id(request, type, date, groupe, cd_cli):
query = "SELECT * FROM pla_moto_lignes WHERE type=:type AND date=:date AND groupe=:groupe AND cd_cli=:cd_cli;"
results = request.dbsession.execute(query, {'type': type, 'date': date, 'groupe': groupe, 'cd_cli': cd_cli}).first()
return results
def ctl_delai_annul(request, dateRDV, heureRDV, cree_le, statut):
# controler que le delai de suppression est OK
# lire le délai d'annulation des HCB
# query = "SELECT delai_annul FROM p_agences WHERE code = 6;"
# results = request.dbsession.execute(query, {}).first()
# delai = results.delai_annul
delai = 2 # jours
# statut du rdv est moniteur absent ?
if statut >= 10 and statut <= 14 :
return True
# la date de création du rdv est aujourd'hui ou hier ?
nDays = (cree_le.date() - date.today()).days
if nDays == 0 or nDays == -1 :
return True
# si Vendredi ou Samedi, ajouter un jour supplémentaire
if date.today().weekday() == 4 or date.today().weekday() == 5 :
delai = delai + 1
# datetime du RDV
dtRDV = datetime.strptime('%s %02d:00:00' % (dateRDV.strftime('%Y-%m-%d'), heureRDV), '%Y-%m-%d %H:%M:%S')
# datetime aujourd'hui + délai
dtDelai = datetime.now() + timedelta(hours=delai * 24)
if dtRDV > dtDelai:
return True
else:
return False
def ctl_delai_annul_A(request, dateRDV):
# controler que le delai de suppression est OK
# lire le délai d'annulation des HCB
# query = "SELECT delai_annul FROM p_agences WHERE code = 6;"
# results = request.dbsession.execute(query, {}).first()
# delai = results.delai_annul
delai = 2 # jours
# si Vendredi ou Samedi, ajouter un jour supplémentaire
if date.today().weekday() == 4 or date.today().weekday() == 5 :
delai = delai + 1
# date aujourd'hui + délai
dtDelai = datetime.today() + timedelta(days=delai)
if dateRDV > dtDelai:
return True
else:
return False
def upd_eleves_rdv_annule(request, planning, no_ligne, logged_in):
if planning == "B":
# delettrer la ligne de compte
query = "CALL spUPD_ELEVES_DELETTRER(:no_ligne)"
execute_query(request, query, {'no_ligne': no_ligne})
# annuler l'heure de l'élève
query = """UPDATE eleves_cpt SET ref=NULL, debit=0, mtval=0, qte=0, fin_reservation=NULL,
intitule=CONCAT('RDV de ', noplan,' h annulé (', statut, ')'), noplan=0, cd_uti = 'WEB' WHERE no_ligne = :no_ligne;"""
execute_query(request, query, {'no_ligne': no_ligne})
# revaloriser la ligne de compte
query = "CALL spUpd_PLANNING_B_VALORISER(:logged_in)"
execute_query(request, query, {'logged_in': logged_in})
else:
# relire le RDV de type planning A
query = "SELECT * FROM pla_moto_lignes WHERE no_ligne=:no_ligne;"
rdvA = request.dbsession.execute(query, {'no_ligne': no_ligne}).first()
# obtiens le no de la ligne cpt correspondant
ligne_cpt = rdvA.ligne_cpt
# exécute le traitement d'annulation
query = """CALL spDel_PLA_MOTO_LIGNES(:no_ligne, :ligne_cpt, :logged_in, 'WEB');"""
execute_query(request, query, {'logged_in': logged_in, 'no_ligne': no_ligne, 'ligne_cpt': ligne_cpt})
def upd_eleves_rdv_statut3(request, planning, no_ligne):
# mettre le statut du RDV = 3 (décommandé avant 48h)
if planning == "B":
query = """UPDATE eleves_cpt SET statut=3, cd_uti = 'WEB', fin_reservation=NULL WHERE no_ligne = :no_ligne;"""
execute_query(request, query, {'no_ligne': no_ligne})
else:
query = "UPDATE pla_moto_lignes SET statut=3, cd_uti = 'WEB' WHERE no_ligne=:no_ligne;"
execute_query(request, query, {'no_ligne': no_ligne})
def get_rdva_dispos(request, type_lecon, cd_cli):
# lire les horaires dispos du planning A
# lire l'heure courante pour déterminer le groupe du jour à afficher
heure = datetime.now().hour
if heure < 8 :
gr_debut = 'A'
elif heure < 12:
gr_debut = 'B'
elif heure < 15:
gr_debut = 'c'
elif heure < 18:
gr_debut = 'D'
else:
gr_debut = 'E'
# covertir heure en groupe TA
TA_debut = chr(heure + 57)
# Lire les dispos du jour à partir du groupe suivant l'heure actuelle
# + les horaires dispos des jours suivants
# + les résa de l'élève
# + les résa en statut = 3, décommandé moins de 48h, et groupe dispo=0
if type_lecon == 'PLATEAU':
query = """SELECT type, date, groupe, 0 as cd_cli, 0 as statut FROM pla_moto
WHERE type='A' AND date = CURRENT_DATE AND groupe >= :gr_debut AND groupe <= 'D' AND libelle NOT LIKE '1er plat%' AND dispo > 0 AND valide ='N'
UNION
SELECT l.type, l.date, l.groupe, l.cd_cli, l.statut FROM pla_moto_lignes l JOIN pla_moto m ON l.type=m.type AND l.date=m.date AND l.groupe=m.groupe
WHERE l.type='A' AND l.date = CURRENT_DATE AND l.groupe >= :gr_debut AND l.groupe <= 'D' AND l.route = 0 AND l.statut = 3 AND l.valide ='N' AND m.dispo=0 AND m.libelle NOT LIKE '1er plat%'
UNION
SELECT type, date, groupe, cd_cli, statut FROM pla_moto_lignes WHERE (type='A' OR type='F') AND date >= CURRENT_DATE AND cd_cli = :cd_cli AND statut=0 AND valide='N'
UNION
SELECT type, date, groupe, 0 as cd_cli, 0 as statut FROM pla_moto
WHERE type='A' AND date > CURRENT_DATE AND groupe <= 'D' AND libelle NOT LIKE '1er plat%' AND dispo > 0 AND valide ='N'
UNION
SELECT l.type, l.date, l.groupe, l.cd_cli, l.statut FROM pla_moto_lignes l JOIN pla_moto m ON l.type=m.type AND l.date=m.date AND l.groupe=m.groupe
WHERE l.type='A' AND l.date > CURRENT_DATE AND l.groupe <= 'D' AND l.route = 0 AND l.statut = 3 AND l.valide ='N' AND m.dispo=0 AND libelle NOT LIKE '1er plat%';"""
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'gr_debut': gr_debut, 'TA_debut': TA_debut}).fetchall()
# lecon = ROUTE
elif type_lecon == 'ROUTE':
query = """SELECT type, date, groupe, 0 as cd_cli, 0 as statut FROM pla_moto
WHERE type='A' AND date = CURRENT_DATE AND groupe >= :gr_debut AND groupe <= 'D' AND route_dispo > 0 AND valide ='N'
UNION
SELECT l.type, l.date, l.groupe, l.cd_cli, l.statut FROM pla_moto_lignes l JOIN pla_moto m ON l.type=m.type AND l.date=m.date AND l.groupe=m.groupe
WHERE l.type='A' AND l.date = CURRENT_DATE AND l.groupe >= :gr_debut AND l.groupe <= 'D' AND l.route <> 0 AND l.statut = 3 AND l.valide ='N' AND m.dispo=0
UNION
SELECT type, date, groupe, cd_cli, statut FROM pla_moto_lignes WHERE (type='A' OR type='F') AND date >= CURRENT_DATE AND cd_cli = :cd_cli AND statut=0 AND valide ='N'
UNION
SELECT type, date, groupe, 0 as cd_cli, 0 as statut FROM pla_moto
WHERE type='A' AND date > CURRENT_DATE AND groupe <= 'D' AND route_dispo > 0 AND valide ='N'
UNION
SELECT l.type, l.date, l.groupe, l.cd_cli, l.statut FROM pla_moto_lignes l JOIN pla_moto m ON l.type=m.type AND l.date=m.date AND l.groupe=m.groupe
WHERE l.type='A' AND l.date > CURRENT_DATE AND l.groupe <= 'D' AND l.route <> 0 AND l.statut = 3 AND l.valide ='N' AND m.dispo=0;"""
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'gr_debut': gr_debut, 'TA_debut': TA_debut}).fetchall()
# lecon =examen blanc
else:
query = """SELECT type, date, groupe, 0 as cd_cli, 0 as statut FROM pla_moto
WHERE type='F' AND date = CURRENT_DATE AND groupe > :TA_debut AND dispo > 0 AND valide ='N'
UNION
SELECT l.type, l.date, l.groupe, l.cd_cli, l.statut FROM pla_moto_lignes l JOIN pla_moto m ON l.type=m.type AND l.date=m.date AND l.groupe=m.groupe
WHERE l.type='F' AND l.date = CURRENT_DATE AND l.groupe > :TA_debut AND l.statut = 3 AND l.valide ='N' AND m.dispo=0
UNION
SELECT type, date, groupe, cd_cli, statut FROM pla_moto_lignes WHERE (type='A' OR type='F') AND date >= CURRENT_DATE AND cd_cli = :cd_cli AND valide ='N'
UNION
SELECT type, date, groupe, 0 as cd_cli, 0 as statut FROM pla_moto
WHERE type='F' AND date > CURRENT_DATE AND dispo > 0 AND valide ='N'
UNION
SELECT l.type, l.date, l.groupe, l.cd_cli, l.statut FROM pla_moto_lignes l JOIN pla_moto m ON l.type=m.type AND l.date=m.date AND l.groupe=m.groupe
WHERE l.type='F' AND l.date > CURRENT_DATE AND l.groupe <= 'D' AND l.statut = 3 AND l.valide ='N' AND m.dispo=0;"""
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'gr_debut': gr_debut, 'TA_debut': TA_debut}).fetchall()
return results
def get_rdvb_dispos(request, cd_cli):
# lire les horaires dispos du planning B
query = "CALL spGet_PLANNINGB_DISPO(:cd_cli);"
results = request.dbsession.execute(query, {'cd_cli': cd_cli}).fetchall()
return results
def update_rdva(request, rdv_type, rdv_date, rdv_groupe, old_cli, newcli, qte, ref, route, nDelai):
# lire lieu en fonction du groupe
query = "SELECT lieu from P_LIEUX WHERE type = :type;"
results = request.dbsession.execute(query, {'type': rdv_type + rdv_groupe}).first()
if results:
lieu = results.lieu
else:
lieu = '???'
query = "CALL spUpd_PLA_MOTO_LIG(:rdv_type,:rdv_date,:rdv_groupe,:old_cli,:newcli,0,:lieu,'',:qte,:ref,:route,6,:nDelai,0,'WEB');"
execute_query(request, query, {'rdv_type':rdv_type, 'rdv_date':rdv_date, 'rdv_groupe':rdv_groupe, 'old_cli':old_cli, 'newcli':newcli,
'lieu':lieu, 'qte':qte, 'ref':ref, 'route':route, 'nDelai':nDelai, })
query = "CALL spUpd_PLANNING_A_VALORISER(:cd_cli, :ref);"
execute_query(request, query, {'cd_cli':newcli, 'ref':ref})
def update_rdvb(request, no_ligne, old_cd_cli, cd_cli, date, heure, qte, ref, cd_mon, agence, comment, statut, typeHeure, nDelai, cd_cli_old, cd_uti):
query = "CALL spUpd_PLANNING_B(:no_ligne,:old_cd_cli,:cd_cli,:date,:heure,:qte,:ref,:cd_mon,:agence,0,:comment,:statut,:typeHeure,:nDelai,:cd_cli_old,:cd_uti);"
execute_query(request, query, {'no_ligne':no_ligne, 'old_cd_cli':old_cd_cli, 'cd_cli':cd_cli, 'date':date, 'heure':heure, 'qte':qte, 'ref':ref,
'cd_mon':cd_mon, 'agence':agence, 'comment':comment, 'statut':statut, 'typeHeure':typeHeure,
'nDelai':nDelai, 'cd_cli_old':cd_cli_old, 'cd_uti':cd_uti})
query = "CALL spUpd_PLANNING_B_VALORISER(:cd_cli);"
execute_query(request, query, {'cd_cli':cd_cli})
def get_eleve_cpt_extrait(request, logged_in):
query = "CALL spGet_ELEVES_CPT_byEXTRAIT(:logged_in)"
results = request.dbsession.execute(query, {'logged_in': logged_in}).fetchall()
return results
def ctl_heures_resaB(request, user, cd_cli, cd_mon, date, heure, qte):
# controler heures en double
query = "CALL spCTL_HEURES_EN_DOUBLE(:user, :cd_cli, :cd_mon, :date, :heure, :qte)"
results = request.dbsession.execute(query, {'user': user,'cd_cli': cd_cli,'cd_mon': cd_mon,'date': date,'heure': heure,'qte': qte}).fetchall()
if results:
return 1
# max 2h cumulées par jour
query = "SELECT COALESCE(sum(qte),0) AS total FROM eleves_cpt WHERE cd_cli=:cd_cli AND date=:date AND NoPlan > 0;"
results = request.dbsession.execute(query, {'user': user,'cd_cli': cd_cli,'date': date}).first()
if results.total + qte > 2:
return 2
# max 4h cumulées par semaine
lundi = date - timedelta(days=date.weekday())
samedi = lundi + timedelta(days=5)
query = "SELECT COALESCE(sum(qte),0) AS total FROM eleves_cpt WHERE cd_cli=:cd_cli AND date>=:lundi AND date<=:samedi AND NoPlan > 0;"
results = request.dbsession.execute(query, {'user': user,'cd_cli': cd_cli,'lundi': lundi,'samedi': samedi}).first()
if results.total + qte > 4:
return 3
return 0
def ins_t_log_nuit(request, proc, message):
# insert une ligne dans t_log_nuit
query = "INSERT t_log_nuit (proc, msg) values (:proc, :message);"
execute_query(request, query, {'proc': proc, 'message': message})
def ctl_heures_resaA(request, type_lecon, cd_cli, rdv_date, rdv_groupe):
# lire l'agence 6 pour obtenir les Max des lecons A possibles
agence6 = get_agences(request, 6)
# Controler que l'élève n'est pas déjà inscrit dans ce créneau
query = "SELECT type, date, groupe, cd_cli, statut FROM pla_moto_lignes WHERE date = :date AND groupe = :groupe AND cd_cli = :cd_cli;"
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'date': rdv_date, 'groupe': rdv_groupe}).fetchall()
if results:
return 'Vous avez déjà un rendez-vous dans ce créneau.'
madate = datetime.strptime(rdv_date, '%Y-%m-%d')
# cas des lecons ROUTE
if type_lecon == 'R':
# controler 2 leçons de plateau sont prises ou réservée avant la date de la route
query = "SELECT count(*) AS total FROM pla_moto_lignes WHERE type = 'A' AND date < :rdv_date AND cd_cli = :cd_cli AND route = 0;"
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'rdv_date': rdv_date}).first()
if results.total < 2:
return 'Vous devez avoir 2 leçons PLATEAU avant de pouvoir prendre une ROUTE.'
# rdv d'aujourd'hui ou dans période de dérogation ?
derogation = date.today() + timedelta(days = agence6.MaxJoursDerogation)
if madate.date() <= derogation:
# controler 3 leçons max par journée
query = "SELECT type, date, groupe, cd_cli, statut FROM pla_moto_lignes WHERE date = :date AND cd_cli = :cd_cli;"
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'date': rdv_date}).fetchall()
if len(results) > 3:
return 'Vous ne pouvez pas prendre plus de 3 rendez-vous par jour.'
else:
# controler une seule leçon par journée
query = "SELECT type, date, groupe, cd_cli, statut FROM pla_moto_lignes WHERE date = :date AND cd_cli = :cd_cli;"
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'date': rdv_date}).fetchall()
if results:
return 'Vous avez déjà un rendez-vous dans cette journée.'
# max leçons par semaine
lundi = madate - timedelta(days=madate.weekday())
samedi = lundi + timedelta(days=5)
query = "SELECT count(*) AS total FROM pla_moto_lignes WHERE cd_cli = :cd_cli AND date>=:lundi AND date<=:samedi;"
results = request.dbsession.execute(query, {'cd_cli': cd_cli,'lundi': lundi,'samedi': samedi}).first()
if results.total >= agence6.MaxLeconASemaine:
return 'Vous ne pouvez pas prendre plus de %s rendez-vous par semaine.' % str(agence6.MaxLeconASemaine)
# max leçons par mois
premier = date.today()
dernier = premier + relativedelta(days=28)
query = "SELECT count(*) AS total FROM pla_moto_lignes WHERE cd_cli = :cd_cli AND date>=:premier AND date<=:dernier;"
results = request.dbsession.execute(query, {'cd_cli': cd_cli,'premier': premier,'dernier': dernier}).first()
if results.total >= agence6.MaxLeconAMois:
return 'Vous ne pouvez pas prendre plus de %s rendez-vous par 28 jours.' % str(agence6.MaxLeconAMois)
# une seule lecon 18-21h par semaine
query = "SELECT count(*) AS total FROM pla_moto_lignes WHERE type = 'A' AND groupe = 'D' AND cd_cli=:cd_cli AND date>=:lundi AND date<=:samedi;"
results = request.dbsession.execute(query, {'cd_cli': cd_cli,'lundi': lundi,'samedi': samedi}).first()
if results.total > 0:
return "Vous ne pouvez prendre qu'un seul créneau 18-21h par semaine."
return ''
def ctl_heures_TA(request, cd_cli):
# compter le nb examen blanc A
query = "SELECT type, date, groupe, cd_cli, statut FROM pla_moto_lignes WHERE type = 'F' AND cd_cli = :cd_cli AND statut=0"
results = request.dbsession.execute(query, {'cd_cli': cd_cli}).fetchall()
return results
def ctl_heures_plateau(request, cd_cli):
# compter le nombre heures plateau
query = "SELECT count(*) as total FROM eleves_cpt WHERE cd_cli = :cd_cli AND ref = 'HCA3' AND route=0;"
results = request.dbsession.execute(query, {'cd_cli': cd_cli}).first()
return results.total
def ctl_pratique_ok(request, login):
# lire l'eleve connecte
query = """SELECT tr_p_ok FROM eleves WHERE cd_cli=:login ;"""
results = request.dbsession.execute(query, {'login': login}).first()
if results.tr_p_ok:
return True
else:
return False
def get_inscriptions(request):
# lire les inscriptions WEB dans planning A et B
query = """
SELECT ref, date, fin_reservation, cd_cli, no_ligne, noplan, circuit, debit, cree_le, statut, cd_cli_old
FROM eleves_cpt WHERE NOT isnull(fin_reservation) AND cd_uti = 'WEB' ORDER BY date;"""
results = request.dbsession.execute(query, {}).fetchall()
return results
def get_solde_eleve(request, cd_cli, ref):
# Controler le solde de l'élève
query = "CALL spCTL_SOLDE_RESA(:cd_cli, :ref)"
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'ref': ref}).first()
return results
def update_reservation_confirm(request, action, no_ligne, ref, statut, cd_cli_old):
# confirmer les résa WEB
query = "CALL spUPD_RESERVATION_CONFIRM(:action, :no_ligne, :ref, :statut, :cd_cli_old);"
execute_query(request, query, {'action': action, 'no_ligne': no_ligne, 'ref': ref, 'statut': statut, 'cd_cli_old': cd_cli_old})
def insert_email_resa(request, ref, cd_cli, type, date, heure, statut):
query = """INSERT INTO email_resa (ref, cd_cli, resa_date, resa_type, resa_statut)
VALUES (:ref, :cd_cli, DATE_ADD(:date, INTERVAL :heure HOUR), :type, :statut);"""
execute_query(request, query, {'ref': ref, 'cd_cli': cd_cli, 'type': type, 'date': date, 'heure': heure, 'statut': statut})
def get_email_resa(request, type):
# lire les rappels non envoyés
query = "CALL spGet_EMAIL_RESA(:type);"
results = request.dbsession.execute(query, {'type': type}).fetchall()
return results
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 update_email_resa(request, no_id):
query = "UPDATE email_resa SET envoye_le = NOW() WHERE no_id = :no_id;"
execute_query(request, query, {'no_id': no_id})