Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
first release
  • Loading branch information
kw committed Jun 28, 2017
0 parents commit b0ddfda
Show file tree
Hide file tree
Showing 58 changed files with 7,185 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
@@ -0,0 +1,3 @@
# ignore dbconnect.php since it contains classified DB access data
dbconnect.php
ldapconnect.php
84 changes: 84 additions & 0 deletions README.md
@@ -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)

### Email
> `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
```
295 changes: 295 additions & 0 deletions ag-kalender.php
@@ -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'>&nbsp&nbsp$data&nbsp&nbsp</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'>&nbsp&nbsp$data&nbsp&nbsp</a></td>";
}
echo "</tr>";
}*/
echo "</table>
</div>";

echo "\n<div id='legende'>
<h3>Legende</h3>
<span class='green'>&nbsp</span> ---> genehmigt
<span class='light-green'>&nbsp</span> ---> geprüft
<span class='yellow'>&nbsp</span> ---> beantragt
<span class='red'>&nbsp</span> ---> abgelehnt
<span class='disabled'>&nbsp</span> ---> arbeitsfreier Tag
<span class='dark'>&nbsp</span> ---> Tag existiert nicht
</div>";
?>
</body>
</html>

0 comments on commit b0ddfda

Please sign in to comment.