mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-20 00:12:15 +00:00
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:
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user