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

This commit is contained in:
alex
2017-12-20 14:54:11 +01:00
parent 6aeb96818f
commit c0f9b31409
@@ -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();