#!/usr/bin/perl -w # # # Dieses Programm erlaubt es, einen Kalender ueber das Web zu pflegen, # in den eine ueberschaubare Anzahl von Leuten Ihre Anwesenheit # eintragen. Sinn: Abteilungsuebersicht 'wer ist da' oder 'wo isser denn' # # Es wird MySQL benoetigt. Ausserdem ein aktuelles Perl bzw ein aktuelles # Modul CGI:Carp. Falls nicht vorhanden, kann die Zeile mit dem Import # des Moduls CGI::Carp qw(fatalsToBrowser warningsToBrowser) geloescht werden. # Dann werden evtl. Fehler aber nicht mehr im Browser angezeigt. # ............................................................................ # Hubert Quint sagt: # Add_Delta_YM($sy,$sm,$sd,0,1) habe ich durch # Add_Delta_YMD($sy,$sm,$sd,0,1,0) ersetzt, bei Suse 7.3 und # dem aelteren Date-Calc gibt es diese Funktion nicht. # Und noch eine Anpassung der Zeile # print "
" . Calendar(Add_Delta_YMD($sy,$sm,$sd,0,1,0));
#     in
#     print "
" . Calendar( (Add_Delta_YMD($sy,$sm,$sd,0,1,0))[0,1] );
#     und ebenso fuer den Monat +2.
#     Damit laeuft das Script auch auf aelteren Installationen.
# ............................................................................
#
# Das Programm ist frei weiterverwendbar unter den folgenden Bedingungen:
# - Bei Veraenderungen bleibt mein Name erhalten
# - Bei Produktionseinsatz erhalte ich eine kurze EMail, wo das Programm
#   eingesetzt wird.
#
# Die Benutzung des Programmes geschieht natuerlich auf eigene Gefahr.
#
# Installation:
# - Script nach cgi-bin kopieren
# - Datenbank weristda in mysql anlegen
# - User weristda in mysql anlegen, mit select, insert, update, delete-Recht in DB weristda
# - Tabellen nach weristda.dump anlegen (mysql -p -u root < weristda.dump)
# - Fehlende Perlmodule installieren (z.B. Date::Calc)
# - Optional:
#   - cgi-bin passwortschuetzen via AuthConfig in Apache
#   - Fuer jeden potentiellen User per htpasswd einen eigenen Account anlegen, Datei z.B. /srv/www/passwd
#   - .htaccess im Verzeichnis mit diesem Programm anlegen wie folgt:
#         AuthName WERISTDA
#         AuthType Basic
#         AuthUserFile /srv/www/passwd
#         require user misc syth (... usw fuer alle user, die eingetragen sind)
#
#   - Vorteil: Usernamen tauchen in der Logtabelle auf
#   - Vorteil: Ein User kann nur seine eigenen Termine anlegen/aendern
#   - Vorteil: Die Userverwaltung kann auf einen User beschraenkt werden
#
# Dieses Script editieren und die Punkte bei "Konfiguration ab hier" anpassen.
#
# Script per Webbrowser als $usereditallow aufrufen und User in weristda eintragen.
#
# Achtung: Von Zeit zu Zeit Tabellengroesse ueberpruefen und alte Termine sowie
#  alte Logeintraege loeschen.
# 
# Bemerkung: Die Farben koennen eine Anpassung vertragen. Das Programm wurde auf einem TFT erstellt (Notebook), wo die
# Farben gut aussehen. Auf CRTs sind sie zu grell. Tip: Suche nach "bgcolor" in diesem Script. 

use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use CGI qw(:standard);
use DBI;
use Date::Calc qw(:all);
use strict;

# -------------Konfiguration ab hier---------------------------------

my $dbuser = "account";
my $dbpassword = "passwort";
my $dbhost = "localhost";
my $db = "weristda";
my $dbport = "3306";

my $eigeneurl='/cgi-bin/weristda/weristda.pl';
my $anzeigeintervall=28;   # In diesem Intervall erfolgt die Anzeige
my $maxfolgetermine=35;    # Maximale Anzahl von Folgeterminen

my $loglevel=1;            # 2=maximal, 1=nur Aenderungen auf Tabellen, 0=nichts wird mitgeschrieben
                           # Achtung: Die logs werden in der Tabelle log mitgeschrieben,
                           # diese muss ab und zu manuell gereinigt werden!

