Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
first release
- Loading branch information
0 parents
commit b0ddfda
Showing
58 changed files
with
7,185 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# ignore dbconnect.php since it contains classified DB access data | ||
dbconnect.php | ||
ldapconnect.php |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
# timerec3 | ||
|
||
## Installation | ||
### Webserver aufsetzen | ||
> apache | ||
> php7 | ||
> sendmail | ||
> deutsche Sprache | ||
```bash | ||
sudo apt update | ||
sudo apt install apache2 libapache2-mod-php7.0 php7.0 php7.0-mysql | ||
sudo apt install sendmail | ||
|
||
sudo locale-gen de_DE.UTF-8 | ||
sudo update-locale LANG=de_DE.UTF-8 | ||
sudo service apache2 restart | ||
``` | ||
### DB Server | ||
> MySQL | ||
```bash | ||
sudo apt update | ||
sudo apt install mysql-server | ||
``` | ||
|
||
### Web-Root klonen | ||
```bash | ||
git clone https://github.molgen.mpg.de/kw/timerec3 | ||
``` | ||
### Log Folder anlegen | ||
```bash | ||
sudo mkdir /var/log/timerec3 | ||
sudo chown www-data:www-data /var/log/timerec3 | ||
``` | ||
|
||
### MySQL | ||
> `struktur.sql` auf DB Server ausführen | ||
> Zugriff für Webserver einrichten und in `dbconnect.php` hinterlegen | ||
> ersten Administrator manuell in der DB anlegen | ||
> Für den korrekten Betrieb müssen folgende Zeittypen in der DB hinterlegt bleiben: | ||
(werden durch `struktur.sql` angelegt) | ||
|
||
> `buchen.php` enthält den entsprechenden Code. | ||
> Adresse entsprechend ändern oder entfernen. | ||
Typ | Bezeichnung | ||
---: | --- | ||
9 | storniert | ||
10 | Urlaub | ||
20 | Gleittag | ||
|
||
### LDAP | ||
> LDAP Einstellungen in `ldapconnect.php` vornehmen | ||
### Cronjobs | ||
_sollten durch www-data ausgeführt werden_ ; geht aber auch als root | ||
> `saldorun.php` -> täglich nachts um 3 | ||
> ```bash | ||
> 0 3 * * * /var/www/timerec3/saldorun.php >> /var/log/timerec3/saldorun.log | ||
> ``` | ||
> `madeleterun.php` -> täglich nachts um 3 | ||
> ```bash | ||
> 0 3 * * * /var/www/timerec3/madeleterun.php >> /var/log/timerec3/madeleterun.log | ||
> ``` | ||
> `urlaubrun.php` -> am 01.01. jeden Jahres | ||
> ```bash | ||
> 0 3 1 1 * /var/www/timerec3/urlaubrun.php >> /var/log/timerec3/urlaubrun.log | ||
> ``` | ||
--- | ||
## Terminals | ||
Quellcode + kompilierte Software für > Raspberry Pi 2 | ||
> [git Repository "raspFHIt"](https://github.molgen.mpg.de/kw/raspFHIt) | ||
__ACHTUNG__ | ||
in der Datei `raspFHIt.c` muss der korrekte Datenbankserver angegeben werden! | ||
__HINWEIS__ | ||
`chkraspfhit` sollte als cronjob des Users `pi` eingerichtet werden, um Einfrieren des Displays zu verhindern: | ||
```bash | ||
* * * * * /home/pi/chkraspfhit > /dev/null 2>&1 | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,295 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<meta charset="utf-8"> | ||
<title>timerec</title> | ||
<link rel="stylesheet" type="text/css" href="style.css"> | ||
<link rel="shortcut icon" href="favicon.ico"> | ||
</head> | ||
<body> | ||
<?php | ||
include('dbconnect.php'); | ||
|
||
//Feiertag-Funktion | ||
function feiertag($tag, $monat, $jahr){ | ||
global $dbc; | ||
//empty um wiederholte DB abfrage zu verhindern | ||
if(empty($feiertage)){ | ||
// Feste Feiertage werden nach dem Schema ddmm eingetragen | ||
$feiertage[] = "0101"; // Neujahrstag | ||
$feiertage[] = "0105"; // Tag der Arbeit | ||
$feiertage[] = "0310"; // Tag der Deutschen Einheit | ||
$feiertage[] = "2512"; // Erster Weihnachtstag | ||
$feiertage[] = "2612"; // Zweiter Weihnachtstag | ||
|
||
// Bewegliche Feiertage berechnen | ||
$tage = 60 * 60 * 24; | ||
$ostersonntag = easter_date($jahr); | ||
$feiertage[] = date("dm", $ostersonntag - 2 * $tage); // Karfreitag | ||
$feiertage[] = date("dm", $ostersonntag + 1 * $tage); // Ostermontag | ||
$feiertage[] = date("dm", $ostersonntag + 39 * $tage); // Himmelfahrt | ||
$feiertage[] = date("dm", $ostersonntag + 50 * $tage); // Pfingstmontag | ||
|
||
//freie Tage FHI aus Datenbank nehmen | ||
$getfree = $dbc->query("select daymon from feiertag where year = $jahr;"); | ||
foreach($getfree as $free){ | ||
$feiertage[] = $free['daymon']; | ||
} | ||
} | ||
|
||
// Prüfen, ob Feiertag | ||
$code = $tag.$monat; | ||
return in_array($code, $feiertage); | ||
} | ||
//unbedingt deutsche Sprache auf Server nachrüsten mit: | ||
//sudo locale-gen de_DE.UTF-8 | ||
//sudo update-locale LANG=de_DE.UTF-8 | ||
//sudo service apache2 restart | ||
//wortlaut im setlocale() befehl MUSS korrekt sein! (s.u.) | ||
setlocale(LC_TIME, 'de_DE.UTF8'); | ||
|
||
session_start(); | ||
if(!$_SESSION['userid']){ | ||
session_destroy(); | ||
include('login.php'); | ||
exit; | ||
} | ||
|
||
$infoarray = $_SESSION['infoarray']; | ||
$userarray = $_SESSION['userarray']; | ||
$maID = $infoarray['maID']; | ||
|
||
if(isset($_GET['y'], $_GET['m'])){ | ||
$jahr = $_GET['y']; | ||
$monat = $_GET['m']; | ||
$datum = new DateTime("$jahr-$monat-01"); | ||
}else{ | ||
$datum = new DateTime(); | ||
$jahr = $datum->format('Y'); | ||
$monat = $datum->format('m'); | ||
} | ||
|
||
if(isset($_GET['ag'])){ | ||
//AGs laden, die ausgewählt wurden | ||
//gegen unerwünschtes Laden anderer AGs sichern per prüfung, | ||
//ob GET wert in userarray->ag_array vorhanden ist | ||
foreach($_GET['ag'] as $ag){ | ||
if(in_array($ag, $userarray['ag_array'])) $agtoload[] = $ag; | ||
} | ||
}else{ | ||
//AG aus infoarray laden (-> AG des vorher gewählten MA wird geöffnet) | ||
$agtoload[] = $infoarray['agID']; | ||
} | ||
|
||
if(!$_SESSION['userarray']['admin'] && empty($agtoload)){ | ||
echo "<h3>keine Rechte, diese Seite einzusehen, oder es wurde versucht, eine fremde AG zu laden!</h3>"; | ||
exit; | ||
} | ||
|
||
$getkalenderstr = "select k.maID, datum, typ, zt_bez, status from kalender k | ||
join mitarbeiter m on k.maID = m.maID | ||
join zeittyp zt on k.typ = zt.zt_ID | ||
where agID in ("; | ||
$getagpplstr = "select maID, concat(nachname, ', ', vorname) as name from mitarbeiter where agID in ("; | ||
foreach($agtoload as $ag){ | ||
$getkalenderstr .= "$ag, "; | ||
$getagpplstr .= "$ag, "; | ||
$agidstr .= "&ag[]=$ag"; | ||
} | ||
$getagpplstr = substr($getagpplstr, 0, -2); | ||
$getagpplstr .= ") order by nachname;"; | ||
$getagppl = $dbc->query($getagpplstr); | ||
|
||
$getkalenderstr = substr($getkalenderstr, 0, -2); | ||
$getkalenderstr .= ") and year(datum) = $jahr and month(datum) = $monat order by nachname, datum, k_id asc;"; | ||
$reskalender = $dbc->query($getkalenderstr); | ||
foreach($reskalender as $kalendereintrag){ | ||
//nur aktuellste einträge pro MA und datum nehmen | ||
$kalender[$kalendereintrag['maID']][$kalendereintrag['datum']] = $kalendereintrag; | ||
} | ||
|
||
if($userarray['admin'] || !empty($userarray['ag_array'])){ | ||
$agname = "<form id='agwahl' action='ag-kalender.php' method='get'> | ||
<select class='auswahl inline' multiple name='ag[]' size=1 onmousedown='this.size=10' onblur='this.size=1'>"; | ||
if(!$userarray['admin']){ | ||
$notadmin = "where ag_ID in ("; | ||
foreach($userarray['ag_array'] as $ag){ | ||
$notadmin .= "$ag, "; | ||
} | ||
$notadmin = substr($notadmin, 0, -2); | ||
$notadmin .= ")"; | ||
}else{ | ||
$notadmin = ""; | ||
} | ||
$getag = $dbc->query("select * from ag $notadmin order by name;"); | ||
foreach($getag as $ag){ | ||
$id = $ag['ag_ID']; | ||
$agbez = $ag['name']; | ||
if(in_array($id, $agtoload)){ | ||
$selected = "selected"; | ||
}else{ | ||
$selected = ""; | ||
} | ||
$agname .= "<option $selected value='$id'>$agbez</option>"; | ||
} | ||
$agname .= "</select> | ||
<input type='hidden' name='y' value='$jahr'> | ||
<input type='hidden' name='m' value='$monat'> | ||
<button type='submit'>ansehen</button> | ||
</form>"; | ||
}else{ | ||
$getag = $dbc->query("select name from ag where ag_ID = $infoarray[agID];"); | ||
$agname = $getag->fetch_array()[0]; | ||
} | ||
|
||
$datum->modify('+1 month'); | ||
$nextdate = $datum->format('\y\=Y\&\m\=m'); | ||
$datum->modify('-2 month'); | ||
$prevdate = $datum->format('\y\=Y\&\m\=m'); | ||
$datum->modify('+1 month'); //zurücksetzen | ||
|
||
echo "<div id='headline'> | ||
<a href='index.php?ma=".$_SESSION['infoarray']['maID']."'><button id='home'><< Dashboard</button></a> | ||
<div id='back'><a href='ag-kalender.php?$prevdate$agidstr'><button><<<</button></a></div> | ||
AG-Kalender für <b>".strftime('%B %Y', $datum->getTimestamp())."</b> für $agname | ||
<div id='forward'><a href='ag-kalender.php?$nextdate$agidstr'><button>>>></button></a></div> | ||
</div>"; | ||
|
||
echo "<div id='kalender'> | ||
<table>"; | ||
echo "<tr> | ||
<th>Mitarbeiter</th>"; | ||
for($i = 1; $i <= 31; $i++){ | ||
echo "<th>$i</th>"; | ||
} | ||
echo "</tr>"; | ||
foreach($getagppl as $ma){ | ||
$id = $ma['maID']; | ||
echo "<tr>"; | ||
echo "<th class='maname'>".$ma['name']."</th>"; | ||
for($i = 1; $i <= 31; $i++){ | ||
$thisdate = new DateTime("$jahr-$monat-$i"); | ||
$thisdatestr = $thisdate->format('Y-m-d'); | ||
$wochentag = $thisdate->format('N'); | ||
if(!checkdate($monat, $i, $jahr)){ //Nicht vorhandene Tage werden blau | ||
$dark = "dark"; | ||
}else{ | ||
$dark = ""; | ||
} | ||
$azm = $dbc->query("select * from azmodell az | ||
join ma_azmodel maz on az.azm_ID = maz.model_nr | ||
where maID = $id order by datum_ab desc;"); | ||
foreach($azm as $az){ //AZ-Modelle des MA durchlaufen und für dieses Datum geltendes verwenden | ||
$az_ab = new DateTime($az['datum_ab']); | ||
if($az_ab <= $thisdate){ | ||
break; | ||
}else{ | ||
$az = NULL; | ||
} | ||
} | ||
if(strpos($az['arbeitstage'], $wochentag) === false || feiertag($i, $monat, $jahr)){ //arbeitsfreie Tage werden grau | ||
$disabled = 'disabled'; | ||
}else{ | ||
$disabled = ""; | ||
} | ||
if(in_array($thisdatestr, array_keys($kalender[$id]))){ //Eintrag zu aktuellem Tag vorhanden? //erweiterbar | ||
$data = substr($kalender[$id][$thisdatestr]["zt_bez"], 0,1); | ||
switch($kalender[$id][$thisdatestr]["status"]){ | ||
case "genehmigt": | ||
$farbe = "green"; | ||
break; | ||
case "geprüft": | ||
$farbe = "light-green"; | ||
break; | ||
case "abgelehnt": | ||
$farbe = "red"; | ||
break; | ||
case "beantragt": | ||
$farbe = "yellow"; | ||
break; | ||
default: | ||
$farbe = ""; | ||
} | ||
}else{ | ||
$data = ""; | ||
$farbe = ""; | ||
} | ||
//eigentliche Zelle wird hier erst geschrieben | ||
echo "<td class='cell $farbe $dark $disabled'><a class='hiddenlink' href='index.php?ma=$id&datum=$thisdatestr'>  $data  </a></td>"; | ||
} | ||
echo "</tr>"; | ||
} | ||
|
||
/*foreach($agppl as $ma){ | ||
$getname = $dbc->query("select concat(nachname, ', ', vorname) from mitarbeiter where maID = $ma;"); | ||
$name = $getname->fetch_array()[0]; | ||
echo "<tr>"; | ||
echo "<th class='maname'>".$name."</th>"; | ||
for($i = 1; $i <= 31; $i++){ | ||
$thisdate = new DateTime("$jahr-$monat-$i"); | ||
$thisdatestr = $thisdate->format('Y-m-d'); | ||
$wochentag = $thisdate->format('N'); | ||
if(!checkdate($monat, $i, $jahr)){ //Nicht vorhandene Tage werden blau | ||
$dark = "dark"; | ||
}else{ | ||
$dark = ""; | ||
} | ||
$azm = $dbc->query("select * from azmodell az | ||
join ma_azmodel maz on az.azm_ID = maz.model_nr | ||
where maID = $ma order by datum_ab desc;"); | ||
foreach($azm as $az){ //AZ-Modelle des MA durchlaufen und für dieses Datum geltendes verwenden | ||
$az_ab = new DateTime($az['datum_ab']); | ||
if($az_ab <= $thisdate){ | ||
break; | ||
}else{ | ||
$az = NULL; | ||
} | ||
} | ||
if(strpos($az['arbeitstage'], $wochentag) === false || feiertag($i, $monat, $jahr)){ //arbeitsfreie Tage werden grau | ||
$disabled = 'disabled'; | ||
}else{ | ||
$disabled = ""; | ||
} | ||
if(in_array($thisdatestr, array_keys($kalender[$ma]))){ //Eintrag zu aktuellem Tag vorhanden? //erweiterbar | ||
$data = substr($kalender[$ma][$thisdatestr]["zt_bez"], 0,1); | ||
switch($kalender[$ma][$thisdatestr]["status"]){ | ||
case "genehmigt": | ||
$farbe = "green"; | ||
break; | ||
case "geprüft": | ||
$farbe = "light-green"; | ||
break; | ||
case "abgelehnt": | ||
$farbe = "red"; | ||
break; | ||
case "beantragt": | ||
$farbe = "yellow"; | ||
break; | ||
default: | ||
$farbe = ""; | ||
} | ||
}else{ | ||
$data = ""; | ||
$farbe = ""; | ||
} | ||
//eigentliche Zelle wird hier erst geschrieben | ||
echo "<td class='cell $farbe $dark $disabled'><a class='hiddenlink' href='index.php?ma=$ma&datum=$thisdatestr'>  $data  </a></td>"; | ||
} | ||
echo "</tr>"; | ||
}*/ | ||
echo "</table> | ||
</div>"; | ||
|
||
echo "\n<div id='legende'> | ||
<h3>Legende</h3> | ||
<span class='green'> </span> ---> genehmigt | ||
<span class='light-green'> </span> ---> geprüft | ||
<span class='yellow'> </span> ---> beantragt | ||
<span class='red'> </span> ---> abgelehnt | ||
<span class='disabled'> </span> ---> arbeitsfreier Tag | ||
<span class='dark'> </span> ---> Tag existiert nicht | ||
</div>"; | ||
?> | ||
</body> | ||
</html> |
Oops, something went wrong.