
#  Nouveau système de gestion des absences (mars 2014) 
Page discutant les spécifications et l'implémentation d'un nouveau système de suivi des absences dans ScoDoc, basé sur le calendrier emplois du temps.


L'objectif est de remplacé le système actuel par une gestion:
 * basée sur des "événements" d'absence (ou présence), de durée arbitraire.

 * liée aux emplois du temps, supposés disponibles en format ics quelque part (on indique à ScoDoc l'URL du calendrier de chaque semestre).

(un fonctionnement sans emploi du temps sera bien entendu proposé: dans ce cas, le système ressemblera à l'actuel, avec la possibilité d'indiquer la durée de l'absence.)


##  Vocabulaire 
 module::
  un module d'enseignement dans un semestre donné (un `moduleimpl`).

 EDT::
  l'emploi du temps, constitué d'un ensemble de *plages*. Obtenu au format ics (iCalendar) à partir d'un logiciel de gestion d'emploi du temps (GPU, CELCAT, HyperPlanning, ...). 

 Plage (d'emploi du temps)::
  aussi appelé "événement": un enseignement, avec heures de début et de fin, groupe d'étudiant concerné et (facultatif) module et enseignant.

 Absence::
  un événement, donnant l'absence d'un étudiant à une date et heure donnée. Peut être associé (ou non) à un module, enseignant (et groupe ?)

 Justificatif::
   la justification d'une absence (concrétisée par un certificat médical, par exemple). Etudiant, date, heure, durée, motif.



#  Fonctionnalités attendues par les utilisateurs 
##  Obtention d'information 

1.1 Afficher le nombre d'heures absences pour un étudiant 
        sur une période donnée, le nombre d'heures justifiées et non justifiées.
        > Permissions: View

1.2 Afficher, pour un étudiant, le nombre d'heures d'absence dans chaque module
        > Permissions: View

1.3 Visualiser les absences d'un étudiant sous forme de calendrier.
        > Permissions: View

1.4 Présenter à un enseignant les plages horaires qu'il peut (et doit) renseigner)   
 
1.5 Contrôle d'accès: interdire à un enseignant normal de saisir des absences en dehors de ses plages d'intervention;
 
1.6 Lister les plages pour lesquelles les absences n'ont pas été renseignées.



##  Signalement des absences & justificatifs

2.1 Signaler une absence de 'x' minutes à partir de telle jour et heure (dt)
    avec ou sans spécifier le module et l'enseignant.
     > Permissions: Admin, Secr, resp. semestre,  ou 'enseignant dans le module concerné' (restriction paramétrable car impose forte contrainte, eg EDT à jour).

  NB: <img src="/img/alert.png" style="vertical-align: bottom; margin:0 0 0 0;" alt="/!\" /> Attention aux chevauchements: si une absence existe déjà, la supprimer (?)

  *On peut avoir création de 3 absences: si absent sur [t0, t1] et qu'on ajoute [t2, t3] tel que t2 > t0 et t2 < t1 et t3 < t1.
  L'ajout fera la vérification (=> verrouillage, plusieurs requêtes, écriture des absences, invalider les caches)
  Objectif: garantir l'absence de chevauchements, pour calculer efficacement les heures.*

2.2 Supprimer une absence (interface: proposer de noter une présence ?)
       > Permission:  Admin, Secr, responsable semestre, utilisateur ayant saisi l'absence (ou enseignant du module concerné ?)
       
   *Problème: retrouver le semestre: que faire si l'étudiant est à cette date inscrit à plusieurs semestres ?* (cas rare, on peut autoriser les responsables de chaque semestre ?)


2.3 Enregistrer un justificatif pour un étudiant, de dt0 à dt1 (en général, d'un jour à 0h pour n jours ou *m* demi-journées)

  voir comment on code les justificatifs (dt, durée avec presque toujours t=0h, et durée=24h ?)
  > Permission: Admin, Secr.



##  Présences 
Les présences ne sont actuellement pas enregistrées dans ScoDoc 7. 
*Je crains que cela n'alourdisse l'interface utilisateur, pour un besoin assez rare.*
# > à implémenter dans un deuxième temps ?

3.1 Signaler la présence d'un étudiant (mêmes infos qu'une absence)
      > Permission: comme ajout absence

3.2 Calculer le nombre d'heures de présence d'un étudiant, par module ou total du semestre.
      > Permission: View

3.3 Lister les modules d'un semestre qui n'ont pas eu de présents (pour le suivi des relevés)
      > Permission: View



#  Notes sur l'implémentation 
Absence:   
Attributs d'une absence: 
```
  dt  : datetime (jour et heure) de début de l'evènement
  durée: (en secondes)
  etat: flag, present|absent
  entry_date: date de saisie (timestamp)
  entry_user: utilisateur ayant saisi
  Champs optionnels:
   description: texte libre
   moduleimpl_id : module concerné par l'absence
   ens_id: enseignant concerné par l'absence (= celui qui donnait le cours manqué)
   module_code: le code (acronyme) du module (il peut arriver que l'on récupère ce code via l'EDT mais que l'on n'ait pas la correspondance dans les modules ScoDoc: c'est quand même compté pour le total d'heures d'absences.
```

Si "jour" entier d'absence: 
    t=0h, durée=24h (ou n*24h si plusieurs jours), moduleimpl_id, ens_id non renseignés.
Comment calculer les heures ?
   si emploi du temps:  prendre chaque groupe g auquel appartient l'étudiant, et sommer les heures.
   (-> demander à l'EDT: liste de modules enseignés dur t0, t1 au groupe g)
  
   ok si l'EDT est bien renseigné, et que l'on a tous les groupes. Attention: chaque plage EDT ne doit concerner qu'un groupe.

Le calcul est fait au moment de la saisie de l'absence: lire l'EDT et générer des événements, 1 par plage edt.

Si on n'a pas d'EDT ? afin de retrouver le comportement antérieur de ScoDoc, on génère deux absences par jour (matin: 8h-12h, après-midi: 13h-17) (paramétrable).

Afin de garantir le sérieux des informations saisies, on interdira la saisie d'absences dans le futur (on ne fait que constater les absences passées)

 * Calcul nombre d'heures d'absence sur [dt0, dt1]:
```
  select sum(durée) from absences where dt > t0 et dt < t1 et etudid=xxx
```

 * Calcul nombre d'heures d'absence *non justifiées* sur [dt0, dt1]:
```
  - liste des absences pour cet etudiant sur [dt0, dt1]  (caché par semestre)
  - liste des justificatifs pour cet etudiant sur [dt0, dt1] (caché par semestre)
  - calcul sur les intervalles de temps 
```



#  Spécification des fichiers Emplois du Temps (ics) 
Un calendrier EDT est un ensemble d'évènements (date début, date fin, attributs).

On donne utilise un seul calendrier ics par semestre, qui donne l'emplois du temps de tous le semestre (voir toute l'année, peu importe).
Les événements ics doivent avoir des attributs permettant de retrouver:
 * les enseignants (login dit "`login_edt`", utilisé par le logiciel d'emplois du temps, et mis en correspondance avec le login ScoDoc)
 * le groupe (ScoDoc offre une table de transcodage `groupe_edt <-> groupe_ScoDoc`,  s'ils n'ont pas les mêmes noms dans les 2 logiciels)
 * le code module (idéalement, le même que le module.code de ScoDoc, mais on pourait envisager transcodage)

Les fonctions extrayant ces trois informations des événements ics pourront être définies par l'établissement utilisateur. A l'IUTV, les ics (extraits de GPU et retraités par EDT+) comprennent les champs:
`X-GROUP-ID`, `X-MODULE-CODE`, et `X-LOGIN-ENSEIGNANTS`

*Attention: un évènement EDT ne peut concerner qu'un seul groupe d'étudiants, mais peut faire intervenir plusieurs enseignants.*




#  TODO 
* détailler permissions pour chaque opération (eg: saisie absence: seulement dans certains modules ?)


* options d'affichage (bulletins, PV): unité de compte (heures, 1/2 journées ou journées)


####  Interface utilisateur (anciennes remarques à revoir) 
L'enseignant voit dans son tableau de bord semestre:

 * la liste de ses séances où ont été saisies des absences;
 
 * la liste des séances où il doit saisir des absences.

 * Pour le directeur d'étude/secrétariat : justification de l'absence avec un champ
commentaire pour le motif ou des cases type santé avec certificat médical, famille, 
permis de conduire etc.

 * Les absences d'au moins deux jours consécutifs devrait être mémorisés tels quels pour affichage
ultérieur

 * Il faudrait que les absences aux contrôles soient reportés automatiquement dans le système
d'absence, les enseignants ne devraient pas avoir à faire une double saisie d'absence et dans
la case correspondant à la notes ABS.

