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

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