#!/usr/local/sisis-pap/bin/perl -w
#
# Realisierung einer cgi-Schnittstelle zur Sisis-Datenbank
# Zweck: Suchen von Namen, Benutzernummern. Auth. von Bennr/Pwd.
# 
# Ausgabe des Programmes in html.
# Codes zur Programm-Weiterverarbeitung als Kommentar im html:
# Erfolgreich: <!--returncode:OK--> findet sich im html-Quelltext
# Fehler:      <!--returncode:ERROR--> findet sich im html-Quelltext
# Diese Codes sind umdefinierbar
#
# misc, 9/07
#

use lib "/usr/local/sisis-pap/lib/perl5/site_perl/5.8.8/i686-linux-thread-multi-ld";
use lib "/usr/local/sisis-pap/lib/perl5/site_perl/5.8.8";
use lib "/usr/local/sisis-pap/lib/perl5/site_perl";

use DBI;
use CGI;
our $version="$0, 1.0, 9/07, Michael.Schaarwaechter\@ub.uni-dortmund.de";
our $query=new CGI;
our $servername;

# Config Start ###############

# Passwort welches per POST/GET mitgeliefert werden muss (accesspassword=...), damit Anfrage authentifiziert ist
our $accesspassword="main-access-passwort";

# Eigene URL fuer Weiterverzweigung von Benutzernamensuche auf Benutzerdatenanzeige
our $ownurl=qq#/cgi-bin/sisiscgi.pl#; 

# Codes im html-Text, mit denen maschinell das Ergebnis der Anfrage geprueft werden kann
# Nicht aendern, da diese in anderen Programmen verwendet werden!
our $codeerror=qq#<!--returncode:ERROR-->#;
our $codesuccess=qq#<!--returncode:OK-->#;
our $codesperre=qq#<!--geperrt:ja-->#;
our $codenosperre=qq#<!--gesperrt:nein-->#;

# Datenbankzugriff
our $dbuser = "sisis";    
our $dbpassword ; # wird ganz unten festgelegt 
my $conn       = "dbi:Sybase:server=sisisSYB;database=sisis";
$ENV{'SYBASE'} = '/opt/sybase';

# Config Ende ################

# ------------------------------------------------------
sub datum {

   my @time;
   @time=localtime;

   my $y=$time[5]+1900;
   my $m=$time[4]+1;
   my $d=$time[3];
   my $hour=$time[2];
   my $min=$time[1];
   my $sec=$time[0];
   $sec="0".$sec if (length($sec)==1);
   $min="0".$min if (length($min)==1);
   $hour="0".$hour if (length($hour)==1);
   $d="0".$d if (length($d)==1);
   $m="0".$m if (length($m)==1);

   return $d.".".$m.".".$y." ".$hour.":".$min.":$sec";
}

