416 lines
18 KiB
Python
416 lines
18 KiB
Python
# -*- coding: utf8 -*-
|
|
from sqlalchemy import text
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
from sqlalchemy.orm import (
|
|
scoped_session,
|
|
sessionmaker,
|
|
)
|
|
|
|
from zope.sqlalchemy import ZopeTransactionExtension, mark_changed
|
|
|
|
from datetime import *
|
|
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})
|
|
|