my $usereditallow="name des benutzers, der die userverwaltung benutzen darf";

# --------------bis hier---------------------------------------------

my $version = '1.1, 4/03, Michael@Schaarwaechter.de';
my %userid;
my %username;
my $query = new CGI;   
my $startparam="";
delete @ENV{qw(IFS CDPATH ENV BASH_ENV PATH)}; # Pfad sicher machen
Language(3);  # Deutsche Sprache einstellen
my $remote_user=$query->remote_user || "-"; # Achtung: "-" wird unten mehrfach abgeprueft, nicht aendern!


# -------------------------
sub logentry {
   # Erstellt Eintrag in Logdatei,m abhaengig vom Loglevel
   my ($level,$action)=@_;

   return if ($loglevel < $level);

   my $dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost;port=$dbport",$dbuser,$dbpassword)
   or die "Could not connect: $DBI::errstr\n";
   my $sth = $dbh->prepare( q{
      insert into log (wer,was) values (?,?)
                          } )
   or die "Can't prepare statement: $DBI::errstr";
   $sth->execute($query->remote_host().", ".$remote_user,$action) or die "Can't execute statement: $DBI::errstr";
   $dbh->disconnect;
 
}
# -------------------------
sub ausgabestart {
   print $query->header;
   print $query->start_html(-title=>"WerIstDa",
                            -bgcolor=>"#FFFFCA"); # Hintergrundfarbe der Seite
#   print "

WerIstDa? Die Abteilungs-Zeit-Planung.

"; # warningsToBrowser(1); } # ------------------------- sub ausgabeende { print "

\n"; print ""; print ""; print ""; # print ""; print ""; print "
Informationen über den Client
Remote Host".$query->remote_host()."
Referer".$query->referer()."
User Agent".$query->user_agent(),"
"; print "

Erzeugt von weristda.pl, Version $version
" ; print "Michael Schaarwächter"; print "

\n"; print $query->end_html; } # ---------------------------------------------------------------------- sub feiertag { # Gibt fuer ein Datum den Namen des Feiertages oder leer zurueck my ($y,$m,$d) = @_; return "Neujahr" if ( ($m == 1 ) and ($d == 1 ) ); return "Silvester" if ( ($m == 12) and ($d == 31) ); return "Tag der Arbeit" if ( ($m == 5 ) and ($d == 1 ) ); return "Tag der Einheit" if ( ($m == 10) and ($d == 3 ) ); return "Allerheiligen" if ( ($m == 11) and ($d == 1 ) ); return "Heiligabend" if ( ($m == 12) and ($d == 24) ); return "1. Weihnachtstag" if ( ($m == 12) and ($d == 25) ); return "2. Weihnachtstag" if ( ($m == 12) and ($d == 26) ); my ($ey,$em,$ed) = Easter_Sunday($y); return "Ostersonntag" if ( Delta_Days($ey,$em,$ed,$y,$m,$d) == 0 ); return "Ostermontag" if ( Delta_Days(Add_Delta_Days($ey,$em,$ed,1),$y,$m,$d) == 0 ); # return "(Rosenmontag)" if ( Delta_Days(Add_Delta_Days($ey,$em,$ed,-48),$y,$m,$d) == 0); # return "(Karneval)" if ( Delta_Days(Add_Delta_Days($ey,$em,$ed,-47),$y,$m,$d) == 0); # return "(Weiberfastnacht)" if ( Delta_Days(Add_Delta_Days($ey,$em,$ed,-52),$y,$m,$d) == 0); # return "(Aschermittwoch)" if ( Delta_Days(Add_Delta_Days($ey,$em,$ed,-46),$y,$m,$d) == 0); return "Palmsonntag" if ( Delta_Days(Add_Delta_Days($ey,$em,$ed,-7),$y,$m,$d) == 0); return "Karfreitag" if ( Delta_Days(Add_Delta_Days($ey,$em,$ed,-2),$y,$m,$d) == 0); return "Christi Himmelf." if ( Delta_Days(Add_Delta_Days($ey,$em,$ed,39),$y,$m,$d) == 0); return "Pfingstsonntag" if ( Delta_Days(Add_Delta_Days($ey,$em,$ed,49),$y,$m,$d) == 0); return "Pfingstmontag" if ( Delta_Days(Add_Delta_Days($ey,$em,$ed,50),$y,$m,$d) == 0); return "Fronleichnam" if ( Delta_Days(Add_Delta_Days($ey,$em,$ed,60),$y,$m,$d) == 0); return ""; } # ---------------------------------------------------------------------- sub userverwaltung { my $dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost;port=$dbport",$dbuser,$dbpassword) or die "Could not connect: $DBI::errstr\n"; my $sth = $dbh->prepare( q{ select * from user order by account } ) or die "Can't prepare statement: $DBI::errstr"; my $rc = $sth->execute or die "Can't execute statement: $DBI::errstr"; print "

