diff --git a/cis/private/tools/zeitaufzeichnung.php b/cis/private/tools/zeitaufzeichnung.php index 7ba8a0a9c..3c57636a9 100755 --- a/cis/private/tools/zeitaufzeichnung.php +++ b/cis/private/tools/zeitaufzeichnung.php @@ -50,7 +50,7 @@ if (!$db = new basis_db()) $user = get_uid(); -//Wenn User Administrator ist und UID uebergeben wurde, dann die Zeiaufzeichnung +//Wenn User Administrator ist und UID uebergeben wurde, dann die Zeitaufzeichnung //des uebergebenen Users anzeigen if(isset($_GET['uid'])) { @@ -120,6 +120,22 @@ else $zeitsperren = $zs->result; +$bn = new benutzer(); +if(!$bn->load($user)) + die($p->t("zeitaufzeichnung/benutzerWurdeNichtGefunden",array($user))); + +//CSV export - Konflikt mit normalen HTML headern deshalb weiter vorne +if(isset($_POST['export'])) +{ + if(isset($_POST['exp_von_datum']) && isset($_POST['exp_bis_datum'])) + { + $datevon = $datum->formatDatum($_POST['exp_von_datum'], 'Y-m-d'); + $datebis = $datum->formatDatum($_POST['exp_bis_datum'], 'Y-m-d'); + $ztauf = getZeitaufzeichnung( $user, $datevon, $datebis); + exportAsCSV($ztauf->result, ',', $za_simple, $user); + } +} + echo ' @@ -402,13 +418,55 @@ echo ' } return true; } + + /** + * kontrolliert Start- und Enddatum für CSV Export - + * ob Startdatum nicht größer als Enddatum ist und ob die Zeitspanne nicht größer als 1000 Tage ist + */ + function checkdatumCSVExp(vondatumid, bisdatumid) + { + var Datum,Tag,Monat,Jahr,vonDatum,bisDatum,diff; + + Datum=document.getElementById(vondatumid).value; + Tag=Datum.substring(0,2); + Monat=Datum.substring(3,5); + Jahr=Datum.substring(6,10); + vonDatum=Jahr+\'\'+Monat+\'\'+Tag; + + Datum=document.getElementById(bisdatumid).value; + Tag=Datum.substring(0,2); + Monat=Datum.substring(3,5); + Jahr=Datum.substring(6,10); + bisDatum=Jahr+\'\'+Monat+\'\'+Tag; + diff=bisDatum-vonDatum; + + if (bisDatum>=vonDatum) + { + if (diff>2000 && bisDatum != "" && vonDatum != "") + { + Check = confirm("'.$p->t("zeitaufzeichnung/zeitraumAuffallendHoch").'"); + document.getElementById(bisdatumid).focus(); + if (Check == false) + return false; + else + return true; + } + } + else + { + if(bisDatum != "") + { + alert("'.$p->t("zeitaufzeichnung/bisDatumKleinerAlsVonDatum").'"); + document.getElementById(bisdatumid).focus(); + return false; + } + } + return true; + } '; -$bn = new benutzer(); - if(!$bn->load($user)) - die($p->t("zeitaufzeichnung/benutzerWurdeNichtGefunden",array($user))); echo '

'.$p->t("zeitaufzeichnung/zeitaufzeichnungVon").' '.$db->convert_html_chars($bn->vorname).' '.$db->convert_html_chars($bn->nachname).'

'; @@ -462,8 +520,6 @@ if(isset($_POST['save']) || isset($_POST['edit']) || isset($_POST['import'])) $zeit->beschreibung = $data[4]; $tag = $datum->formatDatum($data[2], $format='Y-m-d'); - - if(!in_array($tag, $importtage_array)) { $importtage_array[] = $tag; @@ -647,18 +703,19 @@ if(isset($_GET['type']) && $_GET['type']=='edit') //Projekte holen zu denen der Benutzer zugeteilt ist $projekt = new projekt(); - if($projekt->getProjekteMitarbeiter($user, true)) { //if(count($projekt->result)>0) //{ - + $anzprojekte = count($projekt->result); echo "'; @@ -927,7 +988,21 @@ if($projekt->getProjekteMitarbeiter($user, true)) } echo ''; echo '
".$p->t("zeitaufzeichnung/neu")."   - CSV Import + CSV Import  + + CSV Export
'; echo ''; - if($za_simple == 0) + //Projekte werden nicht angezeigt wenn es keine gibt + if($anzprojekte > 0) { - //Projekt - echo ' + //Projekt + echo ''; + echo ''; } - echo ''; - echo ''; + if($za_simple == 0) + { //OE_KURZBZ_1 - echo ' + echo ''; } else - echo ''; + echo ''; echo '
'.$p->t("zeitaufzeichnung/projekt").'
'.$p->t("zeitaufzeichnung/organisationseinheiten").'
'.$p->t("zeitaufzeichnung/organisationseinheiten").'
Informationen zum Format der CSV-Datei s. Leitfaden Arbeitszeitaufzeichnung
'; echo '


