diff --git a/cis/private/tools/zeitaufzeichnung_projektliste.php b/cis/private/tools/zeitaufzeichnung_projektliste.php index 130dde64a..ef272fedf 100644 --- a/cis/private/tools/zeitaufzeichnung_projektliste.php +++ b/cis/private/tools/zeitaufzeichnung_projektliste.php @@ -66,7 +66,7 @@ $toignore = ['Pause', 'LehreExtern']; $ztaufdata = $ztauf->result; $monthsums = [0 => 0.00]; -//sprt list by startdate ascending (if not already done in zeitaufzeichnung class) +//sort list by startdate ascending (if not already done in zeitaufzeichnung class) usort($ztaufdata, function ($ztaufa, $ztaufb) { $date = new datum(); @@ -75,9 +75,12 @@ usort($ztaufdata, function ($ztaufa, $ztaufb) ); //fill projectlines with data -for ($i = 0; $i < sizeof($ztaufdata); $i++) +for ($i = 0; $i < count($ztaufdata); $i++) { $ztaufrow = $ztaufdata[$i]; + //make sure dates are in correct format + $ztaufrow->start = $date->formatDatum($ztaufrow->start, $format = 'Y-m-d H:i:s'); + $ztaufrow->ende = $date->formatDatum($ztaufrow->ende, $format = 'Y-m-d H:i:s'); $day = intval($date->formatDatum($ztaufrow->ende, 'd')); //first entry for a day $isFirstEntry = !isset($projectlines[$day]); @@ -95,16 +98,16 @@ for ($i = 0; $i < sizeof($ztaufdata); $i++) $tosubtract[] = $subtraction; //save all pause ranges - if($ztaufrow->aktivitaet_kurzbz == $toignore[0]) + if ($ztaufrow->aktivitaet_kurzbz == $toignore[0]) { $prevpause = null; - if(sizeof($allpauseranges)>0) + if (count($allpauseranges) > 0) { - $prevpause = $allpauseranges[sizeof($allpauseranges) - 1]; + $prevpause = $allpauseranges[count($allpauseranges) - 1]; } //first pause or no overlap to previous pause - add pauserange - if( is_null($prevpause ) || $prevpause->ende <= $ztaufrow->start ) + if (is_null($prevpause) || $prevpause->ende <= $ztaufrow->start) { $pauserange = new stdClass(); $pauserange->start = $ztaufrow->start; @@ -112,16 +115,17 @@ for ($i = 0; $i < sizeof($ztaufdata); $i++) $allpauseranges[] = $pauserange; } //pause overlap - change pause ende - elseif($prevpause->ende > $ztaufrow->start ) + elseif ($prevpause->ende > $ztaufrow->start) { - $allpauseranges[sizeof($allpauseranges) - 1]->ende = $ztaufrow->ende; + $allpauseranges[count($allpauseranges) - 1]->ende = $ztaufrow->ende; } } } - if (($dayStart == '' || $date->mktime_fromtimestamp($date->formatDatum($dayStart, $format = 'Y-m-d H:i:s')) > $date->mktime_fromtimestamp($date->formatDatum($ztaufrow->start, $format = 'Y-m-d H:i:s'))) && $ztaufrow->aktivitaet_kurzbz != $toignore[1]) + //save new dayStart (if earlier) or dayEnd (if later) + if (($dayStart == '' || $dayStart > $ztaufrow->start) && $ztaufrow->aktivitaet_kurzbz != $toignore[1]) $dayStart = $ztaufrow->start; - if (($dayEnd == '' || $date->mktime_fromtimestamp($date->formatDatum($dayEnd, $format = 'Y-m-d H:i:s')) < $date->mktime_fromtimestamp($date->formatDatum($ztaufrow->ende, $format = 'Y-m-d H:i:s'))) && $ztaufrow->aktivitaet_kurzbz != $toignore[1]) + if (($dayEnd == '' || $dayEnd < $ztaufrow->ende) && $ztaufrow->aktivitaet_kurzbz != $toignore[1]) $dayEnd = $ztaufrow->ende; if ($isFirstEntry) @@ -141,7 +145,7 @@ for ($i = 0; $i < sizeof($ztaufdata); $i++) $toadd = 0.00; //case 1: there is no overlap, just add project time difference - if ($date->mktime_fromtimestamp($ztaufrow->start) > $date->mktime_fromtimestamp($lastende)) + if ($ztaufrow->start >= $lastende) { $toadd = $date->convertTimeStringToHours($ztaufrow->diff); $laststart = $ztaufrow->start; @@ -152,13 +156,13 @@ for ($i = 0; $i < sizeof($ztaufdata); $i++) $projectlines[$day]->projekte[$ztaufrow->projekt_kurzbz]->alleZeiten[] = $newprojecttime; } //case 2: overlap - add only part of the time - elseif ($date->mktime_fromtimestamp($ztaufrow->start) < $date->mktime_fromtimestamp($lastende) && $date->mktime_fromtimestamp($ztaufrow->ende) > $date->mktime_fromtimestamp($lastende)) + elseif ($ztaufrow->start < $lastende && $ztaufrow->ende > $lastende) { $toadd = ($date->mktime_fromtimestamp($ztaufrow->ende) - $date->mktime_fromtimestamp($lastende)) / 3600; $lastende = $ztaufrow->ende; $alleZeiten =& $projectlines[$day]->projekte[$ztaufrow->projekt_kurzbz]->alleZeiten; $index = count($alleZeiten); - $alleZeiten[$index-1]->ende = $ztaufrow->ende; + $alleZeiten[$index - 1]->ende = $ztaufrow->ende; } $projectlines[$day]->projekte[$ztaufrow->projekt_kurzbz]->stunden += $toadd; @@ -201,14 +205,14 @@ for ($i = 0; $i < sizeof($ztaufdata); $i++) if ($isLastEntry) { - $worktime_unix = $date->mktime_fromtimestamp($date->formatDatum($dayEnd, $format = 'Y-m-d H:i:s')) - $date->mktime_fromtimestamp($date->formatDatum($dayStart, $format = 'Y-m-d H:i:s')); + $worktime_unix = $date->mktime_fromtimestamp($dayEnd) - $date->mktime_fromtimestamp($dayStart); $worktimehours = $worktime_unix / 3600; $projectlines[$day]->arbeitszeit = $worktimehours; $pauseSubtracted = 0.00; $lehreExternExists = false; - //subtract Pauses and LehreExtern + //subtract pauses and LehreExtern from total worktime foreach ($tosubtract as $subtraction) { if ($subtraction->typ == $toignore[0]) @@ -223,32 +227,33 @@ for ($i = 0; $i < sizeof($ztaufdata); $i++) } } - //subtract pauses from Project worktimes - foreach($allpauseranges as $pauserange) + //subtract pauses from project worktimes + foreach ($allpauseranges as $pauserange) { - foreach($projectlines[$day]->projekte as $name => $project) + foreach ($projectlines[$day]->projekte as $name => $project) { - foreach($projectlines[$day]->projekte[$name]->alleZeiten as $zeit) + foreach ($projectlines[$day]->projekte[$name]->alleZeiten as $zeit) { - if($pauserange->start >= $zeit->start && $pauserange->ende <= $zeit->ende) + //pause between project start and end + if ($pauserange->start >= $zeit->start && $pauserange->ende <= $zeit->ende) { $projectlines[$day]->projekte[$name]->stunden -= ($date->mktime_fromtimestamp($pauserange->ende) - $date->mktime_fromtimestamp($pauserange->start)) / 3600; break; } - elseif($pauserange->start < $zeit->ende && $pauserange->start > $zeit->start) + //pause and project time overlap at project time end + elseif ($pauserange->start < $zeit->ende && $pauserange->start > $zeit->start) { $projectlines[$day]->projekte[$name]->stunden -= ($date->mktime_fromtimestamp($zeit->ende) - $date->mktime_fromtimestamp($pauserange->start)) / 3600; - //break; } - elseif($pauserange->ende > $zeit->start && $pauserange->ende< $zeit->ende) + //pause and project time overlap at project time start + elseif ($pauserange->ende > $zeit->start && $pauserange->ende < $zeit->ende) { $projectlines[$day]->projekte[$name]->stunden -= ($date->mktime_fromtimestamp($pauserange->ende) - $date->mktime_fromtimestamp($zeit->start)) / 3600; - //break; } } } } - + //worktime with no break greater 6 -> compulsory break of half an hour if ($pauseSubtracted < 0.5 && !$lehreExternExists) { @@ -262,7 +267,7 @@ for ($i = 0; $i < sizeof($ztaufdata); $i++) $projectlines[$day]->arbeitszeit = floor($projectlines[$day]->arbeitszeit * 100) / 100; - foreach($projectlines[$day]->projekte as $name => $project) + foreach ($projectlines[$day]->projekte as $name => $project) { $projecthours =& $projectlines[$day]->projekte[$name]->stunden; $projecthours = floor($projecthours * 100) / 100; @@ -309,6 +314,12 @@ $format_heading_right_bottomline->setAlign('right'); $format_heading_right_bottomline->setRight(2); $format_heading_right_bottomline->setBottom(2); +$format_heading_bottomline =& $workbook->addFormat(); +$format_heading_bottomline->setBottom(2); + +$format_heading_topline =& $workbook->addFormat(); +$format_heading_topline->setTop(2); + $format_bold_centered_toprightline =& $workbook->addFormat(); $format_bold_centered_toprightline->setBorder(1); $format_bold_centered_toprightline->setBold(); @@ -349,7 +360,9 @@ $format_cell_centered->setAlign('center'); $format_cell_centered->setVAlign('vcenter'); $format_cell_centered_leftline =& $workbook->addFormat(); -$format_cell_centered_leftline->setBorder(1); +$format_cell_centered_leftline->setRight(1); +$format_cell_centered_leftline->setLeft(1); +$format_cell_centered_leftline->setBottom(1); $format_cell_centered_leftline->setAlign('center'); $format_cell_centered_leftline->setVAlign('vcenter'); $format_cell_centered_leftline->setLeft(2); @@ -382,7 +395,7 @@ $format_cell_centered_alllines->setAlign('center'); $format_cell_centered_alllines->setVAlign('vcenter'); //define column widths -$nrProjects = sizeof($projectnames); +$nrProjects = count($projectnames); $daywidth = 4; $totalworktimewidth = 10; $worktimewidth = 8; @@ -431,14 +444,23 @@ while ($numberspaces > 0) $spalte = $zeile = 0; //write global header -$lastspalte = ($nrProjects > 0) ? 2 + sizeof($projectnames) * 2 : 14; +$lastspalte = ($nrProjects > 0) ? 2 + count($projectnames) * 2 : 14; $worksheet->setMerge($zeile, $spalte, $zeile + 1, $spalte + 2); $worksheet->write($zeile, $spalte, $monthtext." ".$year, $format_heading_left); -$worksheet->write($zeile + 1, $spalte, "", $format_heading_left); - +$worksheet->write($zeile + 1, $spalte, $monthtext." ".$year, $format_heading_left); +for ($i = 1; $i < 3; $i++) +{ + $worksheet->write($zeile, $spalte+$i, "", $format_heading_topline); + $worksheet->write($zeile + 1, $spalte+$i, "", $format_heading_bottomline); +} $worksheet->setMerge($zeile, $spalte + 3, $zeile, $lastspalte); $worksheet->setMerge($zeile + 1, $spalte + 3, $zeile + 1, $lastspalte); $worksheet->write($zeile, $spalte + 3, "Projektliste gedruckt am:".$spacesstringFirst.$username, $format_heading_right); +for ($i = 4; $i < $lastspalte; $i++) +{ + $worksheet->write($zeile, $i, "", $format_heading_topline); + $worksheet->write($zeile + 1, $i, "", $format_heading_bottomline); +} $worksheet->write($zeile, $lastspalte, '', $format_heading_right); $worksheet->write($zeile + 1, $spalte + 3, date('d.m.Y H:i').$spacesstringSecond.'Personal-Nr.:'.$persnr, $format_heading_right_bottomline); $worksheet->write($zeile + 1, $lastspalte, '', $format_heading_right_bottomline); @@ -452,7 +474,9 @@ $worksheet->hideScreenGridlines(); //write table header $worksheet->setMerge($zeile, $spalte, $zeile + 1, $spalte + 1); $worksheet->write($zeile, $spalte, "Tag", $format_bold_centered_alllines); -$worksheet->write($zeile + 1, $spalte++, "", $format_bold_centered_alllines); +$worksheet->write($zeile + 1, $spalte, "", $format_bold_centered_alllines); +$worksheet->write($zeile, $spalte + 1, "Tag", $format_bold_centered_alllines); +$worksheet->write($zeile + 1, ++$spalte, "", $format_bold_centered_alllines); $worksheet->setMerge($zeile, ++$spalte, $zeile + 1, $spalte); $worksheet->write($zeile, $spalte, "Arbeitszeit", $format_bold_centered_alllines); $worksheet->write($zeile + 1, $spalte, "", $format_bold_centered_alllines); @@ -505,15 +529,16 @@ for ($daysnmbr = 1; $daysnmbr <= $daysinmonth; $daysnmbr++) } else { - //write empty cells - $worksheet->write($zeile, $spalte, '0,00', $format_cell_centered_rightline); - $toskip = sizeof($projectnames) * 2; + //write empty cells until end of table + $worksheet->write($zeile, $spalte, '0,00', $format_cell_centered_leftline); + $toskip = count($projectnames) * 2; for ($i = 0; $i <= $toskip; $i++) { if ($i % 2 == 0) - $worksheet->write($zeile, $spalte++, '', $format_cell_centered_rightline); + $worksheet->write($zeile, $spalte, '', $format_cell_centered_rightline); else - $worksheet->write($zeile, $spalte++, '', $format_cell_centered); + $worksheet->write($zeile, $spalte, '', $format_cell_centered); + $spalte++; } } $zeile++; @@ -531,6 +556,7 @@ if ($nrProjects < 1) $spalte = 0; $worksheet->setMerge($zeile, $spalte, $zeile, $spalte + 1); $worksheet->write($zeile, $spalte, 'Summe:', $format_bold_centered_alllines); +$worksheet->write($zeile, $spalte + 1, '', $format_bold_centered_alllines); $spalte += 2; $worksheet->write($zeile, $spalte++, number_format($monthsums[0], 2, ",", "."), $format_cell_centered_alllines); foreach ($projectnames as $project) @@ -538,7 +564,5 @@ foreach ($projectnames as $project) $worksheet->write($zeile, $spalte++, number_format($monthsums[$project], 2, ",", "."), $format_cell_centered_topbottomleftline); $worksheet->write($zeile, $spalte++, "", $format_cell_centered_topbottomrightline); } - $worksheet->fitToPages(1, 1); $workbook->close(); -