Files
FHC-Core/include/zeitsperre.class.php
T

638 lines
18 KiB
PHP

<?php
/* Copyright (C) 2006 Technikum-Wien
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* Authors: Christian Paminger <christian.paminger@technikum-wien.at>,
* Andreas Oesterreicher <andreas.oesterreicher@technikum-wien.at> and
* Rudolf Hangl <rudolf.hangl@technikum-wien.at>.
*/
require_once(dirname(__FILE__).'/basis_db.class.php');
class zeitsperre extends basis_db
{
const NUR_BLOCKIERENDE_ZEITSPERREN = true;
const BLOCKIERENDE_ZEITSPERREN = "'Krank','Urlaub','ZA','DienstV','PflegeU','DienstF','CovidSB','CovidKS'";
public $new; // boolean
public $result = array(); // news Objekt
//Tabellenspalten
public $zeitsperre_id; // serial
public $zeitsperretyp_kurzbz; // varchar(8)
public $mitarbeiter_uid; // varchar(16)
public $bezeichnung; // varchar(32)
public $vondatum; // date
public $vonstunde; // smallint
public $bisdatum; // date
public $bisstunde; // smallint
public $erreichbarkeit_kurzbz; // varchar(5)
public $vertretung_uid; // varchar(16)
public $updateamum; // timestamp
public $updatevon; // string
public $insertamum; // timestamp
public $insertvon; // string
public $freigabeamum;
public $freigabevon;
/**
* Konstruktor
* @param $zeitsperre_id ID der zu ladenden Funktion
*/
public function __construct($zeitsperre_id=null)
{
parent::__construct();
if($zeitsperre_id != null)
$this->load($zeitsperre_id);
}
public static function getBlockierendeZeitsperren()
{
return explode("','",trim(self::BLOCKIERENDE_ZEITSPERREN, '\''));
}
/**
* Laedt alle Zeitsperren eines Benutzers wo ende>=now() ist
* @param $uid
* @param $bisgrenze wenn true werden nur die Zeitsperren des
* aktuellen Geschaeftsjahres geholt (1.9.-31.8.)
* @return true wenn ok, false im Fehlerfall
*/
public function getzeitsperren($uid, $bisgrenze=true)
{
unset($this->result);
$this->result=array();
$qry = "SELECT tbl_zeitsperre.*, tbl_zeitsperretyp.*, tbl_erreichbarkeit.farbe AS erreichbarkeit_farbe, tbl_erreichbarkeit.beschreibung AS erreichbarkeit_beschreibung
FROM (campus.tbl_zeitsperre JOIN campus.tbl_zeitsperretyp USING (zeitsperretyp_kurzbz))
LEFT JOIN campus.tbl_erreichbarkeit USING (erreichbarkeit_kurzbz)
WHERE mitarbeiter_uid=".$this->db_add_param($uid);
if($bisgrenze)
{
$qry.=" AND (
(date_part('month',vondatum)>=9 AND date_part('year', vondatum)>='".(date('Y')-1)."')
OR
(date_part('month',vondatum)<9 AND date_part('year', vondatum)>='".(date('Y'))."')
)";
}
$qry.= " ORDER BY vondatum DESC";
if($this->db_query($qry))
{
while($row = $this->db_fetch_object())
{
$obj = new zeitsperre();
$obj->zeitsperre_id = $row->zeitsperre_id;
$obj->zeitsperretyp_kurzbz = $row->zeitsperretyp_kurzbz;
$obj->zeitsperretyp_beschreibung = $row->beschreibung;
$obj->zeitsperretyp_farbe = $row->farbe;
$obj->mitarbeiter_uid = $row->mitarbeiter_uid;
$obj->bezeichnung = $row->bezeichnung;
$obj->vondatum = $row->vondatum;
$obj->vonstunde = $row->vonstunde;
$obj->bisdatum = $row->bisdatum;
$obj->bisstunde = $row->bisstunde;
$obj->erreichbarkeit = $row->erreichbarkeit_kurzbz;
$obj->erreichbarkeit_farbe = $row->erreichbarkeit_farbe;
$obj->erreichbarkeit_kurzbz = $row->erreichbarkeit_kurzbz;
$obj->erreichbarkeit_beschreibung = $row->erreichbarkeit_beschreibung;
$obj->vertretung_uid = $row->vertretung_uid;
$obj->updateamum = $row->updateamum;
$obj->updatevon = $row->updatevon;
$obj->insertamum = $row->insertamum;
$obj->insertvon = $row->insertvon;
$obj->freigabeamum = $row->freigabeamum;
$obj->freigabevon = $row->freigabevon;
$this->result[] = $obj;
}
return true;
}
else
{
$this->errormsg = 'Fehler beim Laden der Zeitsperren';
return false;
}
}
/**
* Laedt eine Zeitsperre
* @param $zeitsperre_id ID der zu laden ist
* @return true wenn ok, false im Fehlerfall
*/
public function load($zeitsperre_id)
{
if(!is_numeric($zeitsperre_id))
{
$this->errormsg = 'zeitsperre_id muß eine gültige Zahl sein';
return false;
}
$qry = "SELECT * FROM campus.tbl_zeitsperre WHERE zeitsperre_id=".$this->db_add_param($zeitsperre_id, FHC_INTEGER);
if(!$this->db_query($qry))
{
$this->errormsg = 'Fehler beim Laden des Datensatzes';
return false;
}
if($row = $this->db_fetch_object())
{
$this->zeitsperre_id = $row->zeitsperre_id;
$this->zeitsperretyp_kurzbz = $row->zeitsperretyp_kurzbz;
$this->mitarbeiter_uid = $row->mitarbeiter_uid;
$this->bezeichnung = $row->bezeichnung;
$this->vondatum = $row->vondatum;
$this->vonstunde = $row->vonstunde;
$this->bisdatum = $row->bisdatum;
$this->bisstunde = $row->bisstunde;
$this->erreichbarkeit_kurzbz = $row->erreichbarkeit_kurzbz;
$this->vertretung_uid = $row->vertretung_uid;
$this->updateamum = $row->updateamum;
$this->updatevon = $row->updatevon;
$this->insertamum = $row->insertamum;
$this->insertvon = $row->insertvon;
$this->freigabeamum = $row->freigabeamum;
$this->freigabevon = $row->freigabevon;
}
else
{
$this->errormsg = 'Es ist kein Datensatz mit dieser ID vorhanden';
return false;
}
return true;
}
/**
* Loescht einen Datensatz
* @param $zeitsperre_id id des Datensatzes der geloescht werden soll
* @return true wenn ok, false im Fehlerfall
*/
public function delete($zeitsperre_id)
{
if(!is_numeric($zeitsperre_id))
{
$this->errormsg = 'Zeitsperre_id muss eine gueltige Zahl sein';
return false;
}
$qry = "DELETE FROM campus.tbl_zeitsperre WHERE zeitsperre_id=".$this->db_add_param($zeitsperre_id, FHC_INTEGER);
if($this->db_query($qry))
return true;
else
{
$this->errormsg = 'Fehler beim Löschen';
return false;
}
}
/**
* Prueft die Gueltigkeit der Variablen
* @return true wenn ok, false im Fehlerfall
*/
protected function validate()
{
if(mb_strlen($this->bezeichnung)>32)
{
$this->errormsg = "Bezeichnung darf nicht laenger als 32 Zeichen sein";
return false;
}
if(mb_strlen($this->zeitsperretyp_kurzbz)>8)
{
$this->errormsg = "Zeitsperretyp_kurzbz darf nicht laenger als 8 Zeichen sein";
return false;
}
if(mb_strlen($this->mitarbeiter_uid)>32)
{
$this->errormsg = "Mitarbeiter_uid darf nicht laenger als 8 Zeichen sein";
return false;
}
if(mb_strlen($this->erreichbarkeit_kurzbz)>8)
{
$this->errormsg = "Erreichbarkeit darf nicht laenger als 8 Zeichen sein";
return false;
}
$this->errormsg = '';
return true;
}
/**
* Speichert den aktuellen Datensatz
* @return true wenn ok, false im Fehlerfall
*/
public function save($new = null)
{
//Gueltigkeit der Variablen pruefen
if(!$this->validate())
return false;
if(!is_null($new))
$this->new = $new;
if($this->new)
{
//Neuen Datensatz anlegen
$qry = 'INSERT INTO campus.tbl_zeitsperre (zeitsperretyp_kurzbz, mitarbeiter_uid, bezeichnung,'.
' vondatum ,vonstunde, bisdatum, bisstunde, erreichbarkeit_kurzbz, vertretung_uid, insertamum,'.
' insertvon, updateamum, updatevon, freigabeamum, freigabevon) VALUES ('.
$this->db_add_param($this->zeitsperretyp_kurzbz).', '.
$this->db_add_param($this->mitarbeiter_uid).', '.
$this->db_add_param($this->bezeichnung).', '.
$this->db_add_param($this->vondatum).', '.
$this->db_add_param($this->vonstunde).', '.
$this->db_add_param($this->bisdatum).', '.
$this->db_add_param($this->bisstunde).', '.
$this->db_add_param($this->erreichbarkeit_kurzbz).', '.
$this->db_add_param($this->vertretung_uid).', '.
$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->freigabeamum).','.
$this->db_add_param($this->freigabevon).'); ';
}
else
{
//bestehenden Datensatz akualisieren
//Pruefen ob zeitsperre_id eine gueltige Zahl ist
if(!is_numeric($this->zeitsperre_id) || $this->zeitsperre_id == '')
{
$this->errormsg = 'Zeitsperre_id muss eine gueltige Zahl sein';
return false;
}
$qry = 'UPDATE campus.tbl_zeitsperre SET '.
'zeitsperretyp_kurzbz='.$this->db_add_param($this->zeitsperretyp_kurzbz).', '.
'mitarbeiter_uid='.$this->db_add_param($this->mitarbeiter_uid).', '.
'bezeichnung='.$this->db_add_param($this->bezeichnung).', '.
'vondatum='.$this->db_add_param($this->vondatum).', '.
'vonstunde='.$this->db_add_param($this->vonstunde).', '.
'bisdatum='.$this->db_add_param($this->bisdatum).', '.
'bisstunde='.$this->db_add_param($this->bisstunde).', '.
'erreichbarkeit_kurzbz='.$this->db_add_param($this->erreichbarkeit_kurzbz).', '.
'vertretung_uid='.$this->db_add_param($this->vertretung_uid).', '.
'insertamum='.$this->db_add_param($this->insertamum).', '.
'insertvon='.$this->db_add_param($this->insertvon).', '.
'freigabeamum='.$this->db_add_param($this->freigabeamum).', '.
'freigabevon='.$this->db_add_param($this->freigabevon).', '.
'updateamum='.$this->db_add_param($this->updateamum).', '.
'updatevon='.$this->db_add_param($this->updatevon).' '.
'WHERE zeitsperre_id = '.$this->db_add_param($this->zeitsperre_id, FHC_INTEGER).';';
}
if($this->db_query($qry))
{
return true;
}
else
{
$this->errormsg = 'Fehler beim Speichern des Datensatzes';
return false;
}
}
/**
* Liefert ZeitsperreTypen eines Tages
* @param $datum
* @return string wenn ok, false im Fehlerfall
*/
public function getTyp($datum)
{
$datum_obj=new datum();
$typ='';
foreach ($this->result as $zs)
{
$beginn=$datum_obj->mktime_fromdate($zs->vondatum);
$ende=$datum_obj->mktime_fromdate($zs->bisdatum);
if ($datum>=$beginn && ((int)($datum/60/60/24)<=(int)($ende/60/60/24) || date('Y-m-d', $datum)==date('Y-m-d', $ende)))
$typ.=$zs->zeitsperretyp_kurzbz.' ';
}
return $typ;
}
/**
* Liefert Erreichbarkeit der Zeitsperre eines Tages
* @return string wenn ok, false im Fehlerfall
*/
public function getErreichbarkeit($datum)
{
$datum_obj=new datum();
$erbk='';
foreach ($this->result as $zs)
{
$beginn=$datum_obj->mktime_fromdate($zs->vondatum);
$ende=$datum_obj->mktime_fromdate($zs->bisdatum);
if ($datum>=$beginn && ((int)($datum/60/60/24)<=(int)($ende/60/60/24) || date('Y-m-d', $datum)==date('Y-m-d', $ende)))
$erbk.=$zs->erreichbarkeit.' ';
}
return $erbk;
}
/**
* Liefert die Vertretung der Zeitsperre
* @return array wenn ok, false im Fehlerfall
*/
public function getVertretung($datum)
{
$datum_obj=new datum();
$vertretung[]='';
foreach ($this->result as $zs)
{
$beginn=$datum_obj->mktime_fromdate($zs->vondatum);
$ende=$datum_obj->mktime_fromdate($zs->bisdatum);
if ($datum>=$beginn && ((int)($datum/60/60/24)<=(int)($ende/60/60/24) || date('Y-m-d', $datum)==date('Y-m-d', $ende)))
$vertretung[]=$zs->vertretung_uid;
}
return array_unique($vertretung);
}
/**
* Liefert die Zeitsperren eines Users zu einem bestimmten Datum und Stunde
*
* @param $user
* @param $datum
* @param $stunde optional, wird nur abgefragt, wenn != null
* @param $nurblockierend boolean default false
* @return true wenn ok, false im Fehlerfall
*/
public function getSperreByDate($user, $datum, $stunde=null, $nurblockierend=false)
{
$this->result = array();
$qry = "
SELECT
*
FROM
campus.tbl_zeitsperre
WHERE
vondatum<=".$this->db_add_param($datum)."
AND bisdatum>=".$this->db_add_param($datum);
if( $nurblockierend ) {
$qry .= " AND zeitsperretyp_kurzbz in (" . self::BLOCKIERENDE_ZEITSPERREN . ")";
}
if(!is_null($stunde))
$qry.=" AND
((vondatum=".$this->db_add_param($datum)." AND vonstunde<=".$this->db_add_param($stunde).") OR vonstunde is null OR vondatum<>".$this->db_add_param($datum).") AND
((bisdatum=".$this->db_add_param($datum)." AND bisstunde>=".$this->db_add_param($stunde).") OR bisstunde is null OR bisdatum<>".$this->db_add_param($datum).")";
$qry .= "AND mitarbeiter_uid=".$this->db_add_param($user);
if($result = $this->db_query($qry))
{
while($row = $this->db_fetch_object($result))
{
$obj = new zeitsperre();
$obj->zeitsperre_id = $row->zeitsperre_id;
$obj->zeitsperretyp_kurzbz = $row->zeitsperretyp_kurzbz;
$obj->mitarbeiter_uid = $row->mitarbeiter_uid;
$obj->bezeichnung = $row->bezeichnung;
$obj->vondatum = $row->vondatum;
$obj->vonstunde = $row->vonstunde;
$obj->bisdatum = $row->bisdatum;
$obj->bisstunde = $row->bisstunde;
$obj->erreichbarkeit_kurzbz = $row->erreichbarkeit_kurzbz;
$obj->vertretung_uid = $row->vertretung_uid;
$obj->updateamum = $row->updateamum;
$obj->updatevon = $row->updatevon;
$obj->insertamum = $row->insertamum;
$obj->insertvon = $row->insertvon;
$obj->freigabeamum = $row->freigabeamum;
$obj->freigabevon = $row->freigabevon;
$this->result[] = $obj;
}
return true;
}
else
{
$this->errormsg = 'Fehler beim Laden der Zeitsperren';
return false;
}
}
/**
* Prueft ob innerhalb des angegebenen Zeitraums bereits ein Urlaub eingetragen ist
*
* @param $uid
* @param $von
* @param $bis
* @param $id Eintrag mit dieser ID wird nicht beruecksichtigt (zB bei Editieren von Eintraegen)
*/
function UrlaubEingetragen($uid, $von, $bis, $id=null)
{
$qry = "SELECT
1
FROM
campus.tbl_zeitsperre
WHERE
zeitsperretyp_kurzbz='Urlaub'
AND mitarbeiter_uid=".$this->db_add_param($uid)."
AND
(
(vondatum BETWEEN ".$this->db_add_param($von)." AND ".$this->db_add_param($bis).")
OR
(bisdatum BETWEEN ".$this->db_add_param($von)." AND ".$this->db_add_param($bis).")
OR
(vondatum<=".$this->db_add_param($von)." AND bisdatum>=".$this->db_add_param($bis).")
)";
if(!is_null($id))
$qry.=" AND zeitsperre_id<>".$this->db_add_param($id);
if($result = $this->db_query($qry))
{
if($this->db_num_rows($result)>0)
{
return true;
}
else
{
return false;
}
}
else
{
$this->errormsg = 'Fehler beim Laden der Daten';
return false;
}
}
/**
* Liefert die Zeitsperren eines Users für die Zeitaufzeichnung
*
* @param $uid
* @param $anz_tage
* @return array 'datum'->'zeitsperre_kurzbz'
*/
public function getZeitsperrenForZeitaufzeichnung($uid, $anz_tage=50)
{
unset($this->result);
$this->result=array();
$qry = "select datum::date, freigabevon, zeitsperretyp_kurzbz
from (SELECT generate_series(vondatum::timestamp, bisdatum::timestamp, '1 day') as datum, freigabevon, mitarbeiter_uid, zeitsperretyp_kurzbz FROM campus.tbl_zeitsperre where vonstunde is null and bisstunde is null) a
where a.mitarbeiter_uid = ".$this->db_add_param($uid)." and datum>(now() - interval '".$anz_tage." Days') and zeitsperretyp_kurzbz in (" . self::BLOCKIERENDE_ZEITSPERREN . ")";
if($this->db_query($qry))
{
while($row = $this->db_fetch_object())
{
if ($row->zeitsperretyp_kurzbz == 'Urlaub' && $row->freigabevon == NULL)
$result[$row->datum] = "Urlaubsantrag (Freigabe fehlt)";
else
$result[$row->datum] = $row->zeitsperretyp_kurzbz;
$this->result = $result;
}
return true;
}
else
{
$this->errormsg = 'Fehler beim Laden der Zeitsperren';
return false;
}
}
public function getVonDatum()
{
return $this->vondatum;
}
public function getBisDatum()
{
return $this->bisdatum;
}
/**
* Liefert die Zeitsperren eines Users innerhalb einer bestimmten Zeitspanne.
* Einschränkung nach Zeitsperrentyp möglich.
*
* @param $uid
* @param $von string Datum im Format YYYY-MM-DD
* @param $bis string Datum im Format YYYY-MM-DD
* @param null $zeitsperretyp_kurzbz
* @return bool
*/
public function getVonBis($uid, $von, $bis, $zeitsperretyp_kurzbz = null)
{
$qry = '
SELECT
zeitsperre_id, zeitsperretyp_kurzbz, vondatum, vonstunde, bisdatum, bisstunde
FROM
campus.tbl_zeitsperre
LEFT JOIN campus.tbl_zeitsperretyp USING (zeitsperretyp_kurzbz)
WHERE
mitarbeiter_uid = '. $this->db_add_param($uid). '
AND (
(vondatum BETWEEN '.$this->db_add_param($von).' AND '.$this->db_add_param($bis).')
OR
(bisdatum BETWEEN '.$this->db_add_param($von).' AND '.$this->db_add_param($bis).')
)';
if (!is_null($zeitsperretyp_kurzbz))
{
$qry.= '
AND zeitsperretyp_kurzbz = '. $this->db_add_param($zeitsperretyp_kurzbz);
}
if (!$this->db_query($qry))
{
$this->errormsg=$this->db_last_error();
return false;
}
else
{
while($row = $this->db_fetch_object())
{
$obj = new stdClass();
$obj->zeitsperre_id = $row->zeitsperre_id;
$obj->zeitsperretyp_kurzbz = $row->zeitsperretyp_kurzbz;
$obj->vondatum = $row->vondatum;
$obj->vonstunde = $row->vonstunde;
$obj->bisdatum = $row->bisdatum;
$obj->bisstunde = $row->bisstunde;
$this->result[]= $obj;
}
return true;
}
}
/**
* Laedt einen Zeitsperretyp.
*
* @param $zeitsperretyp_kurzbz
* @return Gibt Zeitsperretyp als Objekt zurück. True wenn ok, false im Fehlerfall.
*/
public function loadZeitsperretyp($zeitsperretyp_kurzbz)
{
if(!is_string($zeitsperretyp_kurzbz))
{
$this->errormsg = 'zeitsperretyp muß ein String sein';
return false;
}
$qry = "SELECT * FROM campus.tbl_zeitsperretyp WHERE zeitsperretyp_kurzbz = ". $this->db_add_param($zeitsperretyp_kurzbz);
if(!$this->db_query($qry))
{
$this->errormsg = 'Fehler beim Laden des Datensatzes';
return false;
}
if($row = $this->db_fetch_object())
{
$obj = new StdClass();
$obj->zeitsperretyp_kurzbz = $row->zeitsperretyp_kurzbz;
$obj->beschreibung = $row->beschreibung;
$obj->farbe = $row->farbe;
$this->result[]= $obj;
}
else
{
$this->errormsg = 'Zeitsperretyp konnte nicht geladen werden';
return false;
}
return true;
}
}
?>