Userverwaltung

\n"; print qq#

Zurück zum Kalender


\n#; print ""; print "\n"; while ( my ($id,$account,$name,$vorname,$bemerkung,$geloescht) = $sth->fetchrow_array) { print qq#\n#; print qq##; print qq##; print ""; print ""; print qq##; print qq##; print qq##; print ""; print "" if ($geloescht); print "" if (not $geloescht); print ""; print " \n"; } my ($start1,$start2)=split(/=/,$startparam); print qq#\n#; print qq##; print qq##; print ""; print ""; print ""; print qq##; print qq##; print qq##; print ""; print ""; print "
IDAccountVornameNameBemerkungGelöschtAktion
$idJa-"; print qq#\n#; print qq#  Account entlöschen# if ($geloescht); print qq#  Account löschen# if (not $geloescht); print ""; print "
Neu "; print qq#\n#; print ""; print "
\n"; $dbh->disconnect; print <<"USERVINFO";

Achtung!

Einmal angelegte User können mit diesem Programm nur als gelöscht markiert werden!
Als gelöscht markierte User tauchen im Kalender nicht auf, ihre Termine werden nicht angezeigt. Dies kann per 'Entlöschen' wieder rückgängig gemacht werden.
Bitte die Userverwaltung mit Vorsicht benutzen, ein einmal angelegter User kann mit diesem Interface nicht wieder gelöscht werden!!
\n Neue User anlegen: Die Felder Account, Vorname und Name in der unteresten Tabellenzeile füllen und dann auf Zufügen klicken.\n USERVINFO &logentry(2,"Userverwaltung aufgerufen"); } # ---------------------------------------------------------------------- sub userzufuegen { my ($account,$name,$vorname,$bemerkung)=@_; return qq#

User zufügen nicht erlaubt! Bitte $usereditallow fragen!

# if (($remote_user ne $usereditallow) and ($remote_user ne "-")); return qq#

Bitte die Defaulttexte in den Eingabefeldern löschen!

# if ($account=~m/Account/ or $vorname=~m/Vorname/ or $name=~m/Name/); return qq#

Bitte Account eintragen!

# if ($account eq ""); return qq#

Bitte Name eintragen!

# if ($name eq ""); return qq#

Bitte Vorname eintragen!

# if ($vorname eq ""); return qq#

$account schon vorhanden!

# if ($userid{$account}); my $dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost;port=$dbport",$dbuser,$dbpassword) or die "Could not connect: $DBI::errstr\n"; my $sth = $dbh->prepare( q{ insert into user (account,name,vorname,bemerkung) values (?,?,?,?) } ) or die "Can't prepare statement: $DBI::errstr"; $sth->execute($account,$name,$vorname,$bemerkung) or die "Can't execute statement: $DBI::errstr"; $dbh->disconnect; &logentry(1,"User zugefuegt: $account,$name,$vorname,$bemerkung"); return qq#

$account zugefügt!

\n#; } # ---------------------------------------------------------------------- sub userloeschen { my ($loeschen,$id) = @_; return qq#

User löschen nicht erlaubt! Bitte $usereditallow fragen!

# if (($remote_user ne $usereditallow) and ($remote_user ne "-")); my $dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost;port=$dbport",$dbuser,$dbpassword) or die "Could not connect: $DBI::errstr\n"; my $sth = $dbh->prepare( q{ update user set deleted=? where id=? } ) or die "Can't prepare statement: $DBI::errstr"; $sth->execute($loeschen,$id) or die "Can't execute statement: $DBI::errstr"; $dbh->disconnect; &logentry(1,"User geloescht: $id, $username{$id}") if ($loeschen); &logentry(1,"User entloescht: $id, $username{$id}") if (not $loeschen); return qq#

