Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
timerec3public/saldorun.php
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
executable file
338 lines (310 sloc)
12.6 KB
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
#!/usr/bin/php | |
<?php | |
error_reporting(E_ALL & ~E_NOTICE); | |
///* | |
//benchmark | |
$time = microtime(); | |
$time = explode(' ', $time); | |
$time = $time[1] + $time[0]; | |
$start = $time; | |
//ob_start(); //output buffer starten | |
//*/ | |
include('dbconnect.php'); | |
//Feiertag-Funktion, abgewandelt vom Kalender | |
function feiertag($datum){ | |
global $dbc; | |
$tag = $datum->format('d'); | |
$monat = $datum->format('m'); | |
$jahr = $datum->format('Y'); | |
// 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); | |
} | |
if(php_sapi_name() != "cli"){ | |
echo "<h3>keine Rechte, diese Seite einzusehen!</h3>"; | |
exit; | |
} | |
/*if(strpos($argv[1], '-') == 0){ | |
echo "Usage: saldorun.php <from date> <staff number>\n"; | |
exit; | |
}*/ | |
if(isset($argv[1])){ | |
$ab = new DateTime($argv[1]); | |
}else{ | |
$ab = new DateTime(); | |
$ab->modify("-30 day"); | |
} | |
if(isset($argv[2])){ | |
$singlemaID = "and maID = $argv[2]"; | |
} | |
echo "Ab Datum: " . $ab->format("Y-m-d H:i:s") . "\n------------\n"; | |
$heute = new DateTime(); | |
$tage = $ab->diff($heute); | |
$tage = $tage->days -1; //es soll ja nur bis einschließlich gestern gerechnet werden | |
echo "Anzahl Tage bis gestern: $tage\n-----------\n"; | |
$result = $dbc->query("select maID from mitarbeiter where gleitzeit = 1 $singlemaID;"); | |
for($i = 0; $i <= $tage; $i++){ | |
echo "ab wert: ".$ab->format('d.m.Y')."\n"; | |
$tag = new DateTime($ab->format('Y-m-d')); //direkte zuweisung tag = ab geht nicht, überschreibt immer ab | |
//echo "zuweisung: ".$tag->format('d.m.Y')."\n"; | |
$tag->modify("+$i days"); | |
echo "veränderung: ".$tag->format('d.m.Y')."\n"; | |
$datumstr = $tag->format("Y-m-d"); | |
$wochentag = $tag->format('N'); | |
echo ">>>> $datumstr | Tag $wochentag <<<<\n"; | |
foreach ($result as $row){ | |
unset($az); | |
$fehler = false; | |
$saldo = 0; | |
$summe = 0; | |
$longest = 0; | |
$pausesumme = 0; | |
$anzahlkommen = 0; | |
$anzahlgehen = 0; | |
$maID = $row['maID']; | |
echo $maID . ": \n"; | |
$gettimes = "select * from zeit where maID = '$maID' and date(datumzeit) = '$datumstr' order by datumzeit;"; | |
echo "gettimes:\n" . $gettimes . "\n"; | |
$times = $dbc->query($gettimes); | |
$getazdID = $dbc->query("select azdID from az_data_copy | |
where maID = '$maID' and datum_ab <= '$datumstr' | |
order by azdID desc, datum_ab desc | |
limit 1;"); | |
$azdID = $getazdID->fetch_array()[0]; | |
echo $azdID; | |
$getaz = $dbc->query("select * from az_data_copy data | |
join az_time time on data.azdID = time.azdID | |
where data.azdID = $azdID order by data.azdID desc, datum_ab desc;"); | |
if(!empty($getaz)){ | |
foreach($getaz as $azrow){ | |
$az[$azrow['tag']] = $azrow; | |
} | |
//print_r($az); | |
}else{ | |
continue; | |
} | |
unset($pausestart, $bis, $von); | |
foreach($times as $time){ | |
echo $time['datumzeit'] . " - status: " . $time['status'] . "\n"; | |
if($time['status'] == 'kommt'){ | |
echo "azstart: ".$az[$wochentag]['azstart']."\n"; | |
if(substr($time['datumzeit'], -8) < $az[$wochentag]['azstart'] && isset($az[$wochentag]['azstart'])){ | |
//vor azstart erschienen? -> azstart als Startzeit nehmen | |
$von = new DateTime(substr($time['datumzeit'], 0, 10).' '.$az[$wochentag]['azstart']); | |
}else{ | |
$von = new DateTime($time['datumzeit']); | |
$vonmod = new DateTime($von->format('Y-m-d H:i')); | |
if($von->format('s') < 30){ | |
$von = clone $vonmod; | |
}else{ | |
$vonmod->modify('+ 1 minute'); | |
$von = clone $vonmod; | |
} | |
} | |
if(substr($time['datumzeit'], -8) > $az[$wochentag]['azende'] && isset($az[$wochentag]['azende'])){ | |
//nach azende gekommen ? -> start auf azende setzen | |
$von = new DateTime(substr($time['datumzeit'], 0, 10).' '.$az[$wochentag]['azende']); | |
} | |
if($anzahlkommen > 0 && $anzahlgehen > 0){ | |
$pauseende = new DateTime($time['datumzeit']); | |
//var_dump($pausestart, $pauseende); | |
$pausediff = $pausestart->diff($pauseende); | |
$pausesumme += ($pausediff->h * 60); | |
$pausesumme += $pausediff->i; | |
$pausesumme += round($pausediff->s/60); | |
echo "pausediff: $pausesumme\n"; | |
} | |
$anzahlkommen++; | |
}elseif($time['status'] == 'geht'){ | |
echo "azende: ".$az[$wochentag]['azende']."\n"; | |
if(substr($time['datumzeit'], -8) > $az[$wochentag]['azende'] && isset($az[$wochentag]['azende'])){ | |
//nach azende gegangen? -> azende als Stoppzeit nehmen | |
$bis = new DateTime(substr($time['datumzeit'], 0, 10).' '.$az[$wochentag]['azende']); | |
print_r($bis); | |
}else{ | |
$bis = new DateTime($time['datumzeit']); | |
$bismod = new DateTime($bis->format('Y-m-d H:i')); | |
if($bis->format('s') < 30){ | |
$bis = clone $bismod; | |
}else{ | |
$bismod->modify('+ 1 minute'); | |
$bis = clone $bismod; | |
} | |
} | |
if(substr($time['datumzeit'], -8) < $az[$wochentag]['azstart'] && isset($az[$wochentag]['azstart'])){ | |
//nach azende gekommen ? -> start auf azende setzen | |
$bis = new DateTime(substr($time['datumzeit'], 0, 10).' '.$az[$wochentag]['azstart']); | |
} | |
$diff = $von->diff($bis); | |
//var_dump($diff, $von, $bis); | |
if($diff->h*60 + $diff->i >= $longest){ | |
$longest = $diff->h*60 + $diff->i; | |
} | |
$summe += ($diff->h * 60); | |
$summe += $diff->i; | |
$summe += round($diff->s/60); | |
$anzahlgehen++; | |
echo "summe: $summe\n"; | |
//was ist das?! | |
/* if(!isset($pausestart)) */$pausestart = new DateTime($time['datumzeit']); | |
} | |
} | |
//------------------------- | |
//pause abziehen | |
$autopause = false; | |
$pauserest = 0; | |
if(isset($az[$wochentag])){ | |
//$longest = new DateTime($longest); | |
$pauseab = new DateTime($az[$wochentag]['pauseab']); | |
$pause = new DateTime($az[$wochentag]['pause']); | |
$fixpause = new DateTime($tag->format('Y-m-d') . " " . $az[$wochentag]['fixpause']); | |
//print_r($fixpause); | |
$pauseminuten = $pause->format('H')*60 + $pause->format('i'); | |
$pauseab = $pauseab->format('H')*60 + $pauseab->format('i'); | |
/* var_dump($pauseab); | |
var_dump($summe); | |
var_dump($pausesumme); | |
var_dump($pauseminuten); */ | |
echo "pausesumme: " . print_r($pausesumme, true) . "\n"; | |
echo "pauseminuten: " . print_r($pauseminuten, true) . "\n"; | |
echo "Fixpause: " . $fixpause->format('H:i') . "\n"; | |
if($longest >= $pauseab){ | |
$pauserest = $pauseminuten; | |
}elseif($summe >= $pauseab && $pausesumme < $pauseminuten){ | |
$pauserest = $pauseminuten - $pausesumme; | |
} | |
if($pauserest >= 0){ | |
echo "Pauserest: $pauserest\n"; | |
$summe -= $pauserest; | |
$autopause = true; | |
} | |
if(isset($bis) && $bis->format('Y-m-d') == $tag->format('Y-m-d') && $fixpause->format('H:i') != '00:00' && $bis->format('H:i') > $fixpause->format('H:i') && $longest < $pauseab){ | |
echo "fixpause! Pauschalabzug!\n"; | |
$summe -= $pauseminuten; | |
$autopause = true; | |
} | |
//pause nicht zwischen KZv und KZn genommen? (Vollzeit: zwischen 12 und 13 Uhr) -> auto Abzug | |
/* if($summe >= $pauseab && !$autopause && | |
($az[$wochentag]['kzvende'] != '00:00:00' && | |
$az[$wochentag]['kznstart'] != '00:00:00') && | |
($pausestart->format('H:i:s') > $az[$wochentag]['kznstart'] || | |
$pausestart->format('H:i:s') < $az[$wochentag]['kzvende'])){ | |
//autoabzug | |
echo "pausestart: ".$pausestart->format('H:i:s')."\n"; | |
echo "kzvende: ".$az[$wochentag]['kzvende']."\n"; | |
echo "kznstart: ".$az[$wochentag]['kznstart']."\n"; | |
echo "pause nicht in KZ Lücke genommen, Auto-Abzug!\n"; | |
$summe -= $pauseminuten; | |
} */ | |
echo "Summe nach Pausenabzug: $summe\n"; | |
} | |
//--------------------------- | |
if($anzahlgehen != $anzahlkommen){ | |
echo "kommen / gehen ist irgendwie durcheinander! Saldo kann falsch sein!\n"; | |
$fehler = true; | |
} | |
echo "------------\n"; | |
$eintragen = false; | |
$frei = false; | |
//echo "var dump az: "; | |
//var_dump($az); | |
//echo "\n--------\n"; | |
if(isset($az[$wochentag]) && feiertag($tag) === false){ | |
$tagesminuten = $az[$wochentag]['wochenarbeit'] / count($az); | |
echo "tagesminuten: $tagesminuten\n"; | |
$saldo = $summe - $tagesminuten; | |
$eintragen = true; | |
}elseif($summe > 0){ | |
$saldo = $summe; | |
$eintragen = true; | |
} | |
if(!$eintragen){ | |
echo "wochenende!\n"; | |
$frei = true; | |
} | |
echo "\n--------------\n"; | |
$getcal = "select * from kalender where maID = '$maID' and datum = '$datumstr' order by k_id desc limit 1;"; | |
$rescal = $dbc->query($getcal); | |
$cal = $rescal->fetch_assoc(); | |
if($cal){ | |
echo "Typ und Status: \n"; | |
echo $cal['typ'] . " --> " . $cal['status']."\n"; | |
$getmode = $dbc->query("select zt_op from zeittyp where zt_ID = ".$cal['typ'].";"); | |
$mode = $getmode->fetch_array()[0]; | |
if($mode == '+'){ | |
if($cal['status'] != ''){ | |
echo "\nstatus gesetzt: ".$cal['status']."\n"; | |
if($cal['status'] == 'genehmigt') $frei = true; | |
}else{ | |
echo "\nkein status gesetzt, aber trotzdem plus\n"; | |
$frei = true; | |
} | |
} | |
if($frei && $summe > 0){ //MA ist trotzdem erschienen -> Zeit wird gutgeschrieben | |
$frei = false; //wieder false setzen, damit wert eingetragen wird. | |
$saldo = $summe; | |
} | |
} | |
if($frei){ //frei ist immer true, wenn jemand rechtmäßigerweise nicht erschienen ist -> negative Saldi werden ggf gelöscht | |
$getsaldo = $dbc->query("select saldomin from saldo where maID = '$maID' and datum = '$datumstr';"); | |
$oldsaldo = $getsaldo->fetch_array()[0]; | |
if($oldsaldo != 0){ | |
//falls frei hat und schon mal saldo gerechnet wurde -> eintrag löschen | |
$dbc->query("delete from saldo where maID = $maID and datum = '$datumstr' and special is NULL;"); | |
echo "\n --> old saldo deleted <--\n"; | |
} | |
echo "frei!\n"; | |
}else{ | |
echo "nicht frei oder dennoch gesteckt :(\n"; | |
} | |
echo "-------------\n"; | |
if($eintragen && !$fehler && !$frei){ | |
echo "saldo: $saldo\n"; | |
//olddata: falls schon Saldo vorhanden ist, updaten statt inserten (ersatz für on duplicate key da special NULL sein kann und damit unique key zerstört) | |
$getolddata = $dbc->query("select sid from saldo where maID = '$maID' and datum = '$datumstr' and special is NULL;"); | |
$olddata = $getolddata->fetch_array()[0]; | |
if($olddata){ | |
echo "old data @: $olddata\n"; | |
$insert = "update saldo set saldomin = $saldo where sid = $olddata;"; | |
}else{ | |
echo "neue Daten!\n"; | |
$insert = "insert into saldo (maID, datum, saldomin) values ('$maID', '$datumstr', '$saldo');"; | |
} | |
$dbc->query($insert); | |
if($dbc->error){ | |
echo $dbc->error; | |
exit; | |
} | |
} | |
echo "==============\n"; | |
} | |
} | |
///* | |
//benchmark | |
//ob_end_clean(); //output buffer verwerfen ( = echo unterdrücken) | |
$time = microtime(); | |
$time = explode(' ', $time); | |
$time = $time[1] + $time[0]; | |
$finish = $time; | |
$total_time = round(($finish - $start), 4); | |
echo "==============\nPage generated in ".$total_time." seconds.\n"; | |
//*/ | |
?> |