'; - + echo ''; + if (isset($_GET['csvexport'])) + { + echo '
'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo '

CSV-ExportStartdatum:  Enddatum:
'; + echo '
'; + } echo '
'; echo '

'.($alle===true?$p->t('zeitaufzeichnung/alleEintraege'):$p->t('zeitaufzeichnung/xTageAnsicht', array($angezeigte_tage))).'

'; if ($alle===true) @@ -936,8 +1011,6 @@ if($projekt->getProjekteMitarbeiter($user, true)) echo ''; //echo ''; - echo ''; - $za = new zeitaufzeichnung(); if(isset($_GET['filter'])) $za->getListeProjekt($_GET['filter']); @@ -1221,4 +1294,78 @@ echo ' '; + +/** + * Exportiert Zeitaufzeichnungsdaten als CSV + * @param $data Zeitaufzeichnungsdaten + * @param string $delimiter CSV-Trennzeichen + * @param bool $za_simple Zeitaufzeichnung lang (für Infrastrukturmitarbeiter) oder kurz (simple) + */ +function exportAsCSV($data, $delimiter = ',', $za_simple = false, $uid) +{ + $filename = "zeitaufzeichnung_".$uid.".csv"; + $file = fopen('php://output', 'w'); + $towrite = getDataForCSV($data, $za_simple); + foreach ($towrite as $row) + { + fputcsv($file, $row, $delimiter); + } + header('Content-type: text/csv; charset=utf-8'); + header('Content-Disposition: attachment; filename='.$filename); + fclose($file); + //Abbruch damit HTML markup danach nicht mit exportiert wird + exit(); +} + +/** + * Liefert Daten für CSV-Export basierend auf erhaltenen Zeitaufzeichnungsdaten + * @param $rawdata zu exportierenden Rohdaten aus der Datenbank + * @param bool $za_simple Zeitaufzeichnung lang (für Infrastrukturmitarbeiter) oder kurz (simple). Wenn true, werden Spalten wie Service, OE ausgelassen + * @return array Daten wie sie als CSV exportiert werden können + */ +function getDataForCSV($rawdata, $za_simple = false) +{ + if(!$za_simple) + $service = new service(); + $datum = new datum(); + $csvData = array(); + //headers schreiben + $csvData[] = ($za_simple) ? array("User", "Datum", "Start", "Ende", "Projekt", "Aktivität", "Beschreibung") : array("User", "Datum", "Start", "Ende", "Projekt", "OE 1", "OE 2", "Aktivität", "Service", "Beschreibung"); + foreach ($rawdata as $zeitauf) + { + //Newline characters bei Beschreibung ersetzen + $beschreibung = str_replace(array("\r\n", "\r", "\n"), " | ", $zeitauf->beschreibung); + $hauptdatum = $datum->formatDatum($zeitauf->datum, "d.m.Y"); + $bisdatum = $datum->formatDatum($zeitauf->ende, "d.m.Y"); + //wenn Zeitspanne länger als ein Tag (kommt selten vor) dann Tag des Bisdatums dazuschreiben + $bisdatum = ($hauptdatum == $bisdatum)?$datum->formatDatum($zeitauf->ende, 'H:i'):$datum->formatDatum($zeitauf->ende, 'd.m.Y H:i'); + + if($za_simple) + { + $csvData[] = array($zeitauf->uid, $hauptdatum, $datum->formatDatum($zeitauf->start, 'H:i'), + $bisdatum, $zeitauf->projekt_kurzbz, $zeitauf->aktivitaet_kurzbz, $beschreibung); + } + else + { + $servicebez = ($service->load($zeitauf->service_id))?$service->bezeichnung:""; + $csvData[] = array($zeitauf->uid, $hauptdatum, $datum->formatDatum($zeitauf->start, 'H:i'), $bisdatum, + $zeitauf->projekt_kurzbz, $zeitauf->oe_kurzbz_1, $zeitauf->oe_kurzbz_2, $zeitauf->aktivitaet_kurzbz, $servicebez, $beschreibung); + } + } + return $csvData; +} + +/** + * Liefert Zeitaufzeichnungsdaten zwischen zwei Datumswerten + * @param $user - user für den Zeitaufzeichnungsdaten geholt werden + * @param $von - Startdatum + * @param $bis - Enddatum + * @return zeitaufzeichnung - die Zeitaufzeichnungsdaten + */ +function getZeitaufzeichnung($user, $von, $bis) +{ + $za = new zeitaufzeichnung(); + $za->getListeUserFromTo($user, $von, $bis); + return $za; +} ?> diff --git a/include/zeitaufzeichnung.class.php b/include/zeitaufzeichnung.class.php index dcb270db5..c9b319316 100755 --- a/include/zeitaufzeichnung.class.php +++ b/include/zeitaufzeichnung.class.php @@ -133,8 +133,8 @@ class zeitaufzeichnung extends basis_db //Variablen pruefen if(!$this->validate()) return false; - - // check ob identischer eintrag existiert + + // check ob identischer eintrag existiert $check_qry = 'SELECT count(*) from campus.tbl_zeitaufzeichnung where uid='.$this->db_add_param($this->uid).' and start = '.$this->db_add_param($this->start).' and ende = '.$this->db_add_param($this->ende); if($this->db_query($check_qry) && $this->new) { @@ -142,13 +142,13 @@ class zeitaufzeichnung extends basis_db { if ($row->count) { - $this->errormsg = 'Identischer Eintrag existiert!'; - return false; - } - } - } - - + $this->errormsg = 'Identischer Eintrag existiert!'; + return false; + } + } + } + + if($this->new) { //Neuen Datensatz einfuegen @@ -313,10 +313,84 @@ class zeitaufzeichnung extends basis_db } } + + /** + * 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 + * @return bool + */ + public function getListeUserFromTo($user, $from = null, $to = 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))"; + + $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 deafult: 40 Tage + * @param integer $days default: 40 Tage */ public function getListeUser($user, $days='40') { @@ -355,7 +429,7 @@ class zeitaufzeichnung extends basis_db $obj->service_id = $row->service_id; $obj->kunde_uid = $row->kunde_uid; $obj->summe = $row->summe; - $obj->diff = $row->diff; + $obj->diff = $row->diff; $obj->datum = $row->start; $this->result[] = $obj; @@ -367,10 +441,10 @@ class zeitaufzeichnung extends basis_db $this->errormsg = 'Fehler beim Laden der Daten'; return false; } - } - + } + /** - * Laedt die Zeitaufzeichnungen eines Users aufgefüllt mit lehren Tagen. + * Laedt die Zeitaufzeichnungen eines Users aufgefüllt mit lehren Tagen. * Default: Die letzten 40 Tage * @param string $user * @param integer $days deafult: 40 Tage @@ -379,21 +453,21 @@ class zeitaufzeichnung extends basis_db { $where = "uid=".$this->db_add_param($user); if ($days!='') - $where.= " AND ende>(now() - INTERVAL '".$days." days')"; + $where.= " AND ende>(now() - INTERVAL '".$days." days')"; $where_join = "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 + 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 + 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)) @@ -419,7 +493,7 @@ class zeitaufzeichnung extends basis_db $obj->service_id = $row->service_id; $obj->kunde_uid = $row->kunde_uid; $obj->summe = $row->summe; - $obj->diff = $row->diff; + $obj->diff = $row->diff; $obj->datum = $row->dates; $this->result[] = $obj; @@ -431,11 +505,11 @@ class zeitaufzeichnung extends basis_db $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 $user * @param string $tag Y-m-d */ public function deleteEntriesForUser($user, $tag) @@ -452,30 +526,30 @@ class zeitaufzeichnung extends basis_db $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 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 $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 ) -) - "; + + $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)) { @@ -486,56 +560,56 @@ or not exists $this->errormsg = 'Fehler beim Laden der Daten'; return false; } - } - + } + /** - * Holt alle ZA-Einträge Typ LehreIntern und LehreExtern eines Users + * 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 + * @param string $user * @return Array mit Keay: LehreIntern, LehreExtern, LehreAuftraege, LehreInkludiert - */ - public function getLehreForUser($user,$sem) - { - $where = "uid=".$this->db_add_param($user); + */ + public function getLehreForUser($user,$sem) + { + $where = "uid=".$this->db_add_param($user); $where_sem = "studiensemester_kurzbz=".$this->db_add_param($sem); - $lehre_arr = array("LehreIntern"=>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 ('LehreIntern', 'LehreExtern') and start > (select start from public.tbl_studiensemester where $where_sem) group by aktivitaet_kurzbz - "; + $lehre_arr = array("LehreIntern"=>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 ('LehreIntern', '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); + + 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(m.semesterstunden) from lehre.tbl_lehreinheitmitarbeiter m, lehre.tbl_lehreinheit l where $where and $where_sem and l.lehreinheit_id = m.lehreinheit_id and m.stundensatz*m.semesterstunden > 0 - "; + } + $where = "mitarbeiter_uid=".$this->db_add_param($user); + $where_sem = "l.studiensemester_kurzbz=".$this->db_add_param($sem); + $qry = " + select sum(m.semesterstunden) from lehre.tbl_lehreinheitmitarbeiter m, lehre.tbl_lehreinheit l where $where and $where_sem and l.lehreinheit_id = m.lehreinheit_id and m.stundensatz*m.semesterstunden > 0 + "; if($result = $this->db_query($qry)) { - - while($row = $this->db_fetch_object($result)) - { - $lehre_arr["LehreAuftraege"] = round($row->sum); + + while($row = $this->db_fetch_object($result)) + { + $lehre_arr["LehreAuftraege"] = round($row->sum); } } else { return false; - } - - return $lehre_arr; + } + + return $lehre_arr; } } ?>