Account mit der ID $id als gelöscht markiert

\n# if ($loeschen); return qq#

Account mit der ID $id entlöscht

\n# if (not $loeschen); } # ---------------------------------------------------------------------- sub useraendern { my ($id,$account,$name,$vorname,$bemerkung)=@_; return qq#

User ändern nicht erlaubt! Bitte $usereditallow fragen!

# if (($remote_user ne $usereditallow) and ($remote_user ne "-")); my $dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost;port=$dbport",$dbuser,$dbpassword) or die "Could not connect: $DBI::errstr\n"; my $sth = $dbh->prepare( q{ update user set account=?,name=?,vorname=?,bemerkung=? where id=? } ) or die "Can't prepare statement: $DBI::errstr"; $sth->execute($account,$name,$vorname,$bemerkung,$id) or die "Can't execute statement: $DBI::errstr"; $dbh->disconnect; &logentry(1,"User geaendert: $id, $account,$name,$vorname,$bemerkung"); return qq#

Account mit der ID $id geändert.

\n# } # ---------------------------------------------------------------------- sub holealleuser { # liefert die Namen aller User, speichert in globalem Hash %user; my $dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost;port=$dbport",$dbuser,$dbpassword) or die "Could not connect: $DBI::errstr\n"; my $sth = $dbh->prepare( q{ select * from user } ) or die "Can't prepare statement: $DBI::errstr"; my $rc = $sth->execute or die "Can't execute statement: $DBI::errstr"; while ( my ($id,$account,$name,$vorname,$bemerkung,$deleted) = $sth->fetchrow_array) { $userid{$account} = $id if (not $deleted); $username{$id} = $account if (not $deleted); } $dbh->disconnect; } # ---------------------------------------------------------------------- sub terminausgabe { # Gibt zu einem Termin und einem User den vollen Eintrag aus, erlaubt edit und loeschen my ($id,$datum)=@_; my ($zeitstempel,$start,$ende,$folgeid,$wo,$text); my $dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost;port=$dbport",$dbuser,$dbpassword) or die "Could not connect: $DBI::errstr\n"; my $sth = $dbh->prepare( q{ select zeitstempel,start,ende,folgeid,wo,text from termine where user_id=? and start=? } ) or die "Can't prepare statement: $DBI::errstr"; my $rc = $sth->execute($id,$datum) or die "Can't execute statement: $DBI::errstr"; ($zeitstempel,$start,$ende,$folgeid,$wo,$text) = $sth->fetchrow_array; if ($rc == 0) { ($zeitstempel,$start,$ende,$folgeid,$wo,$text) = ("Neu",$datum,$datum,int (rand (time())),"Ort",""); } $sth->finish; $dbh->disconnect; my ($y,$m,$d)=split(/-/,$datum); my ($sy,$sm,$sd)=split(/-/,$start); my ($ey,$em,$ed)=split(/-/,$ende); my ($start1,$start2)=split(/=/,$startparam); print "

Terminausgabe für $username{$id} am $d.$m.$y

\n"; print qq#

Zurück zum Kalender

\n#; print <<"TERMININFO";

Termin für diesen Tag: Nur das Feld 'Wo/Was' füllen und ggf. die Bemerkung.
Termine für mehrere Tage, z.B. Urlaub: Auch das Feld 'Endedatum' füllen.
Es wird dann für jeden Tag zwischen Start- und Endedatum inkl. jeweils ein Termin angelegt. Diese Termine erhalten wie alle anderen eine eindeutige ID, bei Terminen über mehrere Tage alle dieselbe ID. Es werden nur maximal $maxfolgetermine Folgetermine angelegt!
Löscht man einen Termin, der über mehrere Tage geht, werden automatisch alle dazugehörigen Termine mitgelöscht!

Pro Tag und User gibt es nur einen möglichen Termin. Grund: Dieses Programm dient der Abteilungs-Planung und nicht der persönlichen Terminplanung. Natürlich kann man einen Termin auch so bezeichnen, dass er ersichtlich z.B. nur für einen halben Tag gilt, etwa 'teilw.' als Ort und im Bemerkungsfeld 'Zahnarzttermin ab 12 Uhr' oder so aehnlich.

Achtung: Bitte nur die eigenen Termine editieren!!!

