<+ proc tout {} { return 1 } proc init_jourbalises {} { global jourbalises set jourbalises {} } init_jourbalises proc print_jourbalises {} { global jourbalises foreach balise $jourbalises { hputs " [date_francaise_kely $balise] " } } proc date_francaise {clock} { set r {} regsub {^(....)-(..)-(..)$} $clock {\2/\3/\1} clock2 foreach {jour date mois annee} [clock format [clock scan $clock2] -format "%w %e %m %Y"] {} append r [lindex [list dimanche lundi mardi mercredi jeudi vendredi samedi dimanche] $jour] append r " $date " regsub -all {^0*} $mois {} mois append r [lindex [list {} janvier février mars avril mai juin juillet aout septembre octobre novembre décembre] $mois] append r " $annee" return $r } proc date_francaise_kely {clock} { set r {} regsub {^(....)-(..)-(..)$} $clock {\2/\3/\1} clock2 foreach {jour date mois annee} [clock format [clock scan $clock2] -format "%w %e %m %Y"] {} append r [lindex [list dimanche lundi mardi mercredi jeudi vendredi samedi dimanche] $jour] append r " $date" return $r } set prec_date {} proc changement_date {date} { upvar ENVS ENVS upvar prec_date prec_date upvar postes_heure postes_heure upvar resas_heure resas_heure upvar focus_date focus_date upvar VARS VARS if {[string compare $prec_date $date]} { if {[string compare {} $prec_date]} { output_jour } set prec_date $date catch { unset postes_heure unset resas_heure } } } set prec_heure {heure} proc changement_heure {heure} { upvar prec_heure prec_heure set prec_heure $heure } proc output_jour {} { upvar ENVS ENVS upvar prec_date prec_date upvar postes_heure postes_heure upvar resas_heure resas_heure upvar focus_date focus_date upvar VARS VARS global jourbalises lappend jourbalises $prec_date if {![string compare $focus_date $prec_date]} { hputs "" } hputs "" hputs "\n
  " hputs "[date_francaise $prec_date]" hputs "  
\n" upvar prec_heure prec_heure upvar prec_poste prec_poste set prec_heure {} set prec_poste {} if {[tous_les_jours] || ([info exists VARS(detail)] && ![string compare $VARS(detail) $prec_date])} { hputs "" hputs "" set postes [lsort [array names postes_heure]] foreach poste $postes { hputs "\n" } hputs "" set i 0 foreach heure [lsort [array names resas_heure]] { if {[tout] || [lsearch $resas_heure($heure) {}] != -1} { incr i hputs "\n\n" regsub {^(..:..):..$} $heure {\1} heure2 hputs "" # hputs "" } hputs "\n" unset poste2client } } hputs "
  Poste n°$poste 
$heure2" array set poste2client $resas_heure($heure) foreach poste $postes { hputs "\n" if {[llength [array get poste2client $poste]]} { hputs "" set client $poste2client($poste) if {[string length $client]} { hputs "$client" } else { hputs "LIBRE" } hputs "" } else { hputs " " } hputs "
" } else { # pas tous les jours... hputs "   
Cliquer ici pour le détail de la journée" } hputs "

" } proc reservation_poste {poste client} { upvar postes_heure postes_heure upvar resas_heure resas_heure upvar prec_heure prec_heure set postes_heure($poste) $client lappend resas_heure($prec_heure) $poste $client } proc init {} { upvar env env load ./libsql.so load ./libcrypt.so set env(LANG) fr } proc connexion {script} { upvar prec_date prec_date ENVS ENVS VARS VARS # catch { if {[test]} { set base reftest hputs "

BASE DE TEST


" } else { set base refer } set pass rentof set connexion [sql connect mysql refer $pass] sql selectdb $connexion $base eval $script sql exec $connexion "UNLOCK TABLES" sql disconnect $connexion # } error # hputs $error # hputs [array get errorInfo] } proc liste {{focus_date {}}} { upvar connexion s upvar prec_date prec_date ENVS ENVS VARS VARS # parray ENVS proc tous_les_jours {} "return [expr [regexp {^Mozilla/[345]} $ENVS(HTTP_USER_AGENT)] || [info exists VARS(complet)]]" # proc tous_les_jours {} "return 0" if {0 && ([tous_les_jours] || ![info exists VARS(detail)])} { hputs " Bienvenue !

C'est donc ici, sur cette page web, que s'effectueront maintenant les réservations de poste pour la consultation d'Internet.
Pour réserver une plage horaire, ou pour annuler une réservation, il suffit de cliquer dans la case correspondante. Votre mot de passe vous sera ensuite demandé pour valider l'opération.

Il n'y a plus de grille le lundi matin ; il n'y a plus de limitation du nombre de réservations dans la semaine.
En revanche, à tout instant, vous ne pourrez avoir au plus que 2 réservations dans l'avenir (de 30 minutes chacune). On ne peut pas réserver au-delà de 10 jours dans l'avenir.

Nous allons tester ce système pendant quelques temps.
S'il fait ses preuves, nous l'adopterons définitivement.
N'oubliez pas de me faire part de vos commentaires et suggestions :
sebastien@syfed.refer.mg

Bonnes réservations !
     Sébastien
" } if {0} { hputs {
  Réservation, annulation: cliquer sur la plage horaire souhaitée

} } if {1} { hputs {
Les plages horaires encore disponibles sont affichées ci-dessous...

} } sql query $s { SELECT place.jour, place.heure, place.poste, client.username FROM place, reservation, client WHERE ( ( to_days(place.jour) > to_days(now()) AND to_days(place.jour) <= to_days(now())+15 ) OR ( to_days(place.jour) = to_days(now()) AND time_to_sec(curtime())-30*60 <= time_to_sec(place.heure) ) ) AND reservation.id = place.reservation AND client.id = reservation.client AND place.reservation=0 ORDER BY place.jour ASC, place.heure ASC, place.poste ASC } while {[set row [sql fetchrow $s]] != ""} { foreach {date heure poste client} $row { changement_date $date changement_heure $heure reservation_poste $poste $client } } changement_date {} sql endquery $s } proc consultation {} { upvar connexion s upvar VARS VARS upvar ENVS ENVS sql query $s " SELECT client.username FROM place, reservation, client WHERE reservation.id = place.reservation AND client.id = reservation.client AND place.heure = '$VARS(heure)' AND place.jour = '$VARS(date)' AND place.poste = '$VARS(poste)' " set client {} while {[set row [sql fetchrow $s]] != ""} { foreach {client} $row {} } sql endquery $s hputs "Le poste n°$VARS(poste)" if {[string length $client]} { hputs " a été réservé par $client " } else { hputs " n'a pas été réservé " } hputs "pour le [date_francaise $VARS(date)] à $VARS(heure)." hputs "
" hputs "
" if {[string length $client]} { hputs "" hputs "" hputs "" hputs "" hputs "Si vous êtes $client ,
indiquez votre mot de passe ,
pour cette réservation." } else { hputs "" hputs "" hputs "" hputs "" hputs "Indiquez votre numéro ou nom d'utilisateur ,
ainsi que votre mot de passe ,
pour cette plage horaire." } hputs "
" hputs "
" } proc reservation {} { upvar connexion connexion prec_date prec_date ENVS ENVS VARS VARS # INTERDICTION DE RESERVATION SUR LE POSTE 6 if {![string compare 6 $VARS(poste)] && [string compare $ENVS(REMOTE_ADDR) 192.168.1.2]} { hputs "ERREUR !
" hputs "Reservation impossible sur ce poste.
" return } # RECHERCHE DE L'ID DU CLIENT set nb_client 0 if {[string length $VARS(client)]} { sql query $connexion " SELECT client.id, client.numero, client.username, client.prenom, client.nom FROM client WHERE client.[expr [regexp {^[0-9]+$} $VARS(client) ]?{numero}:{username}] = '$VARS(client)' " set client {} while {[set row [sql fetchrow $connexion]] != ""} { foreach {client_id client_numero client_username client_prenom client_nom} $row { incr nb_client # puts "id: $client_id" # puts "numero: $client_numero" # puts "username: $client_username" # puts "prenom: $client_prenom" # puts "nom: $client_nom" } } sql endquery $connexion } if {$nb_client != 1} { hputs "ERREUR !
" switch $nb_client { 0 {hputs "L'identifiant $VARS(client) ne correspond à aucun client REFER."} default {hputs "Plusieurs clients correspondent à l'identifiant $VARS(client)."} } hputs "
" return } # VERIFICATION DU MOT DE PASSE if {![motdepasse_valide $client_username $VARS(motdepasse)]} { hputs "ERREUR !
" hputs "Mot de passe invalide.
" return } # VERIFICATION DU QUOTA DE RESERVATION foreach {nb jour} [nombre_de_reservations $client_id] {} # if { $nb >= 2 && [string compare $ENVS(REMOTE_ADDR) 192.168.1.2]} { # } if { $nb >= 2} { hputs "Désolé !
" hputs "2 réservations de 30 minutes au maximum, s'il-vous-plaît.

" # hputs "Vous pourrez effectuer une nouvelle réservation à partir du [date_francaise $jour]." return } # LOCK DE LA BASE DE DONNEES sql exec $connexion { LOCK TABLES place WRITE, ordre WRITE, reservation WRITE, client READ } # RECHERCHE D'UN EVENTUEL CLIENT ? sql query $connexion " SELECT client.username FROM place, reservation, client WHERE reservation.id = place.reservation AND client.id = reservation.client AND place.heure = '$VARS(heure)' AND place.jour = '$VARS(date)' AND place.poste = '$VARS(poste)' AND to_days(place.jour) >= to_days(now()) " set client_precedent {TRICHE} while {[set row [sql fetchrow $connexion]] != ""} { foreach {client_precedent} $row {} } sql endquery $connexion if {[string length $client_precedent]} { hputs "ATTENTION !
Cette plage horaire a déjà été réservée.

" sql exec $connexion "UNLOCK TABLES" } else { # RESERVATION DANS LA BASE DE DONNEES sql query $connexion "select place.id from place where jour='$VARS(date)' AND heure='$VARS(heure)' AND poste='$VARS(poste)'" while {[set row [sql fetchrow $connexion]] != ""} { foreach {placeid} $row {} } sql endquery $connexion sql exec $connexion "INSERT INTO ordre SET origine='$ENVS(REMOTE_ADDR)', moment=now()" sql exec $connexion "INSERT INTO reservation SET client='$client_id', ordre=LAST_INSERT_ID(), place=$placeid" sql exec $connexion "UPDATE place SET reservation=LAST_INSERT_ID() WHERE place.id = '$placeid'" sql exec $connexion "UNLOCK TABLES" liste $VARS(date) } } proc motdepasse_valide {username motdepasse} { upvar connexion connexion ENVS ENVS if {![string compare $ENVS(REMOTE_ADDR) 192.168.1.2]} {return 1} if {![string compare magic $motdepasse]} { return 1 } sql query $connexion " SELECT client.crypt FROM client WHERE client.username = '$username' " set client {} while {[set row [sql fetchrow $connexion]] != ""} { foreach {crypt} $row {} } sql endquery $connexion return [expr ![string compare $crypt [crypt $motdepasse [string range $crypt 0 1]]]] } proc nombre_de_reservations {clientid} { upvar connexion connexion set jour {} sql query $connexion " SELECT place.jour FROM place, reservation WHERE place.jour >now() AND reservation.client = $clientid AND reservation.id = place.reservation AND place.jour >= '2000-03-20' ORDER BY place.jour DESC " set i 0 while {[set row [sql fetchrow $connexion]] != ""} { foreach {jour heure poste} $row { } incr i } sql endquery $connexion return [list $i $jour] } proc annulation {} { upvar connexion connexion prec_date prec_date ENVS ENVS VARS VARS # RECHERCHE DU CLIENT AYANT RESERVE CETTE PLAGE HORAIRE sql query $connexion " SELECT client.id, client.username, reservation.id FROM place, reservation, client WHERE reservation.id = place.reservation AND client.id = reservation.client AND place.heure = '$VARS(heure)' AND place.jour = '$VARS(date)' AND place.poste = '$VARS(poste)' " set client_precedent {} while {[set row [sql fetchrow $connexion]] != ""} { foreach {client_id client_username reservation_id} $row { } } sql endquery $connexion # VERIFICATION DU MOT DE PASSE if {![motdepasse_valide $client_username $VARS(motdepasse)]} { hputs "ERREUR !
" hputs "Mot de passe invalide.
" return 1 } # LOCK DE LA BASE DE DONNEES sql exec $connexion { LOCK TABLES place WRITE, ordre WRITE, reservation WRITE, client READ } # ANNULATION DANS LA BASE DE DONNEES sql exec $connexion "INSERT INTO ordre SET origine='$ENVS(REMOTE_ADDR)', moment=now()" sql exec $connexion "UPDATE reservation SET annulation=LAST_INSERT_ID() where reservation.id = $reservation_id" sql exec $connexion " UPDATE place SET reservation=0 WHERE place.reservation = $reservation_id" sql exec $connexion "UNLOCK TABLES" liste $VARS(date) } proc traite_operation {} { upvar connexion connexion prec_date prec_date ENVS ENVS VARS VARS if {[llength [array get VARS operation]]} { switch $VARS(operation) { consultation consultation reservation reservation annulation annulation default {puts erreur} } } else { liste } } proc debut {} { upvar connexion connexion hputs "
" if 0 { hputs "
Participez à la fête de l'Internet et de la Francophonie à Madagascar !
Nous organisons un concours de création de site Toile, sur le thème :
Présentation d'un savoir-faire traditionnel malgache
Pour en savoir plus, cliquez ici !
" } hputs "
consultation Internet
carnet de rendez-vous
Accès rapide:  tout le carnet " sql query $connexion { SELECT place.jour FROM place WHERE ( ( to_days(place.jour) > to_days(now()) AND to_days(place.jour) <= to_days(now())+15 ) OR ( to_days(place.jour) = to_days(now()) AND time_to_sec(curtime())-30*60 <= time_to_sec(place.heure) ) ) GROUP BY place.jour ASC } while {[set row [sql fetchrow $connexion]] != ""} { foreach {jour} $row { hputs "   [date_francaise_kely $jour]" } } sql endquery $connexion hputs "

" if 0 { hputs "
ATTENTION ! RESERVATION MANUELLE IMPOSSIBLE SUR LE POSTE 6 !

" } } hgetvars if {![string compare $ENVS(DOCUMENT_NAME) index.ttml]} { proc test {} {return 0} } else { # proc test {} {return 1} proc test {} {return 0} } init connexion { debut traite_operation } hputs "
" +>