# ------------------------------------------------------
sub openconnection {
   our $dbh = DBI->connect($conn, $dbuser, $dbpassword, {ChopBlanks=>'true'} ) or die "Abbruch bei connect : $DBI::errstr\n";
}
# ------------------------------------------------------
sub closeconnection {
   $dbh->disconnect;
}
# ------------------------------------------------------
sub ausgabestart {
   my $title = (shift or "Sisis-Benutzer-Recherche");

   print $query->header;

   print << "EOT";
             <!DOCTYPE  HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
             <html>
             <head>
                <TITLE>$title</TITLE>
                <META NAME="author" CONTENT="$0, $version, Michael Schaarwaechter">
                <META NAME="copyright" CONTENT="Michael Schaarwaechter">
                <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type">
                <style type="text/css"> <!--
                   /*  spezielle CSS-Formate */
                   body {
                         font-family:Helvetica,Arial,sans-serif;
                         font-size:medium;
                         background-color:#FFFFFF;
                        }
                   h1 {
                         font-size:x-large;
                        }
                   h2 {
                         font-size:large;
                        }
                   h3 {  font-size:larger;
                        }
                   th { white-space:nowrap;
                      }
                   .klein {
                         font-size:75%;
                        }
                   .nowrap {
                          white-space:nowrap;
                        }
                   img {
                         border:none;
                        }
                   hr {
                         color:#6699CC;
                        }
                   .rechts {
                         text-align: right;
                        }
                   .signatur {
                         font-size:x-small;
                        }
                   .links {
                         text-align: left;
                        }
                   .center {
                         width: 50%;
                         margin-left: auto;
                         margin-right: auto;
                        }
                   .fixed {
                         font-family:Courier,monospace;
                        }
                   .rot {
                         color:red;
                        }
                   .gruen {
                         color:green;
                        }
                   .bggelb {
                         background: yellow;
                        }
                   .bggruen {
                         background: #B3E6C2;
                        }
                   .bgrot {
                         background: red;
                        }
                   .bghellblau {
                         background: #ECF2F9;
                        }
                   .bgorange {
                         background: #FFE600;
                        }
                   .bggrau {
                         background: #DADADA;
                        }
                   .rahmen {
                         border-width:1px;
                         border-style:solid;
                         border-color:#6699CC;
                        }
                 --> </style>
             </head>
             <body>
EOT
}
# ------------------------------------------------------
sub ausgabeende {

   print qq#<p class="signatur">$version am #.&datum ;
   print $query->end_html;
}
# ------------------------------------------------------
sub fehler {
   my $meldung=shift || "Falsche(r) oder fehlende(r) Parameter! Bitte Rücksprache mit EDV.";
   print qq#<h1><span class="rot">Fehler</span>: $meldung </h1>#;

}
# ------------------------------------------------------
sub auth {
   if ( (not defined $query->param("user")) or
        (not defined $query->param("pass")) ) {
      &fehler("Benutzernummer und/oder Passwort fehlen!");
      return;
   }
   my $user=$query->param("user");
   my $pass=$query->param("pass");

   if (not $user=~m/^\d+$/) {
      &fehler("Benutzernummern sind rein numerisch!");
      return;
   }
   while (length($user)<11) {$user="0".$user}

   &openconnection;
   my $select= q{
      select d02bnr,d02opacpin,d02sp1 from d02ben where d02bnr=? and d02bg<80 and d02bg !=41
               };
   my $sth = $dbh->prepare($select) or die "Can't prepare statement: $DBI::errstr";
   $sth->execute($user) or die "Can't execute statement: $DBI::errstr";
   my ($gotbnr,$gotpwd,$gotsperre) = $sth->fetchrow_array;
   $sth->finish;   
   &closeconnection;

   print qq#<h1>Recherche nach Benutzernummer/Passwortkombination</h1>#;
   print qq#<table class="rahmen"><tr><td>Server: </td><td>$servername</td></tr>
                                  <tr><td>Benutzernummer: </td><td>$user</td></tr>
                                  <tr><td>Passwort: </td><td>$pass</td></tr>
                                  <tr><td>Ergebnis: </td><td>#;

   if ($user ne $gotbnr) {
      print qq#<span class="bgrot">Fehler: Die Benutzernummer wurde nicht gefunden!$codeerror#;
   } elsif ($pass ne $gotpwd) {
      print qq#<span class="bgrot">Fehler: Das Passwort passt nicht zur Benutzernummer!$codeerror#;
   } else {
      print qq#<span class="bggelb">OK: Das Passwort passt zur Benutzernummer.$codesuccess#;
   }
   print qq#</span></td></tr>#;

   if ($user eq $gotbnr) {
      if ($gotsperre) {
         print qq#<tr><td>Sperre: </td><td><span class="bgrot">Benutzer ist gesperrt!$codesperre</span></td></tr>#;
      } else {
         print qq#<tr><td>Sperre: </td><td><span class="bggelb">Benutzer ist nicht gesperrt!$codenosperre</span></td></tr>#;
      }
   }

   print qq#<tr><td>Stand</td><td>#.&datum.qq#</td></tr>#;
   print qq#</table>#;
}
# ------------------------------------------------------
sub getbendata {

   my %felderhash=( 
             "d.d02bnr" => "Benutzernummer",
             "d.d02vname" => "Vorname",
             "d.d02name" => "Nachname",
             "d.d02o1" => "Wohnort 1",
             "d.d02s1" => "Strasse 1",
             "d.d02p1" => "PLZ 1",
             "d.d02anrede" => "Anrede",
             "d.d02gedatum" => "Geb.Datum",
             "d.d02ladatum" => "Letzte Aktivit&auml;t",
             "d.d02awdatum" => "Ausweisg&uuml;ltigkeit",
             "d.d02so1" => "Kontostand Geb&uuml;hren",
             "d.d02avanz" => "Kontostand Ausleihen",
             "d.d02pflanz" => "Kontostand PFL",
             "d.d02vlanz" => "Anzahl akt. Verl&auml;ngerungen",
             "d.d02branz" => "Anzahl akt. Buchr&uuml;ckforderungen",
             "d.d02maanz" => "Anzahl gemahnter Medien",
             "d.d02sp1" => "Sperrgrund 1",
             "d.d02sp2" => "Sperrgrund 2",
             "d.d02d1sperre" => "Datum Sperre 1",
             "d.d02d2sperre" => "Datum Sperre 2",
             "d.d02datauf" => "Datum der Aufnahme",
             "d.d02bg" => "Benutzergruppe (Nr)",
             "d.d02sex" => "Geschlecht",
             "d.d02fakul" => "Fakult&auml;t",
             "d.d02jgdatum" => "F&auml;lligkeit Jahresentgelt",
             "d.d02opacpin" => "Opac-PIN",
             "d.d02sljanz" => "Ausleihz&auml;hler lfd. Jahr",
             "d.d02svjanz" => "Ausleihz&auml;hler Vorjahr",
             "d.d02pinfalsch" => "PIN-Falscheingabe",

             "z.d02z_bnr" => "Benutzernummer",
             "z.d02fremd_nr" => "Matrikelnummer",
             "z.d02z_str" => "Strasse (2)",
             "z.d02z_plz" => "PLZ (2)",
             "z.d02z_ort" => "Ort (2)",
             "z.d02anschr" => "Zusatz",
             "z.d02z_anschr" => "Zusatz (2)",
             "z.d02tel" => "Telefon",
             "z.d02z_tel" => "Telefon (2)",
             "z.d02fax" => "Fax",
             "z.d02z_fax" => "Fax (2)",
             "z.d02z_mobil" => "Mobil-Nr",

             "g.d61bgr" => "Benutzergruppe",
             "g.d61gruppe" => "Benutzergruppe (Name)"
      );

   my @ausgabereihenfolge=qw(d.d02anrede d.d02vname d.d02name d.d02sex d.d02bg g.d61gruppe d.d02fakul z.d02fremd_nr d.d02opacpin d.d02pinfalsch d.d02ozeile z.d02anschr d.d02s1 d.d02p1 d.d02o1 z.d02z_mobil z.d02tel z.d02fax z.d02z_anschr z.d02z_str z.d02z_plz z.d02z_ort z.d02z_tel z.d02z_fax d.d02gedatum d.d02datauf d.d02jgdatum d.d02sp1 d.d02d1sperre d.d02sp2 d.d02d2sperre d.d02ladatum d.d02awdatum d.d02so1 d.d02avanz d.d02pflanz d.d02vlanz d.d02branz d.d02maanz d.d02sljanz d.d02svjanz );

   my $rot="d.d02sp1 d.d02sp2"; # Roter Hintergrund bei diesen Feldern, durch Leerzeichen getrennt
   my $gelb="d.d02opacpin d.d02vname d.d02name"; # Gelber Hintergrund, dito

   my @felderarray=(sort keys %felderhash);
   my $felderstring=join(", ", @felderarray);

   if (not defined $query->param("user"))  {
      &fehler("Benutzernummer fehlt!");
      return;
   }
   my $user=$query->param("user");
   if (not $user=~m/^\d+$/) {
      &fehler("Benutzernummern sind rein numerisch!");
      return;
   }
   while (length($user)<11) {$user="0".$user}

   &openconnection;
   my $select= qq{
      select $felderstring from d02ben as d, d02zus as z, d61bgr as g where d02bnr=? and d.d02bnr=z.d02z_bnr and g.d61bgr=d.d02bg
                };

   my $sth = $dbh->prepare($select) or die "Can't prepare statement: $DBI::errstr";
   $sth->execute($user) or die "Can't execute statement: $DBI::errstr";
   my @ergebnisarray = $sth->fetchrow_array;
   my %ergebnishash;
   if (scalar(@ergebnisarray)) {
      foreach my $bezeichner(sort keys %felderhash) {
         $ergebnishash{$bezeichner} = shift @ergebnisarray;
      }
   } 
   $sth->finish;

   print qq#<h1>Recherche nach Benutzerdaten</h1>#;
   print qq#<table class="rahmen"><tr><td>Server: </td><td>$servername</td></tr>
                                  <tr><td>Benutzernummer: </td><td><span class="bggelb">$user</span></td></tr>#;

   if ($user ne $ergebnishash{"d.d02bnr"}) {
      print qq#<tr><td>Ergebnis: </td><td><span class="bgrot">Fehler: Die Benutzernummer wurde nicht gefunden!$codeerror</span></td></tr>#;
   } else {
      # E-Mail-Adressen holen
      $select= qq{
         select d02obnr,d02oart,d02ozeile from d02onl where d02obnr=?
                };
      $sth = $dbh->prepare($select) or die "Can't prepare statement: $DBI::errstr";
      $sth->execute($user) or die "Can't execute statement: $DBI::errstr";
      while (my ($obnr,$oart,$ozeile)=$sth->fetchrow_array) {
         if ($oart eq "1") {
            $felderhash{"d.d02ozeile"}="E-Mail";
            $ergebnishash{"d.d02ozeile"}.=" $ozeile";
         }
      }
      $sth->finish;

      # Sperrgruende holen
      if (($ergebnishash{"d.d02sp1"} or $ergebnishash{"d.d02sp2"})) {
         $select= qq{
            select d65text from d65param where d65typ=2 and d65nr=?
                   };
         $sth = $dbh->prepare($select) or die "Can't prepare statement: $DBI::errstr";
         foreach $sperre("d.d02sp1","d.d02sp2") {
            if ($ergebnishash{$sperre}) {
               $sth->execute($ergebnishash{$sperre}) or die "Can't execute statement: $DBI::errstr";
               my ($sperrgrund)=$sth->fetchrow_array;
               $sperrgrund="?" if (not $sperrgrund);
               $ergebnishash{$sperre}.= " = $sperrgrund";
            }
         }
         $sth->finish;
      }

      # Anrede holen
       if ($ergebnishash{"d.d02anrede"}) {
         $select= qq{
            select d65text from d65param where d65typ=1 and d65nr=?
                   };
         $sth = $dbh->prepare($select) or die "Can't prepare statement: $DBI::errstr";
         $sth->execute($ergebnishash{"d.d02anrede"}) or die "Can't execute statement: $DBI::errstr";
         my ($anredetext)=$sth->fetchrow_array;
         $anredetext="?" if (not $anredetext);
         $ergebnishash{"d.d02anrede"}.= " = $anredetext";
         $sth->finish;
      }

      # Ausgabe
      my $bg;
      foreach $bezeichner(@ausgabereihenfolge) {
         $bg="";
         $bg=qq# class="bgrot"# if ($rot=~m/$bezeichner/);
         $bg=qq# class="bggelb"# if ($gelb=~m/$bezeichner/);
         print qq#<tr><td>$felderhash{$bezeichner}</td><td><span $bg>$ergebnishash{$bezeichner}</span></td></tr>\n# if ($ergebnishash{$bezeichner});
      }
   }
   print qq#<tr><td>Stand</td><td>#.&datum.qq#</td></tr>#;
   print qq#</table>#;

   &closeconnection;
            
}
# ------------------------------------------------------
sub getnames {
   my ($vnam,$nnam,$vnam2show,$nnam2show);
   my $formstart=<<FS;
<form action="$ownurl" method="POST">
<input type="hidden" name="order" value="getbendata">
<input type="hidden" name="accesspassword" value="$accesspassword">
<input type="hidden" size="70" name="user" value=
FS
   my $formende=<<FE;
>
<input type="submit" class="button" value="Mehr..." title="Daten holen">
</form>
FE

   if ( 
        ((not defined $query->param("vnam") and (not defined $query->param("nnam"))))
        or
        ((length($query->param("vnam"))<3) and (length($query->param("nnam"))<3))
      ) {
      &fehler("Bitte mindestens drei Buchstaben bei Vor- und/oder Nachnamen eingeben!");
      return;
   }
   if ( ($query->param("vnam")!~m/^[a-zöäüA-ZÖÄÜß]*$/) or ($query->param("nnam")!~m/^[a-zöäüA-ZÖÄÜß]*$/) ) {
      &fehler("Bitte nur Buchstaben eingeben. Trunkierung erfolgt automatisch.");
      return;
   }

   if (not $query->param("vnam"))  {
      $vnam=q#%#;
      $vnam2show="*";
   } else {
      $vnam2show="*".$query->param("vnam")."*";
      $vnam=q#%#.lc($query->param("vnam")).q#%#;
   }
   if (not $query->param("nnam"))  {
      $nnam=q#%#;
      $nnam2show="*";
   } else {
      $nnam2show="*".$query->param("nnam")."*";
      $nnam=q#%#.lc($query->param("nnam")).q#%#;
   }

#system("echo piep1 >> /tmp/blah.txt");

   &openconnection;
   my $select= qq#
      select d02bnr,d02vname,d02name from d02ben where lower(d02vname) like ? and lower(d02name) like ? order by d02name
               #;
#system("echo $select >> /tmp/blah.txt");
   my $sth = $dbh->prepare($select) or die "Can't prepare statement: $DBI::errstr";
#system("echo piep2 >> /tmp/blah.txt");
   $sth->execute($vnam,$nnam) or die "Can't execute statement: $DBI::errstr";
#system("echo piep3 >> /tmp/blah.txt");
   print qq#<h1>Recherche nach Benutzernummern</h1>#;
   print qq#<table class="rahmen"><tr><td>Server: </td><td>$servername</td><td>&nbsp;</td><td>&nbsp;</td></tr>
                                  <tr><td>Suche nach</td><td>Vorname=<i>$vnam2show</i></td><td>Nachname=<i>$nnam2show</i></td><td>&nbsp;</td></tr>
                                  <tr><th>Benutzernummer</th><th>Vorname</th><th>Nachname</th><th>&nbsp;</th></tr>#;
   my ($gotbnr,$gotvnam,$gotnnam);
   my $counter=0;
   while ( ($gotbnr,$gotvnam,$gotnnam) = $sth->fetchrow_array ) {
      print qq#<tr><td>$gotbnr</td><td>$gotvnam</td><td>$gotnnam</td><td>$formstart"$gotbnr"$formende</td></tr>#;
      $counter++;
   }
   if (not $counter) {  
      print qq#<tr><td>Keine Ergebnisse!</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>#;
   }
   print qq#<tr><td>$counter Ergebnisse</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr># if ($counter);
   print qq#<tr><td>Stand</td><td>#.&datum.qq#</td><td>&nbsp;</td><td>&nbsp;</td></tr>#;
   print qq#</table>#;

   $sth->finish;
   &closeconnection;

}
# ------------------------------------------------------
# ------------------------------------------------------

open PIPE,"uname -n|";
$servername=<PIPE>;
chomp $servername;
close PIPE;

$dbpassword="einpasswort" if ($servername eq "unsertestserver");
$dbpassword="einanderespasswort" if ($servername eq "unserproduktionsserver");

&ausgabestart;

if (not defined $query->param("accesspassword")) {
   &fehler("Passwort geschützter Zugang, Passwort fehlend!");
} elsif ($query->param("accesspassword") ne $accesspassword) {
   &fehler("Passwort geschützter Zugang, Passwort falsch!");
} else {
   if (not defined $query->param("order")) {
      &fehler;
   } elsif (lc($query->param("order")) eq "auth") {
      &auth;
   } elsif (lc($query->param("order")) eq "getbendata") {
      &getbendata;
   } elsif (lc($query->param("order")) eq "getnames") {
      &getnames;
   }
}

&ausgabeende;