TERMININFO print "\n"; print <<"EOHTML"; EOHTML print "" if (not $zeitstempel eq "Neu"); print "" if (not $zeitstempel eq "Neu"); print ""; print ""; print ""; if ($zeitstempel eq "Neu") { print ""; print "\n"; } else { print ""; print ""; } my $buttontext; if ($zeitstempel eq "Neu") {$buttontext="Eintragen"} else {$buttontext="Ändern"} print ""; print ""; print ""; print "
Interne ID Zuletzt geändert Datum Endedatum Wo/Was? Bemerkung Aktion
$folgeid$zeitstempel

"; print "\n"; print "
$sd.$sm.$sy$ed.$em.$ey"; print "
" if (not $zeitstempel eq "Neu"); print "
\n"; print "\n"; print ""; print ""; print "
\n"; print "
".Calendar($sy,$sm);
   print "
"; print "
"; print "
" . Calendar(Add_Delta_YM($sy,$sm,$sd,0,1));
   print "
"; print "
"; print "
" . Calendar(Add_Delta_YM($sy,$sm,$sd,0,2));
   print "
"; print "
\n"; &logentry(2,"Terminausgabe: $id,$datum,$zeitstempel,$start,$ende,$folgeid,$wo,$text"); } # ---------------------------------------------------------------------- sub terminloeschen { # Loescht einen Termin my ($id,$datum,$startdatum,$endedatum,$folgeid) = @_; my $dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost;port=$dbport",$dbuser,$dbpassword) or die "Could not connect: $DBI::errstr\n"; my $sth = $dbh->prepare( q{ delete from termine where user_id=? and folgeid=? } ) or die "Can't prepare statement: $DBI::errstr"; my $rc = $sth->execute($id,$folgeid) or die "Can't execute statement: $DBI::errstr"; $dbh->disconnect; &logentry(1,"Termin geloescht: $id,$datum,$startdatum,$endedatum,$folgeid"); return qq#

Termin mit der ID $folgeid für $username{$id} gelöscht!

\n# } # ---------------------------------------------------------------------- sub termineintragen { # Prueft Parameter auf Richtigkeit und traegt ggf Termin ein. # Rueckgabe: Auszugebener String my ($id,$datum,$startdatum,$endedatum,$wo,$text,$folgeid,$zeitstempel,$werktags)=@_; my $change=1; my $message=""; $werktags=0 if ($werktags eq "Alle Tage"); $werktags=1 if ($werktags eq "Werktags"); my ($sd,$sm,$sy) = split(/\./,$startdatum); my ($ed,$em,$ey) = split(/\./,$endedatum); return qq#

Bitte Ort eingeben!

\n# if ($wo eq "Ort" or length($wo)==0); return qq#

Bitte korrekte Bemerkung eingeben!

\n# if ($text eq "Bemerkung"); return qq#

Das Start-Datum $startdatum ist nicht korrekt!

\n# if (not check_date($sy,$sm,$sd)); return qq#

Das Ende-Datum $endedatum ist nicht korrekt!

\n# if (not check_date($ey,$em,$ed)); my $dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost;port=$dbport",$dbuser,$dbpassword) or die "Could not connect: $DBI::errstr\n"; my $sth = $dbh->prepare( q{ select zeitstempel,start,ende,folgeid,wo,text from termine where user_id=? and start=? } ) or die "Can't prepare statement: $DBI::errstr"; my $rc = $sth->execute($id,$datum) or die "Can't execute statement: $DBI::errstr"; $change = 0 if ($rc==0); # Satz ist neu # $dbh->disconnect; # $dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost;port=$dbport",$dbuser,$dbpassword) # or die "Could not connect: $DBI::errstr\n"; if (not $change) { # Satz nicht vorhanden, anlegen my @laufdatum=($sy,$sm,$sd); my $counter=0; while (Delta_Days((@laufdatum),$ey,$em,$ed) >= 0 ) { if ((not $werktags) or (not &feiertag((@laufdatum)) and Day_of_Week((@laufdatum))<6)) { my $sth = $dbh->prepare( q{ insert into termine (user_id,start,ende,folgeid,wo,text) values (?,?,?,?,?,?) } ) or die "Can't prepare statement: $DBI::errstr"; my $rc = $sth->execute($id,"$laufdatum[0]-$laufdatum[1]-$laufdatum[2]","$ey-$em-$ed",$folgeid,$wo,$text) or die "Can't execute statement: $DBI::errstr"; $message.="$laufdatum[2].$laufdatum[1].$laufdatum[0] ok.
\n"; $counter++; last if ($counter > $maxfolgetermine); } (@laufdatum) = Add_Delta_Days((@laufdatum),1); } } else { # Satz vorhanden, muss geaendert werden my $sth = $dbh->prepare( q{ update termine set wo=?,text=? where user_id=? and folgeid=? } ) or die "Can't prepare statement: $DBI::errstr"; my $rc = $sth->execute($wo,$text,$id,$folgeid) or die "Can't execute statement: $DBI::errstr"; $message="Termin geändert!"; } $sth->finish; $dbh->disconnect; &logentry(1,"Termin eingetragen: $id,$datum,$startdatum,$endedatum,$wo,$text,$folgeid,$zeitstempel,$werktags"); return qq#

