#!/usr/bin/perl

###########################################################################
#
# Script Perl permettant de definir un formulaire et des routines associees
# pour permettre aux etudiants d'obtenir leur note a un travail ou examen.
#
# Auteur: Guy Tremblay
# Creation: Automne 1996
# Revision: Hiver 1997
# Revision pour utilisation d'un combo-form: Automne 1997
#
###########################################################################


###########################################################################
# 
# Variables a definir:
#   $nomProf: 
#      nom du prof
#   $adresseProf: 
#      adresse electronique du prof
#
#   $cours: 
#      sigle de cours, e.g., MAT3143
#   $groupe:
#      numero du groupe
#
#   $sorteNote:
#      travail | examen | litterale
#   $nomTravailOuExamen:
#      exemple: TP1, TP2, intra, final, etc.
#   noteMaximale:
#       note maximale possible pour un travail ou examen
#       (Peut etre omis dans le cas de la note finale litterale)
#
#   numNote:
#      numero de la note desiree parmi les diverses notes.
#      (les numeros debutent a 1)
#       NOTE: Voir mk-obtenir-note.pl pour le format du fichier.
#
#   messageAuRevoir: Formule a utiliser pour terminer le message electronique,
#                    envoye a l'etudiant. Par exemple: "Au revoir!", 
#                    "Bonnes vacances!", etc.
#
#   separateur: Caractere utilise pour separer les divers champs.
#               Par defaut = "\t"
#
###########################################################################

$nomProf = "Guy Tremblay";
$adresseProf = "tremblay.guy\@uqam.ca";

$cours = "INF4110";
$groupe = "10";

$sorteNote = "litterale";
$nomTravailOuExamen = "intra";
$noteMaximale = 90;

$numNote = 1;

$messageAuRevoir = "Joyeuses Fetes!";

$separateur = ":";

###########################################################################

###########################################################################
#
# Le format du fichier "notes-$cours-$groupe.txt" doit etre le suivant:
#
#     CodePermanent  Nom*Prenom note1  note2  ...  notek
#        .            .           .      .           .
#        .            .           .      .           .
#        .            .           .      .           .
#
# Les differents champs doivent etre separes par des caracteres de tabulation.
# (Il doit y avoir au moins une tabulation qui separe les differents champs.
#  Il peut aussi y en avoir plusieurs.)
# Les notes sont des chaines et peuvent donc etre numeriques ou litterales.
# 
# Note: Un autre separateur peut etre utilise mais doit etre specifie
#  au moment de l'appel du script.
#
# Exemple (partiel) d'un fichier approprie obtenu a partir d'un fichier
# Microsoft Works sauve en mode texte avec tabulation comme separateur
# ou d'un fichier creer a partir de celui obtenu du registraire:

# CODE-PERMAN   NOM                 TP1   INTRA 	
# ------------  -----------------   15    25    	
# MAXJ05065801	MAXIMUM*JOE         100.0 80.0
# BELP06096308	BELAIR*PATRICE	    85.0  73.5
# BOUF29086306	BOUIKNI*FARID	    93.5  75.5
# BRUM21627100	BRUNEAU*MARIE-JOSEE 69.4  94.2
#   ...

###########################################################################



$sorteNote =~ y/A-Z/a-z/;

if ($sorteNote eq "travail") {
    $enTeteFormulaire = "Notes du travail $nomTravailOuExamen ($cours, gr. $groupe)";
} elsif ($sorteNote eq "examen") {
    $enTeteFormulaire = "Notes de l'examen $nomTravailOuExamen ($cours, gr. $groupe)";
} elsif ($sorteNote eq "litterale") {
    $enTeteFormulaire = "Notes litt&eacute;rales finales ($cours, gr. $groupe)";    
} else {
    $enTeteFormulaire = "Notes ($cours, gr. $groupe)";    
}
    
if ($sorteNote eq "travail") {
    $nomDeLaNote = "Note du travail $nomTravailOuExamen ($cours, gr. $groupe) [sur $noteMaximale]";
} elsif ($sorteNote eq "examen") {
    $nomDeLaNote = "Note de l'examen $nomTravailOuExamen ($cours, gr. $groupe) [sur $noteMaximale]";
} elsif ($sorteNote eq "litterale") {
    $nomDeLaNote = "Note litterale finale pour $cours (gr. $groupe)";    
} else {
    $nomDeLaNote = "Note pour $cours (gr. $groupe)";    
}

    
if ($sorteNote eq "travail") {
    $demandeFormulaire = "pour le travail $nomTravailOuExamen";
} elsif ($sorteNote eq "examen") {
    $demandeFormulaire = "pour l'examen $nomTravailOuExamen";
} elsif ($sorteNote eq "litterale") {
    $demandeFormulaire = "litt&eacute;rale finale pour $cours";    
} else {
    $demandeFormulaire = "pour $cours";    
}


###########################################################################
###########################################################################

require "ctime.pl";
require "/home2/tremblay_gu/public_html/cgi-bin/cgi-lib.pl";

$fichierNotes = "notes-$cours-$groupe.txt";
$fichierLog = "log-$cours-litterale.txt";

MAIN:
{
	if (&ReadParse(*input))
	{
	    &ProcessForm;
	}
	else
	{
	    &ShowForm;
	}
}

