From c0f9b314098e052212e85325bd7f75708cae9158 Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 20 Dec 2017 14:54:11 +0100 Subject: [PATCH] Fixed Bug that lines are not continuious in some excel versions, projecttime now added up also if second time entry is starting at same time as last project entry ends, converting to date is done only once at begin of projectline iteration --- .../tools/zeitaufzeichnung_projektliste.php | 102 +++++++++++------- 1 file changed, 63 insertions(+), 39 deletions(-) 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(); -