$message

\n#; } # ---------------------------------------------------------------------- sub termine { # liefert die Termine in html-ausgabe mit Links fuer geg. Datum my ($y,$m,$d,$farbe)=@_; my $return=""; my $dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost;port=$dbport",$dbuser,$dbpassword) or die "Could not connect: $DBI::errstr\n"; my $sth = $dbh->prepare( q{ select wo from termine where start=? and user_id=? } ) or die "Can't prepare statement: $DBI::errstr"; my $abfragedatum="$y-$m-$d"; foreach my $u (sort keys %userid) { my $rc = $sth->execute($abfragedatum,$userid{$u}) or die "Can't execute statement: $DBI::errstr"; my $wo; if (($u eq $remote_user) or ("-" eq $remote_user)) { $wo=qq#+#; } else { $wo=' ' } my $color=$farbe; if ($rc>0) { $color=qq{ bgcolor="#FF0000"}; # Farbe fuer Daten=Tabellenzellen mit Termin ($wo) = $sth->fetchrow_array; $wo=qq#$wo#; } $return.=qq#$wo#; } $sth->finish; $dbh->disconnect; return $return; } # ---------------------------------------------------------------------- sub kalender { # Ausgabe in html. Parameter: Startdatum Endedatum my ($sy,$sm,$sd,$ey,$em,$ed)=@_; my @sdp=Add_Delta_Days($sy,$sm,$sd,14); my @sdm=Add_Delta_Days($sy,$sm,$sd,-14); my @sdp2=Add_Delta_Days($sy,$sm,$sd,28); my @sdm2=Add_Delta_Days($sy,$sm,$sd,-28); my @sdt=Today; # Beginn oberer Block print "

Kalender"; print " ($remote_user)" if ($remote_user ne "-"); print "