###############################################
#Sous-routine qui affiche la page de courrier.#
###############################################
sub ShowForm
{
	print &PrintHeader;
	print &HtmlTop($enTeteFormulaire);
	print <<EOTA;
	<FORM METHOD=POST>
	<p>
        Si vous d&eacutesirez obtenir votre note $demandeFormulaire, remplissez le formulaire suivant:
 <PRE>
Nom	 		<INPUT TYPE="TEXT" NAME="nom" SIZE=20 VALUE=""> <BR>
Pr&eacute;nom			<INPUT TYPE="TEXT" NAME="prenom" SIZE=20 VALUE=""> <BR>
Code permanent		<INPUT TYPE="TEXT" NAME="code permanent" SIZE=20 VALUE=""> <BR>
Adresse &eacute;lectronique 	<INPUT TYPE="TEXT" NAME="adresse electronique"  SIZE=30 VALUE=""> <BR>
</PRE><P><P><P>
<INPUT TYPE="SUBMIT" VALUE="Envoyer demande">
<INPUT TYPE="RESET" VALUE="Effacer">
</FORM>
EOTA

    print "<P><P><HR><P>";
    print "<A HREF=\"http://www.labunix.uqam.ca/~tremblay_gu/realisation.html\">R&eacute;alisation par G. Tremblay.</A>";


	print &HtmlBot;
}

####################################################################
#Sous-routine qui envoie le courrier formatte vers le destinataire.#
####################################################################
sub ProcessForm
{
    local($nom, $prenom, $adresseEtudiant, $codePermanent);

    $nom = $input{'nom'};
    $prenom = $input{'prenom'};

    $codePermanent = $input{'code permanent'};

    if (! ($codePermanent =~ /[a-zA-Z]{4,4}[0-9]{8,8}/)) {
	&CgiError("Erreur",
		  "Votre demande ne semble pas contenir un code permanent valide (NOMP99999999).",
		  "Refaites une nouvelle demande.",
		  "<HR>");
	exit;
    }

    $adresseEtudiant = $input{'adresse electronique'};
    if (! ($adresseEtudiant =~ /(.*)\@(.*)/)) {
	&CgiError("Erreur",
		  "Votre demande ne semble pas contenir une adresse &eacute;lectronique valide (xxx\@xxx).",
		  "Refaites une nouvelle demande.",
		  "<HR>");
	exit;
    }

    if (! $codeOK) {
    }

    open(QUI, ">> $fichierLog");
    print QUI "[$codePermanent] $nom >> $adresseEtudiant << ";
    print QUI &ctime(time);
    close QUI;

    # Creation et envoi du message contenant la note desiree.
    if (!open(MAILFILE, "> /tmp/mailfile-out.$$")) {
	$erreur = "Can't open mail file\n";
    }
    
    $resultatObtenir = &ObtenirNote($nom, $prenom, $codePermanent, $adresseProf, $fichierNotes, $numNote, $nomDeLaNote);


    print MAILFILE $resultatObtenir;
    print MAILFILE "\n";
    print MAILFILE "$messageAuRevoir\n\n";
    print MAILFILE "$nomProf\n";
    print MAILFILE "$adresseProf\n";
    close MAILFILE;

    open(MAILIT, "/usr/ucb/mail $adresseEtudiant < /tmp/mailfile-out.$$ |");
    close(MAILIT);
    unlink( "/tmp/mailfile-out.$$" );
    
    print &PrintHeader;
    print &HtmlTop("Confirmation de l'envoi");
    print <<EOTD;
    Votre demande a &eacute;t&eacute; transmise &agrave;
    un script et la r&eacute;ponse sera envoy&eacute;e, d'ici 
    quelques minutes, &agrave;
    l'adresse &eacute;lectronique suivante:
    <P><UL> <LI> $adresseEtudiant</UL>
    <P> $erreur <P>
EOTD
    print &HtmlBot;
}


sub ObtenirNote
{
    local($nom, $prenom, $codePermanent, $adresseProf, $fichierNotes, $numNote, $nomDeLaNote) = @_;
    $nom =~ y/a-z/A-Z/;
    $codePermanent =~ y/a-z/A-Z/;
    $prenom =~ y/a-z/A-Z/;

    $trouve = 0;
    # On saute par dessus le nom et le code permanent et les numeros
    # de notes debutent a 0.
    $numNote = $numNote + 1; 

    if (! open( FICHNOTES, "<$fichierNotes" )) {
	return "Fichier non trouve!\nContactez le professeur!\n";
    }
    while(<FICHNOTES>) {
	chop $_;
	s/$separateur$separateur*/$separateur/;
	@words = split(/$separateur/, $_);
	if ( ($words[1] =~ /$nom/) ) {
	    if ( $words[0] =~ /$codePermanent/ ) {
		return <<FIN_MM
  Demandeur      = $prenom $nom
  Code permanent = $codePermanent\n
  $nomDeLaNote: $words[$numNote]\n
FIN_MM
	    }			
	}
    }
    
    return <<FIN_M;
  Votre nom ou votre code permanent n'est pas dans la liste.
  Verifiez les informations transmises et envoyez une nouvelle demande.\n
  Si le probleme persiste, envoyez un message a \"$adresseProf\".\n
FIN_M
}
