diff --git a/cis/private/tools/zeitaufzeichnung.php b/cis/private/tools/zeitaufzeichnung.php
index 7461f2421..94251ce12 100644
--- a/cis/private/tools/zeitaufzeichnung.php
+++ b/cis/private/tools/zeitaufzeichnung.php
@@ -33,6 +33,7 @@ require_once('../../../include/zeitaufzeichnung.class.php');
require_once('../../../include/zeitsperre.class.php');
require_once('../../../include/datum.class.php');
require_once('../../../include/projekt.class.php');
+require_once('../../../include/projektphase.class.php');
require_once('../../../include/phrasen.class.php');
require_once('../../../include/organisationseinheit.class.php');
require_once('../../../include/service.class.php');
@@ -110,13 +111,12 @@ else if (defined('CIS_ZEITAUFZEICHNUNG_GESPERRT_BIS') && CIS_ZEITAUFZEICHNUNG_GE
else
$gesperrt_bis = '2015-08-31';
-//var_dump($gesperrt_bis);
-
$sperrdatum = date('c', strtotime($gesperrt_bis));
// Uses urlencode to avoid XSS issues
$zeitaufzeichnung_id = urlencode(isset($_GET['zeitaufzeichnung_id'])?$_GET['zeitaufzeichnung_id']:'');
$projekt_kurzbz = (isset($_POST['projekt'])?$_POST['projekt']:'');
+$projektphase_id = (isset($_POST['projektphase'])?$_POST['projektphase']:'');
$oe_kurzbz_1 = (isset($_POST['oe_kurzbz_1'])?$_POST['oe_kurzbz_1']:'');
$oe_kurzbz_2 = (isset($_POST['oe_kurzbz_2'])?$_POST['oe_kurzbz_2']:'');
$aktivitaet_kurzbz = (isset($_POST['aktivitaet'])?$_POST['aktivitaet']:'');
@@ -251,6 +251,13 @@ echo '
$("#kunde_uid").val(ui.item.uid);
}
});
+
+ $("#projekt").change(
+ function()
+ {
+ getProjektphasen($(this).val());
+ }
+ )
});
@@ -489,6 +496,49 @@ echo '
}
return true;
}
+
+ function getProjektphasen(projekt_kurzbz)
+ {
+ $.ajax
+ (
+ {
+ type: "GET",
+ url: "zeitaufzeichnung_projektphasen.php",
+ dataType: "json",
+ data:
+ {
+ "projekt_kurzbz":projekt_kurzbz
+ },
+ success: function(json)
+ {
+ //remove Projektphasen from html if any
+ $("#projektphase").children("option").each(
+ function()
+ {
+ if ($(this).prop("id") !== "projektphasekeineausw")
+ $(this).remove();
+ }
+ );
+ //append Projektphasen if any
+ if (json.length > 0)
+ {
+ var projphasenhtml = "";
+ for (var i = 0; i < json.length; i++)
+ {
+ projphasenhtml += "';
sort($projekt->result);
+ $projektfound = false;
foreach ($projekt->result as $row_projekt)
{
if ($projekt_kurzbz == $row_projekt->projekt_kurzbz || $filter == $row_projekt->projekt_kurzbz)
+ {
+ $projektfound = true;
$selected = 'selected';
+ }
else
$selected = '';
echo '';
}
- echo '';
- echo '';
+ echo '';
+
+ //Projektphase
+ $showprojphases = isset($projektphasen) && is_array($projektphasen) && count($projektphasen) > 0 && $projektfound;
+ $hiddentext = $showprojphases ? "" : " style='display:none'";
+
+ echo
+ ' '.
+ $p->t("zeitaufzeichnung/projektphase").'
+ ';
+ }
+ echo '';
}
if ($za_simple == 0)
diff --git a/cis/private/tools/zeitaufzeichnung_projektliste.php b/cis/private/tools/zeitaufzeichnung_projektliste.php
index 17adfba97..b8b19a0a9 100644
--- a/cis/private/tools/zeitaufzeichnung_projektliste.php
+++ b/cis/private/tools/zeitaufzeichnung_projektliste.php
@@ -32,6 +32,7 @@ require_once('../../../include/benutzer.class.php');
require_once('../../../include/mitarbeiter.class.php');
require_once('../../../include/zeitaufzeichnung.class.php');
require_once('../../../include/projekt.class.php');
+require_once('../../../include/projektphase.class.php');
if (!isset($_GET['projexpmonat']))
die("Parameter monat fehlt");
@@ -61,17 +62,19 @@ $daysinmonth = cal_days_in_month(CAL_GREGORIAN, $month, $year);
$date = new datum();
$ztauf = new zeitaufzeichnung();
+$projektphaseclass = new projektphase();
$activitiesToIgnore = array('DienstreiseMT', 'Ersatzruhe');//aktivitaetstypen which shouldn't be added to worktime
$ztauf->getListeUserFromTo($uid, $year.'-'.$month.'-01', $year.'-'.$month.'-'.$daysinmonth, $activitiesToIgnore);
//objects for one projectline of list (corresponds to one day)
-$projectlines = [];
+$projektlines = array();
$dayStart = $dayEnd = '';
-$projectnames = $tosubtract = $allpauseranges = [];
+$projektnames = $projektphasenames = $tosubtract = $allpauseranges = array();
$activitiesToSubtract = ['Pause', 'LehreExtern', 'Arztbesuch', 'Behoerde'];//aktivitaetstypen which should be subtracted fromworktime
$ztaufdata = $ztauf->result;
-$monthsums = [0 => 0.00];
+$totalmonthsum = 0.00;
+$projektmonthsums = array();
//sort list by startdate ascending (if not already done in zeitaufzeichnung class)
usort($ztaufdata, function ($ztaufa, $ztaufb)
@@ -85,12 +88,13 @@ usort($ztaufdata, function ($ztaufa, $ztaufb)
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]);
+ $isFirstEntry = !isset($projektlines[$day]);
//last entry for a day (next entry is different day)
$isLastEntry = !array_key_exists($i + 1, $ztaufdata) || intval($date->formatDatum($ztaufdata[$i + 1]->ende, 'd')) != $day;
@@ -137,18 +141,19 @@ for ($i = 0; $i < count($ztaufdata); $i++)
if ($isFirstEntry)
{
- $projectlines[$day] = new stdClass();
- $projectlines[$day]->arbeitszeit = '';
- $projectlines[$day]->projekte = [];
+ $projektlines[$day] = new stdClass();
+ $projektlines[$day]->arbeitszeit = '';
+ $projektlines[$day]->projekte = [];
}
if (isset($ztaufrow->projekt_kurzbz))
{
//Project already in projectline - add to worktime and description
- if (array_key_exists($ztaufrow->projekt_kurzbz, $projectlines[$day]->projekte))
+ if (array_key_exists($ztaufrow->projekt_kurzbz, $projektlines[$day]->projekte))
{
- $laststart =& $projectlines[$day]->projekte[$ztaufrow->projekt_kurzbz]->laststart;
- $lastende =& $projectlines[$day]->projekte[$ztaufrow->projekt_kurzbz]->lastende;
+ $currproj =& $projektlines[$day]->projekte[$ztaufrow->projekt_kurzbz];
+ $laststart =& $currproj->laststart;
+ $lastende =& $currproj->lastende;
$toadd = 0.00;
//case 1: there is no overlap, just add project time difference
@@ -157,56 +162,107 @@ for ($i = 0; $i < count($ztaufdata); $i++)
$toadd = $date->convertTimeStringToHours($ztaufrow->diff);
$laststart = $ztaufrow->start;
$lastende = $ztaufrow->ende;
- $newprojecttime = new stdClass();
- $newprojecttime->start = $ztaufrow->start;
- $newprojecttime->ende = $ztaufrow->ende;
- $projectlines[$day]->projekte[$ztaufrow->projekt_kurzbz]->alleZeiten[] = $newprojecttime;
+ $newprojekttime = new stdClass();
+ $newprojekttime->start = $ztaufrow->start;
+ $newprojekttime->ende = $ztaufrow->ende;
+ $currproj->alleZeiten[] = $newprojekttime;
+ if (isset($ztaufrow->projektphase_id))
+ $currproj->projektphasen[$ztaufrow->projektphase_id]->alleZeiten[] = $newprojekttime;
}
//case 2: overlap - add only part of the time
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;
+
+ $alleZeiten =& $currproj->alleZeiten;
$index = count($alleZeiten);
$alleZeiten[$index - 1]->ende = $ztaufrow->ende;
+
+ //check if overlap in projektphase, change ende accordingly
+ if (isset($ztaufrow->projektphase_id))
+ {
+ $projektphaseAlleZeiten =& $currproj->projektphasen[$ztaufrow->projektphase_id]->alleZeiten;
+ $projektphaselastendeidx = count($projektphaseAlleZeiten);
+ $projektphaselastende =& $projektphaseAlleZeiten[$projektphaselastendeidx - 1];
+ if ($ztaufrow->start < $projektphaselastende && $ztaufrow->ende > $projektphaselastende)
+ $projektphaselastende->ende = $ztaufrow->ende;
+ }
+ }
+ $currproj->stunden +=$toadd;
+ //add to projektphase
+ if (isset($ztaufrow->projektphase_id))
+ {
+ $currproj->projektphasen[$ztaufrow->projektphase_id]->stunden += $toadd;
}
- $projectlines[$day]->projekte[$ztaufrow->projekt_kurzbz]->stunden += $toadd;
//concatenate descriptions "working packages" for each project
if (!empty($ztaufrow->beschreibung))
{
- $packagecounter = ++$projectlines[$day]->projekte[$ztaufrow->projekt_kurzbz]->arbeitspakete;
+ $packagecounter = ++$currproj->arbeitspakete;
if ($packagecounter == 1)
- $projectlines[$day]->projekte[$ztaufrow->projekt_kurzbz]->beschreibung = $ztaufrow->beschreibung;
+ $currproj->beschreibung = $ztaufrow->beschreibung;
else
- $projectlines[$day]->projekte[$ztaufrow->projekt_kurzbz]->beschreibung .= " | ".str_replace(array("\r\n", "\r", "\n"), " ", $ztaufrow->beschreibung);
+ $currproj->beschreibung .= " | ".str_replace(array("\r\n", "\r", "\n"), " ", $ztaufrow->beschreibung);
}
}
else
{
//add new project to projectline
- $newproject = new stdClass();
- $newproject->laststart = $ztaufrow->start;
- $newproject->lastende = $ztaufrow->ende;
- $newprojecttime = new stdClass();
- $newprojecttime->start = $ztaufrow->start;
- $newprojecttime->ende = $ztaufrow->ende;
- $newproject->alleZeiten = [];
- $newproject->alleZeiten[] = $newprojecttime;
- $newproject->stunden = $date->convertTimeStringToHours($ztaufrow->diff);
- $newproject->arbeitspakete = 0;//counter for tracking number of descriptions (work packages)
- $newproject->beschreibung = '';
+ $stunden = $date->convertTimeStringToHours($ztaufrow->diff);
+
+ $newprojekt = new stdClass();
+ $newprojekt->laststart = $ztaufrow->start;
+ $newprojekt->lastende = $ztaufrow->ende;
+ $newprojekttime = new stdClass();
+ $newprojekttime->start = $ztaufrow->start;
+ $newprojekttime->ende = $ztaufrow->ende;
+ $newprojekt->alleZeiten = [];
+ $newprojekt->alleZeiten[] = $newprojekttime;
+ $newprojekt->stunden = $stunden;
+ $newprojekt->arbeitspakete = 0;//counter for tracking number of descriptions (work packages)
+ $newprojekt->beschreibung = '';
if (!empty($ztaufrow->beschreibung))
{
- $newproject->beschreibung = str_replace(array("\r\n", "\r", "\n"), " ", $ztaufrow->beschreibung);
- $newproject->arbeitspakete++;
+ $newprojekt->beschreibung = str_replace(array("\r\n", "\r", "\n"), " ", $ztaufrow->beschreibung);
+ $newprojekt->arbeitspakete++;
}
- $projectlines[$day]->projekte[$ztaufrow->projekt_kurzbz] = $newproject;
- //add new project to array with unique project names
- if (!in_array($ztaufrow->projekt_kurzbz, $projectnames))
- $projectnames[] = $ztaufrow->projekt_kurzbz;
+ //add projektphasen of project
+ $projektphasen = array();
+
+ if ($projektphaseclass->getProjektphasen($ztaufrow->projekt_kurzbz))
+ {
+ $projektphasenames[$ztaufrow->projekt_kurzbz] = array();
+
+ foreach ($projektphaseclass->result as $ppitem)
+ {
+ $phasetoadd = new stdClass();
+ $phasetoadd->bezeichnung = $ppitem->bezeichnung;
+ $phasetoadd->stunden = 0;
+ $phasetoadd->alleZeiten = array();
+
+ if ($ppitem->projektphase_id == $ztaufrow->projektphase_id)
+ {
+ $phasetoadd->stunden += $stunden;
+ $phasetoadd->alleZeiten[] = $newprojekttime;
+ }
+
+ $projektphasen[$ppitem->projektphase_id] = $phasetoadd;
+
+ //add new projektphase to array with unique projekt phase names
+ if (!in_array($ppitem->bezeichnung, $projektphasenames[$ztaufrow->projekt_kurzbz]))
+ $projektphasenames[$ztaufrow->projekt_kurzbz][] = $ppitem->bezeichnung;
+ }
+ }
+
+ $newprojekt->projektphasen = $projektphasen;
+
+ $projektlines[$day]->projekte[$ztaufrow->projekt_kurzbz] = $newprojekt;
+
+ //add new projekt to array with unique projekt names
+ if (!in_array($ztaufrow->projekt_kurzbz, $projektnames))
+ $projektnames[] = $ztaufrow->projekt_kurzbz;
}
}
@@ -215,7 +271,7 @@ for ($i = 0; $i < count($ztaufdata); $i++)
$worktime_unix = $date->mktime_fromtimestamp($dayEnd) - $date->mktime_fromtimestamp($dayStart);
$worktimehours = $worktime_unix / 3600;
- $projectlines[$day]->arbeitszeit = $worktimehours;
+ $projektlines[$day]->arbeitszeit = $worktimehours;
$pauseSubtracted = 0.00;
$lehreExternExists = false;
@@ -224,42 +280,71 @@ for ($i = 0; $i < count($ztaufdata); $i++)
{
if ($subtraction->typ == $activitiesToSubtract[0])
{
- $projectlines[$day]->arbeitszeit -= $subtraction->diff;
+ $projektlines[$day]->arbeitszeit -= $subtraction->diff;
$pauseSubtracted += $subtraction->diff;
}
elseif ($subtraction->typ == $activitiesToSubtract[1] && $subtraction->start >= $dayStart && $subtraction->ende <= $dayEnd)
{
- $projectlines[$day]->arbeitszeit -= $subtraction->diff;
+ $projektlines[$day]->arbeitszeit -= $subtraction->diff;
$lehreExternExists = true;
}
elseif ($subtraction->typ == $activitiesToSubtract[2] || $subtraction->typ == $activitiesToSubtract[3])
{
- $projectlines[$day]->arbeitszeit -= $subtraction->diff;
+ $projektlines[$day]->arbeitszeit -= $subtraction->diff;
}
}
- //subtract pauses from project worktimes
+ //subtract pauses from projekt worktimes
foreach ($allpauseranges as $pauserange)
{
- foreach ($projectlines[$day]->projekte as $name => $project)
+ foreach ($projektlines[$day]->projekte as $name => $projekt)
{
- foreach ($projectlines[$day]->projekte[$name]->alleZeiten as $zeit)
+ $proj =& $projektlines[$day]->projekte[$name];
+ foreach ($proj->alleZeiten as $zeit)
{
- //pause between project start and end
+ $subtraction = 0.00;
+
+ //pause between projekt 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;
+ $subtraction = $date->mktime_fromtimestamp($pauserange->ende) - $date->mktime_fromtimestamp($pauserange->start);
}
- //pause and project time overlap at project time end
+ //pause and projekt time overlap at projekt 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;
+ $subtraction = $date->mktime_fromtimestamp($zeit->ende) - $date->mktime_fromtimestamp($pauserange->start);
+ //$proj->stunden -= ($date->mktime_fromtimestamp($zeit->ende) - $date->mktime_fromtimestamp($pauserange->start)) / 3600;
}
- //pause and project time overlap at project time start
+ //pause and projekt time overlap at projekt 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;
+ $subtraction = $date->mktime_fromtimestamp($pauserange->ende) - $date->mktime_fromtimestamp($zeit->start);
+ }
+ $proj->stunden -= $subtraction / 3600;
+ }
+
+ //subtract from projektphasen
+ foreach ($proj->projektphasen as $phase_id => $phase)
+ {
+ foreach ($phase->alleZeiten as $zeit)
+ {
+ $subtraction = 0.00;
+ //pause between projektphase start and end
+ if ($pauserange->start >= $zeit->start && $pauserange->ende <= $zeit->ende)
+ {
+ $subtraction = ($date->mktime_fromtimestamp($pauserange->ende) - $date->mktime_fromtimestamp($pauserange->start));
+ }
+ //pause and projekt time overlap at projektphase time end
+ elseif ($pauserange->start < $zeit->ende && $pauserange->start > $zeit->start)
+ {
+ $subtraction = $date->mktime_fromtimestamp($zeit->ende) - $date->mktime_fromtimestamp($pauserange->start);
+ }
+ //pause and projekt time overlap at projektphase time start
+ elseif ($pauserange->ende > $zeit->start && $pauserange->ende < $zeit->ende)
+ {
+ $subtraction = $date->mktime_fromtimestamp($pauserange->ende) - $date->mktime_fromtimestamp($zeit->start);
+ }
+ $proj->projektphasen[$phase_id]->stunden -= $subtraction / 3600;
}
}
}
@@ -268,29 +353,47 @@ for ($i = 0; $i < count($ztaufdata); $i++)
//worktime with no break greater 6 -> compulsory break of half an hour
if ($pauseSubtracted < 0.5 && !$lehreExternExists)
{
- if ($projectlines[$day]->arbeitszeit >= 6.5)
- $projectlines[$day]->arbeitszeit -= 0.5;
+ if ($projektlines[$day]->arbeitszeit >= 6.5)
+ $projektlines[$day]->arbeitszeit -= 0.5;
//ensure that no worktime gets smaller than 6 hours because of compulsory break
- elseif ($projectlines[$day]->arbeitszeit > 6)
- $projectlines[$day]->arbeitszeit -= $projectlines[$day]->arbeitszeit - 6;
+ elseif ($projektlines[$day]->arbeitszeit > 6)
+ $projektlines[$day]->arbeitszeit -= $projektlines[$day]->arbeitszeit - 6;
}
- $projectlines[$day]->arbeitszeit = round($projectlines[$day]->arbeitszeit, 2);
+ $projektlines[$day]->arbeitszeit = round($projektlines[$day]->arbeitszeit, 2);
- foreach ($projectlines[$day]->projekte as $name => $project)
+ //calculate sums
+ foreach ($projektlines[$day]->projekte as $name => $projekt)
{
- $projecthours =& $projectlines[$day]->projekte[$name]->stunden;
- $projecthours = round($projecthours, 2);
- if (array_key_exists($name, $monthsums))
- $monthsums[$name] += $projecthours;
+ $projekthours =& $projektlines[$day]->projekte[$name]->stunden;
+ $projekthours = round($projekthours, 2);
+
+ if (isset($projektmonthsums[$name]->sum))
+ {
+ $projektmonthsums[$name]->sum += $projekthours;
+ foreach ($projekt->projektphasen as $projektphase)
+ {
+ $projektmonthsums[$name]->projektphasen[$projektphase->bezeichnung] += round($projektphase->stunden, 2, 0);
+ }
+ }
else
- $monthsums[$name] = $projecthours;
+ {
+ $monthsum = new stdClass();
+ $monthsum->sum = $projekthours;
+ $monthsum->projektphasen = array();
+
+ foreach ($projekt->projektphasen as $projektphase)
+ {
+ $monthsum->projektphasen[$projektphase->bezeichnung] = round($projektphase->stunden, 2, 0);
+ }
+ $projektmonthsums[$name] = $monthsum;
+ }
}
$dayStart = $dayEnd = '';
$tosubtract = $allpauseranges = [];
- $monthsums[0] += $projectlines[$day]->arbeitszeit;
+ $totalmonthsum += $projektlines[$day]->arbeitszeit;
}
}
@@ -301,10 +404,6 @@ $workbook->setVersion(8);
// sending HTTP headers
$workbook->send('Projektliste_'.$month.'_'.$year.'.xls');
-// Creating a worksheet
-$worksheet =& $workbook->addWorksheet($p->t('zeitaufzeichnung/projektliste'));
-$worksheet->setInputEncoding('utf-8');
-
// Define formats
$format_heading_left =& $workbook->addFormat();
$format_heading_left->setBold();
@@ -365,6 +464,12 @@ $format_cell_rightline->setBorder(1);
$format_cell_rightline->setVAlign('vcenter');
$format_cell_rightline->setRight(2);
+$format_cell_leftrightline =& $workbook->addFormat();
+$format_cell_leftrightline->setBottom(1);
+$format_cell_leftrightline->setVAlign('vcenter');
+$format_cell_leftrightline->setLeft(2);
+$format_cell_leftrightline->setRight(2);
+
$format_cell_centered =& $workbook->addFormat();
$format_cell_centered->setBorder(1);
$format_cell_centered->setAlign('center');
@@ -372,7 +477,6 @@ $format_cell_centered->setVAlign('vcenter');
$format_cell_centered_leftline =& $workbook->addFormat();
$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');
@@ -384,6 +488,20 @@ $format_cell_centered_rightline->setAlign('center');
$format_cell_centered_rightline->setVAlign('vcenter');
$format_cell_centered_rightline->setRight(2);
+$format_cell_centered_leftrightline =& $workbook->addFormat();
+$format_cell_centered_leftrightline->setBottom(1);
+$format_cell_centered_leftrightline->setAlign('center');
+$format_cell_centered_leftrightline->setVAlign('vcenter');
+$format_cell_centered_leftrightline->setLeft(2);
+$format_cell_centered_leftrightline->setRight(2);
+
+$format_cell_centered_topbottomline =& $workbook->addFormat();
+$format_cell_centered_topbottomline->setBorder(1);
+$format_cell_centered_topbottomline->setAlign('center');
+$format_cell_centered_topbottomline->setVAlign('vcenter');
+$format_cell_centered_topbottomline->setBottom(2);
+$format_cell_centered_topbottomline->setTop(2);
+
$format_cell_centered_topbottomleftline =& $workbook->addFormat();
$format_cell_centered_topbottomleftline->setBorder(1);
$format_cell_centered_topbottomleftline->setAlign('center');
@@ -406,178 +524,243 @@ $format_cell_centered_alllines->setAlign('center');
$format_cell_centered_alllines->setVAlign('vcenter');
//define column widths
-$nrProjects = count($projectnames);
+$nrProjects = count($projektnames);
+$totalwidth = 150;
$daywidth = 4;
$totalworktimewidth = 13;
-$worktimewidth = 8;
-$worksheet->setColumn(0, 1, $daywidth);
-$worksheet->setColumn(2, 2, $totalworktimewidth);
+$worktimewidth = 14;
+$timecolumnswidth = 2 * $daywidth + $totalworktimewidth + $worktimewidth;
-//calculate max width for project descriptions
-$maxwidthprojects = $totalworktimewidth * (12 - $nrProjects);
-$projectcolumnwidths = array_fill_keys($projectnames, $worktimewidth);
-
-//set project column width depending on project description widths
-foreach ($projectlines as $line)
+if ($nrProjects < 1)//no projekts - merge all cells and write notice
{
- foreach ($line->projekte as $key => $project)
+ $projektnames[] = "Keine Projekte vorhanden";
+}
+
+foreach ($projektnames as $projektname)
+{
+ //Creating a worksheet
+ $worksheet =& $workbook->addWorksheet($projektname);
+ $worksheet->setInputEncoding('utf-8');
+
+ //general options
+ $worksheet->setLandscape();
+ $worksheet->hideGridlines();
+ $worksheet->hideScreenGridlines();
+ $worksheet->setmargins(0.4);
+
+ //fixed width columns
+ $worksheet->setColumn(0, 1, $daywidth);
+ $worksheet->setColumn(2, 2, $totalworktimewidth);
+
+ //calculate number of columns of projekt with phases
+ $nrPhases = isset($projektphasenames[$projektname]) ? count($projektphasenames[$projektname]) : 0;
+
+ //get taetigkeiten column width -
+ //minimum is wordlength, maximum restwidth after subraction of projektphase minimum width
+ $mintaetigkeitenwidth = strlen($p->t('zeitaufzeichnung/taetigkeit'));
+ $maxtaetigkeitenlimit = $totalwidth - $timecolumnswidth - $nrPhases * $worktimewidth;
+
+ if (isset($projektlines->projekte[$projektname]))
{
- if ($projectcolumnwidths[$key] < strlen($project->beschreibung))
- $projectcolumnwidths[$key] = strlen($project->beschreibung);
- }
-}
-
-//distribute width remainder evenly among projects
-if ($nrProjects != 0)
- $remwidth = ($maxwidthprojects - array_sum($projectcolumnwidths)) / $nrProjects;
-
-foreach ($projectcolumnwidths as $projectname => $width)
- $projectcolumnwidths[$projectname] += $remwidth;
-
-//calculating spaces for centering global header texts
-$numberspaces = ($maxwidthprojects - 10 - strlen($username));
-$spacesstringFirst = '';
-
-while ($numberspaces > 0)
-{
- $spacesstringFirst .= ' ';
- $numberspaces--;
-}
-
-$numberspaces = ($maxwidthprojects - 14 - strlen($persnr));
-$spacesstringSecond = '';
-while ($numberspaces > 0)
-{
- $spacesstringSecond .= ' ';
- $numberspaces--;
-}
-
-$spalte = $zeile = 0;
-
-//set language options
-$decpoint = $sprache_index === '2' ? '.' : ',';
-$thousandsep = $sprache_index === '2' ? ',' : '.';
-
-//write global header
-$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, $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, $p->t('zeitaufzeichnung/projektlistegedruckt').$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.$p->t('zeitaufzeichnung/personalnr').$persnr, $format_heading_right_bottomline);
-$worksheet->write($zeile + 1, $lastspalte, '', $format_heading_right_bottomline);
-$zeile += 3;
-
-//general options
-$worksheet->setLandscape();
-$worksheet->hideGridlines();
-$worksheet->hideScreenGridlines();
-
-//write table header
-$worksheet->setMerge($zeile, $spalte, $zeile + 1, $spalte + 1);
-$worksheet->write($zeile, $spalte, $p->t('zeitaufzeichnung/tag'), $format_bold_centered_alllines);
-$worksheet->write($zeile + 1, $spalte, '', $format_bold_centered_alllines);
-$worksheet->write($zeile, $spalte + 1, $p->t('zeitaufzeichnung/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, $p->t('zeitaufzeichnung/arbeitszeit'), $format_bold_centered_alllines);
-$worksheet->write($zeile + 1, $spalte, '', $format_bold_centered_alllines);
-$spalte++;
-
-foreach ($projectnames as $project)
-{
- $worksheet->setMerge($zeile, $spalte, $zeile, $spalte + 1);
- $worksheet->write($zeile, $spalte, $project, $format_bold_centered_toprightline);
- $worksheet->write($zeile, $spalte + 1, '', $format_bold_centered_toprightline);
- $worksheet->write($zeile + 1, $spalte, $p->t('zeitaufzeichnung/stunden'), $format_bold_centered_bottomline);
- $worksheet->write($zeile + 1, $spalte + 1, $p->t('zeitaufzeichnung/taetigkeit'), $format_bold_centered_bottomrightline);
- $spalte += 2;
-}
-$zeile += 2;
-
-//write table body
-for ($daysnmbr = 1; $daysnmbr <= $daysinmonth; $daysnmbr++)
-{
- //write day and weekday
- $spalte = 0;
- $monthstr = ($month < 10) ? '0'.$month : $month;
- $daystr = ($daysnmbr < 10) ? '0'.$daysnmbr : $daysnmbr;
- $datestring = $year.'-'.$monthstr.'-'.$daystr;
- $weekday = substr($tagbez[$sprache_index][$date->formatDatum($datestring, 'N')], 0, 2);
- $worksheet->write($zeile, $spalte++, $weekday, $format_cell_centered_leftline);
- $worksheet->write($zeile, $spalte++, $daysnmbr, $format_cell_centered_rightline);
-
- if (array_key_exists($daysnmbr, $projectlines))
- {
- //write worktime
- $worksheet->writeString($zeile, $spalte++, number_format($projectlines[$daysnmbr]->arbeitszeit, 2, $decpoint, $thousandsep), $format_cell_centered_rightline);
- $spaltetemp = $spalte;
- //write projects
- foreach ($projectnames as $project)
+ foreach ($projektlines->projekte[$projektname] as $projekt)
{
- if (array_key_exists($project, $projectlines[$daysnmbr]->projekte))
+ $projektbeschreibunglength = strlen($projekt->beschreibung);
+ if ($projektbeschreibunglength >= $maxtaetigkeitenlimit)
{
- $worksheet->setColumn($spalte, $spalte, $worktimewidth);
- $worksheet->writeString($zeile, $spalte++, number_format($projectlines[$daysnmbr]->projekte[$project]->stunden, 2, $decpoint, $thousandsep), $format_cell_centered_leftline);
- $worksheet->setColumn($spalte, $spalte, $projectcolumnwidths[$project]);
- $worksheet->write($zeile, $spalte++, $projectlines[$daysnmbr]->projekte[$project]->beschreibung, $format_cell_rightline);
- }
- else
- {
- $worksheet->write($zeile, $spalte++, '', $format_cell_centered_leftline);
- $worksheet->write($zeile, $spalte++, '', $format_cell_rightline);
+ $mintaetigkeitenwidth = $maxtaetigkeitenlimit;
+ break;
}
+ elseif ($projektbeschreibunglength > $mintaetigkeitenwidth)
+ $mintaetigkeitenwidth = $projektbeschreibunglength;
}
}
+
+ //get projektphase width, width depending on bezeichnung
+ $phasewidth = 0;
+ $phasewidthlimit = $nrPhases > 0
+ ? ($totalwidth - $timecolumnswidth - $mintaetigkeitenwidth) / $nrPhases
+ : $totalwidth - 4 * $daywidth - $worktimewidth - $mintaetigkeitenwidth;
+
+ if (isset($projektphasenames[$projektname]))
+ {
+ foreach ($projektphasenames[$projektname] as $projektphasename)
+ {
+ $projektphasewidth = strlen($projektphasename);
+ if ($projektphasewidth >= $phasewidthlimit)
+ {
+ $phasewidth = $phasewidthlimit;
+ break;
+ }
+ elseif ($projektphasewidth > $phasewidth)
+ $phasewidth = $projektphasewidth;
+ }
+ }
+
+ //width remainder used for taetigkeit
+ $taetigkeitenwidth = $totalwidth - $timecolumnswidth - $phasewidth * $nrPhases;
+
+ $lastspalte = 4 + $nrPhases;
+
+ //calculating spaces for centering global header texts
+ $usernamelength = strlen($username) * 1.77;
+ $numberspacesfirstrow = $totalwidth - $daywidth * 2 - $worktimewidth - $usernamelength;
+ $numberspacessecondrow = $numberspacesfirstrow + $usernamelength - strlen($p->t('zeitaufzeichnung/personalnr').$persnr) - 4;
+
+ $spacesstringfirstrow = str_repeat(' ', $numberspacesfirstrow);
+ $spacesstringsecondrow = str_repeat(' ', $numberspacessecondrow);
+
+ $spalte = $zeile = 0;
+
+ //set language options
+ $decpoint = $sprache_index === '2' ? '.' : ',';
+ $thousandsep = $sprache_index === '2' ? ',' : '.';
+
+ //write global header
+ $worksheet->setMerge($zeile, $spalte, $zeile + 1, $spalte + 2);
+ $worksheet->write($zeile, $spalte, $monthtext.' '.$year, $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, $p->t('zeitaufzeichnung/projektlistegedruckt').$spacesstringfirstrow.$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').$spacesstringsecondrow.$p->t('zeitaufzeichnung/personalnr').$persnr, $format_heading_right_bottomline);
+ $worksheet->write($zeile + 1, $lastspalte, '', $format_heading_right_bottomline);
+ $zeile += 3;
+
+ $spalte = 0;
+
+ //write table header
+ $worksheet->setMerge($zeile, $spalte, $zeile + 1, $spalte + 1);
+ $worksheet->write($zeile, $spalte, $p->t('zeitaufzeichnung/tag'), $format_bold_centered_alllines);
+ $worksheet->write($zeile + 1, $spalte, '', $format_bold_centered_alllines);
+ $worksheet->write($zeile, $spalte + 1, $p->t('zeitaufzeichnung/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, $p->t('zeitaufzeichnung/arbeitszeit'), $format_bold_centered_alllines);
+ $worksheet->write($zeile + 1, $spalte, '', $format_bold_centered_alllines);
+ $spalte++;
+
+ if (isset($projektphasenames[$projektname]))
+ {
+ $phasenames = $projektphasenames[$projektname];
+ $phasenameslength = count($phasenames);
+ }
else
{
- //write empty cells until end of table
- $worksheet->writeString($zeile, $spalte, number_format(0, 2, $decpoint, $thousandsep), $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);
- else
- $worksheet->write($zeile, $spalte, '', $format_cell_centered);
- $spalte++;
- }
+ $phasenames = array();
+ $phasenameslength = 0;
}
- $zeile++;
+ $worksheet->write($zeile, $spalte + $phasenameslength + 1, '', $format_bold_centered_toprightline);
+ $worksheet->write($zeile + 1, $spalte, $p->t('zeitaufzeichnung/projektstunden'), $format_bold_centered_bottomline);
+
+ for($i = 0; $i < $phasenameslength; $i++)
+ $worksheet->write($zeile, $spalte + 1 + $i, '', $format_bold_centered_toprightline);
+
+ $worksheet->setMerge($zeile, $spalte, $zeile, $spalte + 1 + $phasenameslength);
+ $worksheet->write($zeile, $spalte, $projektname, $format_bold_centered_toprightline);
+
+ for ($i = 0; $i < $phasenameslength; $i++)
+ $worksheet->write($zeile + 1, $spalte + 1 + $i, $phasenames[$i], $format_bold_centered_bottomline);
+
+ $worksheet->setColumn($spalte + $phasenameslength + 1, $spalte + $phasenameslength + 1, $taetigkeitenwidth);
+ $worksheet->write($zeile + 1, $spalte + $phasenameslength + 1, $p->t('zeitaufzeichnung/taetigkeit'), $format_bold_centered_bottomrightline);
+ $spalte = $spalte + 2 + $phasenameslength;
+ $zeile += 2;
+
+ //write table body
+ for ($daysnmbr = 1; $daysnmbr <= $daysinmonth; $daysnmbr++)
+ {
+ //write day and weekday
+ $spalte = 0;
+ $monthstr = ($month < 10) ? '0'.$month : $month;
+ $daystr = ($daysnmbr < 10) ? '0'.$daysnmbr : $daysnmbr;
+ $datestring = $year.'-'.$monthstr.'-'.$daystr;
+ $weekday = substr($tagbez[$sprache_index][$date->formatDatum($datestring, 'N')], 0, 2);
+ $worksheet->write($zeile, $spalte++, $weekday, $format_cell_centered_leftline);
+ $worksheet->write($zeile, $spalte++, $daysnmbr, $format_cell_centered_rightline);
+
+ if (array_key_exists($daysnmbr, $projektlines))
+ {
+ //write worktime
+ $worksheet->writeString($zeile, $spalte++, number_format($projektlines[$daysnmbr]->arbeitszeit, 2, $decpoint, $thousandsep), $format_cell_centered_rightline);
+ $spaltetemp = $spalte;
+ //write projekt
+ if (array_key_exists($projektname, $projektlines[$daysnmbr]->projekte))
+ {
+ $projekt = $projektlines[$daysnmbr]->projekte[$projektname];
+
+ $worksheet->setColumn($spalte, $spalte, $worktimewidth);
+ $worksheet->writeString($zeile, $spalte++, number_format($projekt->stunden, 2, $decpoint, $thousandsep), $format_cell_centered_leftrightline);
+
+ foreach ($projekt->projektphasen as $projektphase)
+ {
+ $worksheet->setColumn($spalte, $spalte, $phasewidth);
+ $worksheet->writeString($zeile, $spalte++, number_format($projektphase->stunden, 2, $decpoint, $thousandsep), $format_cell_centered);
+ }
+
+ $worksheet->setColumn($spalte, $spalte, $phasewidth);
+ $worksheet->write($zeile, $spalte++, $projekt->beschreibung, $format_cell_leftrightline);
+ }
+ }
+ else
+ {
+ $worksheet->writeString($zeile, $spalte++, number_format(0, 2, $decpoint, $thousandsep), $format_cell_centered_leftrightline);
+ }
+
+ if (!array_key_exists($daysnmbr, $projektlines) || !array_key_exists($projektname, $projektlines[$daysnmbr]->projekte))
+ {
+ if (isset($projektphasenames[$projektname]))
+ {
+ //write empty cells until end of table
+ $worksheet->write($zeile, $spalte, '', $format_cell_centered_leftrightline);
+ $toskip = count($projektphasenames[$projektname]);
+ for ($i = 0; $i <= $toskip; $i++)
+ {
+ if ($i == 0)
+ $format = $format_cell_centered_leftrightline;
+ else
+ $format = $format_cell_centered;
+
+ $worksheet->write($zeile, $spalte++, '', $format);
+ }
+ $worksheet->write($zeile, $spalte, '', $format_cell_centered_leftrightline);
+ }
+ }
+ $zeile++;
+ }
+
+ //write monthly sums
+ $spalte = 0;
+ $worksheet->setMerge($zeile, $spalte, $zeile, $spalte + 1);
+ $worksheet->write($zeile, $spalte, $p->t('zeitaufzeichnung/summe'), $format_bold_centered_alllines);
+ $worksheet->write($zeile, $spalte + 1, '', $format_bold_centered_alllines);
+ $spalte += 2;
+ $worksheet->writeString($zeile, $spalte++, number_format($totalmonthsum, 2, $decpoint, $thousandsep), $format_cell_centered_alllines);
+
+ if (isset($projektmonthsums[$projektname]))
+ {
+ $worksheet->writeString($zeile, $spalte++, number_format($projektmonthsums[$projektname]->sum, 2, $decpoint, $thousandsep), $format_cell_centered_alllines);
+
+ foreach ($projektmonthsums[$projektname]->projektphasen as $projektphase)
+ {
+ $worksheet->writeString($zeile, $spalte++, number_format($projektphase, 2, $decpoint, $thousandsep), $format_cell_centered_topbottomline);
+ }
+
+ $worksheet->write($zeile, $spalte++, '', $format_cell_centered_alllines);
+ }
+ $zeile += 2;
+
+ $worksheet->fitToPages(1, 1);
}
-if ($nrProjects < 1)
- //no projects - merge all cells and write notice
-{
- $worksheet->setMerge(3, 3, 4 + $daysinmonth, $lastspalte);
- $worksheet->write(3, 3, $p->t('zeitaufzeichnung/keineprojekte'), $format_bold_centered_alllines);
- $worksheet->write(3, $lastspalte, '', $format_bold_centered_alllines);
-}
-
-//write monthly sums
-$spalte = 0;
-$worksheet->setMerge($zeile, $spalte, $zeile, $spalte + 1);
-$worksheet->write($zeile, $spalte, $p->t('zeitaufzeichnung/summe'), $format_bold_centered_alllines);
-$worksheet->write($zeile, $spalte + 1, '', $format_bold_centered_alllines);
-$spalte += 2;
-$worksheet->writeString($zeile, $spalte++, number_format($monthsums[0], 2, $decpoint, $thousandsep), $format_cell_centered_alllines);
-foreach ($projectnames as $project)
-{
- $worksheet->writeString($zeile, $spalte++, number_format($monthsums[$project], 2, $decpoint, $thousandsep), $format_cell_centered_topbottomleftline);
- $worksheet->write($zeile, $spalte++, '', $format_cell_centered_topbottomrightline);
-}
-$worksheet->fitToPages(1, 1);
$workbook->close();
diff --git a/cis/private/tools/zeitaufzeichnung_projektphasen.php b/cis/private/tools/zeitaufzeichnung_projektphasen.php
new file mode 100644
index 000000000..8ec421395
--- /dev/null
+++ b/cis/private/tools/zeitaufzeichnung_projektphasen.php
@@ -0,0 +1,28 @@
+getProjektphasen($projekt_kurzbz))
+ {
+ $result_obj = array();
+ foreach($projektphase->result as $row)
+ {
+ $item['projektphase_id']=$row->projektphase_id;
+ $item['bezeichnung']=$row->bezeichnung;
+ $result_obj[]=$item;
+ }
+ echo json_encode($result_obj);
+ }
+ exit;
+}
diff --git a/include/zeitaufzeichnung.class.php b/include/zeitaufzeichnung.class.php
index 3c99c59a4..c7e0c47af 100644
--- a/include/zeitaufzeichnung.class.php
+++ b/include/zeitaufzeichnung.class.php
@@ -1,800 +1,808 @@
-,
- * Andreas Oesterreicher and
- * Rudolf Hangl .
- */
-/**
- * Klasse Zeitaufzeichnung
- * @create 06-11-2007
- */
-require_once(dirname(__FILE__).'/basis_db.class.php');
-
-class zeitaufzeichnung extends basis_db
-{
- public $new; // boolean
- public $result = array(); // zeitaufzeichnung Objekt
- public $done=false; // boolean
-
- //Tabellenspalten
- public $zeitaufzeichnung_id; // serial
- public $uid; // varchar(16)
- public $aktivitaet_kurzbz; // varchar(16)
- public $start; // timestamp
- public $ende; // timestamp
- public $beschreibung; // varchar(256)
- public $oe_kurzbz_1; // varchar(32) ehemals studiengangs_kz
- public $oe_kurzbz_2; // varchar(32) ehemals fachbereich_kurzbz
- public $insertamum; // timestamp
- public $insertvon; // varchar(16)
- public $updateamum; // timestamp
- public $updatevon; // varchar(16)
- public $projekt_kurzbz; // varchar(16)
- public $ext_id; // bigint
- public $service_id; // integer
- public $kunde_uid; // varchar(32)
-
- /**
- * Konstruktor
- * @param $zeitaufzeichnung_id ID der Zeitaufzeichnung die geladen werden soll (Default=null)
- */
- public function __construct($zeitaufzeichnung_id=null)
- {
- parent::__construct();
-
- if($zeitaufzeichnung_id != null)
- $this->load($zeitaufzeichnung_id);
- }
-
- /**
- * Laedt die Zeitaufzeichnung mit der ID $zeitaufzeichnung_id
- * @param $adress_id ID der zu ladenden Adresse
- * @return true wenn ok, false im Fehlerfall
- */
- public function load($zeitaufzeichnung_id)
- {
- //Pruefen ob zeitaufzeichnung_id eine gueltige Zahl ist
- if(!is_numeric($zeitaufzeichnung_id) || $zeitaufzeichnung_id == '')
- {
- $this->errormsg = 'Zeitaufzeichnung_id muss eine Zahl sein';
- return false;
- }
-
- //Daten aus der Datenbank lesen
- $qry = "SELECT * FROM campus.tbl_zeitaufzeichnung WHERE zeitaufzeichnung_id=".$this->db_add_param($zeitaufzeichnung_id, FHC_INTEGER);
-
- if(!$this->db_query($qry))
- {
- $this->errormsg = 'Fehler bei einer Datenbankabfrage';
- return false;
- }
-
- if($row = $this->db_fetch_object())
- {
- $this->zeitaufzeichnung_id = $row->zeitaufzeichnung_id;
- $this->uid = $row->uid;
- $this->aktivitaet_kurzbz = $row->aktivitaet_kurzbz;
- $this->start = $row->start;
- $this->ende = $row->ende;
- $this->beschreibung = $row->beschreibung;
- $this->oe_kurzbz_1 = $row->oe_kurzbz_1;
- $this->oe_kurzbz_2 = $row->oe_kurzbz_2;
- $this->insertamum = $row->insertamum;
- $this->insertvon = $row->insertvon;
- $this->updateamum = $row->updateamum;
- $this->updatevon = $row->updatevon;
- $this->projekt_kurzbz = $row->projekt_kurzbz;
- $this->ext_id = $row->ext_id;
- $this->service_id = $row->service_id;
- $this->kunde_uid = $row->kunde_uid;
- }
- else
- {
- $this->errormsg = 'Es ist kein Datensatz mit dieser ID vorhanden';
- return false;
- }
-
- return true;
- }
-
- /**
- * Prueft die Variablen auf Gueltigkeit
- * @return true wenn ok, false im Fehlerfall
- */
- protected function validate()
- {
- $this->errormsg = '';
- return true;
- }
-
- /**
- * Speichert den aktuellen Datensatz in die Datenbank
- * Wenn $neu auf true gesetzt ist wird ein neuer Datensatz angelegt
- * andernfalls wird der Datensatz mit der ID in $adresse_id aktualisiert
- * @return true wenn ok, false im Fehlerfall
- */
- public function save()
- {
- //Variablen pruefen
- if(!$this->validate())
- return false;
-
- // check ob identischer eintrag existiert
- // DienstreiseMT-Einträge sind hier ausgenommen da eintägige Dienstreisen mit der identen Arbeitszeit eingetragen werden könnten
- if ($this->aktivitaet_kurzbz != 'DienstreiseMT')
- {
- $check_qry = 'SELECT count(*) from campus.tbl_zeitaufzeichnung where uid='.$this->db_add_param($this->uid).' and aktivitaet_kurzbz != \'DienstreiseMT\' and start = '.$this->db_add_param($this->start).' and ende = '.$this->db_add_param($this->ende);
- if($this->db_query($check_qry) && $this->new)
- {
- if($row = $this->db_fetch_object())
- {
- if ($row->count)
- {
- $this->errormsg = 'Identischer Eintrag existiert!';
- return false;
- }
- }
- }
- }
-
- // ER - Checks
- if ($this->aktivitaet_kurzbz == 'Ersatzruhe')
- {
- $check_qry = "SELECT count(*) from campus.tbl_zeitaufzeichnung where uid=".$this->db_add_param($this->uid)." and (start < ".$this->db_add_param($this->ende)." and ende > ".$this->db_add_param($this->start).")";
- if ($this->zeitaufzeichnung_id)
- $check_qry .= " and zeitaufzeichnung_id != ".$this->db_add_param($this->zeitaufzeichnung_id);
- if($this->db_query($check_qry))
- {
- if($row = $this->db_fetch_object())
- {
- if ($row->count)
- {
- $this->errormsg = 'Ersatzruhe darf nicht Überlappen!';
- return false;
- }
- }
- }
- }
- if ($this->aktivitaet_kurzbz != 'Ersatzruhe')
- {
- $check_qry = "SELECT count(*) from campus.tbl_zeitaufzeichnung where uid=".$this->db_add_param($this->uid)." and aktivitaet_kurzbz = 'Ersatzruhe' and (start < ".$this->db_add_param($this->ende)." and ende > ".$this->db_add_param($this->start).")";
- if($this->db_query($check_qry))
- {
- if($row = $this->db_fetch_object())
- {
- if ($row->count)
- {
- $this->errormsg = 'Eintrag darf nicht mit Ersatzruhe Überlappen!';
- return false;
- }
- }
- }
- }
-
- if($this->new)
- {
- //Neuen Datensatz einfuegen
- $qry='BEGIN;INSERT INTO campus.tbl_zeitaufzeichnung (uid, aktivitaet_kurzbz, start, ende, beschreibung,
- oe_kurzbz_1, oe_kurzbz_2, insertamum, insertvon, updateamum, updatevon, projekt_kurzbz, service_id, kunde_uid) VALUES('.
- $this->db_add_param($this->uid).', '.
- $this->db_add_param($this->aktivitaet_kurzbz).', '.
- $this->db_add_param($this->start).', '.
- $this->db_add_param($this->ende).', '.
- $this->db_add_param($this->beschreibung).', '.
- $this->db_add_param($this->oe_kurzbz_1).', '.
- $this->db_add_param($this->oe_kurzbz_2).','.
- $this->db_add_param($this->insertamum).', '.
- $this->db_add_param($this->insertvon).', '.
- $this->db_add_param($this->updateamum).', '.
- $this->db_add_param($this->updatevon).', '.
- $this->db_add_param($this->projekt_kurzbz).', '.
- $this->db_add_param($this->service_id).', '.
- $this->db_add_param($this->kunde_uid).');';
- }
- else
- {
- //Updaten des bestehenden Datensatzes
-
- //Pruefen ob zeitaufzeichnung_id eine gueltige Zahl ist
- if(!is_numeric($this->zeitaufzeichnung_id))
- {
- $this->errormsg = 'zeitaufzeichnung_id muss eine gueltige Zahl sein';
- return false;
- }
-
- $qry='UPDATE campus.tbl_zeitaufzeichnung SET'.
- ' uid='.$this->db_add_param($this->uid).', '.
- ' aktivitaet_kurzbz='.$this->db_add_param($this->aktivitaet_kurzbz).', '.
- ' start='.$this->db_add_param($this->start).', '.
- ' ende='.$this->db_add_param($this->ende).', '.
- ' beschreibung='.$this->db_add_param($this->beschreibung).', '.
- ' oe_kurzbz_1='.$this->db_add_param($this->oe_kurzbz_1).', '.
- ' oe_kurzbz_2='.$this->db_add_param($this->oe_kurzbz_2).', '.
- ' updateamum='.$this->db_add_param($this->updateamum).', '.
- ' updatevon='.$this->db_add_param($this->updatevon).', '.
- ' projekt_kurzbz='.$this->db_add_param($this->projekt_kurzbz).', '.
- ' service_id='.$this->db_add_param($this->service_id).', '.
- ' kunde_uid='.$this->db_add_param($this->kunde_uid).' '.
- 'WHERE zeitaufzeichnung_id='.$this->db_add_param($this->zeitaufzeichnung_id, FHC_INTEGER, false);
- }
-
- if($this->db_query($qry))
- {
- if($this->new)
- {
- //naechste ID aus der Sequence holen
- $qry="SELECT currval('campus.tbl_zeitaufzeichnung_zeitaufzeichnung_id_seq') as id;";
- if($this->db_query($qry))
- {
- if($row = $this->db_fetch_object())
- {
- $this->zeitaufzeichnung_id = $row->id;
- $this->db_query('COMMIT');
- return true;
- }
- else
- {
- $this->db_query('ROLLBACK');
- $this->errormsg = "Fehler beim Auslesen der Sequence";
- return false;
- }
- }
- else
- {
- $this->db_query('ROLLBACK');
- $this->errormsg = 'Fehler beim Auslesen der Sequence';
- return false;
- }
- }
- }
- else
- {
- $this->errormsg = 'Fehler beim Speichern';
- return false;
- }
- return true;
- }
-
- /**
- * Loescht den Datenensatz mit der ID die uebergeben wird
- * @param $zeitaufzeichnnung_id ID die geloescht werden soll
- * @return true wenn ok, false im Fehlerfall
- */
- public function delete($zeitaufzeichnung_id)
- {
- //Pruefen ob zeitaufzeichnung_id eine gueltige Zahl ist
- if(!is_numeric($zeitaufzeichnung_id) || $zeitaufzeichnung_id == '')
- {
- $this->errormsg = 'zeitaufzeichnung_id muss eine gueltige Zahl sein';
- return false;
- }
-
- //loeschen des Datensatzes
- $qry="DELETE FROM campus.tbl_zeitaufzeichnung WHERE zeitaufzeichnung_id=".$this->db_add_param($zeitaufzeichnung_id, FHC_INTEGER, false);
-
- if($this->db_query($qry))
- {
- return true;
- }
- else
- {
- $this->errormsg = 'Fehler beim Loeschen der Daten';
- return false;
- }
- }
-
- /**
- * Laedt die Datensaetze eines Projektes
- * @param $projekt_kurzbz
- */
- public function getListeProjekt($projekt_kurzbz)
- {
- $where = 'projekt_kurzbz='.$this->db_add_param($projekt_kurzbz);
-
- $qry = "SELECT
- *, to_char ((ende-start),'HH24:MI') as diff,
- (SELECT (to_char(sum(ende-start),'DD')::integer)*24+to_char(sum(ende-start),'HH24')::integer || ':' || to_char(sum(ende-start),'MI')
- FROM campus.tbl_zeitaufzeichnung
- WHERE $where ) as summe
- FROM campus.tbl_zeitaufzeichnung WHERE $where
- ORDER BY start DESC";
-
- if($result = $this->db_query($qry))
- {
- while($row = $this->db_fetch_object($result))
- {
- $obj = new zeitaufzeichnung();
-
- $obj->zeitaufzeichnung_id = $row->zeitaufzeichnung_id;
- $obj->uid = $row->uid;
- $obj->aktivitaet_kurzbz = $row->aktivitaet_kurzbz;
- $obj->start = $row->start;
- $obj->ende = $row->ende;
- $obj->beschreibung = $row->beschreibung;
- $obj->oe_kurzbz_1 = $row->oe_kurzbz_1;
- $obj->oe_kurzbz_2 = $row->oe_kurzbz_2;
- $obj->insertamum = $row->insertamum;
- $obj->insertvon = $row->insertvon;
- $obj->updateamum = $row->updateamum;
- $obj->updatevon = $row->updatevon;
- $obj->projekt_kurzbz = $row->projekt_kurzbz;
- $obj->ext_id = $row->ext_id;
- $obj->service_id = $row->service_id;
- $obj->kunde_uid = $row->kunde_uid;
- $obj->summe = $row->summe;
- $obj->diff = $row->diff;
-
- $this->result[] = $obj;
- }
- return true;
- }
- else
- {
- $this->errormsg = 'Fehler beim Laden der Daten';
- return false;
- }
- }
-
-
- /**
- * Laedt die Zeitaufzeichnungen eines Users in einer festgelegten Zeitspanne
- * @param $user
- * @param $from startdatum als String in Form Y-m-d
- * @param $to enddatum als String in Form Y-m-d
- * @param $excluded_activities zu ignorierende Aktivitätstypen
- * @return bool
- */
- public function getListeUserFromTo($user, $from = null, $to = null, $excluded_activities = null)
- {
- $where = "uid=".$this->db_add_param($user);
-
- //standard wenn kein Datum gegeben - letzter Monat
- if(empty($from) && empty($to))
- {
- $from = date('Y-m-d', strtotime('first day of previous month'));
- $to = date('Y-m-d', strtotime('last day of previous month'));
- }
- else if(empty($to))//standard wenn ein Datum gegeben - datum +/- 40 tage
- $to = date('Y-m-d', strtotime($from. ' + 40 days'));
- else if(empty($from))
- $from = date('Y-m-d', strtotime($to. ' - 40 days'));
-
- //zusätzlicher Tag - SQL rechnet letzten Tag nicht hinein
- $to = date('Y-m-d', strtotime($to. ' + 1 days'));
-
- $where.= " AND ((start >= ".$this->db_add_param($from)."::DATE AND start <= ".$this->db_add_param($to)."::DATE)
- OR (ende >= ".$this->db_add_param($from)."::DATE AND ende <= ".$this->db_add_param($to)."::DATE))";
-
- if (!empty($excluded_activities))
- {
- $exactstring = is_array($excluded_activities) ? $this->db_implode4SQL($excluded_activities) : $this->db_add_param($excluded_activities);
- $where .= " AND (aktivitaet_kurzbz NOT IN (" . $exactstring . ") OR aktivitaet_kurzbz IS NULL)";
- }
-
- $qry = "SELECT
- *, to_char ((ende-start),'HH24:MI') as diff,
- (SELECT (to_char(sum(ende-start),'DD')::integer)*24+to_char(sum(ende-start),'HH24')::integer || ':' || to_char(sum(ende-start),'MI')
- FROM campus.tbl_zeitaufzeichnung
- WHERE $where ) as summe
- FROM campus.tbl_zeitaufzeichnung WHERE $where
- ORDER BY start DESC";
-
- if($result = $this->db_query($qry))
- {
- while($row = $this->db_fetch_object($result))
- {
- $obj = new zeitaufzeichnung();
-
- $obj->zeitaufzeichnung_id = $row->zeitaufzeichnung_id;
- $obj->uid = $row->uid;
- $obj->aktivitaet_kurzbz = $row->aktivitaet_kurzbz;
- $obj->start = $row->start;
- $obj->ende = $row->ende;
- $obj->beschreibung = $row->beschreibung;
- $obj->oe_kurzbz_1 = $row->oe_kurzbz_1;
- $obj->oe_kurzbz_2 = $row->oe_kurzbz_2;
- $obj->insertamum = $row->insertamum;
- $obj->insertvon = $row->insertvon;
- $obj->updateamum = $row->updateamum;
- $obj->updatevon = $row->updatevon;
- $obj->projekt_kurzbz = $row->projekt_kurzbz;
- $obj->ext_id = $row->ext_id;
- $obj->service_id = $row->service_id;
- $obj->kunde_uid = $row->kunde_uid;
- $obj->summe = $row->summe;
- $obj->diff = $row->diff;
- $obj->datum = $row->start;
-
- $this->result[] = $obj;
- }
- return true;
- }
- else
- {
- $this->errormsg = 'Fehler beim Laden der Daten';
- return false;
- }
- }
-
- /**
- * Laedt die Zeitaufzeichnungen eines Users. Default: Die letzten 40 Tage
- * @param string $user
- * @param integer $days default: 40 Tage
- */
- public function getListeUser($user, $days='40')
- {
- $where = "uid=".$this->db_add_param($user);
- if ($days!='')
- $where.= " AND ende>(now() - INTERVAL '".$days." days')";
-
- $qry = "SELECT
- *, to_char ((ende-start),'HH24:MI') as diff,
- (SELECT (to_char(sum(ende-start),'DD')::integer)*24+to_char(sum(ende-start),'HH24')::integer || ':' || to_char(sum(ende-start),'MI')
- FROM campus.tbl_zeitaufzeichnung
- WHERE $where ) as summe
- FROM campus.tbl_zeitaufzeichnung WHERE $where
- ORDER BY start DESC";
-
- if($result = $this->db_query($qry))
- {
- while($row = $this->db_fetch_object($result))
- {
- $obj = new zeitaufzeichnung();
-
- $obj->zeitaufzeichnung_id = $row->zeitaufzeichnung_id;
- $obj->uid = $row->uid;
- $obj->aktivitaet_kurzbz = $row->aktivitaet_kurzbz;
- $obj->start = $row->start;
- $obj->ende = $row->ende;
- $obj->beschreibung = $row->beschreibung;
- $obj->oe_kurzbz_1 = $row->oe_kurzbz_1;
- $obj->oe_kurzbz_2 = $row->oe_kurzbz_2;
- $obj->insertamum = $row->insertamum;
- $obj->insertvon = $row->insertvon;
- $obj->updateamum = $row->updateamum;
- $obj->updatevon = $row->updatevon;
- $obj->projekt_kurzbz = $row->projekt_kurzbz;
- $obj->ext_id = $row->ext_id;
- $obj->service_id = $row->service_id;
- $obj->kunde_uid = $row->kunde_uid;
- $obj->summe = $row->summe;
- $obj->diff = $row->diff;
- $obj->datum = $row->start;
-
- $this->result[] = $obj;
- }
- return true;
- }
- else
- {
- $this->errormsg = 'Fehler beim Laden der Daten';
- return false;
- }
- }
-
- /**
- * Laedt die Zeitaufzeichnungen eines Users aufgefüllt mit lehren Tagen.
- * Default: Die letzten 40 Tage
- * @param string $user
- * @param integer $days deafult: 40 Tage
- */
- public function getListeUserFull($user, $days='40')
- {
- $where = "uid=".$this->db_add_param($user);
- if ($days!='')
- $where.= " AND ende>(now() - INTERVAL '".$days." days')";
- $where_join = "and (z.aktivitaet_kurzbz != 'DienstreiseMT' or z.aktivitaet_kurzbz is null) and z.uid=".$this->db_add_param($user);
- if ($days!='')
- $where_join.= " AND z.ende>(now() - INTERVAL '".$days." days')";
- if ($days=='')
- $max_anz = 180;
- else
- $max_anz = $days;
- $qry = "SELECT
- d.dates, z.*, to_char ((z.ende-z.start),'HH24:MI') as diff,
- (SELECT (to_char(sum(ende-start),'DD')::integer)*24+to_char(sum(ende-start),'HH24')::integer || ':' || to_char(sum(ende-start),'MI')
- FROM campus.tbl_zeitaufzeichnung
- WHERE $where) as summe
- FROM campus.tbl_zeitaufzeichnung z
- right join (select current_date - s.a as dates from generate_series(0,$max_anz,1) as s(a)) d on date(z.ende) = d.dates $where_join order by d.dates desc, z.start desc
- ";
-
- if($result = $this->db_query($qry))
- {
- while($row = $this->db_fetch_object($result))
- {
- $obj = new zeitaufzeichnung();
-
- $obj->zeitaufzeichnung_id = $row->zeitaufzeichnung_id;
- $obj->uid = $row->uid;
- $obj->aktivitaet_kurzbz = $row->aktivitaet_kurzbz;
- $obj->start = $row->start;
- $obj->ende = $row->ende;
- $obj->beschreibung = $row->beschreibung;
- $obj->oe_kurzbz_1 = $row->oe_kurzbz_1;
- $obj->oe_kurzbz_2 = $row->oe_kurzbz_2;
- $obj->insertamum = $row->insertamum;
- $obj->insertvon = $row->insertvon;
- $obj->updateamum = $row->updateamum;
- $obj->updatevon = $row->updatevon;
- $obj->projekt_kurzbz = $row->projekt_kurzbz;
- $obj->ext_id = $row->ext_id;
- $obj->service_id = $row->service_id;
- $obj->kunde_uid = $row->kunde_uid;
- $obj->summe = $row->summe;
- $obj->diff = $row->diff;
- $obj->datum = $row->dates;
-
- $this->result[] = $obj;
- }
- return true;
- }
- else
- {
- $this->errormsg = 'Fehler beim Laden der Daten';
- return false;
- }
- }
-
- /**
- * Laedt die Zeitaufzeichnungen eines Users aufgefüllt mit lehren Tagen.
- * Default: Die letzten 40 Tage
- * @param string $user
- * @param integer $days deafult: 40 Tage
- */
- public function getDienstreisenUser($user, $days='40')
- {
- $where = "uid=".$this->db_add_param($user);
- if ($days!='')
- $where.= " AND ende>(now() - INTERVAL '".$days." days')";
- $where .= " AND aktivitaet_kurzbz = 'DienstreiseMT'";
- $qry = "SELECT
- zeitaufzeichnung_id, start::date as starttag, TO_CHAR(start, 'HH24:MI') as startzeit, ende::date as endtag, TO_CHAR(ende, 'HH24:MI') as endzeit
- FROM campus.tbl_zeitaufzeichnung
- where $where
- ORDER BY ende DESC
- ";
-
- if($result = $this->db_query($qry))
- {
- $dr_arr = array();
- while($row = $this->db_fetch_object($result))
- {
- if (array_key_exists($row->starttag, $dr_arr))
- {
- $dr_arr[$row->starttag]['start'] = $row->startzeit;
- $dr_arr[$row->starttag]['id'] = $row->zeitaufzeichnung_id;
- }
- else
- {
- $dr_arr[$row->starttag] = array();
- $dr_arr[$row->starttag]['start'] = $row->startzeit;
- $dr_arr[$row->starttag]['id'] = $row->zeitaufzeichnung_id;
- }
- if (array_key_exists($row->endtag, $dr_arr))
- {
- $dr_arr[$row->endtag]['ende'] = $row->endzeit;
- $dr_arr[$row->endtag]['id'] = $row->zeitaufzeichnung_id;
- }
- else
- {
- $dr_arr[$row->endtag] = array();
- $dr_arr[$row->endtag]['ende'] = $row->endzeit;
- $dr_arr[$row->endtag]['id'] = $row->zeitaufzeichnung_id;
- }
-
- $this->result = $dr_arr;
- }
- return true;
- }
- else
- {
- $this->errormsg = 'Fehler beim Laden der Daten';
- return false;
- }
- }
-
- /**
- * Löscht sämtliche Einträge eines Users für einen Tag
- * @param string $user
- * @param string $tag Y-m-d
- */
- public function deleteEntriesForUser($user, $tag)
- {
- $where = "uid=".$this->db_add_param($user);
-
- $qry = "delete from campus.tbl_zeitaufzeichnung where $where and date_trunc('day', start) = '$tag'";
- if($result = $this->db_query($qry))
- {
- return true;
- }
- else
- {
- $this->errormsg = 'Fehler beim Laden der Daten';
- return false;
- }
- }
-
- /**
- * Löscht Pauseneinträge eines Users für einen Tag, die außerhalb der Arbeitszeit liegen
- * Löscht Pauseneinträge an Tagen ohne Arbeitszeit
- * @param string $user
- * @param string $tag Y-m-d
- */
- public function cleanPausenForUser($user, $tag)
- {
- $where = "uid=".$this->db_add_param($user);
-
- $qry = "
- delete from campus.tbl_zeitaufzeichnung where aktivitaet_kurzbz = 'Pause' and start::date = '$tag' and $where and
-(
-start::time >=
-(SELECT max(ende::time) as endzeit from campus.tbl_zeitaufzeichnung where $where and start::date = '$tag' AND (aktivitaet_kurzbz != 'LehreExtern' or aktivitaet_kurzbz is null ) and aktivitaet_kurzbz != 'Pause')
-or
-ende::time<=
-(SELECT min(start::time) as startzeit from campus.tbl_zeitaufzeichnung where $where and start::date = '$tag' AND (aktivitaet_kurzbz != 'LehreExtern' or aktivitaet_kurzbz is null ) and aktivitaet_kurzbz != 'Pause')
-or not exists
-(select 1 from campus.tbl_zeitaufzeichnung where aktivitaet_kurzbz != 'LehreExtern' and aktivitaet_kurzbz != 'Pause' and start::date = '$tag' and $where )
-)
- ";
-
- if($result = $this->db_query($qry))
- {
- return true;
- }
- else
- {
- $this->errormsg = 'Fehler beim Laden der Daten';
- return false;
- }
- }
-
- /**
- * Holt alle ZA-Einträge Typ LehreIntern und LehreExtern eines Users
- * für das laufende Studienjahr und gibt die Summen in einem Array zurück
- * @param string $user
- * @return Array mit Key: LehreIntern, LehreExtern, LehreAuftraege, LehreInkludiert
- */
- public function getLehreForUser($user,$sem)
- {
- $where = "uid=".$this->db_add_param($user);
- $where_sem = "studiensemester_kurzbz=".$this->db_add_param($sem);
- $lehre_arr = array("Lehre"=>0, "LehreExtern"=>0, "LehreAuftraege"=>0);
-
- $qry = "
- select sum(extract(epoch from ende-start))/3600 as lehre, aktivitaet_kurzbz from campus.tbl_zeitaufzeichnung where $where and aktivitaet_kurzbz in ('Lehre', 'LehreExtern') and start > (select start from public.tbl_studiensemester where $where_sem) group by aktivitaet_kurzbz
- ";
-
- if($result = $this->db_query($qry))
- {
-
- while($row = $this->db_fetch_object($result))
- {
- $lehre_arr[$row->aktivitaet_kurzbz] = round($row->lehre,2);
- }
- }
- else
- {
- return false;
- }
- $where = "mitarbeiter_uid=".$this->db_add_param($user);
- $where_sem = "l.studiensemester_kurzbz=".$this->db_add_param($sem);
-
- $qry = "
- SELECT sum(semstunden) AS stunden
- FROM
- (
- SELECT sum(m.semesterstunden) AS semstunden
- FROM
- lehre.tbl_lehreinheitmitarbeiter m,
- lehre.tbl_lehreinheit l
- JOIN
- lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
- JOIN
- public.tbl_studiengang s using (studiengang_kz)
- WHERE
- $where AND
- $where_sem AND
- l.lehreinheit_id = m.lehreinheit_id AND
- m.stundensatz * m.semesterstunden > 0 AND
- s.typ not in ('l') AND
- lv.studiengang_kz > 0
- UNION
- SELECT sum(pb.stunden) AS semstunden
- FROM
- lehre.tbl_projektarbeit pa,
- lehre.tbl_projektbetreuer pb,
- public.tbl_benutzer b,
- lehre.tbl_lehreinheit l
- JOIN
- lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
- JOIN
- public.tbl_studiengang s using (studiengang_kz)
-
- WHERE
- pa.lehreinheit_id = l.lehreinheit_id AND
- pb.projektarbeit_id = pa.projektarbeit_id AND
- pb.person_id = b.person_id AND
- b.uid = ".$this->db_add_param($user)." AND
- pb.stunden * pb.stundensatz > 0 AND
- s.typ not in ('l') AND
- lv.studiengang_kz > 0 AND
- $where_sem
- ) AS semstunden
- ";
-
- if($result = $this->db_query($qry))
- {
-
- while($row = $this->db_fetch_object($result))
- {
- $lehre_arr["LehreAuftraege"] = round($row->stunden);
- }
- }
- else
- {
- return false;
- }
-
- return $lehre_arr;
- }
-
- /**
- * Holt das Datum bis zu dem die Eintragung für einen bestimmten User gesperrt ist
- * @param string $user
- * @return string $tag Y-m-d or false
- */
-
- public function getEintragungGesperrtBisForUser($user)
- {
- //check if addon casetime is installed
- $qrytable = "
- SELECT EXISTS(
- SELECT 1
- FROM information_schema.tables
- WHERE
- table_schema = 'addon' AND
- table_name = 'tbl_casetime_timesheet'
- );
- ";
-
- $res = $this->db_query($qrytable);
- if ($this->db_fetch_row($res)[0] == 't')
- {
- //check if sent timesheets for the UID exist
- $where = "uid=".$this->db_add_param($user);
-
- $qry = "select max(datum) from addon.tbl_casetime_timesheet where ".$where." and abgeschicktamum is not null";
-
- if($result = $this->db_query($qry))
- {
- $datum = $this->db_fetch_object($result);
- return $datum->max;
- }
- else
- {
- return false;
- }
- }
- else
- {
- return false;
- }
- }
-}
-?>
+,
+ * Andreas Oesterreicher and
+ * Rudolf Hangl .
+ */
+/**
+ * Klasse Zeitaufzeichnung
+ * @create 06-11-2007
+ */
+require_once(dirname(__FILE__).'/basis_db.class.php');
+
+class zeitaufzeichnung extends basis_db
+{
+ public $new; // boolean
+ public $result = array(); // zeitaufzeichnung Objekt
+ public $done=false; // boolean
+
+ //Tabellenspalten
+ public $zeitaufzeichnung_id; // serial
+ public $uid; // varchar(16)
+ public $aktivitaet_kurzbz; // varchar(16)
+ public $start; // timestamp
+ public $ende; // timestamp
+ public $beschreibung; // varchar(256)
+ public $oe_kurzbz_1; // varchar(32) ehemals studiengangs_kz
+ public $oe_kurzbz_2; // varchar(32) ehemals fachbereich_kurzbz
+ public $insertamum; // timestamp
+ public $insertvon; // varchar(16)
+ public $updateamum; // timestamp
+ public $updatevon; // varchar(16)
+ public $projekt_kurzbz; // varchar(16)
+ public $projektphase_id; // bigint
+ public $ext_id; // bigint
+ public $service_id; // integer
+ public $kunde_uid; // varchar(32)
+
+ /**
+ * Konstruktor
+ * @param $zeitaufzeichnung_id ID der Zeitaufzeichnung die geladen werden soll (Default=null)
+ */
+ public function __construct($zeitaufzeichnung_id=null)
+ {
+ parent::__construct();
+
+ if($zeitaufzeichnung_id != null)
+ $this->load($zeitaufzeichnung_id);
+ }
+
+ /**
+ * Laedt die Zeitaufzeichnung mit der ID $zeitaufzeichnung_id
+ * @param $adress_id ID der zu ladenden Adresse
+ * @return true wenn ok, false im Fehlerfall
+ */
+ public function load($zeitaufzeichnung_id)
+ {
+ //Pruefen ob zeitaufzeichnung_id eine gueltige Zahl ist
+ if(!is_numeric($zeitaufzeichnung_id) || $zeitaufzeichnung_id == '')
+ {
+ $this->errormsg = 'Zeitaufzeichnung_id muss eine Zahl sein';
+ return false;
+ }
+
+ //Daten aus der Datenbank lesen
+ $qry = "SELECT * FROM campus.tbl_zeitaufzeichnung WHERE zeitaufzeichnung_id=".$this->db_add_param($zeitaufzeichnung_id, FHC_INTEGER);
+
+ if(!$this->db_query($qry))
+ {
+ $this->errormsg = 'Fehler bei einer Datenbankabfrage';
+ return false;
+ }
+
+ if($row = $this->db_fetch_object())
+ {
+ $this->zeitaufzeichnung_id = $row->zeitaufzeichnung_id;
+ $this->uid = $row->uid;
+ $this->aktivitaet_kurzbz = $row->aktivitaet_kurzbz;
+ $this->start = $row->start;
+ $this->ende = $row->ende;
+ $this->beschreibung = $row->beschreibung;
+ $this->oe_kurzbz_1 = $row->oe_kurzbz_1;
+ $this->oe_kurzbz_2 = $row->oe_kurzbz_2;
+ $this->insertamum = $row->insertamum;
+ $this->insertvon = $row->insertvon;
+ $this->updateamum = $row->updateamum;
+ $this->updatevon = $row->updatevon;
+ $this->projekt_kurzbz = $row->projekt_kurzbz;
+ $this->projektphase_id = $row->projektphase_id;
+ $this->ext_id = $row->ext_id;
+ $this->service_id = $row->service_id;
+ $this->kunde_uid = $row->kunde_uid;
+ }
+ else
+ {
+ $this->errormsg = 'Es ist kein Datensatz mit dieser ID vorhanden';
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Prueft die Variablen auf Gueltigkeit
+ * @return true wenn ok, false im Fehlerfall
+ */
+ protected function validate()
+ {
+ $this->errormsg = '';
+ return true;
+ }
+
+ /**
+ * Speichert den aktuellen Datensatz in die Datenbank
+ * Wenn $neu auf true gesetzt ist wird ein neuer Datensatz angelegt
+ * andernfalls wird der Datensatz mit der ID in $adresse_id aktualisiert
+ * @return true wenn ok, false im Fehlerfall
+ */
+ public function save()
+ {
+ //Variablen pruefen
+ if(!$this->validate())
+ return false;
+
+ // check ob identischer eintrag existiert
+ // DienstreiseMT-Einträge sind hier ausgenommen da eintägige Dienstreisen mit der identen Arbeitszeit eingetragen werden könnten
+ if ($this->aktivitaet_kurzbz != 'DienstreiseMT')
+ {
+ $check_qry = 'SELECT count(*) from campus.tbl_zeitaufzeichnung where uid='.$this->db_add_param($this->uid).' and aktivitaet_kurzbz != \'DienstreiseMT\' and start = '.$this->db_add_param($this->start).' and ende = '.$this->db_add_param($this->ende);
+ if($this->db_query($check_qry) && $this->new)
+ {
+ if($row = $this->db_fetch_object())
+ {
+ if ($row->count)
+ {
+ $this->errormsg = 'Identischer Eintrag existiert!';
+ return false;
+ }
+ }
+ }
+ }
+
+ // ER - Checks
+ if ($this->aktivitaet_kurzbz == 'Ersatzruhe')
+ {
+ $check_qry = "SELECT count(*) from campus.tbl_zeitaufzeichnung where uid=".$this->db_add_param($this->uid)." and (start < ".$this->db_add_param($this->ende)." and ende > ".$this->db_add_param($this->start).")";
+ if ($this->zeitaufzeichnung_id)
+ $check_qry .= " and zeitaufzeichnung_id != ".$this->db_add_param($this->zeitaufzeichnung_id);
+ if($this->db_query($check_qry))
+ {
+ if($row = $this->db_fetch_object())
+ {
+ if ($row->count)
+ {
+ $this->errormsg = 'Ersatzruhe darf nicht Überlappen!';
+ return false;
+ }
+ }
+ }
+ }
+ if ($this->aktivitaet_kurzbz != 'Ersatzruhe')
+ {
+ $check_qry = "SELECT count(*) from campus.tbl_zeitaufzeichnung where uid=".$this->db_add_param($this->uid)." and aktivitaet_kurzbz = 'Ersatzruhe' and (start < ".$this->db_add_param($this->ende)." and ende > ".$this->db_add_param($this->start).")";
+ if($this->db_query($check_qry))
+ {
+ if($row = $this->db_fetch_object())
+ {
+ if ($row->count)
+ {
+ $this->errormsg = 'Eintrag darf nicht mit Ersatzruhe Überlappen!';
+ return false;
+ }
+ }
+ }
+ }
+
+ if($this->new)
+ {
+ //Neuen Datensatz einfuegen
+ $qry='BEGIN;INSERT INTO campus.tbl_zeitaufzeichnung (uid, aktivitaet_kurzbz, start, ende, beschreibung,
+ oe_kurzbz_1, oe_kurzbz_2, insertamum, insertvon, updateamum, updatevon, projekt_kurzbz, projektphase_id, service_id, kunde_uid) VALUES('.
+ $this->db_add_param($this->uid).', '.
+ $this->db_add_param($this->aktivitaet_kurzbz).', '.
+ $this->db_add_param($this->start).', '.
+ $this->db_add_param($this->ende).', '.
+ $this->db_add_param($this->beschreibung).', '.
+ $this->db_add_param($this->oe_kurzbz_1).', '.
+ $this->db_add_param($this->oe_kurzbz_2).','.
+ $this->db_add_param($this->insertamum).', '.
+ $this->db_add_param($this->insertvon).', '.
+ $this->db_add_param($this->updateamum).', '.
+ $this->db_add_param($this->updatevon).', '.
+ $this->db_add_param($this->projekt_kurzbz).', '.
+ $this->db_add_param($this->projektphase_id, FHC_INTEGER).', '.
+ $this->db_add_param($this->service_id).', '.
+ $this->db_add_param($this->kunde_uid).');';
+ }
+ else
+ {
+ //Updaten des bestehenden Datensatzes
+
+ //Pruefen ob zeitaufzeichnung_id eine gueltige Zahl ist
+ if(!is_numeric($this->zeitaufzeichnung_id))
+ {
+ $this->errormsg = 'zeitaufzeichnung_id muss eine gueltige Zahl sein';
+ return false;
+ }
+
+ $qry='UPDATE campus.tbl_zeitaufzeichnung SET'.
+ ' uid='.$this->db_add_param($this->uid).', '.
+ ' aktivitaet_kurzbz='.$this->db_add_param($this->aktivitaet_kurzbz).', '.
+ ' start='.$this->db_add_param($this->start).', '.
+ ' ende='.$this->db_add_param($this->ende).', '.
+ ' beschreibung='.$this->db_add_param($this->beschreibung).', '.
+ ' oe_kurzbz_1='.$this->db_add_param($this->oe_kurzbz_1).', '.
+ ' oe_kurzbz_2='.$this->db_add_param($this->oe_kurzbz_2).', '.
+ ' updateamum='.$this->db_add_param($this->updateamum).', '.
+ ' updatevon='.$this->db_add_param($this->updatevon).', '.
+ ' projekt_kurzbz='.$this->db_add_param($this->projekt_kurzbz).', '.
+ ' projektphase_id='.$this->db_add_param($this->projektphase_id, FHC_INTEGER).', '.
+ ' service_id='.$this->db_add_param($this->service_id).', '.
+ ' kunde_uid='.$this->db_add_param($this->kunde_uid).' '.
+ 'WHERE zeitaufzeichnung_id='.$this->db_add_param($this->zeitaufzeichnung_id, FHC_INTEGER, false);
+ }
+
+ if($this->db_query($qry))
+ {
+ if($this->new)
+ {
+ //naechste ID aus der Sequence holen
+ $qry="SELECT currval('campus.tbl_zeitaufzeichnung_zeitaufzeichnung_id_seq') as id;";
+ if($this->db_query($qry))
+ {
+ if($row = $this->db_fetch_object())
+ {
+ $this->zeitaufzeichnung_id = $row->id;
+ $this->db_query('COMMIT');
+ return true;
+ }
+ else
+ {
+ $this->db_query('ROLLBACK');
+ $this->errormsg = "Fehler beim Auslesen der Sequence";
+ return false;
+ }
+ }
+ else
+ {
+ $this->db_query('ROLLBACK');
+ $this->errormsg = 'Fehler beim Auslesen der Sequence';
+ return false;
+ }
+ }
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Speichern';
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Loescht den Datenensatz mit der ID die uebergeben wird
+ * @param $zeitaufzeichnnung_id ID die geloescht werden soll
+ * @return true wenn ok, false im Fehlerfall
+ */
+ public function delete($zeitaufzeichnung_id)
+ {
+ //Pruefen ob zeitaufzeichnung_id eine gueltige Zahl ist
+ if(!is_numeric($zeitaufzeichnung_id) || $zeitaufzeichnung_id == '')
+ {
+ $this->errormsg = 'zeitaufzeichnung_id muss eine gueltige Zahl sein';
+ return false;
+ }
+
+ //loeschen des Datensatzes
+ $qry="DELETE FROM campus.tbl_zeitaufzeichnung WHERE zeitaufzeichnung_id=".$this->db_add_param($zeitaufzeichnung_id, FHC_INTEGER, false);
+
+ if($this->db_query($qry))
+ {
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Loeschen der Daten';
+ return false;
+ }
+ }
+
+ /**
+ * Laedt die Datensaetze eines Projektes
+ * @param $projekt_kurzbz
+ */
+ public function getListeProjekt($projekt_kurzbz)
+ {
+ $where = 'projekt_kurzbz='.$this->db_add_param($projekt_kurzbz);
+
+ $qry = "SELECT
+ *, to_char ((ende-start),'HH24:MI') as diff,
+ (SELECT (to_char(sum(ende-start),'DD')::integer)*24+to_char(sum(ende-start),'HH24')::integer || ':' || to_char(sum(ende-start),'MI')
+ FROM campus.tbl_zeitaufzeichnung
+ WHERE $where ) as summe
+ FROM campus.tbl_zeitaufzeichnung WHERE $where
+ ORDER BY start DESC";
+
+ if($result = $this->db_query($qry))
+ {
+ while($row = $this->db_fetch_object($result))
+ {
+ $obj = new zeitaufzeichnung();
+
+ $obj->zeitaufzeichnung_id = $row->zeitaufzeichnung_id;
+ $obj->uid = $row->uid;
+ $obj->aktivitaet_kurzbz = $row->aktivitaet_kurzbz;
+ $obj->start = $row->start;
+ $obj->ende = $row->ende;
+ $obj->beschreibung = $row->beschreibung;
+ $obj->oe_kurzbz_1 = $row->oe_kurzbz_1;
+ $obj->oe_kurzbz_2 = $row->oe_kurzbz_2;
+ $obj->insertamum = $row->insertamum;
+ $obj->insertvon = $row->insertvon;
+ $obj->updateamum = $row->updateamum;
+ $obj->updatevon = $row->updatevon;
+ $obj->projekt_kurzbz = $row->projekt_kurzbz;
+ $obj->projektphase_id = $row->projektphase_id;
+ $obj->ext_id = $row->ext_id;
+ $obj->service_id = $row->service_id;
+ $obj->kunde_uid = $row->kunde_uid;
+ $obj->summe = $row->summe;
+ $obj->diff = $row->diff;
+
+ $this->result[] = $obj;
+ }
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Laden der Daten';
+ return false;
+ }
+ }
+
+
+ /**
+ * Laedt die Zeitaufzeichnungen eines Users in einer festgelegten Zeitspanne
+ * @param $user
+ * @param $from startdatum als String in Form Y-m-d
+ * @param $to enddatum als String in Form Y-m-d
+ * @param $excluded_activities zu ignorierende Aktivitätstypen
+ * @return bool
+ */
+ public function getListeUserFromTo($user, $from = null, $to = null, $excluded_activities = null)
+ {
+ $where = "uid=".$this->db_add_param($user);
+
+ //standard wenn kein Datum gegeben - letzter Monat
+ if(empty($from) && empty($to))
+ {
+ $from = date('Y-m-d', strtotime('first day of previous month'));
+ $to = date('Y-m-d', strtotime('last day of previous month'));
+ }
+ else if(empty($to))//standard wenn ein Datum gegeben - datum +/- 40 tage
+ $to = date('Y-m-d', strtotime($from. ' + 40 days'));
+ else if(empty($from))
+ $from = date('Y-m-d', strtotime($to. ' - 40 days'));
+
+ //zusätzlicher Tag - SQL rechnet letzten Tag nicht hinein
+ $to = date('Y-m-d', strtotime($to. ' + 1 days'));
+
+ $where.= " AND ((start >= ".$this->db_add_param($from)."::DATE AND start <= ".$this->db_add_param($to)."::DATE)
+ OR (ende >= ".$this->db_add_param($from)."::DATE AND ende <= ".$this->db_add_param($to)."::DATE))";
+
+ if (!empty($excluded_activities))
+ {
+ $exactstring = is_array($excluded_activities) ? $this->db_implode4SQL($excluded_activities) : $this->db_add_param($excluded_activities);
+ $where .= " AND (aktivitaet_kurzbz NOT IN (" . $exactstring . ") OR aktivitaet_kurzbz IS NULL)";
+ }
+
+ $qry = "SELECT
+ *, to_char ((ende-start),'HH24:MI') as diff,
+ (SELECT (to_char(sum(ende-start),'DD')::integer)*24+to_char(sum(ende-start),'HH24')::integer || ':' || to_char(sum(ende-start),'MI')
+ FROM campus.tbl_zeitaufzeichnung
+ WHERE $where ) as summe
+ FROM campus.tbl_zeitaufzeichnung WHERE $where
+ ORDER BY start DESC";
+
+ if($result = $this->db_query($qry))
+ {
+ while($row = $this->db_fetch_object($result))
+ {
+ $obj = new zeitaufzeichnung();
+
+ $obj->zeitaufzeichnung_id = $row->zeitaufzeichnung_id;
+ $obj->uid = $row->uid;
+ $obj->aktivitaet_kurzbz = $row->aktivitaet_kurzbz;
+ $obj->start = $row->start;
+ $obj->ende = $row->ende;
+ $obj->beschreibung = $row->beschreibung;
+ $obj->oe_kurzbz_1 = $row->oe_kurzbz_1;
+ $obj->oe_kurzbz_2 = $row->oe_kurzbz_2;
+ $obj->insertamum = $row->insertamum;
+ $obj->insertvon = $row->insertvon;
+ $obj->updateamum = $row->updateamum;
+ $obj->updatevon = $row->updatevon;
+ $obj->projekt_kurzbz = $row->projekt_kurzbz;
+ $obj->projektphase_id = $row->projektphase_id;
+ $obj->ext_id = $row->ext_id;
+ $obj->service_id = $row->service_id;
+ $obj->kunde_uid = $row->kunde_uid;
+ $obj->summe = $row->summe;
+ $obj->diff = $row->diff;
+ $obj->datum = $row->start;
+
+ $this->result[] = $obj;
+ }
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Laden der Daten';
+ return false;
+ }
+ }
+
+ /**
+ * Laedt die Zeitaufzeichnungen eines Users. Default: Die letzten 40 Tage
+ * @param string $user
+ * @param integer $days default: 40 Tage
+ */
+ public function getListeUser($user, $days='40')
+ {
+ $where = "uid=".$this->db_add_param($user);
+ if ($days!='')
+ $where.= " AND ende>(now() - INTERVAL '".$days." days')";
+
+ $qry = "SELECT
+ *, to_char ((ende-start),'HH24:MI') as diff,
+ (SELECT (to_char(sum(ende-start),'DD')::integer)*24+to_char(sum(ende-start),'HH24')::integer || ':' || to_char(sum(ende-start),'MI')
+ FROM campus.tbl_zeitaufzeichnung
+ WHERE $where ) as summe
+ FROM campus.tbl_zeitaufzeichnung WHERE $where
+ ORDER BY start DESC";
+
+ if($result = $this->db_query($qry))
+ {
+ while($row = $this->db_fetch_object($result))
+ {
+ $obj = new zeitaufzeichnung();
+
+ $obj->zeitaufzeichnung_id = $row->zeitaufzeichnung_id;
+ $obj->uid = $row->uid;
+ $obj->aktivitaet_kurzbz = $row->aktivitaet_kurzbz;
+ $obj->start = $row->start;
+ $obj->ende = $row->ende;
+ $obj->beschreibung = $row->beschreibung;
+ $obj->oe_kurzbz_1 = $row->oe_kurzbz_1;
+ $obj->oe_kurzbz_2 = $row->oe_kurzbz_2;
+ $obj->insertamum = $row->insertamum;
+ $obj->insertvon = $row->insertvon;
+ $obj->updateamum = $row->updateamum;
+ $obj->updatevon = $row->updatevon;
+ $obj->projekt_kurzbz = $row->projekt_kurzbz;
+ $obj->projektphase_id = $row->projektphase_id;
+ $obj->ext_id = $row->ext_id;
+ $obj->service_id = $row->service_id;
+ $obj->kunde_uid = $row->kunde_uid;
+ $obj->summe = $row->summe;
+ $obj->diff = $row->diff;
+ $obj->datum = $row->start;
+
+ $this->result[] = $obj;
+ }
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Laden der Daten';
+ return false;
+ }
+ }
+
+ /**
+ * Laedt die Zeitaufzeichnungen eines Users aufgefüllt mit lehren Tagen.
+ * Default: Die letzten 40 Tage
+ * @param string $user
+ * @param integer $days deafult: 40 Tage
+ */
+ public function getListeUserFull($user, $days='40')
+ {
+ $where = "uid=".$this->db_add_param($user);
+ if ($days!='')
+ $where.= " AND ende>(now() - INTERVAL '".$days." days')";
+ $where_join = "and (z.aktivitaet_kurzbz != 'DienstreiseMT' or z.aktivitaet_kurzbz is null) and z.uid=".$this->db_add_param($user);
+ if ($days!='')
+ $where_join.= " AND z.ende>(now() - INTERVAL '".$days." days')";
+ if ($days=='')
+ $max_anz = 180;
+ else
+ $max_anz = $days;
+ $qry = "SELECT
+ d.dates, z.*, to_char ((z.ende-z.start),'HH24:MI') as diff,
+ (SELECT (to_char(sum(ende-start),'DD')::integer)*24+to_char(sum(ende-start),'HH24')::integer || ':' || to_char(sum(ende-start),'MI')
+ FROM campus.tbl_zeitaufzeichnung
+ WHERE $where) as summe
+ FROM campus.tbl_zeitaufzeichnung z
+ right join (select current_date - s.a as dates from generate_series(0,$max_anz,1) as s(a)) d on date(z.ende) = d.dates $where_join order by d.dates desc, z.start desc
+ ";
+
+ if($result = $this->db_query($qry))
+ {
+ while($row = $this->db_fetch_object($result))
+ {
+ $obj = new zeitaufzeichnung();
+
+ $obj->zeitaufzeichnung_id = $row->zeitaufzeichnung_id;
+ $obj->uid = $row->uid;
+ $obj->aktivitaet_kurzbz = $row->aktivitaet_kurzbz;
+ $obj->start = $row->start;
+ $obj->ende = $row->ende;
+ $obj->beschreibung = $row->beschreibung;
+ $obj->oe_kurzbz_1 = $row->oe_kurzbz_1;
+ $obj->oe_kurzbz_2 = $row->oe_kurzbz_2;
+ $obj->insertamum = $row->insertamum;
+ $obj->insertvon = $row->insertvon;
+ $obj->updateamum = $row->updateamum;
+ $obj->updatevon = $row->updatevon;
+ $obj->projekt_kurzbz = $row->projekt_kurzbz;
+ $obj->projektphase_id = $row->projektphase_id;
+ $obj->ext_id = $row->ext_id;
+ $obj->service_id = $row->service_id;
+ $obj->kunde_uid = $row->kunde_uid;
+ $obj->summe = $row->summe;
+ $obj->diff = $row->diff;
+ $obj->datum = $row->dates;
+
+ $this->result[] = $obj;
+ }
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Laden der Daten';
+ return false;
+ }
+ }
+
+ /**
+ * Laedt die Zeitaufzeichnungen eines Users aufgefüllt mit lehren Tagen.
+ * Default: Die letzten 40 Tage
+ * @param string $user
+ * @param integer $days deafult: 40 Tage
+ */
+ public function getDienstreisenUser($user, $days='40')
+ {
+ $where = "uid=".$this->db_add_param($user);
+ if ($days!='')
+ $where.= " AND ende>(now() - INTERVAL '".$days." days')";
+ $where .= " AND aktivitaet_kurzbz = 'DienstreiseMT'";
+ $qry = "SELECT
+ zeitaufzeichnung_id, start::date as starttag, TO_CHAR(start, 'HH24:MI') as startzeit, ende::date as endtag, TO_CHAR(ende, 'HH24:MI') as endzeit
+ FROM campus.tbl_zeitaufzeichnung
+ where $where
+ ORDER BY ende DESC
+ ";
+
+ if($result = $this->db_query($qry))
+ {
+ $dr_arr = array();
+ while($row = $this->db_fetch_object($result))
+ {
+ if (array_key_exists($row->starttag, $dr_arr))
+ {
+ $dr_arr[$row->starttag]['start'] = $row->startzeit;
+ $dr_arr[$row->starttag]['id'] = $row->zeitaufzeichnung_id;
+ }
+ else
+ {
+ $dr_arr[$row->starttag] = array();
+ $dr_arr[$row->starttag]['start'] = $row->startzeit;
+ $dr_arr[$row->starttag]['id'] = $row->zeitaufzeichnung_id;
+ }
+ if (array_key_exists($row->endtag, $dr_arr))
+ {
+ $dr_arr[$row->endtag]['ende'] = $row->endzeit;
+ $dr_arr[$row->endtag]['id'] = $row->zeitaufzeichnung_id;
+ }
+ else
+ {
+ $dr_arr[$row->endtag] = array();
+ $dr_arr[$row->endtag]['ende'] = $row->endzeit;
+ $dr_arr[$row->endtag]['id'] = $row->zeitaufzeichnung_id;
+ }
+
+ $this->result = $dr_arr;
+ }
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Laden der Daten';
+ return false;
+ }
+ }
+
+ /**
+ * Löscht sämtliche Einträge eines Users für einen Tag
+ * @param string $user
+ * @param string $tag Y-m-d
+ */
+ public function deleteEntriesForUser($user, $tag)
+ {
+ $where = "uid=".$this->db_add_param($user);
+
+ $qry = "delete from campus.tbl_zeitaufzeichnung where $where and date_trunc('day', start) = '$tag'";
+ if($result = $this->db_query($qry))
+ {
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Laden der Daten';
+ return false;
+ }
+ }
+
+ /**
+ * Löscht Pauseneinträge eines Users für einen Tag, die außerhalb der Arbeitszeit liegen
+ * Löscht Pauseneinträge an Tagen ohne Arbeitszeit
+ * @param string $user
+ * @param string $tag Y-m-d
+ */
+ public function cleanPausenForUser($user, $tag)
+ {
+ $where = "uid=".$this->db_add_param($user);
+
+ $qry = "
+ delete from campus.tbl_zeitaufzeichnung where aktivitaet_kurzbz = 'Pause' and start::date = '$tag' and $where and
+(
+start::time >=
+(SELECT max(ende::time) as endzeit from campus.tbl_zeitaufzeichnung where $where and start::date = '$tag' AND (aktivitaet_kurzbz != 'LehreExtern' or aktivitaet_kurzbz is null ) and aktivitaet_kurzbz != 'Pause')
+or
+ende::time<=
+(SELECT min(start::time) as startzeit from campus.tbl_zeitaufzeichnung where $where and start::date = '$tag' AND (aktivitaet_kurzbz != 'LehreExtern' or aktivitaet_kurzbz is null ) and aktivitaet_kurzbz != 'Pause')
+or not exists
+(select 1 from campus.tbl_zeitaufzeichnung where aktivitaet_kurzbz != 'LehreExtern' and aktivitaet_kurzbz != 'Pause' and start::date = '$tag' and $where )
+)
+ ";
+
+ if($result = $this->db_query($qry))
+ {
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Laden der Daten';
+ return false;
+ }
+ }
+
+ /**
+ * Holt alle ZA-Einträge Typ LehreIntern und LehreExtern eines Users
+ * für das laufende Studienjahr und gibt die Summen in einem Array zurück
+ * @param string $user
+ * @return Array mit Key: LehreIntern, LehreExtern, LehreAuftraege, LehreInkludiert
+ */
+ public function getLehreForUser($user,$sem)
+ {
+ $where = "uid=".$this->db_add_param($user);
+ $where_sem = "studiensemester_kurzbz=".$this->db_add_param($sem);
+ $lehre_arr = array("Lehre"=>0, "LehreExtern"=>0, "LehreAuftraege"=>0);
+
+ $qry = "
+ select sum(extract(epoch from ende-start))/3600 as lehre, aktivitaet_kurzbz from campus.tbl_zeitaufzeichnung where $where and aktivitaet_kurzbz in ('Lehre', 'LehreExtern') and start > (select start from public.tbl_studiensemester where $where_sem) group by aktivitaet_kurzbz
+ ";
+
+ if($result = $this->db_query($qry))
+ {
+
+ while($row = $this->db_fetch_object($result))
+ {
+ $lehre_arr[$row->aktivitaet_kurzbz] = round($row->lehre,2);
+ }
+ }
+ else
+ {
+ return false;
+ }
+ $where = "mitarbeiter_uid=".$this->db_add_param($user);
+ $where_sem = "l.studiensemester_kurzbz=".$this->db_add_param($sem);
+
+ $qry = "
+ SELECT sum(semstunden) AS stunden
+ FROM
+ (
+ SELECT sum(m.semesterstunden) AS semstunden
+ FROM
+ lehre.tbl_lehreinheitmitarbeiter m,
+ lehre.tbl_lehreinheit l
+ JOIN
+ lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
+ JOIN
+ public.tbl_studiengang s using (studiengang_kz)
+ WHERE
+ $where AND
+ $where_sem AND
+ l.lehreinheit_id = m.lehreinheit_id AND
+ m.stundensatz * m.semesterstunden > 0 AND
+ s.typ not in ('l') AND
+ lv.studiengang_kz > 0
+ UNION
+ SELECT sum(pb.stunden) AS semstunden
+ FROM
+ lehre.tbl_projektarbeit pa,
+ lehre.tbl_projektbetreuer pb,
+ public.tbl_benutzer b,
+ lehre.tbl_lehreinheit l
+ JOIN
+ lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
+ JOIN
+ public.tbl_studiengang s using (studiengang_kz)
+
+ WHERE
+ pa.lehreinheit_id = l.lehreinheit_id AND
+ pb.projektarbeit_id = pa.projektarbeit_id AND
+ pb.person_id = b.person_id AND
+ b.uid = ".$this->db_add_param($user)." AND
+ pb.stunden * pb.stundensatz > 0 AND
+ s.typ not in ('l') AND
+ lv.studiengang_kz > 0 AND
+ $where_sem
+ ) AS semstunden
+ ";
+
+ if($result = $this->db_query($qry))
+ {
+
+ while($row = $this->db_fetch_object($result))
+ {
+ $lehre_arr["LehreAuftraege"] = round($row->stunden);
+ }
+ }
+ else
+ {
+ return false;
+ }
+
+ return $lehre_arr;
+ }
+
+ /**
+ * Holt das Datum bis zu dem die Eintragung für einen bestimmten User gesperrt ist
+ * @param string $user
+ * @return string $tag Y-m-d or false
+ */
+
+ public function getEintragungGesperrtBisForUser($user)
+ {
+ //check if addon casetime is installed
+ $qrytable = "
+ SELECT EXISTS(
+ SELECT 1
+ FROM information_schema.tables
+ WHERE
+ table_schema = 'addon' AND
+ table_name = 'tbl_casetime_timesheet'
+ );
+ ";
+
+ $res = $this->db_query($qrytable);
+ if ($this->db_fetch_row($res)[0] == 't')
+ {
+ //check if sent timesheets for the UID exist
+ $where = "uid=".$this->db_add_param($user);
+
+ $qry = "select max(datum) from addon.tbl_casetime_timesheet where ".$where." and abgeschicktamum is not null";
+
+ if($result = $this->db_query($qry))
+ {
+ $datum = $this->db_fetch_object($result);
+ return $datum->max;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+}
+?>
diff --git a/locale/de-AT/zeitaufzeichnung.php b/locale/de-AT/zeitaufzeichnung.php
index 4634459dd..0692a5f8b 100644
--- a/locale/de-AT/zeitaufzeichnung.php
+++ b/locale/de-AT/zeitaufzeichnung.php
@@ -1,60 +1,61 @@
-phrasen['zeitaufzeichnung/zeitaufzeichnung']='Zeitaufzeichnung';
-$this->phrasen['zeitaufzeichnung/benutzerWurdeNichtGefunden']='Benutzer %s wurde nicht gefunden';
-$this->phrasen['zeitaufzeichnung/zeitaufzeichnungVon']='Zeitaufzeichnung von';
-$this->phrasen['zeitaufzeichnung/neu']='NEU';
-$this->phrasen['zeitaufzeichnung/projekt']='Projekt';
-$this->phrasen['zeitaufzeichnung/keineAuswahl']='keine Auswahl';
-$this->phrasen['zeitaufzeichnung/aktivitaet']='Aktivität';
-$this->phrasen['zeitaufzeichnung/id']='ID';
-$this->phrasen['zeitaufzeichnung/user']='User';
-$this->phrasen['zeitaufzeichnung/start']='Start';
-$this->phrasen['zeitaufzeichnung/ende']='Ende';
-$this->phrasen['zeitaufzeichnung/dauer']='Dauer';
-$this->phrasen['zeitaufzeichnung/gesamtdauer']='Gesamtdauer';
-$this->phrasen['zeitaufzeichnung/sieSindDerzeitKeinenProjektenZugeordnet']='Sie sind derzeit keinen Projekten zugeordnet';
-$this->phrasen['zeitaufzeichnung/fehlerBeimErmittelnDerProjekte']='Fehler beim Ermitteln der Projekte';
-$this->phrasen['zeitaufzeichnung/organisationseinheit1']='Organisationseinheit 1';
-$this->phrasen['zeitaufzeichnung/organisationseinheit2']='Organisationseinheit 2';
-$this->phrasen['zeitaufzeichnung/organisationseinheiten']='Organisationseinheit';
-$this->phrasen['zeitaufzeichnung/oe']='OE';
-$this->phrasen['zeitaufzeichnung/service']='Service';
-$this->phrasen['zeitaufzeichnung/kunde']='Kunde';
-$this->phrasen['zeitaufzeichnung/alsNeuenEintragSpeichern']='Als neuen Eintrag speichern';
-$this->phrasen['zeitaufzeichnung/kartennummer']='Kartennummer';
-$this->phrasen['zeitaufzeichnung/oderKartennummerOptional']='oder Kartennummer (optional)';
-$this->phrasen['zeitaufzeichnung/nameEingeben']='Name eingeben';
-$this->phrasen['zeitaufzeichnung/aktuelleZeitLaden']='Aktuelle Zeit laden';
-$this->phrasen['zeitaufzeichnung/alsEndzeitUebernehmen']='Als Endzeit übernehmen';
-$this->phrasen['zeitaufzeichnung/alsStartzeitUebernehmen']='Als Startzeit übernehmen';
-$this->phrasen['zeitaufzeichnung/uebersicht']='Projektübersicht';
-$this->phrasen['zeitaufzeichnung/zeitraumAuffallendHoch']='Achtung, eingegebener Zeitraum ist auffallend hoch. \nWollen Sie die Daten dennoch speichern?';
-$this->phrasen['zeitaufzeichnung/bisDatumKleinerAlsVonDatum']='Das Bis-Datum darf nicht kleiner als das Von-Datum sein';
-$this->phrasen['zeitaufzeichnung/tagessumme']='Tagessumme:';
-$this->phrasen['zeitaufzeichnung/wochensumme']='Wochensumme:';
-$this->phrasen['zeitaufzeichnung/wochensummeEintraege']='Wochensumme Einträge';
-$this->phrasen['zeitaufzeichnung/wochensummeArbeitszeit']='Wochensumme Arbeitszeit';
-$this->phrasen['zeitaufzeichnung/xTageAnsicht']='%s Tage Ansicht';
-$this->phrasen['zeitaufzeichnung/endeXTageAnsicht']='Ende der %s Tage Ansicht';
-$this->phrasen['zeitaufzeichnung/alleAnzeigen']='Alle anzeigen';
-$this->phrasen['zeitaufzeichnung/alleEintraege']='Alle Einträge';
-$this->phrasen['zeitaufzeichnung/summeEintraege']='Summe Einträge';
-$this->phrasen['zeitaufzeichnung/arbeitszeit']='Arbeitszeit';
-$this->phrasen['zeitaufzeichnung/pause']='Pausen';
-$this->phrasen['zeitaufzeichnung/inklusivePflichtpause']='inkl. 30 min. Pflichtpause';
-$this->phrasen['zeitaufzeichnung/handbuchZeitaufzeichnung']='Arbeitszeitaufzeichnung Leitfaden';
-$this->phrasen['zeitaufzeichnung/fiktiveNormalarbeitszeit']='Vereinbarung der fiktiven Normalarbeitszeit';
-$this->phrasen['zeitaufzeichnung/projektexport']='Projektexport';
-$this->phrasen['zeitaufzeichnung/projektliste']='Projektliste';
-$this->phrasen['zeitaufzeichnung/projektlistegedruckt']='Projektliste gedruckt am:';
-$this->phrasen['zeitaufzeichnung/personalnr']='Personal-Nr.:';
-$this->phrasen['zeitaufzeichnung/jahr']='Jahr:';
-$this->phrasen['zeitaufzeichnung/monat']='Monat:';
-$this->phrasen['zeitaufzeichnung/tag']='Tag';
-$this->phrasen['zeitaufzeichnung/startdatum']='Startdatum:';
-$this->phrasen['zeitaufzeichnung/enddatum']='Enddatum:';
-$this->phrasen['zeitaufzeichnung/stunden']='Stunden';
-$this->phrasen['zeitaufzeichnung/taetigkeit']='Tätigkeit';
-$this->phrasen['zeitaufzeichnung/keineprojekte']='keine Projekte vorhanden';
-$this->phrasen['zeitaufzeichnung/summe']='Summe:';
-$this->phrasen['zeitaufzeichnung/dienstreise']='Dienstreise';
+phrasen['zeitaufzeichnung/zeitaufzeichnung']='Zeitaufzeichnung';
+$this->phrasen['zeitaufzeichnung/benutzerWurdeNichtGefunden']='Benutzer %s wurde nicht gefunden';
+$this->phrasen['zeitaufzeichnung/zeitaufzeichnungVon']='Zeitaufzeichnung von';
+$this->phrasen['zeitaufzeichnung/neu']='NEU';
+$this->phrasen['zeitaufzeichnung/projekt']='Projekt';
+$this->phrasen['zeitaufzeichnung/projektphase']='Projektphase';
+$this->phrasen['zeitaufzeichnung/keineAuswahl']='keine Auswahl';
+$this->phrasen['zeitaufzeichnung/aktivitaet']='Aktivität';
+$this->phrasen['zeitaufzeichnung/id']='ID';
+$this->phrasen['zeitaufzeichnung/user']='User';
+$this->phrasen['zeitaufzeichnung/start']='Start';
+$this->phrasen['zeitaufzeichnung/ende']='Ende';
+$this->phrasen['zeitaufzeichnung/dauer']='Dauer';
+$this->phrasen['zeitaufzeichnung/gesamtdauer']='Gesamtdauer';
+$this->phrasen['zeitaufzeichnung/sieSindDerzeitKeinenProjektenZugeordnet']='Sie sind derzeit keinen Projekten zugeordnet';
+$this->phrasen['zeitaufzeichnung/fehlerBeimErmittelnDerProjekte']='Fehler beim Ermitteln der Projekte';
+$this->phrasen['zeitaufzeichnung/organisationseinheit1']='Organisationseinheit 1';
+$this->phrasen['zeitaufzeichnung/organisationseinheit2']='Organisationseinheit 2';
+$this->phrasen['zeitaufzeichnung/organisationseinheiten']='Organisationseinheit';
+$this->phrasen['zeitaufzeichnung/oe']='OE';
+$this->phrasen['zeitaufzeichnung/service']='Service';
+$this->phrasen['zeitaufzeichnung/kunde']='Kunde';
+$this->phrasen['zeitaufzeichnung/alsNeuenEintragSpeichern']='Als neuen Eintrag speichern';
+$this->phrasen['zeitaufzeichnung/kartennummer']='Kartennummer';
+$this->phrasen['zeitaufzeichnung/oderKartennummerOptional']='oder Kartennummer (optional)';
+$this->phrasen['zeitaufzeichnung/nameEingeben']='Name eingeben';
+$this->phrasen['zeitaufzeichnung/aktuelleZeitLaden']='Aktuelle Zeit laden';
+$this->phrasen['zeitaufzeichnung/alsEndzeitUebernehmen']='Als Endzeit übernehmen';
+$this->phrasen['zeitaufzeichnung/alsStartzeitUebernehmen']='Als Startzeit übernehmen';
+$this->phrasen['zeitaufzeichnung/uebersicht']='Projektübersicht';
+$this->phrasen['zeitaufzeichnung/zeitraumAuffallendHoch']='Achtung, eingegebener Zeitraum ist auffallend hoch. \nWollen Sie die Daten dennoch speichern?';
+$this->phrasen['zeitaufzeichnung/bisDatumKleinerAlsVonDatum']='Das Bis-Datum darf nicht kleiner als das Von-Datum sein';
+$this->phrasen['zeitaufzeichnung/tagessumme']='Tagessumme:';
+$this->phrasen['zeitaufzeichnung/wochensumme']='Wochensumme:';
+$this->phrasen['zeitaufzeichnung/wochensummeEintraege']='Wochensumme Einträge';
+$this->phrasen['zeitaufzeichnung/wochensummeArbeitszeit']='Wochensumme Arbeitszeit';
+$this->phrasen['zeitaufzeichnung/xTageAnsicht']='%s Tage Ansicht';
+$this->phrasen['zeitaufzeichnung/endeXTageAnsicht']='Ende der %s Tage Ansicht';
+$this->phrasen['zeitaufzeichnung/alleAnzeigen']='Alle anzeigen';
+$this->phrasen['zeitaufzeichnung/alleEintraege']='Alle Einträge';
+$this->phrasen['zeitaufzeichnung/summeEintraege']='Summe Einträge';
+$this->phrasen['zeitaufzeichnung/arbeitszeit']='Arbeitszeit';
+$this->phrasen['zeitaufzeichnung/pause']='Pausen';
+$this->phrasen['zeitaufzeichnung/inklusivePflichtpause']='inkl. 30 min. Pflichtpause';
+$this->phrasen['zeitaufzeichnung/handbuchZeitaufzeichnung']='Arbeitszeitaufzeichnung Leitfaden';
+$this->phrasen['zeitaufzeichnung/fiktiveNormalarbeitszeit']='Vereinbarung der fiktiven Normalarbeitszeit';
+$this->phrasen['zeitaufzeichnung/projektexport']='Projektexport';
+$this->phrasen['zeitaufzeichnung/projektliste']='Projektliste';
+$this->phrasen['zeitaufzeichnung/projektlistegedruckt']='Projektliste gedruckt am:';
+$this->phrasen['zeitaufzeichnung/personalnr']='Personal-Nr.:';
+$this->phrasen['zeitaufzeichnung/jahr']='Jahr:';
+$this->phrasen['zeitaufzeichnung/monat']='Monat:';
+$this->phrasen['zeitaufzeichnung/tag']='Tag';
+$this->phrasen['zeitaufzeichnung/startdatum']='Startdatum:';
+$this->phrasen['zeitaufzeichnung/enddatum']='Enddatum:';
+$this->phrasen['zeitaufzeichnung/projektstunden']='Projektstunden';
+$this->phrasen['zeitaufzeichnung/taetigkeit']='Tätigkeit';
+$this->phrasen['zeitaufzeichnung/keineprojekte']='keine Projekte vorhanden';
+$this->phrasen['zeitaufzeichnung/summe']='Summe:';
+$this->phrasen['zeitaufzeichnung/dienstreise']='Dienstreise';
diff --git a/locale/en-US/zeitaufzeichnung.php b/locale/en-US/zeitaufzeichnung.php
index bd887a5d0..cd460dc97 100644
--- a/locale/en-US/zeitaufzeichnung.php
+++ b/locale/en-US/zeitaufzeichnung.php
@@ -1,60 +1,61 @@
-phrasen['zeitaufzeichnung/zeitaufzeichnung']='Timesheet';
-$this->phrasen['zeitaufzeichnung/benutzerWurdeNichtGefunden']='User %s not found';
-$this->phrasen['zeitaufzeichnung/zeitaufzeichnungVon']='Timesheet for';
-$this->phrasen['zeitaufzeichnung/neu']='NEW';
-$this->phrasen['zeitaufzeichnung/projekt']='Project';
-$this->phrasen['zeitaufzeichnung/keineAuswahl']='no selection';
-$this->phrasen['zeitaufzeichnung/aktivitaet']='Activity';
-$this->phrasen['zeitaufzeichnung/id']='ID';
-$this->phrasen['zeitaufzeichnung/user']='User';
-$this->phrasen['zeitaufzeichnung/start']='Start';
-$this->phrasen['zeitaufzeichnung/ende']='End';
-$this->phrasen['zeitaufzeichnung/dauer']='Length';
-$this->phrasen['zeitaufzeichnung/gesamtdauer']='Total time';
-$this->phrasen['zeitaufzeichnung/sieSindDerzeitKeinenProjektenZugeordnet']='You are not currently assigned to any projects';
-$this->phrasen['zeitaufzeichnung/fehlerBeimErmittelnDerProjekte']='Error retrieving project data';
-$this->phrasen['zeitaufzeichnung/organisationseinheit1']='Organisation Unit 1';
-$this->phrasen['zeitaufzeichnung/organisationseinheit2']='Organisation Unit 2';
-$this->phrasen['zeitaufzeichnung/organisationseinheiten']='Organisation Unit';
-$this->phrasen['zeitaufzeichnung/oe']='OU';
-$this->phrasen['zeitaufzeichnung/service']='Service';
-$this->phrasen['zeitaufzeichnung/kunde']='Client';
-$this->phrasen['zeitaufzeichnung/alsNeuenEintragSpeichern']='Save as new';
-$this->phrasen['zeitaufzeichnung/kartennummer']='Number';
-$this->phrasen['zeitaufzeichnung/oderKartennummerOptional']='or number of card (optional)';
-$this->phrasen['zeitaufzeichnung/nameEingeben']='Enter name';
-$this->phrasen['zeitaufzeichnung/aktuelleZeitLaden']='Load current time';
-$this->phrasen['zeitaufzeichnung/alsEndzeitUebernehmen']='Transfer to endtime';
-$this->phrasen['zeitaufzeichnung/alsStartzeitUebernehmen']='Transfer to starttime';
-$this->phrasen['zeitaufzeichnung/uebersicht']='Projectoverview';
-$this->phrasen['zeitaufzeichnung/zeitraumAuffallendHoch']='Warning! Period entered is noticeably long. \nDo you want to save the dates anyway?';
-$this->phrasen['zeitaufzeichnung/bisDatumKleinerAlsVonDatum']='The \'To\' date may not be earlier than the \'From\' date.';
-$this->phrasen['zeitaufzeichnung/tagessumme']='Total day:';
-$this->phrasen['zeitaufzeichnung/wochensumme']='Total week:';
-$this->phrasen['zeitaufzeichnung/wochensummeEintraege']='Total week';
-$this->phrasen['zeitaufzeichnung/wochensummeArbeitszeit']='Total week working time';
-$this->phrasen['zeitaufzeichnung/xTageAnsicht']='%s days view';
-$this->phrasen['zeitaufzeichnung/endeXTageAnsicht']='End of %s days view';
-$this->phrasen['zeitaufzeichnung/alleAnzeigen']='Show all';
-$this->phrasen['zeitaufzeichnung/alleEintraege']='All entries';
-$this->phrasen['zeitaufzeichnung/summeEintraege']='Total';
-$this->phrasen['zeitaufzeichnung/arbeitszeit']='Working time';
-$this->phrasen['zeitaufzeichnung/pause']='Breaks';
-$this->phrasen['zeitaufzeichnung/inklusicePlichtpause']='incl. 30 min. lunch break';
-$this->phrasen['zeitaufzeichnung/handbuchZeitaufzeichnung']='Timesheet howto';
-$this->phrasen['zeitaufzeichnung/fiktiveNormalarbeitszeit']='Vereinbarung der fiktiven Normalarbeitszeit';
-$this->phrasen['zeitaufzeichnung/projektexport']='Projectexport';
-$this->phrasen['zeitaufzeichnung/projektliste']='Projectlist';
-$this->phrasen['zeitaufzeichnung/projektlistegedruckt']='Projectlist printed on:';
-$this->phrasen['zeitaufzeichnung/personalnr']='staff number ';
-$this->phrasen['zeitaufzeichnung/jahr']='Year:';
-$this->phrasen['zeitaufzeichnung/monat']='Month:';
-$this->phrasen['zeitaufzeichnung/tag']='Day';
-$this->phrasen['zeitaufzeichnung/startdatum']='Startdate:';
-$this->phrasen['zeitaufzeichnung/enddatum']='Enddate:';
-$this->phrasen['zeitaufzeichnung/stunden']='Hours';
-$this->phrasen['zeitaufzeichnung/taetigkeit']='Activity';
-$this->phrasen['zeitaufzeichnung/keineprojekte']='no projects exist';
-$this->phrasen['zeitaufzeichnung/summe']='Sum:';
-$this->phrasen['zeitaufzeichnung/dienstreise']='Business Trip';
+phrasen['zeitaufzeichnung/zeitaufzeichnung']='Timesheet';
+$this->phrasen['zeitaufzeichnung/benutzerWurdeNichtGefunden']='User %s not found';
+$this->phrasen['zeitaufzeichnung/zeitaufzeichnungVon']='Timesheet for';
+$this->phrasen['zeitaufzeichnung/neu']='NEW';
+$this->phrasen['zeitaufzeichnung/projekt']='Project';
+$this->phrasen['zeitaufzeichnung/projektphase']='Projectphase';
+$this->phrasen['zeitaufzeichnung/keineAuswahl']='no selection';
+$this->phrasen['zeitaufzeichnung/aktivitaet']='Activity';
+$this->phrasen['zeitaufzeichnung/id']='ID';
+$this->phrasen['zeitaufzeichnung/user']='User';
+$this->phrasen['zeitaufzeichnung/start']='Start';
+$this->phrasen['zeitaufzeichnung/ende']='End';
+$this->phrasen['zeitaufzeichnung/dauer']='Length';
+$this->phrasen['zeitaufzeichnung/gesamtdauer']='Total time';
+$this->phrasen['zeitaufzeichnung/sieSindDerzeitKeinenProjektenZugeordnet']='You are not currently assigned to any projects';
+$this->phrasen['zeitaufzeichnung/fehlerBeimErmittelnDerProjekte']='Error retrieving project data';
+$this->phrasen['zeitaufzeichnung/organisationseinheit1']='Organisation Unit 1';
+$this->phrasen['zeitaufzeichnung/organisationseinheit2']='Organisation Unit 2';
+$this->phrasen['zeitaufzeichnung/organisationseinheiten']='Organisation Unit';
+$this->phrasen['zeitaufzeichnung/oe']='OU';
+$this->phrasen['zeitaufzeichnung/service']='Service';
+$this->phrasen['zeitaufzeichnung/kunde']='Client';
+$this->phrasen['zeitaufzeichnung/alsNeuenEintragSpeichern']='Save as new';
+$this->phrasen['zeitaufzeichnung/kartennummer']='Number';
+$this->phrasen['zeitaufzeichnung/oderKartennummerOptional']='or number of card (optional)';
+$this->phrasen['zeitaufzeichnung/nameEingeben']='Enter name';
+$this->phrasen['zeitaufzeichnung/aktuelleZeitLaden']='Load current time';
+$this->phrasen['zeitaufzeichnung/alsEndzeitUebernehmen']='Transfer to endtime';
+$this->phrasen['zeitaufzeichnung/alsStartzeitUebernehmen']='Transfer to starttime';
+$this->phrasen['zeitaufzeichnung/uebersicht']='Projectoverview';
+$this->phrasen['zeitaufzeichnung/zeitraumAuffallendHoch']='Warning! Period entered is noticeably long. \nDo you want to save the dates anyway?';
+$this->phrasen['zeitaufzeichnung/bisDatumKleinerAlsVonDatum']='The \'To\' date may not be earlier than the \'From\' date.';
+$this->phrasen['zeitaufzeichnung/tagessumme']='Total day:';
+$this->phrasen['zeitaufzeichnung/wochensumme']='Total week:';
+$this->phrasen['zeitaufzeichnung/wochensummeEintraege']='Total week';
+$this->phrasen['zeitaufzeichnung/wochensummeArbeitszeit']='Total week working time';
+$this->phrasen['zeitaufzeichnung/xTageAnsicht']='%s days view';
+$this->phrasen['zeitaufzeichnung/endeXTageAnsicht']='End of %s days view';
+$this->phrasen['zeitaufzeichnung/alleAnzeigen']='Show all';
+$this->phrasen['zeitaufzeichnung/alleEintraege']='All entries';
+$this->phrasen['zeitaufzeichnung/summeEintraege']='Total';
+$this->phrasen['zeitaufzeichnung/arbeitszeit']='Working time';
+$this->phrasen['zeitaufzeichnung/pause']='Breaks';
+$this->phrasen['zeitaufzeichnung/inklusicePlichtpause']='incl. 30 min. lunch break';
+$this->phrasen['zeitaufzeichnung/handbuchZeitaufzeichnung']='Timesheet howto';
+$this->phrasen['zeitaufzeichnung/fiktiveNormalarbeitszeit']='Vereinbarung der fiktiven Normalarbeitszeit';
+$this->phrasen['zeitaufzeichnung/projektexport']='Projectexport';
+$this->phrasen['zeitaufzeichnung/projektliste']='Projectlist';
+$this->phrasen['zeitaufzeichnung/projektlistegedruckt']='Projectlist printed on:';
+$this->phrasen['zeitaufzeichnung/personalnr']='staff number ';
+$this->phrasen['zeitaufzeichnung/jahr']='Year:';
+$this->phrasen['zeitaufzeichnung/monat']='Month:';
+$this->phrasen['zeitaufzeichnung/tag']='Day';
+$this->phrasen['zeitaufzeichnung/startdatum']='Startdate:';
+$this->phrasen['zeitaufzeichnung/enddatum']='Enddate:';
+$this->phrasen['zeitaufzeichnung/projektstunden']='Project hours';
+$this->phrasen['zeitaufzeichnung/taetigkeit']='Activity';
+$this->phrasen['zeitaufzeichnung/keineprojekte']='no projects exist';
+$this->phrasen['zeitaufzeichnung/summe']='Sum:';
+$this->phrasen['zeitaufzeichnung/dienstreise']='Business Trip';
diff --git a/locale/it-IT/zeitaufzeichnung.php b/locale/it-IT/zeitaufzeichnung.php
index 04f222b4a..21e081de0 100644
--- a/locale/it-IT/zeitaufzeichnung.php
+++ b/locale/it-IT/zeitaufzeichnung.php
@@ -29,6 +29,7 @@ $this->phrasen['zeitaufzeichnung/organisationseinheit2']='';
$this->phrasen['zeitaufzeichnung/organisationseinheiten']='';
$this->phrasen['zeitaufzeichnung/pause']='';
$this->phrasen['zeitaufzeichnung/projekt']='';
+$this->phrasen['zeitaufzeichnung/projektphase']='';
$this->phrasen['zeitaufzeichnung/service']='';
$this->phrasen['zeitaufzeichnung/sieSindDerzeitKeinenProjektenZugeordnet']='';
$this->phrasen['zeitaufzeichnung/start']='';
diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php
index 1c95190fb..0b50d8920 100644
--- a/system/dbupdate_3.3.php
+++ b/system/dbupdate_3.3.php
@@ -3031,7 +3031,8 @@ if(!$result = @$db->db_query("SELECT stufe FROM public.tbl_dokumentstudiengang L
}
// Create TABLE public.tbl_variablenname
-if(!@$db->db_query("SELECT 0 FROM public.tbl_variablenname WHERE 0 = 1")) {
+if(!@$db->db_query("SELECT 0 FROM public.tbl_variablenname WHERE 0 = 1"))
+{
$qry = '
CREATE TABLE public.tbl_variablenname
(
@@ -3083,6 +3084,18 @@ if(!@$db->db_query("SELECT 0 FROM public.tbl_variablenname WHERE 0 = 1")) {
echo '
Granted privileges to vilesci on public.tbl_variablenname';
}
+// Add column projektphase_id to tbl_zeitaufzeichnung
+if(!$result = @$db->db_query("SELECT projektphase_id FROM campus.tbl_zeitaufzeichnung LIMIT 1"))
+{
+ $qry = "ALTER TABLE campus.tbl_zeitaufzeichnung ADD COLUMN projektphase_id bigint;
+ ALTER TABLE campus.tbl_zeitaufzeichnung ADD CONSTRAINT fk_zeitaufzeichnung_projektphase FOREIGN KEY (projektphase_id) REFERENCES fue.tbl_projektphase (projektphase_id) ON DELETE RESTRICT ON UPDATE CASCADE;";
+
+ if(!$db->db_query($qry))
+ echo 'campus.tbl_zeitaufzeichnung: '.$db->db_last_error().'
';
+ else
+ echo '
campus.tbl_zeitaufzeichnung: Spalte projektphase_id hinzugefuegt';
+}
+
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo 'Pruefe Tabellen und Attribute!
';