Files
aem_moniteurs/aem_gestion/views/planning.py
2023-06-22 10:34:18 +02:00

2980 lines
131 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf8 -*-
from pyramid.view import (
view_config,
)
from pyramid.httpexceptions import (
HTTPFound,
)
from datetime import datetime, timedelta
import json
from ..models.planning import *
from ..models.default import (
get_users_by_code,
get_user_access,
get_user_cd_mon,
get_user_cd_mon_B78,
isDelaiOK,
get_formules,
get_formule,
get_moniteur_by_code,
delete_stage_lig_by_cd_cli,
delete_moto_lig_by_cd_cli,
update_panning_moto_dispo,
get_moniteur_aff,
get_moniteur_aff_by_agence
)
from ..models.eleves import (
get_eleves_by_code,
get_moniteurs_by_code,
update_eleve_delettrer,
)
from ..views.default import (
to_age,
to_date,
to_euro,
to_euroN,
to_euroz,
to_time,
to_int,
to_percent,
to_sha1,
to_str,
)
from datetime import timedelta, date as ddate
from jours_feries_france.compute import JoursFeries
def ctlEleve_PLB(request, cd_cli):
# Lire la fiche Elève
eleve = get_eleves_by_code(request, cd_cli)
if eleve is None or len(eleve) == 0:
message = "Elève %s non trouvé !" % cd_cli
return message
# est-ce une activité ? oui, fin des controles
if eleve.AGENCE == 0 :
return ''
if eleve.CLOTURE_LE :
message = "Le DOSSIER de cet élève est CLOTURE ou RETIRE ou en LITIGE !"
return message
if eleve.ELEVEGARDE02 :
message = "Le DOSSIER est gardé par l'élève !"
return message
# controler la date de validité de la visite medicale
if eleve.visite_med_fin_le :
today = date.today()
diff = eleve.visite_med_fin_le - today
nbJours = diff.days
if nbJours < 0 :
message = "Attention! La date de visite médicale de l'élève est exprirée."
return message
#elif nbJours < 90 :
# message = "Attention! La date de visite médicale de l'élève expirera dans %s jours." % nbJours
# return message
# controles spécifiques
if eleve.PERMIS_DEMANDE != "B" and eleve.PERMIS_DEMANDE != "B78" :
message = "La catégorie de permis demandée n'est pas compatible avec ce planning !"
return message
return ''
@view_config(route_name='monplanning', renderer='../templates/planning/monplanning.pt', permission='view')
def monplanning(request):
def generer_planning(agence, cd_mon, datedeb, datefin,edit='rdvb_edit'):
# construire la liste des rdv du moniteurs
rows = get_rendez_vous_moniteur(request, agence, cd_mon, datedeb, datefin)
events = []
for row in rows:
if row.comment == None:
comment = ''
else:
comment = row.comment
if row.NOM_ENTREPRISE :
etoile = ' (E)'
else:
etoile = ''
nom = row.nom + etoile
# déterminer la couleur de l'event
if row.date_valeur :
color = 'LightGreen' # rdv validé = vert pale
else:
if to_int(row.ref) != row.cd_cli :
if row.statut > 1 :
color = 'DeepPink' # rdv élève décommandé
if row.statut == 10 or row.statut == 15 :
color = 'LightGray' # moniteur absent
elif row.fin_reservation :
color = 'LightPink' # résa = LightPink
else:
color = 'LightYellow' # rdv élève = jaune pale
if row.circuit == 1:
color = 'Gold' # gold
elif row.circuit == 2:
color = 'Plum' # Plum
elif row.circuit == 3:
color = 'YellowGreen' # YellowGreen
elif row.circuit == 4:
color = 'DeepSkyBlue' # DeepSkyBlue
elif row.circuit == 5:
color = 'LimeGreen' # LimeGreen
elif row.circuit == 6:
color = 'GoldenRod' # Marron
else:
if row.cd_cli == 99995 :
color = 'White' # résa web = couleur blanc)
elif row.cd_cli == 1 :
color = 'Gainsboro' # ///////
else:
color = 'LightBlue' # activité
if row.statut == 10 or row.statut == 15 :
color = 'LightGray' # moniteur absent
json_event = {
'title': nom,
'start': '%s %02d:00:00' % (row.DATE.strftime('%Y-%m-%d'), row.noplan),
'end': '%s %02d:00:00' % (row.DATE.strftime('%Y-%m-%d'), row.noplan + row.qte),
'description': comment,
'allDay': False,
'color': color,
'textColor': '#000000',
'url': '/'+edit+'/%s' % (row.no_ligne),
}
events.append(json_event)
# construire la liste des rdv annulés du moniteurs
rows = get_rendez_vous_annules(request, agence, cd_mon, datedeb, datefin)
for row in rows:
if row.NOM_ENTREPRISE :
etoile += ' (E)'
else:
etoile = ''
nom = row.nom + etoile
json_event = {
'title': nom,
'start': row.DATE.strftime('%Y-%m-%d'),
'end': row.DATE.strftime('%Y-%m-%d'),
'description': '%s par %s' % (row.intitule.replace(' (0)', ''), row.cd_uti),
'allDay': True,
'color': 'White',
'textColor': 'Black',
'url': '/'+edit+'/%s' % (row.no_ligne),
}
events.append(json_event)
return json.dumps(events)
# récupérer les paramètres de l'appel de la view
datePlan = request.matchdict['date']
cd_mon = request.matchdict['cd_mon']
logged_in = request.authenticated_userid
isSeulB78 = False
url = request.current_route_path()
if cd_mon == 'codeMon':
cd_mon,cd_mon_B78 = get_user_cd_mon(request, logged_in)
else :
moni = get_moniteurs_by_code(request,cd_mon)
if moni and moni['PLANNING'] == "B78" :
cd_mon_B78 = moni['CD_MON']
isSeulB78 = True
else:
cd_mon_B78 = get_user_cd_mon_B78(request, logged_in)
isSeulB78 = False
url = request.route_url('monplanning', cd_mon='codeMon', date='today')
if datePlan == 'today':
datePlan = date.today().strftime('%Y-%m-%d')
# si cd_mon a été changé par le user
if 'cd_mon' in request.params:
cd_mon = request.params["cd_mon"]
moni = get_moniteurs_by_code(request,cd_mon)
if moni and moni['PLANNING'] == "B78" :
cd_mon_B78 = moni['CD_MON']
isSeulB78 = True
else:
isSeulB78 = False
url_select = request.route_url('eleve_select', cd_mon=cd_mon, date=datePlan)
member = get_users_by_code(request, logged_in)
if not member:
request.session.flash(u"Moniteur %s introuvable" % (logged_in), 'danger')
return HTTPFound(location=request.route_url("home"))
agence = member.agence
QTE = 1
message = ''
# -- CREER un rendez-vous
if 'form.submitted' in request.params:
name = request.params['name'].split(' | ')
cd_cli = int(name[1])
QTE = int(request.params['QTE'])
dateRDV = request.params['dateRDV']
heureRDV = request.params['heureRDV']
isB78 = 'cd_mon_B78' in request.params
# controle date exportation
isAffected, lastdate = controlAffectationEtAgece(request,cd_mon,dateRDV,heureRDV,agence)
if controleDateExport(request, dateRDV, agence) == False:
message = "Cette journée est déjà comptabilisée ! Création impossible."
elif not isAffected:
if lastdate :
message = "La dernier affectation de ce moniteur pour l'agence "+str(agence)+ " était le " + lastdate['DATEF'].strftime('%d/%m/%Y')+ " à "+str(lastdate['DMATIN'])+"h jusqu'à "+str(lastdate['FMATIN'])+"h le matin et " +str(lastdate['DSOIR'])+"h jusqu'à "+str(lastdate['FSOIR'])+"h l'apres midi.!!"
else :
message = "Ce moniteur n'a aucune affectation dans cet agence pour la date de {0} à {1}h!!".format(dateRDV,heureRDV)
else:
if cd_cli < 100000:
ref = str(cd_cli)
else:
if isB78 :
ref = "HCB78"
else:
ref = "HCB"
# controles sur l'élève
message = ctlEleve_PLB(request, cd_cli)
if len(message) == 0:
nDelai = controleSoldeResa(request, cd_cli, ref)
# plafond dépassé ?
if nDelai == -1:
request.session.flash(u"L'encours de l'élève a dépassé son plafond autorisé. Impossible de lui ajouter une heure.", 'danger')
return HTTPFound(location=request.route_url("monplanning", cd_mon=cd_mon, date=dateRDV))
else:
if isB78 :
update_rdvb(request, 0, 0, cd_cli, dateRDV, heureRDV, QTE, ref, cd_mon_B78, agence, '', 0, 0, nDelai, 0, logged_in)
else :
update_rdvb(request, 0, 0, cd_cli, dateRDV, heureRDV, QTE, ref, cd_mon, agence, '', 0, 0, nDelai, 0, logged_in)
if nDelai == 0:
request.session.flash(u"Le rendez-vous a été CREE avec succès.", 'success')
else:
request.session.flash(u"Le rendez-vous a été RESERVE avec succès.", 'warning')
return HTTPFound(location=request.route_url("monplanning", cd_mon=cd_mon, date=dateRDV))
TODAY = date.today()
# début = aujourd'hui - 3 semaines
d = TODAY + relativedelta(weeks=-3)
datedeb = d.strftime('%Y-%m-%d')
# fin = aujourd'hui + 6 mois
d = TODAY + relativedelta(months=+6)
datefin = d.strftime('%Y-%m-%d')
# lire les moniteurs
moniteurs = get_moniteurs_by_aff(request, agence, datedeb, datefin)
#sort moniteur , mettre B78 à la fin
moniteurs.sort(key=lambda m: str(m.PLANNING) == "B", reverse=True)
moniteursB = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "B"]
moniteursB78 = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "B78"]
moniteurs2R = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "2R"]
moniteursGL = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "GL"]
moniteurs = [moniteursB,moniteurs2R,moniteursGL,moniteursB78]
# generer le planning B
calendar_events = generer_planning(agence, cd_mon, datedeb, datefin)
# generer le planning B78
calendar_events_b78 = generer_planning(agence, cd_mon_B78, datedeb, datefin,'rdvb78_edit')
return {
'page_title': "Planning de %s (agence %s)" % (cd_mon, agence) if not isSeulB78 else "Planning B78 de %s (agence %s)" % (cd_mon, agence),
'url': url,
'url_select': url_select,
'datePlan': datePlan,
'message': message,
'calendar_events': calendar_events,
'calendar_events_b78': calendar_events_b78,
'moniteurs': moniteurs,
'cd_mon': cd_mon,
'cd_mon_B78':cd_mon_B78,
'isSeulB78': isSeulB78,
'agence' : agence,
'QTE': QTE,
}
@view_config(route_name='planningb', renderer='../templates/planning/planningb.pt', permission='view')
def planningb(request):
def generer_ressources(moniteurs):
# construire la liste des ressources
# {"id":"a","title":"Auditorium A"}
ressources = []
for row in moniteurs:
name = ' (B78)' if row.PLANNING == "B78" else ''
json_ressources = {
'id': row.CD_MON,
'planning': row.PLANNING,
'title': row.NOM + name,
}
ressources.append(json_ressources)
ressources.sort(key=lambda r: r['planning'] == 'B78')
return json.dumps(ressources, indent=4, sort_keys=True, default=str)
def generer_planning(agence, moniteurs, datedeb, datefin, current_date=date.today()):
# construire la liste des events
events = []
delta = timedelta(days=1)
first = current_date - timedelta(days=7)
last = current_date + timedelta(days=30)
for item in moniteurs:
cd_mon = item.CD_MON
rows = get_rendez_vous_moniteur(request, agence, cd_mon, datedeb, datefin)
affectations = get_moniteur_aff_by_agence(request, cd_mon, agence)
for affectation in affectations:
disabled_days = [i if affectation['REPOS' +
str(i)] != 0 else None for i in range(1, 7)]
start_date = affectation.DATED
end_date = affectation.DATEF
if end_date < first or start_date > last:
continue
count = 0
diffday = (current_date - start_date)
if diffday.days > 7 and diffday > timedelta(0):
start_date = first
while start_date <= end_date:
weekday = start_date.weekday() + 1
feries = JoursFeries.for_year(start_date.year).values()
if first <= start_date <= last and weekday != 7 and weekday not in disabled_days and start_date not in feries:
morning_event = {
'resourceId': cd_mon,
'title': '',
'start': '%s %02d:00:00' % (start_date.strftime('%Y-%m-%d'), affectation.DMATIN),
'end': '%s %02d:00:00' % (start_date.strftime('%Y-%m-%d'), affectation.FMATIN),
'color': '#ffffff',
'rendering': 'background',
}
events.append(morning_event)
afternoon_event = {
'resourceId': cd_mon,
'title': '',
'start': '%s %02d:00:00' % (start_date.strftime('%Y-%m-%d'), affectation.DSOIR),
'end': '%s %02d:00:00' % (start_date.strftime('%Y-%m-%d'), affectation.FSOIR),
'color': '#ffffff',
'display': 'background',
'rendering': 'background',
}
events.append(afternoon_event)
count += 1
start_date += delta
if count >= 38:
break
planning_edit = 'rdvb78_edit' if item.PLANNING == "B78" else 'rdvb_edit'
for row in rows:
nom = row.nom
etoile = ''
if row.NOM_ENTREPRISE:
etoile += 'E'
if row.comment:
etoile += 'C'
if len(etoile) > 0:
nom = '%s (%s)' % (nom, etoile)
# déterminer la couleur de l'event
if row.date_valeur:
color = 'LightGreen' # rdv validé = vert pale
else:
if to_int(row.ref) != row.cd_cli:
if row.statut > 1:
color = 'DeepPink' # rdv élève décommandé
if row.statut == 10 or 15:
color = 'LightGray' # moniteur absent
elif row.fin_reservation:
color = 'LightPink' # résa = LightPink
else:
color = 'LightYellow' # rdv élève = jaune pale
if row.circuit == 1:
color = 'Gold' # gold
elif row.circuit == 2:
color = 'Plum' # Plum
elif row.circuit == 3:
color = 'YellowGreen' # YellowGreen
elif row.circuit == 4:
color = 'DeepSkyBlue' # DeepSkyBlue
elif row.circuit == 5:
color = 'LimeGreen' # LimeGreen
elif row.circuit == 6:
color = 'GoldenRod' # Marron
else:
if row.cd_cli == 99995:
color = 'White' # résa web = couleur blanc)
elif row.cd_cli == 1:
color = 'Gainsboro' # ///////
else:
color = 'LightBlue' # activité
if row.statut == 10 or row.statut == 15:
color = 'LightGray' # moniteur absent
json_event = {
'resourceId': cd_mon,
'title': nom,
'start': '%s %02d:00:00' % (row.DATE.strftime('%Y-%m-%d'), row.noplan),
'end': '%s %02d:00:00' % (row.DATE.strftime('%Y-%m-%d'), row.noplan + row.qte),
'description': "%06d" % row.cd_cli,
'allDay': False,
'color': color,
'textColor': '#000000',
'url': '/%s/%s?from=planningb&agence=%s' % (planning_edit, row.no_ligne, str(agence))
}
events.append(json_event)
return json.dumps(events)
logged_in = request.authenticated_userid
# lire le user connecté
member = get_users_by_code(request, logged_in)
type_plannings = ['B', 'B78', '2R', 'GL']
current_planning = 'ALL'
if 'current_planning' in request.params:
current_planning = request.params['current_planning']
message = ''
if not member:
request.session.flash(u"Moniteur %s introuvable" % (logged_in), 'danger')
return HTTPFound(location=request.route_url("home"))
# lire son agence d'appartenance
url = request.route_url('planningb')
if 'agence' in request.GET:
agence = request.GET['agence']
elif 'agence' in request.params:
agence = request.params['agence']
else:
agence = member.agence
# start date
if 'next' in request.GET:
try:
current_date = datetime.strptime(request.GET['next'], '%Y-%m-%d')
current_date = current_date.date()
except:
current_date = date.today()
else:
current_date = date.today()
# -- CREER un rendez-vous
if 'form.submitted' in request.params:
name = request.params['name'].split(' | ')
cd_cli = int(name[1])
QTE = int(request.params['QTE'])
dateRDV = request.params['dateRDV']
heureRDV = request.params['heureRDV']
fromUrl = url + "?agence=" + agence + '&next=' + dateRDV
if 'cd_mon_B78' in request.params:
isB78 = True
cd_mon = request.params['cd_mon_B78']
else:
cd_mon = request.params['cd_mon']
isB78 = False
# controle date exportation
isAffected, lastdate = controlAffectationEtAgece(request, cd_mon, dateRDV, heureRDV, agence)
if controleDateExport(request, dateRDV, agence) == False:
message = "Cette journée est déjà comptabilisée ! Création impossible."
elif not isAffected:
if lastdate:
message = "La dernier affectation de ce moniteur pour l'agence " + str(agence) + " était le " + \
lastdate['DATEF'].strftime('%d/%m/%Y') + " à " + str(lastdate['DMATIN']) + "h jusqu'à " + str(
lastdate['FMATIN']) + "h le matin et " + str(lastdate['DSOIR']) + "h jusqu'à " + str(
lastdate['FSOIR']) + "h l'apres midi.!!"
else:
message = "Ce moniteur n'a aucune affectation dans cet agence pour la date de {0} à {1}h!!".format(
dateRDV, heureRDV)
else:
if cd_cli < 100000:
ref = str(cd_cli)
else:
if isB78:
ref = "HCB78"
else:
ref = "HCB"
# controles sur l'élève
message = ctlEleve_PLB(request, cd_cli)
if len(message) == 0:
nDelai = controleSoldeResa(request, cd_cli, ref)
# plafond dépassé ?
if nDelai == -1:
request.session.flash(
u"L'encours de l'élève a dépassé son plafond autorisé. Impossible de lui ajouter une heure.",
'danger')
return HTTPFound(location=fromUrl)
else:
update_rdvb(request, 0, 0, cd_cli, dateRDV, heureRDV, QTE, ref, cd_mon, agence, '', 0, 0, nDelai, 0,
logged_in)
if nDelai == 0:
request.session.flash(
u"Le rendez-vous a été CREE avec succès.", 'success')
else:
request.session.flash(
u"Le rendez-vous a été RESERVE avec succès.", 'warning')
return HTTPFound(location=fromUrl)
# -- CREER un rendez-vous
if 'form.validated' in request.params:
if member.secu < 4:
request.session.flash(
u"Vous navez pas les droits suffisants pour faire ce traitement.", 'error')
return HTTPFound(location=url)
else:
try:
current_date = datetime.strptime(
request.params['date'], '%d/%m/%Y').date()
fromUrl = url + "?agence=" + \
str(agence) + '&next=' + current_date.strftime('%Y-%m-%d')
if (current_date - date.today()) > timedelta(0):
request.session.flash(
u"Hmm, il est encore trop tôt pour valider ce planning, non ?.", 'error')
return HTTPFound(location=fromUrl)
else:
code = member.secu
if code < 9:
if str(agence) != str(member.agence) and int(member.mobile) == 0:
request.session.flash(
u"Vous navez pas les droits suffisants pour faire ce traitement.", 'error')
return HTTPFound(location=fromUrl)
else:
rows_start_after_now = get_rendez_vous_b_debut_apres_now(
request, agence, current_date)
if len(rows_start_after_now) > 0:
request.session.flash(
u"Vous ne pouvez pas encore valider ce planning. Il y a encore des leçons qui ne débutent pas.",
'error')
return HTTPFound(location=fromUrl)
ligne_cpts = get_eleve_cpt(
request, current_date, agence)
for ligne_cpt in ligne_cpts:
nStatut = ligne_cpt.STATUT
nQte = ligne_cpt.QTE
if ligne_cpt.STATUT == 0:
nStatut = 1
if ligne_cpt.CD_CLI == 99995:
nQte = 0
# valiriser l'heure
valoriser_heure(request, ligne_cpt.CD_CLI)
# Marque lheure comme validée et RAZ la date de résa
validate_heure_rdvb(request, ligne_cpt.no_ligne, current_date,
nQte, nStatut, ligne_cpt.CD_CLI, ligne_cpt.CD_MON, agence)
request.session.flash(
u"Le planning a été validé avec succès.", 'success')
return HTTPFound(location=fromUrl)
except:
request.session.flash(u"Date non validé", 'error')
return HTTPFound(location=url + '?agence=' + str(agence))
TODAY = date.today()
# début = aujourd'hui - 3 semaines
d = TODAY + relativedelta(weeks=-1)
datedeb = d.strftime('%Y-%m-%d')
# fin = aujourd'hui + 6 mois
d = TODAY + relativedelta(months=+1)
datefin = d.strftime('%Y-%m-%d')
# generer le planning
# lire tous les moniteurs de l'agence
moniteurs = get_moniteurs_by_aff(request, agence, datedeb, datefin, current_planning)
# sort moniteur , mettre B78 à la fin
# moniteurs.sort(key=lambda m: str(m.PLANNING) == "B", reverse=True)
moniteursB = [
moniteur for moniteur in moniteurs if moniteur.PLANNING == "B"]
moniteursB78 = [
moniteur for moniteur in moniteurs if moniteur.PLANNING == "B78"]
moniteurs2R = [
moniteur for moniteur in moniteurs if moniteur.PLANNING == "2R"]
moniteursGL = [
moniteur for moniteur in moniteurs if moniteur.PLANNING == "GL"]
moniteurs = moniteursB + moniteursB78 + moniteurs2R + moniteursGL
calendar_ressources = generer_ressources(moniteurs)
calendar_events = generer_planning(
agence, moniteurs, datedeb, datefin, current_date)
return {
'page_title': "Planning de B - Agence %s" % (agence),
'url': url,
'current_url': request.current_route_path(),
'calendar_events': calendar_events,
'calendar_ressources': calendar_ressources,
'QTE': 1,
'agence': int(agence),
'message': message,
'type_plannings': type_plannings,
'current_planning': current_planning,
'current_date': current_date,
'code': member.secu,
'myagence': member.agence
}
@view_config(route_name='rdvb_edit', renderer='../templates/planning/rdvb_edit.pt')
def rdvb_edit(request):
logged_in = request.authenticated_userid
cd_mon, cd_mon_B78 = get_user_cd_mon(request, logged_in)
no_ligne = request.matchdict['no_ligne']
rdvb = get_rendezvous_by_noligne(request, no_ligne)
if ('from' and 'agence') in request.GET:
url = request.route_url('rdvb_edit', no_ligne=no_ligne) + "?from=%s&agence=%s" % (
request.GET['from'], request.GET['agence'])
location = request.route_url(request.GET['from']) + "?agence=%s" % (
request.GET['agence'] + '&next=' + rdvb.DATE.strftime('%Y-%m-%d'))
else:
url = request.route_url('rdvb_edit', no_ligne=no_ligne)
location = request.route_url("monplanning", cd_mon=rdvb.CD_MON, date=rdvb.DATE.strftime('%Y-%m-%d'))
message = ''
# rdv déjà validé ?
if rdvb.DATE_VALEUR:
rdv_valide = True
else:
rdv_valide = False
heuresSpe = [
'0 - HEURE CONDUITE B',
'1 - EXAMEN BLANC',
'2 - RDV PREALABLE',
'3 - RDV PEDAGOGIQUE 1',
'4 - 1ERES HEURES',
'5 - RDV PEDAGOGIQUE 2',
'6 - AVANT PERMIS',
]
statuts = get_statuts_lecon(request)
# déterminer l'url du bouton 'Fiche Elève' / 'Planning xxx'
btn_name = 'Planning %s' % rdvb.NOM
if rdvb.CD_CLI == 37:
# circuit
# btn_url = '/circuit_list/%s/%s' % (rdvb.DATE,'C')
btn_url = "/motos_schd/I"
elif rdvb.CD_CLI == 18:
# rdv Stage code
btn_url = '/motos_schd/D'
elif rdvb.CD_CLI == 20:
# rdv Planning 2R
btn_url = '/motos_schd/A'
elif rdvb.CD_CLI in [21, 56, 59, 69]:
# rdv Planning Stage 2R
btn_url = '/stages_schd/M'
elif rdvb.CD_CLI == 54:
# rdv Examen blanc
btn_url = 'motos_schd/E'
elif rdvb.CD_CLI == 52 or rdvb.CD_CLI == 55:
# rdv pedagoque 1 et 2
btn_url = '/motos_schd/R'
elif rdvb.CD_CLI == 10:
# circuit stage
btn_url = '/stageb_list/%s/A/%s/%s' % (rdvb.DATE, 'C', cd_mon)
elif rdvb.CD_CLI == 11:
# stage B
btn_url = '/stageb_list/%s/A/%s/%s' % (rdvb.DATE, 'S', cd_mon)
elif rdvb.CD_CLI == 16:
# passage permis 2R
btn_url = '/examens_schd/today/2R'
elif rdvb.CD_CLI > 100000:
btn_url = '/fiche_eleve/%s' % (rdvb.CD_CLI)
btn_name = 'Fiche élève'
else:
btn_url = ''
btn_name = ''
if 'form.submitted' in request.params or 'form.validated' in request.params:
name_cdcli = request.params['NOM'].split(' | ')
if len(name_cdcli) < 2:
message = "Elevé non validé !"
NEW_CDCLI = name_cdcli[1]
qte = int(request.params['QTE'])
if qte < 1 or qte > 12:
message = "Le nombre d'heures est incorrect"
else:
# controles sur l'élève
message = ctlEleve_PLB(request, NEW_CDCLI)
if len(message) == 0:
nDelai = 0
update_rdvb(request, no_ligne, rdvb.CD_CLI, NEW_CDCLI, rdvb.DATE.strftime('%Y-%m-%d'), rdvb.NoPlan, qte,
rdvb.REF, rdvb.CD_MON, rdvb.AGENCE, request.params['COMMENT'],
int(request.params['STATUT']),
int(request.params['typeHeure'][0]), nDelai, rdvb.cd_cli_old, logged_in)
if 'form.validated' in request.params:
validate_rdvb(request, no_ligne)
request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success')
return HTTPFound(location=location)
if 'form.deleted' in request.params:
p = request.GET
# user autorisé ?
userAcces = get_user_access(request, logged_in)
if userAcces < 6:
message = "Vous n'êtes pas autorisé à effectuer cette opération !"
else:
# journée déjà comptabilisée ?
if rdvb.DATE_VALEUR:
message = "Journée déjà validée"
else:
delaiOK = 'OK'
if userAcces < 9 and rdvb.CD_CLI > 1000000:
# controler le délai annulation ?
delaiOK = isDelaiOK(request, rdvb.DATE, rdvb.cree_le, rdvb.STATUT)
if delaiOK != 'OK':
message = "Délai de suppression est dépassé. Suppression impossible!"
else:
# delettrer la ligne de compte
update_eleve_delettrer(request, no_ligne)
# mise à jour de la ligne comme annulée
delete_eleve_cpt(request, no_ligne, rdvb.CD_CLI, rdvb.NoPlan, rdvb.STATUT, rdvb.CD_UTI)
request.session.flash(u"Le rendez-vous a été supprimer avec succès.", 'success')
return HTTPFound(location=location)
return {
'page_title': 'Rendez-vous du %s à %s h' % (rdvb.DATE.strftime('%d-%m-%Y'), rdvb.NoPlan),
'url': url,
'rdvb': rdvb,
'rdv_valide': rdv_valide,
'btn_url': btn_url,
'btn_name': btn_name,
'heuresSpe': heuresSpe,
'statuts': statuts,
'message': message,
'back': location
}
@view_config(route_name='rdvb78_edit', renderer='../templates/planning/rdvb78_edit.pt')
def rdvb78_edit(request):
logged_in = request.authenticated_userid
cd_mon, cd_mon_B78 = get_user_cd_mon(request, logged_in)
no_ligne = request.matchdict['no_ligne']
rdvb78 = get_rendezvous_by_noligne(request, no_ligne)
if ('from' and 'agence') in request.GET:
url = request.route_url('rdvb78_edit', no_ligne=no_ligne) + "?from=%s&agence=%s" % (
request.GET['from'], request.GET['agence'])
location = request.route_url(request.GET['from']) + "?agence=%s" % (
request.GET['agence'] + '&next=' + rdvb78.DATE.strftime('%Y-%m-%d'))
else:
url = request.route_url('rdvb78_edit', no_ligne=no_ligne)
location = request.route_url("monplanning", cd_mon=cd_mon, date=rdvb78.DATE.strftime('%Y-%m-%d'))
message = ''
# rdv déjà validé ?
if rdvb78.DATE_VALEUR:
rdv_valide = True
else:
rdv_valide = False
heuresSpe = [
'0 - HEURE CONDUITE B78',
'1 - EXAMEN BLANC',
'2 - RDV PREALABLE',
'3 - RDV PEDAGOGIQUE 1',
'4 - 1ERES HEURES',
'5 - RDV PEDAGOGIQUE 2',
'6 - AVANT PERMIS',
]
statuts = get_statuts_lecon(request)
# déterminer l'url du bouton 'Fiche Elève' / 'Planning xxx'
btn_name = 'Planning %s' % rdvb78.NOM
if rdvb78.CD_CLI == 37:
# circuit
btn_url = '/circuit_list/%s/%s' % (rdvb78.DATE, rdvb78.GROUPE)
elif rdvb78.CD_CLI == 18:
# rdv Stage code
btn_url = '/motos_schd/D'
elif rdvb78.CD_CLI == 20:
# rdv Planning 2R
btn_url = '/motos_schd/A'
elif rdvb78.CD_CLI in [21, 56, 59, 69]:
# rdv Planning Stage 2R
btn_url = '/stages_schd/M'
elif rdvb78.CD_CLI == 54:
# rdv Examen blanc
btn_url = 'motos_schd/E'
elif rdvb78.CD_CLI == 52 or rdvb78.CD_CLI == 55:
# rdv pedagoque 1 et 2
btn_url = '/motos_schd/R'
elif rdvb78.CD_CLI == 10:
# circuit stage
btn_url = '/stageb_list/%s/A/%s/%s' % (rdvb78.DATE, 'C', cd_mon)
elif rdvb78.CD_CLI == 11:
# stage B
btn_url = '/stageb_list/%s/A/%s/%s' % (rdvb78.DATE, 'S', cd_mon)
elif rdvb78.CD_CLI == 16:
# passage permis 2R
btn_url = '/examens_schd/today/2R'
elif rdvb78.CD_CLI > 100000:
btn_url = '/fiche_eleve/%s' % (rdvb78.CD_CLI)
btn_name = 'Fiche élève'
else:
btn_url = ''
btn_name = ''
if 'form.submitted' in request.params or 'form.validated' in request.params:
name_cdcli = request.params['NOM'].split(' | ')
if len(name_cdcli) < 2:
message = "Elevé non validé !"
NEW_CDCLI = name_cdcli[1]
qte = int(request.params['QTE'])
if qte < 1 or qte > 12:
message = "Le nombre d'heures est incorrect"
else:
# controles sur l'élève
message = ctlEleve_PLB(request, NEW_CDCLI)
if len(message) == 0:
nDelai = 0
typeheure = int(request.params['typeHeure'][0])
update_rdvb(request, no_ligne, rdvb78.CD_CLI, NEW_CDCLI, rdvb78.DATE.strftime('%Y-%m-%d'),
rdvb78.NoPlan, qte,
rdvb78.REF, rdvb78.CD_MON, rdvb78.AGENCE, request.params['COMMENT'],
int(request.params['STATUT']),
typeheure, nDelai, rdvb78.cd_cli_old, logged_in)
if 'form.validated' in request.params:
validate_rdvb(request, no_ligne)
request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success')
return HTTPFound(location=location)
if 'form.deleted' in request.params:
p = request.GET
# user autorisé ?
userAcces = get_user_access(request, logged_in)
if userAcces < 6:
message = "Vous n'êtes pas autorisé à effectuer cette opération !"
else:
# journée déjà comptabilisée ?
if rdvb78.DATE_VALEUR:
message = "Journée déjà validée"
else:
delaiOK = 'OK'
if userAcces < 9 and rdvb78.CD_CLI > 1000000:
# controler le délai annulation ?
delaiOK = isDelaiOK(request, rdvb78.DATE, rdvb78.cree_le, rdvb78.STATUT)
if delaiOK != 'OK':
message = "Délai de suppression est dépassé. Suppression impossible!"
else:
# delettrer la ligne de compte
update_eleve_delettrer(request, no_ligne)
# mise à jour de la ligne comme annulée
delete_eleve_cpt(request, no_ligne, rdvb78.CD_CLI, rdvb78.NoPlan, rdvb78.STATUT, rdvb78.CD_UTI)
request.session.flash(u"Le rendez-vous a été supprimer avec succès.", 'success')
return HTTPFound(location=location)
return {
'page_title': 'Rendez-vous du %s à %s h' % (rdvb78.DATE.strftime('%d-%m-%Y'), rdvb78.NoPlan),
'url': url,
'rdvb78': rdvb78,
'rdv_valide': rdv_valide,
'btn_url': btn_url,
'btn_name': btn_name,
'heuresSpe': heuresSpe,
'statuts': statuts,
'message': message,
'back': location
}
@view_config(route_name='motos_edit', renderer='../templates/planning/motos_edit.pt')
def motos_edit(request):
type_stage = request.matchdict['type']
groupe = request.matchdict['groupe']
date_stage = request.matchdict['date']
cd_cli = request.matchdict['cd_cli']
url = request.route_url('motos_edit', type=type_stage,groupe=groupe,date=date_stage,cd_cli=cd_cli)
logged_in = request.authenticated_userid
member = get_users_by_code(request, logged_in)
code = int(member.secu)
# initialise la variable de session
if 'url_retour' not in request.session:
request.session['url_retour'] = url
# save url appelant dans une variable de session
if request.referrer and request.referrer != url:
request.session['url_retour'] = request.referrer
message = ''
formated_date = datetime.strptime(date_stage,'%Y-%m-%d') if date_stage != None else None
if int(cd_cli) == 0 :
rdvb = {
'QTE' : 1,
'REF' : "HCA3",
'LIEU' : '',
'STATUT' : None,
'VALIDE' : 'N',
'CD_CLI' : 0,
'CD_UTI' : member.cd_uti,
'COMMENT' : None,
'ligne_cpt' : 0,
'cree_le' : datetime.now(),
'modif_le' : datetime.now(),
'DATE' : formated_date
}
else :
rdvb = get_pla_moto_ligne_by_date(request,type_stage,groupe,formated_date,int(cd_cli))
delete = True
if code <= 6 or rdvb['VALIDE'] == "O" or int(cd_cli) == 0:
delete = False
eleve = get_eleves_by_code(request,rdvb['CD_CLI'])
lieux = get_lieux_by_type(request,type_stage+groupe)
statuts = get_statuts_lecon(request)
reference = get_ref_by_motos_type(request,type_stage)
stage_edit = get_pla_moto_by_date(request,type_stage,groupe,formated_date)
fin_reservation = stage_edit['DATE'].strftime('%d-%m-%Y') if stage_edit and stage_edit['DATE'] != None and stage_edit['DATE'] != "" else None
cree_le = rdvb['cree_le'].strftime('%d-%m-%Y') if rdvb != None and rdvb['cree_le'] != None and rdvb['cree_le'] != "" else None
modif_le = rdvb['modif_le'].strftime('%d-%m-%Y') if rdvb != None and rdvb['modif_le'] != None and rdvb['modif_le']!= "" else None
if 'form.deleted' in request.params and int(cd_cli) != 0 :
if code < 9 and int(cd_cli) > 100000 :
isdelayok = isDelaiOK(request,stage_edit['DATE'],rdvb['cree_le'],8)
if not isdelayok:
request.session.flash(u"Interdiction de suppression de l'éleve %s dans le planning %s groupe %s." %(eleve['NOM']+" "+eleve['PRENOM'],type_stage,groupe), 'danger')
return HTTPFound(request.session['url'])
delete_moto_lig_by_cd_cli(request,rdvb.no_ligne,rdvb.ligne_cpt,cd_cli,member.cd_uti)
update_panning_moto_dispo(request,type_stage,formated_date,groupe)
request.session.flash(u"L'eleve %s est bien suprimé dans le planning %s groupe %s." %(eleve['NOM']+" "+eleve['PRENOM'],type_stage,groupe), 'success')
return HTTPFound(request.session['url_retour'])
if 'form.submitted' in request.params:
new_values = dict(rdvb)
params = dict(request.params)
del params['form.submitted']
data = params['NOM'].split(' | ')
if len(data) == 2 :
cd_cli2 = int(data[1])
if int(cd_cli) == 0 and stage_edit and stage_edit.DISPO <= 0 :
request.session.flash(u"Les eleves inscrits sont completes !", 'danger')
return HTTPFound(request.session['url_retour'])
if cd_cli2 != 0:
eleve_edit = get_eleves_by_code(request,cd_cli2)
if eleve_edit:
if int (eleve_edit['AGENCE']) != 0 :
if int(code) < 9 and eleve_edit['CLOTURE_LE'] != None :
request.session.flash(u"Le DOSSIER de cet élève est CLOTURE ou RETIRE ou en LITIGE !", 'danger')
return HTTPFound(url)
elif eleve_edit['ELEVEGARDE02'] != 0 :
request.session.flash(u"Le DOSSIER est gardé par l'élève !", 'danger')
return HTTPFound(url)
elif eleve_edit['FORMULE'] == None :
request.session.flash(u" Attention! La FORMULE de l'élève n'est pas renseignée !", 'danger')
return HTTPFound(url)
elif (type_stage == "I" or type_stage == "R" or type_stage == "E") and eleve_edit.PERMIS_DEMANDE != "B" :
request.session.flash(u"La catégorie de permis demandée n'est pas compatible avec ce planning !", 'danger')
return HTTPFound(url)
elif (type_stage == "A" or type_stage == "F") and not eleve_edit.PERMIS_DEMANDE.startswith('A'):
request.session.flash(u"La catégorie de permis demandée n'est pas compatible avec ce planning !", 'danger')
return HTTPFound(url)
elif eleve_edit['COMPLET_LE'] == None or eleve_edit['DOSSIER_DATE'] == None:
request.session.flash(u"Attention! Le dossier de l'élève est INCOMPLET ou NON ENREGISTRE!", 'warning')
if eleve_edit['visite_med_fin_le'] != None :
days = (eleve_edit['visite_med_fin_le'] - date.today()).days
if days < 0 :
request.session.flash(u"Attention! La date de visite médicale de l'élève est exprirée.", 'danger')
return HTTPFound(url)
elif days < 90 :
request.session.flash(u"Attention! La date de visite médicale de l'élève est exprirée.", 'warning')
formule = get_formule(request,eleve_edit['FORMULE'])
if formule:
if type_stage == "A":
params['REF'] = formule.HCONDUIT
params['QTE'] = formule.HSeance
else:
params['QTE'] = 1
if type_stage == "F":
params['REF'] = "TA"
if type_stage == "E":
params['REF'] = 'TB'
elif type_stage == "D":
params['REF'] = 'PREPACODE'
elif type_stage == "I":
params['REF'] = 'CIRCUIT'
elif type_stage == "R":
params['REF'] = 'RDVP'
# controle de solde
resultatSolde = controleSoldeResa(request,cd_cli2,params['REF'])
if int(cd_cli) != 0 :
new_values['SOLDE'] = resultatSolde
else :
params['SOLDE'] = resultatSolde
if resultatSolde == -1:
request.session.flash(u"Le solde REEL de l'élève a dépassé l'encours autorisé et son total de réservation a dépassé le plafond autorisé",'danger')
return HTTPFound(url)
else :
pass
else:
request.session.flash(u"Formule invalidé",'danger')
return HTTPFound(url)
#insert
params['CD_CLI'] = eleve_edit.CD_CLI
params['NOM'] = eleve_edit.NOMPREN
if int(cd_cli) == 0:
params['TYPE'] = type_stage
params['GROUPE'] = groupe
params['DATE'] = formated_date
params['Route'] = eleve_edit.TR_P_OK if eleve_edit.TR_P_OK != None else 0
params['CD_UTI'] = member.cd_uti
params['AGENCE'] = member.agence
params['STATUT'] = 0
params['VALIDE'] = 'N'
params['fin_reservation'] = datetime.strptime(fin_reservation,"%d-%m-%Y").date() if fin_reservation != None and fin_reservation != "" else None
# inserer l'eleve
exist = get_pla_moto_ligne_by_date(request,type_stage,groupe,formated_date,eleve_edit.CD_CLI)
if not exist :
# solde = params['SOLDE']
# del params['SOLDE']
# insert_motos_lig(request,params)
params['CD_UTI'] = member.cd_uti
params['OLD_CD_CLI'] = 0
params['AGENCE'] = member.agence
params['LIGNE_CPT'] = 0
# params['SOLDE'] = solde
update_motos_lig_avec_control(request,params)
update_panning_moto_dispo(request,type_stage,formated_date,groupe)
request.session.flash(u"L'eleve est inscrit dans le planning.", 'success')
return HTTPFound(request.session['url_retour'])
else:
request.session.flash(u"L'eleve est déjà inscrit dans le planning.", 'danger')
return HTTPFound(url)
else:
params['STATUT'] = int(params['STATUT'])
for param, value in params.items():
if param in new_values.keys():
new_values[param] = value
new_values['CD_UTI'] = member.cd_uti
new_values['OLD_CD_CLI'] = rdvb.CD_CLI
new_values['LIGNE_CPT'] = rdvb.ligne_cpt
new_values['AGENCE'] = member.agence
update_motos_lig_avec_control(request,new_values)
request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success')
return HTTPFound(request.session['url_retour'])
else:
request.session.flash(u"L'élève non validé pour le planning %s, groupe %s" %(str(rdvb.TYPE),str(rdvb.GROUPE)),'danger')
return HTTPFound(url)
else:
request.session.flash(u"L'élève non validé pour planning %s, groupe %s" %(str(type_stage),str(groupe)),'danger')
return HTTPFound(url)
else:
request.session.flash(u"Eleve non validé.", 'danger')
return HTTPFound(url)
return {
'page_title': 'Rendez-vous du %s' % (rdvb['DATE'].strftime('%d/%m/%Y')),
'url': url,
'url_retour': request.session['url_retour'],
'rdvb': rdvb,
'statuts': statuts,
'message': message,
'eleve' : eleve,
'lieux' : lieux,
'code' : code,
'delete' : delete,
'cree_le' : cree_le,
'modif_le' : modif_le,
'fin_reservation': fin_reservation,
'cd_uti' : rdvb['CD_UTI'],
}
@view_config(route_name='stages_edit', renderer='../templates/planning/stages_edit.pt')
def stages_edit(request):
no_ligne = request.matchdict['no_ligne']
url = request.route_url('stages_edit', no_ligne=no_ligne)
logged_in = request.authenticated_userid
member = get_users_by_code(request, logged_in)
# initialise la variable de session
if 'url_retour' not in request.session:
request.session['url_retour'] = url
# save url appelant dans une variable de session
if request.referrer and request.referrer != url:
request.session['url_retour'] = request.referrer
message = ''
code = int(member.secu)
delete = True
rdvb = get_stages_lig_by_noligne(request, no_ligne)
statuts = get_statuts_lecon(request)
type_stage = no_ligne[0:1]
semaine = no_ligne[1:7]
groupe = no_ligne[7:8]
cd_cli = no_ligne[8:14]
stage_edit = get_pla_stage_by_semaine(request,type_stage,semaine,groupe)
cree_le = rdvb['cree_le'].strftime('%d-%m-%Y') if rdvb != None and rdvb['cree_le'].strftime('%d-%m-%Y') != None and rdvb['cree_le'].strftime('%d-%m-%Y') != "" else None
modif_le = rdvb['modif_le'].strftime('%d-%m-%Y') if rdvb != None and rdvb['modif_le'].strftime('%d-%m-%Y') != None and rdvb['modif_le'].strftime('%d-%m-%Y') != "" else None
fin_reservation = stage_edit['fin'].strftime('%d-%m-%Y') if stage_edit['fin'].strftime('%d-%m-%Y') != None and stage_edit['fin'].strftime('%d-%m-%Y') != "" else None
eleve = get_eleves_by_code(request,cd_cli)
reference = get_ref_by_stage_type(request,type_stage)
if type_stage == 'B' and (groupe == "C" or groupe == "D"):
reference[0] = {'REF':'HCB78'}
if rdvb is None :
semaine = no_ligne[1:7]
rdvb = {
'QTE' : 1,
'REF' : "HCB",
'ligne_cpt' : 0,
'LIEU' : '',
'STATUT' : None,
'VALIDE' : 'N',
'CD_CLI' : 0
}
else:
semaine = rdvb.SEMAINE
if code <= 6 or rdvb['VALIDE'] == "O":
delete = False
if code < 9 and int(cd_cli) > 100000 :
isdelayok = isDelaiOK(request, stage_edit['fin'], rdvb['cree_le'].date(), 8)
if not isdelayok:
delete = False
if 'form.deleted' in request.params and rdvb != None :
if code < 9 and int(cd_cli) > 100000 :
isdelayok = isDelaiOK(request, stage_edit['fin'], rdvb['cree_le'].date(), 8)
if not isdelayok:
request.session.flash(u"Interdiction de suppression de l'éleve %s dans le stage %s groupe %s." %(eleve['NOM']+" "+eleve['PRENOM'],type_stage,groupe), 'danger')
return HTTPFound(request.session['url'])
delete_stage_lig_by_cd_cli(request,type_stage,semaine,groupe,cd_cli)
request.session.flash(u"L'eleve %s est bien suprimé dans le stage %s groupe %s." %(eleve['NOM']+" "+eleve['PRENOM'],type_stage,groupe), 'success')
return HTTPFound(request.session['url_retour'])
if 'form.submitted' in request.params:
params = dict(request.params)
del params['form.submitted']
data = params['NOM'].split(' | ')
eleve_edit = None
if len(data) == 2 :
cd_cli2 = data[1]
if stage_edit.DISPO <= 0 and int(cd_cli) == 0:
request.session.flash(u"Les eleves inscrits sont completes !", 'danger')
return HTTPFound(request.session['url_retour'])
if int(cd_cli2) != 0 :
eleve_edit = get_eleves_by_code(request,cd_cli2)
eleve_stage = stage_lig_by_eleve(request,cd_cli2,type_stage,semaine,groupe)
params['NOM'] = eleve_edit.NOMPREN
params['CD_CLI'] = cd_cli2
if int(cd_cli) != int(cd_cli2):
formule = get_formule(request,eleve_edit['FORMULE'])
if formule :
params['QTE'] = formule.HSeance
params['REF'] = formule.INS1
if int (eleve_edit['AGENCE']) != 0 :
eleve_formule = get_formule(request,eleve_edit['FORMULE'])
if not eleve_formule :
request.session.falsh(u'Attention! La FORMULE de l\'élève n\'est pas renseignée')
return HTTPFound(url)
if int(code) < 9 and eleve_edit['CLOTURE_LE'] != None :
request.session.flash(u"Le DOSSIER de cet élève est CLOTURE ou RETIRE ou en LITIGE !", 'danger')
return HTTPFound(url)
elif eleve_edit['ELEVEGARDE02'] != 0 :
request.session.flash(u"Le DOSSIER est gardé par l'élève !", 'danger')
return HTTPFound(url)
elif eleve_edit['FORMULE'] == None :
request.session.flash(u" Attention! La FORMULE de l'élève n'est pas renseignée !", 'danger')
return HTTPFound(url)
elif type_stage == "B" and groupe != "C" and groupe != "D" and eleve_edit['PERMIS_DEMANDE'] != "B" :
request.session.flash(u"La catégorie de permis demandée n'est pas compatible avec ce planning !", 'danger')
return HTTPFound(url)
elif type_stage == "B" and (groupe == "C" or groupe == "D") and eleve_edit['PERMIS_DEMANDE'] != "B78" :
request.session.flash(u"Le groupe demandée est réservé pour boite automatique", 'danger')
return HTTPFound(url)
elif type_stage == "B78" and params['REF'] == "HCB" :
request.session.flash(u"Le groupe demandée est réservé pour boite automatique", 'danger')
return HTTPFound(url)
elif type_stage == "B" and int(code) <= 2 :
request.session.flash(u"Les moniteurs sont autorisés à modifier seulement le planning Moto !", 'danger')
return HTTPFound(url)
elif type_stage == "C" and eleve_edit['PERMIS_DEMANDE'] != "POINT":
request.session.flash(u"La catégorie de permis demandée n'est pas compatible avec ce planning !", 'danger')
return HTTPFound(url)
elif type_stage == "M" and not eleve_edit['PERMIS_DEMANDE'].startswith('A'):
request.session.flash(u"La catégorie de permis demandée n'est pas compatible avec ce planning !", 'danger')
return HTTPFound(url)
elif eleve_edit['COMPLET_LE'] == None or eleve_edit['DOSSIER_DATE'] == None:
request.session.flash(u"Attention! Le dossier de l'élève est INCOMPLET ou NON ENREGISTRE!", 'warning')
if eleve_edit['visite_med_fin_le'] != None :
days = (eleve_edit['visite_med_fin_le'] - date.today()).days
if days < 0 :
request.session.flash(u"Attention! La date de visite médicale de l'élève est exprirée.", 'danger')
return HTTPFound(url)
elif days < 90 :
request.session.flash(u"Attention! La date de visite médicale de l'élève est exprirée.", 'warning')
if eleve_formule and int(eleve_formule['STAGE']) == 0 :
request.session.flash(u"La FORMULE de cet élève n'est pas de type stage !", 'danger')
return HTTPFound(url)
elif int(cd_cli) != int(cd_cli2) and len(eleve_stage) > 0 :
request.session.flash(u"L'élève est déjà inscrit au stage de la semaine %s, groupe %s" %(str(semaine),str(groupe)),'danger')
return HTTPFound(url)
else:
request.session.flash(u"L'élève non validé pour le stage de la semaine %s, groupe %s" %(str(semaine),str(groupe)),'danger')
return HTTPFound(url)
else:
request.session.flash(u"Eleve fomat incorrect %s, groupe %s" %(str(semaine),str(groupe)),'danger')
return HTTPFound(url)
params['CD_UTI'] = member.cd_uti
params['AGENCE'] = stage_edit['AGENCE']
if int(cd_cli) == 0 :
update_stages_lig(request, no_ligne, params,1)
else:
if'REF' not in params :
params['REF'] = rdvb['REF']
params['LIGNE_CPT'] = rdvb['ligne_cpt']
update_stages_lig(request, no_ligne, params)
request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success')
return HTTPFound(request.session['url_retour'])
return {
'page_title': 'Stage de la semaine %s' % (semaine),
'url': url,
'url_retour': request.session['url_retour'],
'rdvb': rdvb,
'statuts': statuts,
'message': message,
'eleve' : eleve,
'delete' : delete,
'cree_le' : cree_le,
'modif_le' : modif_le,
'fin_reservation': fin_reservation,
'reference': reference,
'ligne_cpt' : rdvb['ligne_cpt'] if rdvb != None else None,
'cd_uti' : stage_edit['CD_UTI'],
'cd_cli' : rdvb['CD_CLI']
}
@view_config(route_name='stageb_list', renderer='../templates/planning/stageb_list.pt', permission='view')
def stageb_list(request):
def generer_datatable(date_stage, groupe_stage, type_stage, cd_mon_stage):
# lire les stages B
items = get_stage_lig_by_date(request, 'B', date_stage, groupe_stage)
dates_stage = ''
date_deb = date.today()
date_fin = date.today()
# construire la liste
liste=[]
dates_stage = ''
for item in items:
# mémoriser les dates du stage
dates_stage = '%s au %s' % (item.debut.strftime('%d'), item.fin.strftime('%d-%m-%Y'))
date_deb = item.debut.date()
date_fin = item.fin
if type_stage == 'A' or (type_stage == 'S' and item.CD_MON == cd_mon_stage) or (type_stage == 'C' and item.cd_circuit == cd_mon_stage):
# n'affiche que les élèves du moniteur
solde = to_euroN(item.solde)
if item.nom_entreprise :
solde += ' E'
if item.perime_le:
code_ok = to_age(item.perime_le, '<')
else:
code_ok = ''
# examen prévu ?
examen = get_examens_prevu(request, item.CD_CLI)
if examen:
if examen.PERMIS == 'ETG':
code_ok = 'Inscrit'
if item.VALIDE == 'N':
heures = item.heures
else:
heures = 'VAL'
circuit = item.seance
if item.cd_circuit:
circuit += ' - ' + item.cd_circuit
d = (item.CD_CLI, item.GROUPE, item.niveau, to_str(item.CD_MON), to_str(circuit),
to_str(item.CD_CLI) + ' - ' + item.NOM, solde, code_ok,
item.filiere + '-' + item.CD_REF, item.LIEU, heures, str(item.STATUT),
item.TYPE + to_str(item.SEMAINE) + item.GROUPE + to_str(item.CD_CLI), item.VALIDE)
liste.append(d)
return date_deb, date_fin, dates_stage, json.dumps(liste)
date_stage = request.matchdict['date']
date_date_stage = datetime.strptime(date_stage,'%Y-%m-%d')
weeknumber = date_date_stage.isocalendar()[1]
if len(str(weeknumber)) == 1:
weeknumber = "0" + str(weeknumber)
semaine = str(date_date_stage.year) +''+str(weeknumber)
groupe_stage = request.matchdict['groupe']
type_stage = request.matchdict['sorc']
cd_mon_stage = request.matchdict['cd_mon']
url = request.route_url('stageb_list', date=date_stage, groupe=groupe_stage, sorc=type_stage, cd_mon=cd_mon_stage)
groupe = dict({
"A" : "Grp A-5 jrs B",
"B" : "Grp B-3 jrs B",
"C" : "Grp C-5 jrs B78",
"D" : "Grp D-3 jrs B78",
"E" : "Grp E",
"F" : "Grp F",
"G" : "Grp G-B96 en ligne",
"H" : "Grp H-B96",
"I" : "Grp I-B96",
"J" : "Grp JPOST PERMIS VAISE",
"K" : "Grp KPOST PERMIS CHARPENNES",
"L" : "Grp LPOST PERMIS PRESQUILE",
"M" : "Grp MPOST PERMIS VAUGNERAY",
"N" : "Gpr N"
})
# si 'A' en paramètre
if type_stage == 'A':
cb_all = "oui"
# si afficher tous est coché ?
if 'cb_all' in request.params:
cb_all = "oui"
type_stage = 'A'
else:
cb_all = "non"
# si 'A' en paramètre
if type_stage == 'A':
cb_all = "oui"
# initialise la variable de session
if 'url_retour' not in request.session:
request.session['url_retour'] = url
# save url appelant dans une variable de session
if request.referrer and request.referrer != url:
request.session['url_retour'] = request.referrer
message = ''
# generer la datatable
date_deb, date_fin, dates_stage, dt_data = generer_datatable(date_stage, groupe_stage, type_stage, cd_mon_stage)
# lire les moniteurs stageB de la semaine
moniteurs = get_moniteurs_by_activite(request, date_deb, date_fin, 10, 11)
cd_mon = request.authenticated_userid
member = get_users_by_code(request, cd_mon)
if 'form.submitted' in request.params:
# oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')])
liste_param = ''
for param in request.params:
if param[:2] == 'id':
cd_cli = request.params[param]
# maj le statut de la ligne à 1
update_stage_lig_statut(request, 'B', date_stage, cd_cli)
if liste_param:
liste_param += "-%s" % cd_cli
else:
liste_param = cd_cli
# des lignes ont été sélectionnées ?
if len(liste_param) > 0:
# goto fiche de suivi
return HTTPFound(location=request.route_url('show_iframe', param='B' + liste_param))
if 'form.stage' in request.params or 'form.circuit' in request.params:
message = ''
cd_mon = request.params['cd_mon']
# oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')])
for param in request.params:
if param[:2] == 'id':
if 'form.stage' in request.params:
update_stageb_lig_moniteur(request, date_stage, request.params[param], cd_mon)
message = "Le moniteur STAGE est mis à jour avec succès"
else:
update_stageb_lig_circuit(request, date_stage, request.params[param], cd_mon)
message = "Le moniteur CIRCUIT est mis à jour avec succès"
# generer la datatable
date_deb, date_fin, dates_stage, dt_data = generer_datatable(date_stage, groupe_stage, type_stage, cd_mon_stage)
if 'form.seance' in request.params:
message = ''
seance = request.params['seance']
# oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')])
for param in request.params:
if param[:2] == 'id':
update_stageb_lig_seance(request, date_stage, request.params[param], seance)
message = "La SEANCE est mise à jour avec succès"
# generer la datatable
date_deb, date_fin, dates_stage, dt_data = generer_datatable(date_stage, groupe_stage, type_stage, cd_mon_stage)
if 'form.updated' in request.params :
params = dict(request.params)
stage = get_pla_stage_by_semaine(request,'B',semaine,groupe_stage)
del params['form.updated']
params['debut'] = datetime.strptime(request.params['debut']+' '+request.params['starttime'],'%d-%m-%Y %H:%M') if request.params['debut'] != None and request.params['debut'] != '' else None
params['fin'] = datetime.strptime(request.params['fin'],'%d-%m-%Y') if request.params['fin'] != None and request.params['fin'] != '' else None
del params['starttime']
params['CD_UTI'] = cd_mon
params['nom_formateur'] = params['nom_formateur'].split(' | ')[0]
params['nom_psy'] = params['nom_psy'].split(' | ')[0]
# params['DISPO'] = int(params['TOTAL']) - int(params['DISPO'])
update_pla_stage(request,params,'B',semaine,groupe_stage)
request.session.flash(u"Le stage B groupe %s a été mis à jour avec succès" %groupe_stage,'success')
# generer la datatable
date_deb, date_fin, dates_stage, dt_data = generer_datatable(date_stage, groupe_stage, type_stage, cd_mon_stage)
if 'form.validated' in request.params :
params = dict(request.params)
hashed = to_sha1(params['password']) if 'password' in params else None
passed = member.mdp_hash == hashed
if hashed == None or passed :
if StageHasPending(request,"B",semaine,groupe_stage):
request.session.flash(u"Il y a un ou des élèves provisoires dans ce stage. Validation impossible","danger")
return HTTPFound(location=url)
else:
# lire tous les planning
items = get_stage_lig_by_date(request, 'B', date_stage, groupe_stage)
AGENCE = member.agence
stage = get_pla_stage_by_semaine(request,'B',semaine,groupe_stage)
date_valeur = stage['fin']
VALIDE = 'O'
LIBELLE = groupe[groupe_stage]
for item in items :
nStatus = 1
if int (item.STATUT) != 0 :
nStatus = item.STATUT
# update stage ligne and eleve_cpt
update_stage_lig_by_cd_cli(request,'B',semaine,groupe_stage,item.CD_CLI,nStatus,VALIDE,AGENCE,item.ligne_cpt,LIBELLE,date_valeur)
# update stage
update_pla_stage_by_semaine(request,'B',semaine,groupe_stage,AGENCE,VALIDE,member.cd_uti)
request.session.flash(u"Le stage est validé avec succés","success")
return HTTPFound(location=request.route_url('stages_schd', type='B'))
else:
request.session.flash(u"Erreur d'authentification" ,'danger')
return HTTPFound(location=url)
if 'form.deleted' in request.params:
items = get_stage_lig_by_date(request, 'B', date_stage, groupe_stage)
if len(items) > 0 :
request.session.flash(u"Interdiction de suppression, des eleves ont déjà inscrit dans ce stage." ,'danger')
return HTTPFound(location=url)
else:
delete_pla_stage_by_semaine(request,'B',semaine,groupe_stage)
request.session.flash(u"Le stage %s groupe %s du %s est supprimé avec success"%('B',groupe_stage,date_stage),"success")
return HTTPFound(location=request.route_url('stages_schd', type='B'))
if 'form.deleted_selected' in request.params:
ids = str(request.params['deleted_selected_inputs']).split('-')
stage_edit = get_pla_stage_by_semaine(
request, 'B', semaine, groupe_stage)
type_stage = 'B'
for eleve_id in ids:
eleve = get_eleves_by_code(request, eleve_id)
rdvb = get_stage_lig_by_cd_cli(request, type_stage, eleve_id)
if member.secu < 9 and int(eleve_id) > 100000:
isdelayok = isDelaiOK(
request, stage_edit['fin'], rdvb['cree_le'].date(), 8)
if not isdelayok:
request.session.flash(u"Interdiction de suppression de l'éleve %s dans le stage %s groupe %s." % (
eleve['NOM']+" "+eleve['PRENOM'], type_stage, groupe_stage), 'danger')
delete_stage_lig_by_cd_cli(
request, type_stage, semaine, groupe_stage, eleve_id)
request.session.flash(u"L'eleve %s est bien suprimé dans le stage %s groupe_stage %s." % (
eleve['NOM']+" "+eleve['PRENOM'], type_stage, groupe_stage), 'success')
return HTTPFound(url)
stage = get_pla_stage_by_semaine(request,'B',semaine,groupe_stage)
ispassed = (stage['fin'] - date.today()).days > 0
stage_debut = ""
starttime = ""
if stage['debut'] != None :
stage_debut = stage['debut'].strftime('%d-%m-%Y')
starttime = stage['debut'].strftime('%H:%M')
stage_fin = stage['fin'].strftime('%d-%m-%Y') if stage['fin'] != None else ""
return {
'page_title': 'Stage B du %s' % date_date_stage.strftime('%d-%m-%Y'),
'url': url,
'url_retour': request.session['url_retour'],
'message': message,
'dt_data': dt_data,
'moniteurs': moniteurs,
'cd_mon': cd_mon,
'cb_all': cb_all,
'groupe': groupe,
'stage' : stage,
'ispassed' : ispassed,
'code' : member.secu,
'stage_debut' : stage_debut,
'stage_fin' : stage_fin,
'starttime' : starttime,
'codeleve' : stage.TYPE + to_str(stage.SEMAINE) + stage.GROUPE + to_str(0)
}
@view_config(route_name='circuit_list', renderer='../templates/planning/circuit_list.pt', permission='view')
def circuit_list(request):
def generer_datatable(type_stage, date_stage,groupe):
# lire les circuits
items = get_motos_lig_by_date(request, type_stage, date_stage, groupe)
# construire la liste
liste=[]
dates_stage = ''
for item in items:
dates_stage = item.DATE.strftime('%d-%m-%Y')
solde = to_euroN(item.solde)
if item.nom_entreprise :
solde += ' E'
if item.perime_le:
code_ok = to_age(item.perime_le, '<')
else:
code_ok = ''
if item.VALIDE == 'N':
heures = item.heures
else:
heures = 'VAL'
d = (item.CD_CLI, item.GROUPE, item.niveau, to_str(item.cd_circuit), to_str(item.CD_CLI) + ' - ' + item.NOM, solde, code_ok,
item.filiere + '-' + item.cd_mon, item.LIEU, heures, item.STATUT, item.no_ligne)
liste.append(d)
return dates_stage, json.dumps(liste)
type_stage = 'I'
date_stage = request.matchdict['date']
groupe = request.matchdict['groupe']
url = request.route_url('circuit_list', date=date_stage ,groupe=groupe)
logged_in = request.authenticated_userid
member = get_users_by_code(request, logged_in)
code = int(member.secu)
groupe_stage = dict({
"A" : "Grp A-8h à 11h",
"B" : "Grp B-12h à 15h",
"C" : "Grp C-15h à 18h",
"D" : "Grp D-18h à 21h",
"E" : "Grp E-8h à 12h",
"F" : "Grp F-13h à 17h",
"G" : "Grp G-13h à 17h",
})
# initialise la variable de session
if 'url_retour' not in request.session:
request.session['url_retour'] = url
# save url appelant dans une variable de session
if request.referrer and request.referrer != url:
request.session['url_retour'] = request.referrer
message = ''
# generer la datatable
dates_stage, dt_data = generer_datatable('I', date_stage,groupe)
# lire les moniteurs stageB de la semaine
cd_mon = request.authenticated_userid
button_title = 'Suivi groupe'
moniteurs = get_moniteurs_by_activite(request, date_stage, date_stage, 37, 37)
if 'form.submitted' in request.params:
# des lignes ont été sélectionnées ?
if len(request.params) > 1:
# oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')])
liste_param = ''
for param in request.params:
if param[:2] == 'id':
if liste_param:
liste_param += "-%s" % request.params[param]
else:
liste_param = request.params[param]
if liste_param :
# suivi circuit ou suivi rdvp
return HTTPFound(location=request.route_url('show_iframe', param=type_stage + liste_param))
else:
message = 'Veuillez sélectionner au moins un(e) élève'
if 'form.circuit' in request.params:
message = ''
cd_mon = request.params['cd_mon']
# oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')])
for param in request.params:
if param[:2] == 'id':
update_motos_lig_circuit(request, type_stage, date_stage, request.params[param], cd_mon)
message = "Le moniteur CIRCUIT est mis à jour avec succès"
# generer la datatable
dates_stage, dt_data = generer_datatable(type_stage, date_stage)
formated_date = datetime.strptime(date_stage,'%Y-%m-%d') if date_stage != None and date_stage != '' else None
if 'form.updated' in request.params :
params = dict(request.params)
del params['form.updated']
update_pla_motos(request,type_stage,formated_date,groupe,params)
request.session.flash(u"Le stage %s groupe %s a été mis à jour avec succès" %(type_stage,groupe),'success')
if 'form.validated' in request.params :
params = dict(request.params)
diff = (formated_date - datetime.today()).days
if diff > 0 :
request.session.flash(u"Hmm, il est encore trop tôt pour valider ce planning","danger")
return HTTPFound(location=url)
if planningHasPending(request,type_stage,formated_date,groupe):
request.session.flash(u"Il y a un ou des élèves provisoires dans ce planning. Validation impossible","danger")
return HTTPFound(location=url)
else:
# lire tous les planning
items = get_motos_lig_by_date(request, type_stage, formated_date, groupe)
planning = get_pla_moto_by_date(request,type_stage,groupe,formated_date)
fin_reservation = None
VALIDE = 'O'
AGENCE = member.agence
CD_UTI = member.cd_uti
for item in items :
nStatus = 1
if int (item.STATUT) != 0 :
nStatus = item.STATUT
# update planning ligne and eleve_cpt
update_motos_lig_by_cd_cli(request,type_stage,formated_date,groupe,item.CD_CLI,nStatus,VALIDE,AGENCE,item.ligne_cpt,item.REF,item.CD_MON)
# update planning
update_pla_moto_by_date(request,type_stage,formated_date,groupe,AGENCE,VALIDE,member.cd_uti)
request.session.flash(u"Le planning est validé avec succés","success")
return HTTPFound(location=request.route_url('motos_schd', type=type_stage))
if 'form.deleted' in request.params:
items = get_motos_lig_by_date(request, type_stage, formated_date, groupe)
if len(items) > 0 :
request.session.flash(u"Interdiction de suppression, des eleves ont déjà inscrit dans ce planning." ,'danger')
return HTTPFound(location=url)
else:
delete_pla_moto_by_date(request,type_stage,formated_date,groupe)
request.session.flash(u"Le planning %s groupe %s du %s est supprimé avec success"%(type_stage,groupe,date_stage),"success")
return HTTPFound(location=request.route_url('motos_schd', type=type_stage))
stage = get_pla_moto_by_date(request,type_stage,groupe,formated_date)
if not stage :
request.session.flash(u"Planning non trouvé","danger")
return HTTPFound(location=request.route_url('motos_schd', type=type_stage))
return {
'page_title': 'Circuit forfait du %s' % dates_stage,
'url': url,
'url_retour': request.session['url_retour'],
'message': message,
'dt_data': dt_data,
'moniteurs': moniteurs,
'cd_mon': cd_mon,
'button_title': button_title,
'type': type_stage,
'stage' : stage,
'groupe' : groupe_stage,
'grp' : groupe,
'date':date_stage,
'code':code,
'codeleve' : to_str(0)
}
@view_config(route_name='motos_list', renderer='../templates/planning/motos_list.pt', permission='view')
def motos_list(request):
def generer_datatable(type_stage, date_stage, groupe):
# lire les circuits
items = get_motos_lig_by_date(request, type_stage, date_stage, groupe)
# construire la liste
liste=[]
dates_stage = ''
for item in items:
dates_stage = item.DATE.strftime('%d-%m-%Y')
solde = to_euroN(item.solde)
if item.nom_entreprise :
solde += ' E'
if item.perime_le:
code_ok = to_age(item.perime_le, '<')
else:
code_ok = ''
if item.VALIDE == 'N':
heures = item.heures
else:
heures = 'VAL'
d = (item.CD_CLI, item.GROUPE, item.niveau, to_str(item.CD_MON), to_str(item.CD_CLI) + ' - ' + item.NOM, solde,code_ok,'%s - %s' % (item.filiere, item.cd_mon), item.LIEU, heures, item.STATUT, item.no_ligne, item.VALIDE)
liste.append(d)
return dates_stage, json.dumps(liste)
type_stage = request.matchdict['type']
date_stage = request.matchdict['date']
groupe = request.matchdict['groupe']
url = request.route_url('motos_list', type=type_stage, date=date_stage, groupe=groupe)
logged_in = request.authenticated_userid
member = get_users_by_code(request, logged_in)
code = int(member.secu)
groupe_stage = dict({
"A" : "Grp A-8h à 11h",
"B" : "Grp B-12h à 15h",
"C" : "Grp C-15h à 18h",
"D" : "Grp D-18h à 21h",
"E" : "Grp E-8h à 12h",
"F" : "Grp F-13h à 17h",
"G" : "Grp G-13h à 17h",
})
# initialise la variable de session
if 'url_retour' not in request.session:
request.session['url_retour'] = url
# save url appelant dans une variable de session
if request.referrer and request.referrer != url:
request.session['url_retour'] = request.referrer
message = ''
# lire le stage
stage = get_motos_byId(request, type_stage, date_stage, groupe)
# generer la datatable
dates_stage, dt_data = generer_datatable(type_stage, date_stage, groupe)
# moniteur par défaut = moniteur connecté
cd_mon = logged_in
if type_stage == "R":
page_title = 'RDV pédagogique du %s' % dates_stage
button_title = 'Suivi théorique'
moniteurs = get_moniteurs_by_activite(request, date_stage, date_stage, 52, 55)
elif type_stage == "E":
page_title = 'Examen blanc B du %s' % dates_stage
button_title = 'Suivi groupe'
moniteurs = get_moniteurs_by_activite(request, date_stage, date_stage, 54, 54)
elif type_stage == "F":
page_title = 'Examen blanc A du %s' % dates_stage
button_title = 'Suivi groupe'
moniteurs = get_moniteurs_by_activite(request, date_stage, date_stage, 54, 54)
else:
page_title = 'Stage code %s' % dates_stage
button_title = 'Smartcode'
moniteurs = get_moniteurs_by_activite(request, date_stage, date_stage, 18, 18)
if 'form.submitted' in request.params:
# des lignes ont été sélectionnées ?
if len(request.params) > 1:
# oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')])
liste_param = ''
for param in request.params:
if param[:2] == 'id':
cd_cli = request.params[param]
# mise à jour du cd_mon
update_motos_lig_cd_mon(request, type_stage, date_stage, cd_cli, logged_in)
if liste_param:
liste_param += "-%s" % cd_cli
else:
liste_param = cd_cli
if type_stage == "D":
# stage code --> smart code
return HTTPFound(location=request.route_url('show_iframe', param='smartcode'))
if liste_param :
# suivi circuit ou suivi rdvp
return HTTPFound(location=request.route_url('show_iframe', param=type_stage + liste_param))
else:
message = 'Veuillez sélectionner au moins un(e) élève'
if 'form.circuit' in request.params:
message = ''
cd_mon = request.params['cd_mon']
# oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')])
for param in request.params:
if param[:2] == 'id':
update_motos_lig_circuit(request, type_stage, date_stage, request.params[param], cd_mon)
message = "Le moniteur CIRCUIT est mis à jour avec succès"
# generer la datatable
dates_stage, dt_data = generer_datatable(type_stage, date_stage, groupe)
formated_date = datetime.strptime(date_stage,'%Y-%m-%d') if date_stage != None and date_stage != '' else None
if 'form.updated' in request.params :
params = dict(request.params)
del params['form.updated']
update_pla_motos(request,type_stage,formated_date,groupe,params)
request.session.flash(u"Le stage %s groupe %s a été mis à jour avec succès" %(type_stage,groupe),'success')
if 'form.validated' in request.params :
params = dict(request.params)
diff = (formated_date - datetime.today()).days
if diff > 0 :
request.session.flash(u"Hmm, il est encore trop tôt pour valider ce planning","danger")
return HTTPFound(location=url)
if planningHasPending(request,type_stage,formated_date,groupe):
request.session.flash(u"Il y a un ou des élèves provisoires dans ce planning. Validation impossible","danger")
return HTTPFound(location=url)
else:
# lire tous les planning
items = get_motos_lig_by_date(request, type_stage, formated_date, groupe)
planning = get_pla_moto_by_date(request,type_stage,groupe,formated_date)
fin_reservation = None
VALIDE = 'O'
AGENCE = member.agence
CD_UTI = member.cd_uti
for item in items :
nStatus = 1
if int (item.STATUT) != 0 :
nStatus = item.STATUT
# update planning ligne and eleve_cpt
update_motos_lig_by_cd_cli(request,type_stage,formated_date,groupe,item.CD_CLI,nStatus,VALIDE,AGENCE,item.ligne_cpt,item.REF,item.CD_MON)
# update planning
update_pla_moto_by_date(request,type_stage,formated_date,groupe,AGENCE,VALIDE,member.cd_uti)
request.session.flash(u"Le planning est validé avec succés","success")
return HTTPFound(location=request.route_url('motos_schd', type=type_stage))
if 'form.deleted' in request.params:
items = get_motos_lig_by_date(request, type_stage, formated_date, groupe)
if len(items) > 0 :
request.session.flash(u"Interdiction de suppression, des eleves ont déjà inscrit dans ce planning." ,'danger')
return HTTPFound(location=url)
else:
delete_pla_moto_by_date(request,type_stage,formated_date,groupe)
request.session.flash(u"Le planning %s groupe %s du %s est supprimé avec success"%(type_stage,groupe,date_stage),"success")
return HTTPFound(location=request.route_url('motos_schd', type=type_stage))
if 'form.deleted_selected' in request.params:
ids = str(request.params['deleted_selected_inputs']).split('-')
for eleve_id in ids:
eleve = get_eleves_by_code(request, eleve_id)
delete_pla_moto_by_cd_cli(
request, type_stage, groupe, formated_date, eleve_id)
request.session.flash(u"L'eleve %s est bien suprimé dans % %s." % (
eleve['NOM'] + " " + eleve['PRENOM'], page_title), 'success')
return {
'page_title': page_title,
'url': url,
'url_retour': request.session['url_retour'],
'message': message,
'dt_data': dt_data,
'type' : type_stage,
'stage': stage,
'moniteurs': moniteurs,
'cd_mon': cd_mon,
'button_title': button_title,
'groupe' : groupe_stage,
'grp' : groupe,
'date':date_stage,
'code':code,
'codeleve' : to_str(0)
}
@view_config(route_name='stages_schd', renderer='../templates/planning/stages_schd.pt', permission='view')
def stages_schd(request):
type_stage = request.matchdict['type']
cd_mon = request.authenticated_userid
member = get_users_by_code(request, cd_mon)
code = int(member.secu)
groupe = dict({
"A" : "Grp A-5 jrs B",
"B" : "Grp B-3 jrs B",
"C" : "Grp C-5 jrs B78",
"D" : "Grp D-3 jrs B78",
"E" : "Grp E",
"F" : "Grp F",
"G" : "Grp G-B96 en ligne",
"H" : "Grp H-B96",
"I" : "Grp I-B96",
"J" : "Grp JPOST PERMIS VAISE",
"K" : "Grp KPOST PERMIS CHARPENNES",
"L" : "Grp LPOST PERMIS PRESQUILE",
"M" : "Grp MPOST PERMIS VAUGNERAY",
"N" : "Gpr N"
})
if type_stage == 'M':
title = "Stages 2R"
groupe = dict({
"A" : "Grp A-Stage 8h",
"B" : "Grp B-10h",
"C" : "Grp C-Stage 15H",
"D" : "Grp D-10h ",
"E" : "Grp E-10h",
"F" : "Grp F-10h",
"G" : "Grp G-10h",
"H" : "Grp H-10h",
"I" : "Grp I-10h",
"J" : "Grp J-10h",
"K" : "Grp K-10h",
"L" : "Grp L-10h",
"M" : "Grp M-10h",
"N" : "Gpr N-10h"
})
elif type_stage == 'C':
title = "Stages PAP"
groupe = dict({
"A" : "Grp A-CHARP",
"B" : "Grp B-VAUGN",
"C" : "Grp C",
"D" : "Grp D",
"E" : "Grp E",
"F" : "Grp F",
"G" : "Grp G",
"H" : "Grp H",
"I" : "Grp I",
"J" : "Grp J",
"K" : "Grp K",
"L" : "Grp L",
"M" : "Grp M",
"N" : "Gpr N"
})
else:
title = "Stages B"
message = ''
if 'form.submitted' in request.params :
params = dict(request.params)
semaine = get_pla_stage_by_semaine(request,type_stage,params['SEMAINE'],params['GROUPE'])
if semaine is None:
del params['form.submitted']
params['debut'] = datetime.strptime(request.params['debut']+' '+request.params['starttime'],'%d-%m-%Y %H:%M') if request.params['debut'] != None and request.params['debut'] != '' else None
params['fin'] = datetime.strptime(request.params['fin'],'%d-%m-%Y') if request.params['fin'] != None and request.params['fin'] != '' else None
del params['starttime']
params['CD_UTI'] = cd_mon
params['nom_formateur'] = params['nom_formateur'].split(' | ')[0]
params['nom_psy'] = params['nom_psy'].split(' | ')[0]
params['VALIDE'] = 'N'
params['ROUTE'] = 0
params['DISPO'] = params['TOTAL']
params['DispoRoute'] = 0
# params['DISPO'] = int(params['TOTAL']) - int(params['DISPO'])
params['TYPE'] = type_stage
insert_pla_stage(request,params)
request.session.flash(u"Le stage %s groupe %s est crée avec succès" %(type_stage,params['GROUPE']),'success')
else:
request.session.flash(u"Le stage %s groupe %s est dejà existé"%(type_stage,params['GROUPE']), 'danger')
rows = get_stages(request, type_stage)
# construire la liste des events
events = []
for row in rows:
if row.VALIDE == 'O':
color = 'LightGreen' # planning validé = vert pale
elif StageHasPending(request, row.TYPE, row.SEMAINE, row.GROUPE) == True :
color = "LightPink" # en attente
elif row.DISPO > 0 :
color = "LightYellow" # disponible
else:
color = "LightBlue" # complet
if type_stage == 'B':
url = '/stageb_list/%s/%s/%s/%s' % (row.debut.strftime('%Y-%m-%d'), row.GROUPE, 'A', 'x')
elif type_stage == 'M':
url = '/stagea_list/%s/%s' % (row.debut.strftime('%Y-%m-%d'), row.GROUPE)
else:
url = '/stagec_list/%s/%s' % (row.debut.strftime('%Y-%m-%d'), row.GROUPE)
json_event = {
'title': '%s - %s %s/%s' % (row.GROUPE, row.LIBELLE, row.DISPO, row.TOTAL),
'start': row.debut.strftime('%Y-%m-%d %H:%M:%S'),
'end': row.fin.strftime('%Y-%m-%d 18:00:00'),
'allDay': False,
'color': color,
'textColor': '#000000',
'url': url,
}
events.append(json_event)
return {
'page_title': title,
'calendar_events': json.dumps(events),
'type_stage': type_stage,
"groupe" : groupe,
'message' : message,
'code': code
}
@view_config(route_name='motos_schd', renderer='../templates/planning/motos_schd.pt', permission='view')
def motos_schd(request):
# type de planning motos
cd_mon = request.authenticated_userid
member = get_users_by_code(request, cd_mon)
code = int(member.secu)
type_stage = request.matchdict['type']
if type_stage == 'I':
page_title = "Circuit forfait"
elif type_stage == 'R':
page_title = "Rendez-vous pédagogique"
elif type_stage == 'D':
page_title = "Stage code"
elif type_stage == 'E':
page_title = "Examens blancs B"
elif type_stage == 'F':
page_title = "Examens blancs A"
else:
page_title = "Planning 2R"
groupe = dict({
"A" : "Grp A-8h à 11h",
"B" : "Grp B-12h à 15h",
"C" : "Grp C-15h à 18h",
"D" : "Grp D-18h à 21h",
"E" : "Grp E-8h à 12h",
"F" : "Grp F-13h à 17h",
"G" : "Grp G-13h à 17h",
})
if 'form.submitted' in request.params:
params = dict(request.params)
params['DATE'] = datetime.strptime(request.params['DATE'],'%d-%m-%Y') if request.params['DATE'] != None and request.params['DATE'] != '' else None
exist = get_pla_moto_by_date(request,type_stage,params['GROUPE'],params['DATE'])
if not exist :
del params['form.submitted']
params['AGENCE'] = member.agence
params['CD_UTI'] = cd_mon
if 'ROUTE' in params :
params['ROUTE_DISPO'] = params['ROUTE']
params['DISPO'] = params['TOTAL']
insert_pla_moto(request,params)
request.session.flash(u"Le planning %s groupe %s est crée avec succès" %(type_stage,params['GROUPE']),'success')
else:
request.session.flash(u"Le planning %s groupe %s est dejà existé"%(type_stage,params['GROUPE']), 'danger')
if 'form.duplicated' in request.params :
params = dict(request.params)
del params['form.duplicated']
start = datetime.strptime(request.params['DATE1'],'%d/%m/%Y') if request.params['DATE1'] != None and request.params['DATE1'] != '' else None
dest = datetime.strptime(request.params['DATE2'],'%d/%m/%Y') if request.params['DATE2'] != None and request.params['DATE2'] != '' else None
nb = int(request.params['NB'])
for i in range(1,nb+1,1):
duplicate_pla_moto_by_semaine(request,type_stage,start,dest,code)
dest = dest + timedelta(days=7)
request.session.flash(u"La duplication du planning %s est exectuté avec succès" %(type_stage),'success')
# construire la liste des events
rows = get_motos(request, type_stage)
events = []
for row in rows:
# titre selon le type_stage
if type_stage == 'A' or type_stage == 'F':
title = '%s - P:%s/%s R:%s/%s' % (row.GROUPE, row.DISPO, row.TOTAL, row.ROUTE_DISPO, row.ROUTE)
url = '/planninga_list/%s/%s/%s' % (type_stage, row.DATE, row.GROUPE)
elif type_stage == 'I':
title = '%s - %s/%s' % (row.GROUPE, row.DISPO, row.TOTAL)
url = '/circuit_list/%s/%s' % (row.DATE,row.GROUPE)
else:
title = '%s - %s/%s' % (row.GROUPE, row.DISPO, row.TOTAL)
url = '/motos_list/%s/%s/%s' % (type_stage, row.DATE, row.GROUPE)
# couleur de la cellule
if row.VALIDE == 'O':
color = 'LightGreen' # planning validé = vert pale
elif PlanningHasPending(request, row.TYPE, row.DATE, row.GROUPE) == True :
color = "LightPink" # en attente
elif row.DISPO == 0 and row.ROUTE_DISPO == 0 :
color = "LightBlue" # complet
else:
color = "LightYellow" # disponible
if row.LIBELLE == None or len(row.LIBELLE) == 0:
comment = '.'
else:
comment = row.LIBELLE
json_event = {
'title': title,
'start': row.DATE.strftime('%Y-%m-%d 08:00:00'),
'end': row.DATE.strftime('%Y-%m-%d 18:00:00'),
'allDay': False,
'color': color,
'textColor': '#000000',
'description': comment,
'url': url,
}
events.append(json_event)
return {
'page_title': page_title,
'calendar_events': json.dumps(events),
'groupe' : groupe,
'type' : type_stage
}
@view_config(route_name='show_iframe', renderer='../templates/planning/show_iframe.pt', permission='view')
def show_iframe(request):
logged_in = request.authenticated_userid
# lire la fiche du moniteur
moniteur = get_users_by_code(request, logged_in)
# calculer le jour de l'année d'auj
d = date.today()
yearday = (d - date(d.year, 1, 1)).days + 1
# calculer la clé du moniteur
keyM = int(yearday * d.year / d.day * (ord(logged_in[0]) + ord(logged_in[1])))
param = request.matchdict['param']
choicelist = 'pedagogie-pedagoGL-agences-infos'
if param in choicelist:
# param = aide et infos iFrame :
pvar = 'codeU=%s&Mn=%s&keyM=%s' % (logged_in, moniteur.nom, keyM)
iframe_src = "https://suivi-eleve.marietton.com/documents-interne/%s.php?%s" % (param, pvar)
elif param == 'smartcode':
# param = télécommande code
param = 'codeU=%s&Mn=%s&keyM=%s' % (logged_in, moniteur.nom, keyM)
iframe_src = "https://www.marietton.com/telecode/indexE.php?%s" % param
elif param == 'msgerie':
# param = messagerie interne
param = 'codeU=%s&Mn=%s&keyM=%s' % (logged_in, moniteur.nom, keyM)
iframe_src = "https://suivi-eleve.marietton.com/MSG-messagerie.php?%s" % param
elif param == 'dessin':
# param = dessin
param = 'Mn=%s&codeU=%s&keyM=%s' % (moniteur.nom, logged_in, keyM)
iframe_src = "https://suivi-eleve.marietton.com/dessin/index.php?%s" % param
elif param == 'listingGL':
# param = listing GL
param = 'codeU=%s&Mn=%s&keyM=%s' % (logged_in, moniteur.nom, keyM)
iframe_src = "http://devng.marietton.com/stagiairePro.php?%s" % param
elif param.startswith('suivi-peda-'):
# param = suivi pédagogique
# code élève est à la fin de param
cd_cli = param[-6:]
# fiche eleve
eleve = get_eleves_by_code(request, cd_cli)
keyE = int(yearday * d.year / d.day * eleve.CD_CLI)
param = 'codeE=%s&key=%s&Mn=%s&codeU=%s&keyM=%s&En=%s&MnR=%s&filiere=%s&agence=%s&ste=%s&AP=%s&email=%s&permis=%s&formule=%s' % (
cd_cli, keyE, moniteur.nom, logged_in, keyM, eleve.NOMPREN, eleve.CD_MON, eleve.filiere,
eleve.AGENCE, eleve.NOM_ENTREPRISE, eleve.annulation_permis, eleve.email, eleve.PERMIS_DEMANDE, eleve.FORMULE)
iframe_src = "https://www.suivi-eleve.marietton.com/suivi.php?%s" % param
else:
if param[:1] == 'R':
# rendez-vous pédagogique
php_page = 'rvpLotUp.php'
elif param[:1] == 'M':
# planning 2R
php_page = 'comp2RLotUp.php'
else:
# planning circuit
php_page = 'circuitLotUp.php'
# param = liste d'élève
codes_list = param[1:]
codes = codes_list.split("-")
# totaliser les codes élève
codes_sum = 0
for code in codes:
codes_sum += int(code)
# calcul des clés élève et moniteur
# codeE = concaténation des codes Élèves séparé par un tiret : codeE=672211-661640-271213
# keyE = la même que pour la fiche de suivi sauf que le code élève est remplacé par laddition de tous les code élève
keyE = int(yearday * d.year / d.day * codes_sum)
param = 'codeE=%s&key=%s&Mn=%s&codeU=%s&keyM=%s' % (codes_list, keyE, moniteur.nom, logged_in, keyM)
iframe_src = "https://suivi-eleve.marietton.com/%s?%s" % (php_page, param)
return {
'page_title': "",
'iframe_src': iframe_src,
}
@view_config(route_name='plannings', renderer='../templates/planning/plannings.pt', permission='view')
def plannings(request):
logged_in = request.authenticated_userid.lower()
# lire la fiche du moniteur
moniteur = get_users_by_code(request, logged_in)
# calcul des clés élève et moniteur
d = date.today()
# calculer le jour de l'année d'auj
yearday = (d - date(d.year, 1, 1)).days + 1
keyM = int(yearday * d.year / d.day * (ord(logged_in[0]) + ord(logged_in[1])))
url_listeGL = "http://devng.marietton.com/stagiairePro.php?codeU=%s&Mn=%s&keyM=%s" % (logged_in, moniteur.nom, keyM)
return {
'page_title': "Les plannings",
'logged_in': logged_in,
'url_listeGL': url_listeGL,
}
@view_config(route_name='stagea_list', renderer='../templates/planning/stagea_list.pt', permission='view')
def stagea_list(request):
def generer_datatable(date_stage, groupe):
# lire les stages B
items = get_stage_lig_by_date(request, 'M', date_stage, groupe)
dates_stage = ''
date_deb = date.today()
date_fin = date.today()
# construire la liste
liste=[]
dates_stage = ''
for item in items:
# mémoriser les dates du stage
dates_stage = '%s au %s' % (item.debut.strftime('%d'), item.fin.strftime('%d-%m-%Y'))
date_deb = item.debut.date()
date_fin = item.fin
# n'affiche que les élèves du moniteur
solde = to_euroN(item.solde)
if item.perime_le:
code_ok = to_age(item.perime_le, '<')
else:
code_ok = ''
# date inscription + date 1er plateau
date_plateau = 'Insc.:' + item.cree_le.strftime('%d-%m-%Y')
if item.h1plateau_le:
date_plateau += ' 1erP.:' + item.h1plateau_le.strftime('%d-%m-%Y')
# date examen plateau + route
if item.TR_P_DATE:
date_examens = '[%s] %s' % (item.TR_P_NB, item.TR_P_DATE.strftime('%d-%m-%Y'))
else:
date_examens = 'néant'
if item.TR_R_DATE:
date_examens += ' - [%s] %s' % (item.TR_R_NB, item.TR_R_DATE.strftime('%d-%m-%Y'))
else:
date_examens += ' - néant'
# examen prévu ?
examen = get_examens_prevu(request, item.CD_CLI)
if examen:
if examen.PERMIS == 'ETG':
code_ok = 'Inscrit'
else:
date_examens += ' AP'
if item.VALIDE == 'N':
heures = ''
else:
heures = 'VAL'
circuit = item.seance
if item.cd_circuit:
circuit += ' - ' + item.cd_circuit
d = (item.CD_CLI, to_str(item.CD_CLI) + ' - ' + item.NOM, solde, code_ok, item.permis_demande, date_plateau, date_examens, str(item.STATUT),
item.TYPE + to_str(item.SEMAINE) + item.GROUPE + to_str(item.CD_CLI), item.VALIDE)
liste.append(d)
return date_deb, date_fin, dates_stage, json.dumps(liste)
date_stage = request.matchdict['date']
date_date_stage = datetime.strptime(date_stage,'%Y-%m-%d')
weeknumber = date_date_stage.isocalendar()[1]
if len(str(weeknumber)) == 1:
weeknumber = "0"+str(weeknumber)
semaine = str(date_date_stage.year) +''+str(weeknumber)
groupe_stage = request.matchdict['groupe']
groupe = dict({
"A" : "Grp A-Stage 8h",
"B" : "Grp B-10h",
"C" : "Grp C-Stage 15H",
"D" : "Grp D-10h ",
"E" : "Grp E-10h",
"F" : "Grp F-10h",
"G" : "Grp G-10h",
"H" : "Grp H-10h",
"I" : "Grp I-10h",
"J" : "Grp J-10h",
"K" : "Grp K-10h",
"L" : "Grp L-10h",
"M" : "Grp M-10h",
"N" : "Gpr N-10h"
})
url = request.route_url('stagea_list', date=date_stage, groupe=groupe_stage)
message = ''
cd_mon = request.authenticated_userid
member = get_users_by_code(request, cd_mon)
if 'form.submitted' in request.params:
# des lignes ont été sélectionnées ?
if len(request.params) > 1:
# oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')])
liste_param = ''
for param in request.params:
if param[:2] == 'id':
cd_cli = request.params[param]
# maj le statut de la ligne à 1
update_stage_lig_statut(request, 'M', date_stage, cd_cli)
if liste_param:
liste_param += "-%s" % cd_cli
else:
liste_param = cd_cli
if liste_param :
# suivi 2R
return HTTPFound(location=request.route_url('show_iframe', param='M' + liste_param))
else:
message = 'Veuillez sélectionner au moins un(e) élève'
if 'form.updated' in request.params :
params = dict(request.params)
stage = get_pla_stage_by_semaine(request,'M',semaine,groupe_stage)
del params['form.updated']
params['debut'] = datetime.strptime(request.params['debut']+' '+request.params['starttime'],'%d-%m-%Y %H:%M') if request.params['debut'] != None and request.params['debut'] != '' else None
params['fin'] = datetime.strptime(request.params['fin'],'%d-%m-%Y') if request.params['fin'] != None and request.params['fin'] != '' else None
del params['starttime']
params['CD_UTI'] = cd_mon
params['nom_formateur'] = params['nom_formateur'].split(' | ')[0]
params['nom_psy'] = params['nom_psy'].split(' | ')[0]
# params['DISPO'] = int(params['TOTAL']) - int(params['DISPO'])
update_pla_stage(request,params,'M',semaine,groupe_stage)
request.session.flash(u"Le stage 2R groupe %s a été mis à jour avec succès" %groupe_stage,'success')
if 'form.validated' in request.params :
params = dict(request.params)
hashed = to_sha1(params['password']) if 'password' in params else None
passed = member.mdp_hash == hashed
if hashed == None or passed :
if StageHasPending(request,"M",semaine,groupe_stage):
request.session.flash(u"Il y a un ou des élèves provisoires dans ce stage. Validation impossible","danger")
return HTTPFound(location=url)
else:
# lire tous les planning
items = get_stage_lig_by_date(request, 'M', date_stage, groupe_stage)
AGENCE = member.agence
stage = get_pla_stage_by_semaine(request,'M',semaine,groupe_stage)
date_valeur = stage['fin']
VALIDE = 'O'
LIBELLE = groupe[groupe_stage]
for item in items :
nStatus = 1
if int (item.STATUT) != 0 :
nStatus = item.STATUT
# update stage ligne and eleve_cpt
update_stage_lig_by_cd_cli(request,'M',semaine,groupe_stage,item.CD_CLI,nStatus,VALIDE,AGENCE,item.ligne_cpt,LIBELLE,date_valeur)
# update stage
update_pla_stage_by_semaine(request,'M',semaine,groupe_stage,AGENCE,VALIDE,member.cd_uti)
request.session.flash(u"Le stage est validé avec succés","success")
return HTTPFound(location=request.route_url('stages_schd', type='M'))
else:
request.session.flash(u"Erreur d'authentification" ,'danger')
return HTTPFound(location=url)
if 'form.deleted' in request.params:
items = get_stage_lig_by_date(request, 'M', date_stage, groupe_stage)
if len(items) > 0 :
request.session.flash(u"Interdiction de suppression, des eleves ont déjà inscrit dans ce stage." ,'danger')
return HTTPFound(location=url)
else:
delete_pla_stage_by_semaine(request,'M',semaine,groupe_stage)
request.session.flash(u"Le stage %s groupe %s du %s est supprimé avec success"%('M',groupe_stage,date_stage),"success")
return HTTPFound(location=request.route_url('stages_schd', type='M'))
if 'form.deleted_selected' in request.params:
ids = str(request.params['deleted_selected_inputs']).split('-')
stage_edit = get_pla_stage_by_semaine(
request, 'M', semaine, groupe_stage)
type_stage = 'M'
for eleve_id in ids:
eleve = get_eleves_by_code(request, eleve_id)
rdvb = get_stage_lig_by_cd_cli(request, type_stage, eleve_id)
if member.secu < 9 and int(eleve_id) > 100000:
isdelayok = isDelaiOK(
request, stage_edit['fin'], rdvb['cree_le'].date(), 8)
if not isdelayok:
request.session.flash(u"Interdiction de suppression de l'éleve %s dans le stage %s groupe %s." % (
eleve['NOM']+" "+eleve['PRENOM'], type_stage, groupe_stage), 'danger')
delete_stage_lig_by_cd_cli(
request, type_stage, semaine, groupe_stage, eleve_id)
request.session.flash(u"L'eleve %s est bien suprimé dans le stage %s groupe_stage %s." % (
eleve['NOM']+" "+eleve['PRENOM'], type_stage, groupe_stage), 'success')
return HTTPFound(url)
# generer la datatable
stage = get_pla_stage_by_semaine(request,'M',semaine,groupe_stage)
ispassed = (stage['fin'] - date.today()).days > 0
stage_debut = ""
starttime = ""
if stage['debut'] != None :
stage_debut = stage['debut'].strftime('%d-%m-%Y')
starttime = stage['debut'].strftime('%H:%M')
stage_fin = stage['fin'].strftime('%d-%m-%Y') if stage['fin'] != None else ""
date_deb, date_fin, dates_stage, dt_data = generer_datatable(date_stage, groupe_stage)
return {
'page_title': 'Stage 2R du %s' % date_date_stage.strftime('%d-%m-%Y'),
'url': url,
'message': message,
'dt_data': dt_data,
'groupe': groupe,
'stage' : stage,
'stage_debut' : stage_debut,
'stage_fin' : stage_fin,
'ispassed' : ispassed,
'code' : int(member.secu),
'starttime' : starttime,
'codeleve' : stage.TYPE + to_str(stage.SEMAINE) + stage.GROUPE + to_str(0)
}
@view_config(route_name='planninga_list', renderer='../templates/planning/planninga_list.pt', permission='view')
def planninga_list(request):
def generer_datatable(type_stage, date_stage, groupe):
# lire le planning A
items = get_motos_lig_by_date(request, type_stage , date_stage, groupe)
dates_stage = ''
# construire la liste
liste=[]
dates_stage = ''
for item in items:
# mémoriser les dates du stage
dates_stage = item.DATE.strftime('%d-%m-%Y')
# n'affiche que les élèves du moniteur
solde = to_euroN(item.solde)
if item.perime_le:
code_ok = to_age(item.perime_le, '<')
else:
code_ok = ''
# date 1er plateau
if item.h1plateau_le:
date_plateau = item.h1plateau_le.strftime('%d-%m-%Y')
else:
date_plateau = ''
# date examen plateau + route
if item.TR_P_DATE:
date_examens = '[%s] %s' % (item.TR_P_NB, item.TR_P_DATE.strftime('%d-%m-%Y'))
if item.tr_p_ok:
date_examens += '(OK)'
else:
date_examens = 'néant'
if item.TR_R_DATE:
date_examens += ' - [%s] %s' % (item.TR_R_NB, item.TR_R_DATE.strftime('%d-%m-%Y'))
else:
date_examens += ' - néant'
# examen prévu ?
examen = get_examens_prevu(request, item.CD_CLI)
if examen:
if examen.PERMIS == 'ETG':
code_ok = 'Inscrit'
else:
date_examens += ' AP'
if item.VALIDE == 'N':
heures = ''
else:
heures = 'VAL'
if item.Route == 0:
cat = 'P - '
else:
cat = 'R - '
cat = cat + item.permis_demande
d = (item.CD_CLI, to_str(item.CD_CLI) + ' - ' + item.NOM, solde, code_ok, cat, date_plateau, item.heures,
date_examens,
str(item.STATUT), item.no_ligne, item.VALIDE)
liste.append(d)
return dates_stage, json.dumps(liste)
type_stage = request.matchdict['type']
date_stage = request.matchdict['date']
groupe = request.matchdict['groupe']
url = request.route_url('planninga_list', type=type_stage, date=date_stage, groupe=groupe)
logged_in = request.authenticated_userid
member = get_users_by_code(request, logged_in)
code = int(member.secu)
groupe_stage = dict({
"A" : "Grp A-8h à 11h",
"B" : "Grp B-12h à 15h",
"C" : "Grp C-15h à 18h",
"D" : "Grp D-18h à 21h",
"E" : "Grp E-8h à 12h",
"F" : "Grp F-13h à 17h",
"G" : "Grp G-13h à 17h",
})
message = ''
# generer la datatable
dates_stage, dt_data = generer_datatable(type_stage, date_stage, groupe)
# planning A ou TB A
if type_stage == "A":
page_title = 'Planning 2R du %s' % date_stage
else:
page_title = 'Test blanc 2R du %s' % date_stage
if 'form.submitted' in request.params:
# des lignes ont été sélectionnées ?
if len(request.params) > 1:
# oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')])
liste_param = ''
for param in request.params:
if param[:2] == 'id':
cd_cli = request.params[param]
# mise à jour du cd_mon
update_motos_lig_cd_mon(request, type_stage, date_stage, cd_cli, logged_in)
if liste_param:
liste_param += "-%s" % cd_cli
else:
liste_param = cd_cli
if liste_param :
# suivi 2R
return HTTPFound(location=request.route_url('show_iframe', param='M' + liste_param))
else:
message = 'Veuillez sélectionner au moins un(e) élève'
formated_date = datetime.strptime(date_stage,'%Y-%m-%d') if date_stage != None and date_stage != '' else None
if 'form.updated' in request.params :
params = dict(request.params)
del params['form.updated']
update_pla_motos(request,type_stage,formated_date,groupe,params)
request.session.flash(u"Le stage %s groupe %s a été mis à jour avec succès" %(type_stage,groupe),'success')
if 'form.validated' in request.params :
params = dict(request.params)
diff = (formated_date - datetime.today()).days
if diff > 0 :
request.session.flash(u"Hmm, il est encore trop tôt pour valider ce planning","danger")
return HTTPFound(location=url)
if planningHasPending(request,type_stage,formated_date,groupe):
request.session.flash(u"Il y a un ou des élèves provisoires dans ce planning. Validation impossible","danger")
return HTTPFound(location=url)
else:
# lire tous les planning
items = get_motos_lig_by_date(request, type_stage, formated_date, groupe)
planning = get_pla_moto_by_date(request,type_stage,groupe,formated_date)
fin_reservation = None
VALIDE = 'O'
AGENCE = member.agence
CD_UTI = member.cd_uti
for item in items :
nStatus = 1
if int (item.STATUT) != 0 :
nStatus = item.STATUT
# update planning ligne and eleve_cpt
update_motos_lig_by_cd_cli(request,type_stage,formated_date,groupe,item.CD_CLI,nStatus,VALIDE,AGENCE,item.ligne_cpt,item.REF,item.CD_MON)
# update planning
update_pla_moto_by_date(request,type_stage,formated_date,groupe,AGENCE,VALIDE,member.cd_uti)
request.session.flash(u"Le planning est validé avec succés","success")
return HTTPFound(location=request.route_url('motos_schd', type=type_stage))
if 'form.deleted' in request.params:
items = get_motos_lig_by_date(request, type_stage, formated_date, groupe)
if len(items) > 0 :
request.session.flash(u"Interdiction de suppression, des eleves ont déjà inscrit dans ce planning." ,'danger')
return HTTPFound(location=url)
else:
delete_pla_moto_by_date(request,type_stage,formated_date,groupe)
request.session.flash(u"Le planning %s groupe %s du %s est supprimé avec success"%(type_stage,groupe,date_stage),"success")
return HTTPFound(location=request.route_url('motos_schd', type=type_stage))
if 'form.deleted_selected' in request.params:
ids = str(request.params['deleted_selected_inputs']).split('-')
for eleve_id in ids:
eleve = get_eleves_by_code(request, eleve_id)
delete_pla_moto_by_cd_cli(
request, type_stage, groupe, formated_date, eleve_id)
request.session.flash(u"L'eleve %s est bien suprimé dans le planning %s groupe_stage %s." % (
eleve['NOM']+" "+eleve['PRENOM'], type_stage, groupe), 'success')
return HTTPFound(url)
stage = get_pla_moto_by_date(request,type_stage,groupe,formated_date)
if not stage :
request.session.flash(u"Planning non trouvé","danger")
return HTTPFound(location=request.route_url('motos_schd', type=type_stage))
return {
'page_title': page_title,
'url': url,
'message': message,
'type': type_stage,
'dt_data': dt_data,
'stage' : stage,
'groupe' : groupe_stage,
'grp' : groupe,
'date':date_stage,
'code':code,
'codeleve' : to_str(0)
}
@view_config(route_name='stagec_list', renderer='../templates/planning/stagec_list.pt', permission='view')
def stagec_list(request):
def generer_datatable(date_stage, groupe):
# lire les stages B
items = get_stage_lig_by_date(request, 'C', date_stage, groupe)
dates_stage = ''
date_deb = date.today()
date_fin = date.today()
# construire la liste
liste=[]
dates_stage = ''
for item in items:
# mémoriser les dates du stage
dates_stage = '%s au %s' % (item.debut.strftime('%d'), item.fin.strftime('%d-%m-%Y'))
date_deb = item.debut.date()
date_fin = item.fin
# n'affiche que les élèves du moniteur
solde = to_euroN(item.solde)
# date inscription
inscrit_le = item.cree_le.strftime('%d-%m-%Y')
if item.VALIDE == 'N':
heures = ''
else:
heures = 'VAL'
d = (item.CD_CLI, to_str(item.CD_CLI) + ' - ' + item.NOM, solde, item.permis_demande,
inscrit_le, item.LIEU, str(item.STATUT),
item.TYPE + to_str(item.SEMAINE) + item.GROUPE + to_str(item.CD_CLI), item.VALIDE)
liste.append(d)
return date_deb, date_fin, dates_stage, json.dumps(liste)
groupe = dict({
"A" : "Grp A-CHARP",
"B" : "Grp B-VAUGN",
"C" : "Grp C",
"D" : "Grp D",
"E" : "Grp E",
"F" : "Grp F",
"G" : "Grp G",
"H" : "Grp H",
"I" : "Grp I",
"J" : "Grp J",
"K" : "Grp K",
"L" : "Grp L",
"M" : "Grp M",
"N" : "Gpr N"
})
date_stage = request.matchdict['date']
groupe_stage = request.matchdict['groupe']
url = request.route_url('stagec_list', date=date_stage, groupe=groupe_stage)
date_date_stage = datetime.strptime(date_stage,'%Y-%m-%d')
weeknumber = date_date_stage.isocalendar()[1]
if len(str(weeknumber)) == 1:
weeknumber = "0"+str(weeknumber)
semaine = str(date_date_stage.year) +''+str(weeknumber)
message = ''
cd_mon = request.authenticated_userid
member = get_users_by_code(request, cd_mon)
if 'form.submitted' in request.params:
# des lignes ont été sélectionnées ?
if len(request.params) > 1:
# oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')])
liste_param = ''
for param in request.params:
if param[:2] == 'id':
if liste_param:
liste_param += "-%s" % request.params[param]
else:
liste_param = request.params[param]
if liste_param :
# suivi PAP
return HTTPFound(location=request.route_url('show_iframe', param='M' + liste_param))
else:
message = 'Veuillez sélectionner au moins un(e) élève'
if 'form.validated' in request.params :
params = dict(request.params)
hashed = to_sha1(params['password']) if 'password' in params else None
passed = member.mdp_hash == hashed
if hashed == None or passed :
if StageHasPending(request,"C",semaine,groupe_stage):
request.session.flash(u"Il y a un ou des élèves provisoires dans ce stage. Validation impossible","danger")
return HTTPFound(location=url)
else:
# lire tous les planning
items = get_stage_lig_by_date(request, 'C', date_stage, groupe_stage)
AGENCE = member.agence
stage = get_pla_stage_by_semaine(request,'C',semaine,groupe_stage)
date_valeur = stage['fin']
VALIDE = 'O'
LIBELLE = groupe[groupe_stage]
for item in items :
nStatus = 1
if int (item.STATUT) != 0 :
nStatus = item.STATUT
# update stage ligne and eleve_cpt
update_stage_lig_by_cd_cli(request,'C',semaine,groupe_stage,item.CD_CLI,nStatus,VALIDE,AGENCE,item.ligne_cpt,LIBELLE,date_valeur)
# update stage
update_pla_stage_by_semaine(request,'C',semaine,groupe_stage,AGENCE,VALIDE,member.cd_uti)
request.session.flash(u"Le stage est validé avec succés","success")
return HTTPFound(location=request.route_url('stages_schd', type='C'))
else:
request.session.flash(u"Erreur d'authentification" ,'danger')
return HTTPFound(location=url)
if 'form.updated' in request.params :
params = dict(request.params)
stage = get_pla_stage_by_semaine(request,'C',semaine,groupe_stage)
del params['form.updated']
params['debut'] = datetime.strptime(request.params['debut']+' '+request.params['starttime'],'%d-%m-%Y %H:%M') if request.params['debut'] != None and request.params['debut'] != '' else None
params['fin'] = datetime.strptime(request.params['fin'],'%d-%m-%Y') if request.params['fin'] != None and request.params['fin'] != '' else None
del params['starttime']
params['CD_UTI'] = cd_mon
params['nom_formateur'] = params['nom_formateur'].split(' | ')[0]
params['nom_psy'] = params['nom_psy'].split(' | ')[0]
# params['DISPO'] = int(params['TOTAL']) - int(params['DISPO'])
update_pla_stage(request,params,'C',semaine,groupe_stage)
request.session.flash(u"Le stage PAP groupe %s a été mis à jour avec succès" %groupe_stage,'success')
if 'form.deleted' in request.params:
items = get_stage_lig_by_date(request, 'C', date_stage, groupe_stage)
if len(items) > 0 :
request.session.flash(u"Interdiction de suppression, des eleves ont déjà inscrit dans ce stage." ,'danger')
return HTTPFound(location=url)
else:
delete_pla_stage_by_semaine(request,'C',semaine,groupe_stage)
request.session.flash(u"Le stage %s groupe %s du %s est supprimé avec success"%('C',groupe_stage,date_stage),"success")
return HTTPFound(location=request.route_url('stages_schd', type='C'))
if 'form.deleted_selected' in request.params:
ids = str(request.params['deleted_selected_inputs']).split('-')
stage_edit = get_pla_stage_by_semaine(
request, 'C', semaine, groupe_stage)
type_stage = 'C'
for eleve_id in ids:
eleve = get_eleves_by_code(request, eleve_id)
rdvb = get_stage_lig_by_cd_cli(request, type_stage, eleve_id)
if member.secu < 9 and int(eleve_id) > 100000:
isdelayok = isDelaiOK(
request, stage_edit['fin'], rdvb['cree_le'].date(), 8)
if not isdelayok:
request.session.flash(u"Interdiction de suppression de l'éleve %s dans le stage %s groupe %s." % (
eleve['NOM'] + " " + eleve['PRENOM'], type_stage, groupe_stage), 'danger')
delete_stage_lig_by_cd_cli(
request, type_stage, semaine, groupe_stage, eleve_id)
request.session.flash(u"L'eleve %s est bien suprimé dans le stage %s groupe_stage %s." % (
eleve['NOM'] + " " + eleve['PRENOM'], type_stage, groupe_stage), 'success')
return HTTPFound(url)
# generer la datatable
stage = get_pla_stage_by_semaine(request,'C',semaine,groupe_stage)
ispassed = (stage['fin'] - date.today()).days > 0
stage_debut = ""
starttime = ""
if stage['debut'] != None :
stage_debut = stage['debut'].strftime('%d-%m-%Y')
starttime = stage['debut'].strftime('%H:%M')
stage_fin = stage['fin'].strftime('%d-%m-%Y') if stage['fin'] != None else ""
date_deb, date_fin, dates_stage, dt_data = generer_datatable(date_stage, groupe_stage)
return {
'page_title': 'Stage PAP du %s' % date_date_stage.strftime('%d-%m-%Y'),
'url': url,
'message': message,
'dt_data': dt_data,
'groupe': groupe,
'stage' : stage,
'stage_debut' : stage_debut,
'stage_fin' : stage_fin,
'code' : member.secu,
'ispassed' : ispassed,
'starttime' : starttime,
'codeleve' : stage.TYPE + to_str(stage.SEMAINE) + stage.GROUPE + to_str(0)
}
@view_config(route_name='planifier', renderer='../templates/planning/planifier.pt', permission='view')
def planifier(request):
def generer_planning(agence, cd_mon, datedeb, datefin):
# construire la liste des rdv du moniteurs
rows = get_rendez_vous_moniteur(request, agence, cd_mon, datedeb, datefin)
events = []
for row in rows:
if row.comment == None:
comment = ''
else:
comment = row.comment
if row.NOM_ENTREPRISE :
etoile = ' (E)'
else:
etoile = ''
nom = row.nom + etoile
# déterminer la couleur de l'event
if row.date_valeur :
color = 'LightGreen' # rdv validé = vert pale
else:
if to_int(row.ref) != row.cd_cli :
if row.statut > 1 :
color = 'DeepPink' # rdv élève décommandé
if row.statut == 10 or row.statut == 15 :
color = 'LightGray' # moniteur absent
elif row.fin_reservation :
color = 'LightPink' # résa = LightPink
else:
color = 'LightYellow' # rdv élève = jaune pale
if row.circuit == 1:
color = 'Gold' # gold
elif row.circuit == 2:
color = 'Plum' # Plum
elif row.circuit == 3:
color = 'YellowGreen' # YellowGreen
elif row.circuit == 4:
color = 'DeepSkyBlue' # DeepSkyBlue
elif row.circuit == 5:
color = 'LimeGreen' # LimeGreen
elif row.circuit == 6:
color = 'GoldenRod' # Marron
else:
if row.cd_cli == 99995 :
color = 'White' # résa web = couleur blanc)
elif row.cd_cli == 1 :
color = 'Gainsboro' # ///////
else:
color = 'LightBlue' # activité
if row.statut == 10 or row.statut == 15 :
color = 'LightGray' # moniteur absent
json_event = {
'title': nom,
'start': '%s %02d:00:00' % (row.DATE.strftime('%Y-%m-%d'), row.noplan),
'end': '%s %02d:00:00' % (row.DATE.strftime('%Y-%m-%d'), row.noplan + row.qte),
'description': comment,
'allDay': False,
'color': color,
'textColor': '#000000',
'url': '/activ_edit/%s' % (row.no_ligne),
}
events.append(json_event)
return json.dumps(events)
logged_in = request.authenticated_userid.upper()
TODAY = date.today()
# récupérer les paramètres de l'appel de la view
datePlan = request.matchdict['date']
if datePlan == '6mois':
# la plannification des activités se fait 6 mois à l'avance
datePlan = TODAY + relativedelta(months=6)
else:
datePlan = datetime.strptime(datePlan,'%Y-%m-%d')
cd_mon = request.matchdict['cd_mon']
if cd_mon == 'codeMon':
cd_mon,cd_mon_B78 = get_user_cd_mon(request, logged_in)
# si cd_mon a été changé par le user
if 'cd_mon' in request.params:
cd_mon = request.params["cd_mon"]
url = request.route_url('planifier', cd_mon=cd_mon, date=datePlan.strftime('%Y-%m-%d'))
member = get_users_by_code(request, logged_in)
if not member:
request.session.flash(u"Moniteur %s introuvable" % (logged_in), 'danger')
return HTTPFound(location=request.route_url("home"))
agence = member.agence
QTE = 1
message = ''
# -- CREER une semaine type
if 'form.submitted' in request.params:
if 'alterne' in request.params:
increment = 2
else:
increment = 1
# insérer la semaine type sélectionnée
semaine = request.params['semaine']
QTE = int(request.params['QTE'])
dateRDV = datetime.strptime(request.params['dateRDV'],'%d-%m-%Y')
# date de départ = Lundi
dateDepart = dateRDV - timedelta(days = dateRDV.weekday())
insert_semaine_type(request, cd_mon, semaine, dateDepart, QTE, increment, agence, logged_in)
request.session.flash(u"La semaine type a été insérée avec succès.", 'success')
# afficher le formulaire à partir de cette date
return HTTPFound(location=request.route_url('planifier', cd_mon=cd_mon, date=dateDepart.strftime('%Y-%m-%d')))
# début = date - 3 semaines
d = datePlan + relativedelta(weeks=-3)
datedeb = d.strftime('%Y-%m-%d')
# fin = date + 6 mois
d = datePlan + relativedelta(months=+6)
datefin = d.strftime('%Y-%m-%d')
# lire les moniteurs
moniteurs = get_moniteurs_by_aff(request, agence, datedeb, datefin)
#sort moniteur , mettre B78 à la fin
moniteurs.sort(key=lambda m: str(m.PLANNING) == "B", reverse=True)
moniteursB = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "B"]
moniteursB78 = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "B78"]
moniteurs2R = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "2R"]
moniteursGL = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "GL"]
moniteurs = [moniteursB,moniteurs2R,moniteursGL,moniteursB78]
# generer le planning B
calendar_events = generer_planning(agence, cd_mon, datedeb, datefin)
# le type de planning du moniteur
moniteur = get_moniteur_by_code(request,cd_mon)
type_planning = moniteur.PLANNING
# lire les semaines type
p_semaines = get_p_semaines(request, type_planning)
semaine = ''
return {
'page_title': "Activités de %s (agence %s)" % (cd_mon, agence),
'url': url,
'datePlan': datePlan.strftime('%Y-%m-%d'),
'message': message,
'calendar_events': calendar_events,
'moniteurs': moniteurs,
'cd_mon': cd_mon,
'type_planning': type_planning,
'agence' : agence,
'p_semaines': p_semaines,
'semaine': semaine,
'QTE': QTE,
}
@view_config(route_name='activ_edit', renderer='../templates/planning/activ_edit.pt')
def activ_edit(request):
logged_in = request.authenticated_userid
cd_mon,cd_mon_B78 = get_user_cd_mon(request, logged_in)
no_ligne = request.matchdict['no_ligne']
rdvb = get_rendezvous_by_noligne(request, no_ligne)
url = request.route_url('activ_edit', no_ligne=no_ligne)
location = request.route_url("planifier", cd_mon=rdvb.CD_MON, date=rdvb.DATE.strftime('%Y-%m-%d'))
message = ''
if 'form.submitted' in request.params:
qte = int(request.params['QTE'])
if qte < 1 or qte > 12:
message = "Le nombre d'heures est incorrect"
else:
update_rdvb(request, no_ligne, rdvb.CD_CLI, rdvb.CD_CLI, rdvb.DATE.strftime('%Y-%m-%d'), rdvb.NoPlan, qte,
rdvb.REF, rdvb.CD_MON, rdvb.AGENCE, request.params['COMMENT'], 0, 0, 0, rdvb.cd_cli_old, logged_in)
request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success')
return HTTPFound(location=location)
if 'form.deleted' in request.params:
# user autorisé ?
userAcces = get_user_access(request, logged_in)
if userAcces < 6:
message = "Vous n'êtes pas autorisé à effectuer cette opération !"
else:
delete_eleve_cpt(request, no_ligne, rdvb.CD_CLI, rdvb.NoPlan, rdvb.STATUT, rdvb.CD_UTI)
request.session.flash(u"Le rendez-vous a été supprimer avec succès.", 'success')
return HTTPFound(location=location)
return {
'page_title': 'Activité du %s à %s h' % (rdvb.DATE.strftime('%d-%m-%Y'), rdvb.NoPlan),
'url': url,
'rdvb': rdvb,
'message': message,
'back' : location
}