\n"; print "\n"; print "
"; print "\n"; print "\n"; print ""; print qq##; print qq##; print qq##; print "\n"; print qq#"; print qq##; print qq##; print "\n"; print "
Springe zu ...
heute ($sdt[2].$sdt[1].$sdt[0])+2 Wo. ($sdp[2].$sdp[1].$sdp[0])-2 Wo. ($sdm[2].$sdm[1].$sdm[0])
#; print qq##; print qq#"; print qq##; print ""; print "+4 Wo. ($sdp2[2].$sdp2[1].$sdp2[0])-4 Wo. ($sdm2[2].$sdm2[1].$sdm2[0])
\n"; print "
\n"; # Spaltenwechsel oberer Block print qq#Userverwaltung#; print "
\n"; # Ende oberer Block print "
\n"; # Beginn Datumstabelle print <<"KALINFO"; Klick auf ein Datum: Dieses Datum zum ersten angezeigten machen.
Klick auf ein '+' zu einem Datum und einem User: Termin für diesen User an diesem Datum und ggf. folgenden Tagen zufügen.
Klick auf einen Text zu einem Datum/User: Bemerkung zu diesem Termin einsehen und Ort/Bemerkung ggf editieren.
KALINFO my $thfarbe="bgcolor=\"#FFEA00\""; # Farbe des Tabellenheaders my ($kw,$ky) = Week_of_Year($sy,$sm,$sd); my @tableheader = ("","TagDatum "); foreach my $key(sort keys %userid) { $tableheader[1] .= "  $key  "; } $tableheader[1] .= "\n"; my @laufdatum=($sy,$sm,$sd); my $farbe; print "\n"; print $tableheader[0]."$kw. KW $ky".$tableheader[1] if (Day_of_Week(@laufdatum) > 1 ); while (Delta_Days((@laufdatum),$ey,$em,$ed) > 0 ) { SWITCH: { if (Delta_Days((@laufdatum),Today) == 0 ) {$farbe = "bgcolor=\"#EE7777\"";last SWITCH} # Farbe eines normalen Tages if ( Day_of_Week(@laufdatum) > 5 ) {$farbe = "bgcolor=\"#53FF1A\"";last SWITCH} # Farbe fuer Wochenenden if (&feiertag(@laufdatum)) {$farbe = "bgcolor=\"#80FFFF\"";last SWITCH} # Farbe fuer Feiertage $farbe = " " } if (Day_of_Week(@laufdatum) == 1 ) { ($kw,$ky) = Week_of_Year((@laufdatum)); print $tableheader[0]."$kw. KW $ky".$tableheader[1]; } print "" . "" . &termine(@laufdatum, $farbe) . # &termine liefert die mit "\n"; @laufdatum=Add_Delta_Days(@laufdatum,1); } print "
" . &Day_of_Week_Abbreviation(&Day_of_Week(@laufdatum)) . "" . qq#$laufdatum[2].$laufdatum[1].$laufdatum[0]# . "" . &feiertag(@laufdatum) . " und
\n"; &logentry(2,"Kalender aufgerufen: $sy-$sm-$sd, $ey-$em-$ed"); } # ---------------------------------------------------------------------- sub testfeiertage { my @start=(2003,1,1); foreach my $d (0..365) { my @datum=Add_Delta_Days(@start,$d); print &Day_of_Week_Abbreviation(&Day_of_Week(@datum)).", $datum[0]-$datum[1]-$datum[2] ".&feiertag(@datum)."\n"; } } # ---------------------------------------------------------------------- # &testfeiertage; exit; &holealleuser; &ausgabestart; my @start; my @ende; if (defined $query->param("start")) { @start=split(/-/,$query->param("start")); $startparam="start=".$query->param("start"); } else { @start=Today } if (defined $query->param("ende")) { @ende=split(/-/,$query->param("ende")); } else { @ende=Add_Delta_Days(@start,$anzeigeintervall) } if (defined $query->param("userverwaltung")) { if ($query->param("userverwaltung") eq "zufuegen") { print &userzufuegen($query->param("account"),$query->param("name"),$query->param("vorname"),$query->param("bemerkung")); } if ($query->param("userverwaltung") eq "loesche") { print &userloeschen(1, $query->param("id")); } if ($query->param("userverwaltung") eq "entloesche") { print &userloeschen(0, $query->param("id")); } if ($query->param("userverwaltung") eq "aendern") { print &useraendern($query->param("id"),$query->param("account"),$query->param("name"),$query->param("vorname"), $query->param("bemerkung")); } &userverwaltung; &ausgabeende; exit; } if (defined $query->param("termin")) { # termin=show&id=$userid{$u}&datum=$y-$m-$d&$startparam # ($id,$datum,$startdatum,$endedatum,$wo,$text,$folgeid,$zeitstempel) if ($query->param("termin") eq "eintragen" and $query->param("button") eq "Loeschen") { if (($remote_user ne $username{$query->param("id")}) and ($remote_user ne "-")) { print qq#

Termin für #.$username{$query->param("id")}." löschen nicht erlaubt!

\n"; } else { print &terminloeschen( $query->param("id"), $query->param("datum"), $query->param("startdatum"), $query->param("endedatum"), $query->param("folgeid"), ); } &kalender(@start,@ende); &ausgabeende; exit; } else { if ($query->param("termin") eq "show") { } if ($query->param("termin") eq "eintragen") { if (($remote_user ne $username{$query->param("id")}) and ($remote_user ne "-")) { print qq#

Termin für #.$username{$query->param("id")}." eintragen/ändern nicht erlaubt!

\n"; } else { print &termineintragen( $query->param("id"), $query->param("datum"), $query->param("startdatum"), $query->param("endedatum"), $query->param("wo"), $query->param("text"), $query->param("folgeid"), $query->param("zeitstempel"), $query->param("werktags") ); } } &terminausgabe($query->param("id"),$query->param("datum")); &ausgabeende; exit; } } &kalender(@start,@ende); &ausgabeende;