initial upload
This commit is contained in:
82
monaem/models/__init__.py
Normal file
82
monaem/models/__init__.py
Normal 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
381
monaem/models/default.py
Normal 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
|
||||
415
monaem/models/inscriptions.py
Normal file
415
monaem/models/inscriptions.py
Normal 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})
|
||||
|
||||
94
monaem/models/reglement.py
Normal file
94
monaem/models/reglement.py
Normal 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
|
||||
|
||||
391
monaem/models/reservation.py
Normal file
391
monaem/models/reservation.py
Normal 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})
|
||||
|
||||
Reference in New Issue
Block a user