diff --git a/cis/private/tools/zeitaufzeichnung.php b/cis/private/tools/zeitaufzeichnung.php index 0eb86bdb1..742ef7af3 100644 --- a/cis/private/tools/zeitaufzeichnung.php +++ b/cis/private/tools/zeitaufzeichnung.php @@ -46,6 +46,7 @@ require_once('../../../include/studiensemester.class.php'); require_once('../../../include/benutzerberechtigung.class.php'); require_once('../../../include/zeitaufzeichnung_import_csv.class.php'); require_once('../../../include/zeitaufzeichnung_import_post.class.php'); +require_once('../../../include/vertragsbestandteil.class.php'); $sprache = getSprache(); $p=new phrasen($sprache); @@ -303,7 +304,7 @@ echo ' Monat=Datum.substring(3,5); Jahr=Datum.substring(6,10); var day = Jahr + "-" + Monat + "-" + Tag; - checkBisverwendung(day,uid); + checkZeitaufzeichnung(day,uid); checkZeitsperre(day,uid); } ) @@ -762,14 +763,15 @@ echo ' Monat=Datum.substring(3,5); Jahr=Datum.substring(6,10); var checkedDay = Jahr + "-" + Monat + "-" + Tag; - checkBisverwendung(checkedDay, uid); + checkZeitaufzeichnung(checkedDay, uid); checkZeitsperre(checkedDay, uid); } - function checkBisverwendung(day, uid) + function checkZeitaufzeichnung(day, uid) { + /* Checkt nicht mehr Bisverwendung, sondern Vertragsbestandteil Zeitaufzeichnung */ $.ajax({ - url: "zeitaufzeichnung_bisverwendung.php", + url: "zeitaufzeichnung_bisverwendung.php", data: { day: day, uid: uid @@ -1395,23 +1397,15 @@ if ($projekt->getProjekteMitarbeiter($user, true)) echo ''; echo '
'; - if (defined('DEFAULT_ALLIN_DIENSTVERTRAG') && DEFAULT_ALLIN_DIENSTVERTRAG != '') + $vbt = new vertragsbestandteil(); + $isAllin = $vbt->isAllin($user); + + if ($isAllin) { - $bisver = new bisverwendung(); - $bisver->getLastVerwendung($user); - // $ba1code = $bisver->ba1code; - $ba1code = null; - - if (in_array($bisver->ba1code, DEFAULT_ALLIN_DIENSTVERTRAG)) - { - echo '

'; - } - else - echo '
'; + echo '
'; } - else - echo '
'; + echo '
'; @@ -1578,21 +1572,21 @@ if ($projekt->getProjekteMitarbeiter($user, true)) $linkInformation = APP_ROOT. 'skin/images/information.png'; $za = new zeitaufzeichnung(); - $verwendung = new bisverwendung(); + if ($za->checkPausenErrors($user, $tag)) { - $verwendung->getVerwendungDatum($user, $tag); - foreach ($verwendung->result as $v) + $vbt = new vertragsbestandteil(); + $isAzgrelevant = $vbt->isAzgRelevant($user, $tag); + + if ($isAzgrelevant) { - if ($v->azgrelevant) - { - $pausefehlt_str = ' -- Pause fehlt oder zu kurz -- '; - } - else - { - $pausefehlt_str = ' -- Pause fehlt --'; - } + $pausefehlt_str = ' -- Pause fehlt oder zu kurz -- '; } + else + { + $pausefehlt_str = ' -- Pause fehlt --'; + } + } $tagessaldo = date('H:i', ($tagessaldo)); diff --git a/cis/private/tools/zeitaufzeichnung_bisverwendung.php b/cis/private/tools/zeitaufzeichnung_bisverwendung.php index 2f430ecda..0229aa723 100644 --- a/cis/private/tools/zeitaufzeichnung_bisverwendung.php +++ b/cis/private/tools/zeitaufzeichnung_bisverwendung.php @@ -31,7 +31,7 @@ require_once('../../../include/benutzerberechtigung.class.php'); require_once('../../../include/mitarbeiter.class.php'); require_once('../../../include/zeitaufzeichnung.class.php'); require_once('../../../include/projekt.class.php'); -require_once('../../../include/bisverwendung.class.php'); +require_once('../../../include/vertragsbestandteil.class.php'); if ((isset($_GET['uid'])) && (isset($_GET['day']))) { @@ -57,18 +57,8 @@ if ((isset($_GET['uid'])) && (isset($_GET['day']))) $day = $_GET['day']; - $verwendung = new bisverwendung(); - - $verwendung->getVerwendungDatum($uid, $day); - $homeoffice = false; - - foreach ($verwendung->result as $v) - { - if ($v->homeoffice) - { - $homeoffice = true; - } - } + $vbt = new vertragsbestandteil(); + $homeoffice = $vbt->hasHomeoffice($uid, $day); echo json_encode($homeoffice); diff --git a/include/vertragsbestandteil.class.php b/include/vertragsbestandteil.class.php new file mode 100644 index 000000000..50b0b7b66 --- /dev/null +++ b/include/vertragsbestandteil.class.php @@ -0,0 +1,451 @@ +, + */ +/** + * Klasse Vertragsbestandteil + * @create 29.03.2023 + */ +require_once(dirname(__FILE__).'/basis_db.class.php'); + +class vertragsbestandteil extends basis_db +{ + public $new; // boolean + public $result = array(); + + //Tabellenspalten + public $vertragsbestandteil_id; // serial + public $dienstverhaeltnis_id; // integer + public $vertragsbestandteiltyp_kurzbz; // varchar(32) + public $von; // date + public $bis; // date + public $insertamum; // timestamp + public $insertvon; // varchar(32) + public $updateamum; // timestamp + public $updatevon; // varchar(32) + + /** + * Konstruktor + * @param $vertragsbestandteil_id ID des Vertragsbestandteils, der geladen werden soll (Default=null) + */ + public function __construct($vertragsbestandteil_id = null) + { + parent::__construct(); + + if($vertragsbestandteil_id != null) + $this->load($vertragsbestandteil_id); + } + + /** + * Laedt den Vertragsbestandteil mit der uebergebenen ID. + * @return true wenn ok, false im Fehlerfall + */ + public function load($vertragsbestandteil_id) + { + $qry = "SELECT * FROM hr.tbl_vertragsbestandteil WHERE vertragsbestandteil_id = ". $this->db_add_param($vertragsbestandteil_id, FHC_INTEGER); + + if (!$this->db_query($qry)) + { + $this->errormsg = 'Fehler bei einer Datenbankabfrage'; + return false; + } + + if($row = $this->db_fetch_object()) + { + $this->vertragsbestandteil_id = $row->vertragsbestandteil_id; + $this->dienstverhaeltnis_id = $row->dienstverhaeltnis_id; + $this->vertragsbestandteiltyp_kurzbz = $row->vertragsbestandteiltyp_kurzbz; + $this->von = $row->von; + $this->bis = $row->bis; + $this->insertvon = $row->insertvon; + $this->updateamum = $row->updateamum; + $this->updatevon = $row->updatevon; + } + else + { + $this->errormsg = 'Es ist kein Datensatz mit dieser ID vorhanden'; + return false; + } + + return true; + } + + /** + * Prueft ob MitarbeiterIn im Monat des uebergebenen $datums zeitaufzeichnungspflichtig ist. + * Wenn kein Datum übergeben wird, wird das heutige Datum gesetzt. + * + * @param $mitarbeiter_uid + * @param string $timestamp DD-MM-YYYY + * @return bool + */ + public function isZaPflichtig($mitarbeiter_uid, $datum = null) + { + + $timestamp = is_null($datum) ? 'NOW()' : '(date('. $this->db_add_param($datum).'))'; + + $qry = 'SELECT + vbt.vertragsbestandteil_id, vbt.dienstverhaeltnis_id, vbt.vertragsbestandteiltyp_kurzbz, + vbt.von, vbt.bis, vbt.insertamum, vbt.insertvon, vbt.updateamum, vbt.updatevon, + vbtza.zeitaufzeichnung, vbtza.azgrelevant, vbtza.homeoffice + FROM hr.tbl_vertragsbestandteil_zeitaufzeichnung vbtza + JOIN hr.tbl_vertragsbestandteil vbt USING (vertragsbestandteil_id) + JOIN hr.tbl_dienstverhaeltnis dv USING (dienstverhaeltnis_id) + -- Dienstverhältnis(se) des Mitarbeiters + WHERE dv.mitarbeiter_uid = '. $this->db_add_param($mitarbeiter_uid). ' + -- Zeitaufzeichnungspflichtig... + AND zeitaufzeichnung = TRUE + -- ...im aktuellen Monat (default) oder im Monat des übergebenen $datums + AND ((date_trunc(\'month\', '. $timestamp. ')::date < vbt.bis AND (date_trunc(\'month\', '. $timestamp. ') + interval \'1 month - 1 day\')::date > vbt.von) OR (vbt.bis IS NULL AND (date_trunc(\'month\', '. $timestamp. ') + interval \'1 month - 1 day\')::date > vbt.von)) + -- Vorerst nur check, ob zumindest eine aufrechte Zeitaufzeichnungspflicht. Später Unterscheidung nach Dienstverhältnis. + --ORDER BY vbt.von DESC --aktuellster + LIMIT 1'; + + if ($result = $this->db_query($qry)) + { + if ($this->db_num_rows($result) > 0) + { + $this->result = array(); + + while ($row = $this->db_fetch_object()) + { + $obj = new stdClass(); + + $obj->vertragsbestandteil_id = $row->vertragsbestandteil_id; + $obj->dienstverhaeltnis_id = $row->dienstverhaeltnis_id; + $obj->vertragsbestandteiltyp_kurzbz = $row->vertragsbestandteiltyp_kurzbz; + $obj->von = $row->von; + $obj->bis = $row->bis; + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + $obj->updateamum = $row->updateamum; + $obj->updatevon = $row->updatevon; + $obj->zeitaufzeichnung = $row->zeitaufzeichnung; + $obj->azgrelevant = $row->azgrelevant; + $obj->homeoffice = $row->homeoffice; + + $this->result[] = $obj; + } + return true; + } + else + { + return false; + } + } + else + { + $this->errormsg = "Fehler bei der Abfrage aufgetreten"; + return false; + } + + } + + /** + * Holt alle Vertragsbestandteile, die eine Zeitaufzeichnungspflicht haben. + * + * Set order DESC limit 1 to retrieve only most recent Vertragsbestandteil. + * Set order ASC limit 1 to retrieve only first Vertragsbestandteil. + * + * @param $mitarbeiter_uid + * @param string $order + * @param null $limit + * @return bool + */ + public function getZaPflichtig($mitarbeiter_uid, $order = 'DESC', $limit = null) + { + if ($order !== 'ASC' && $order !== 'DESC') + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + + $qry = 'SELECT + vbt.vertragsbestandteil_id, vbt.dienstverhaeltnis_id, vbt.vertragsbestandteiltyp_kurzbz, + vbt.von, vbt.bis, vbt.insertamum, vbt.insertvon, vbt.updateamum, vbt.updatevon, + vbtza.zeitaufzeichnung, vbtza.azgrelevant, vbtza.homeoffice + FROM hr.tbl_vertragsbestandteil_zeitaufzeichnung vbtza + JOIN hr.tbl_vertragsbestandteil vbt USING (vertragsbestandteil_id) + JOIN hr.tbl_dienstverhaeltnis dv USING (dienstverhaeltnis_id) + -- Dienstverhältnis(se) des Mitarbeiters + WHERE dv.mitarbeiter_uid = '. $this->db_add_param($mitarbeiter_uid). ' + -- Zeitaufzeichnungspflichtig + AND zeitaufzeichnung = TRUE + -- Vertragsbestandteile sind aktuell, liegen nach dem GoLive und starten vor dem aktuellen Monatsletzten + AND( + (COALESCE(vbt.bis, NOW()::date) > '. $this->db_add_param(CASETIME_TIMESHEET_GOLIVE). '::date) AND + (vbt.von < (date_trunc(\'month\', NOW()) + interval \'1 month - 1 day\')::date) + ) + ORDER BY vbt.von ' . $order; + + + if (!is_null($limit)) + { + $qry .= ' LIMIT ' . $this->db_add_param($limit, FHC_INTEGER); + } + + if ($result = $this->db_query($qry)) + { + if ($this->db_num_rows($result) > 0) + { + $this->result = array(); + + while ($row = $this->db_fetch_object()) + { + $obj = new stdClass(); + + $obj->vertragsbestandteil_id = $row->vertragsbestandteil_id; + $obj->dienstverhaeltnis_id = $row->dienstverhaeltnis_id; + $obj->vertragsbestandteiltyp_kurzbz = $row->vertragsbestandteiltyp_kurzbz; + $obj->von = $row->von; + $obj->bis = $row->bis; + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + $obj->updateamum = $row->updateamum; + $obj->updatevon = $row->updatevon; + $obj->zeitaufzeichnung = $row->zeitaufzeichnung; + $obj->azgrelevant = $row->azgrelevant; + $obj->homeoffice = $row->homeoffice; + + $this->result[] = $obj; + } + return true; + } + else + { + return false; + } + } + else + { + $this->errormsg = "Fehler bei der Abfrage aufgetreten"; + return false; + } + + } + + /** + * Prueft ob MitarbeiterIn im Monat des uebergebenen $datums AZG-relevant ist. + * Wenn kein Datum übergeben wird, wird das heutige Datum gesetzt. + * + * @param $mitarbeiter_uid + * @param string $timestamp DD-MM-YYYY + * @return bool + */ + public function isAzgRelevant($mitarbeiter_uid, $datum = null) + { + + $timestamp = is_null($datum) ? 'NOW()' : '(date('. $this->db_add_param($datum).'))'; + + $qry = 'SELECT + vbt.vertragsbestandteil_id, vbt.dienstverhaeltnis_id, vbt.vertragsbestandteiltyp_kurzbz, + vbt.von, vbt.bis, vbt.insertamum, vbt.insertvon, vbt.updateamum, vbt.updatevon, + vbtza.zeitaufzeichnung, vbtza.azgrelevant, vbtza.homeoffice + FROM hr.tbl_vertragsbestandteil_zeitaufzeichnung vbtza + JOIN hr.tbl_vertragsbestandteil vbt USING (vertragsbestandteil_id) + JOIN hr.tbl_dienstverhaeltnis dv USING (dienstverhaeltnis_id) + -- Dienstverhältnis(se) des Mitarbeiters + WHERE dv.mitarbeiter_uid = '. $this->db_add_param($mitarbeiter_uid). ' + -- AZG-relevant... + AND azgrelevant = TRUE + -- ...im aktuellen Monat (default) oder im Monat des übergebenen $datums + AND ((date_trunc(\'month\', '. $timestamp. ')::date < vbt.bis AND (date_trunc(\'month\', '. $timestamp. ') + interval \'1 month - 1 day\')::date > vbt.von) OR (vbt.bis IS NULL AND (date_trunc(\'month\', '. $timestamp. ') + interval \'1 month - 1 day\')::date > vbt.von)) + -- Vorerst nur check, ob zumindest eine aufrechte Zeitaufzeichnungspflicht. Später Unterscheidung nach Dienstverhältnis. + --ORDER BY vbt.von DESC --aktuellster + LIMIT 1'; + + if ($result = $this->db_query($qry)) + { + if ($this->db_num_rows($result) > 0) + { + $this->result = array(); + + while ($row = $this->db_fetch_object()) + { + $obj = new stdClass(); + + $obj->vertragsbestandteil_id = $row->vertragsbestandteil_id; + $obj->dienstverhaeltnis_id = $row->dienstverhaeltnis_id; + $obj->vertragsbestandteiltyp_kurzbz = $row->vertragsbestandteiltyp_kurzbz; + $obj->von = $row->von; + $obj->bis = $row->bis; + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + $obj->updateamum = $row->updateamum; + $obj->updatevon = $row->updatevon; + $obj->zeitaufzeichnung = $row->zeitaufzeichnung; + $obj->azgrelevant = $row->azgrelevant; + $obj->homeoffice = $row->homeoffice; + + $this->result[] = $obj; + } + return true; + } + else + { + return false; + } + } + else + { + $this->errormsg = "Fehler bei der Abfrage aufgetreten"; + return false; + } + + } + + /** + * Prueft ob MitarbeiterIn im Monat des uebergebenen $datums AZG-relevant ist. + * Wenn kein Datum übergeben wird, wird das heutige Datum gesetzt. + * + * @param $mitarbeiter_uid + * @param string $timestamp DD-MM-YYYY + * @return bool + */ + public function hasHomeoffice($mitarbeiter_uid, $datum = null) + { + + $timestamp = is_null($datum) ? 'NOW()' : '(date('. $this->db_add_param($datum).'))'; + + $qry = 'SELECT + vbt.vertragsbestandteil_id, vbt.dienstverhaeltnis_id, vbt.vertragsbestandteiltyp_kurzbz, + vbt.von, vbt.bis, vbt.insertamum, vbt.insertvon, vbt.updateamum, vbt.updatevon, + vbtza.zeitaufzeichnung, vbtza.azgrelevant, vbtza.homeoffice + FROM hr.tbl_vertragsbestandteil_zeitaufzeichnung vbtza + JOIN hr.tbl_vertragsbestandteil vbt USING (vertragsbestandteil_id) + JOIN hr.tbl_dienstverhaeltnis dv USING (dienstverhaeltnis_id) + -- Dienstverhältnis(se) des Mitarbeiters + WHERE dv.mitarbeiter_uid = '. $this->db_add_param($mitarbeiter_uid). ' + -- Homeoffice... + AND homeoffice = TRUE + -- ...im aktuellen Monat (default) oder im Monat des übergebenen $datums + AND ((date_trunc(\'month\', '. $timestamp. ')::date < vbt.bis AND (date_trunc(\'month\', '. $timestamp. ') + interval \'1 month - 1 day\')::date > vbt.von) OR (vbt.bis IS NULL AND (date_trunc(\'month\', '. $timestamp. ') + interval \'1 month - 1 day\')::date > vbt.von)) + -- Vorerst nur check, ob zumindest eine aufrechte Zeitaufzeichnungspflicht. Später Unterscheidung nach Dienstverhältnis. + --ORDER BY vbt.von DESC --aktuellster + LIMIT 1'; + + if ($result = $this->db_query($qry)) + { + if ($this->db_num_rows($result) > 0) + { + $this->result = array(); + + while ($row = $this->db_fetch_object()) + { + $obj = new stdClass(); + + $obj->vertragsbestandteil_id = $row->vertragsbestandteil_id; + $obj->dienstverhaeltnis_id = $row->dienstverhaeltnis_id; + $obj->vertragsbestandteiltyp_kurzbz = $row->vertragsbestandteiltyp_kurzbz; + $obj->von = $row->von; + $obj->bis = $row->bis; + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + $obj->updateamum = $row->updateamum; + $obj->updatevon = $row->updatevon; + $obj->zeitaufzeichnung = $row->zeitaufzeichnung; + $obj->azgrelevant = $row->azgrelevant; + $obj->homeoffice = $row->homeoffice; + + $this->result[] = $obj; + } + return true; + } + else + { + return false; + } + } + else + { + $this->errormsg = "Fehler bei der Abfrage aufgetreten"; + return false; + } + + } + + /** + * Prueft ob MitarbeiterIn im Monat des uebergebenen $datums einen Allin Vertragsbestandteil hat. + * Wenn kein Datum übergeben wird, wird das heutige Datum gesetzt. + * + * @param $mitarbeiter_uid + * @param string $datum + * @return bool + */ + public function isAllin($mitarbeiter_uid, $datum = null) + { + $timestamp = is_null($datum) ? 'NOW()' : '(date('. $this->db_add_param($datum).'))'; + + $qry = 'SELECT + vbt.vertragsbestandteil_id, vbt.dienstverhaeltnis_id, vbt.vertragsbestandteiltyp_kurzbz, + vbt.von, vbt.bis, vbt.insertamum, vbt.insertvon, vbt.updateamum, vbt.updatevon, + vbtft.freitexttyp_kurzbz, vbtftt.bezeichnung, vbtft.titel, vbtft.anmerkung + FROM hr.tbl_vertragsbestandteil_freitext vbtft + JOIN hr.tbl_vertragsbestandteil vbt USING (vertragsbestandteil_id) + JOIN hr.tbl_dienstverhaeltnis dv USING (dienstverhaeltnis_id) + JOIN hr.tbl_vertragsbestandteil_freitexttyp vbtftt USING (freitexttyp_kurzbz) + -- Dienstverhältnis(se) des Mitarbeiters + WHERE dv.mitarbeiter_uid = '. $this->db_add_param($mitarbeiter_uid). ' + -- All-In + AND freitexttyp_kurzbz = \'allin\' + -- Vertragsbestandteil Freitext ist im Monat des übergebenen $datums + AND ((date_trunc(\'month\', '. $timestamp. ')::date < vbt.bis AND (date_trunc(\'month\', '. $timestamp. ') + interval \'1 month - 1 day\')::date > vbt.von) OR (vbt.bis IS NULL AND (date_trunc(\'month\', '. $timestamp. ') + interval \'1 month - 1 day\')::date > vbt.von)) + -- Vorerst nur check, ob zumindest ein aufrechter Allin Vertragsbestandteil. Später Unterscheidung nach Dienstverhältnis. + --ORDER BY vbt.von DESC -- aktuellster + LIMIT 1'; + + if ($result = $this->db_query($qry)) + { + if ($this->db_num_rows($result) > 0) + { + $this->result = array(); + + while ($row = $this->db_fetch_object()) + { + $obj = new stdClass(); + + $obj->vertragsbestandteil_id = $row->vertragsbestandteil_id; + $obj->dienstverhaeltnis_id = $row->dienstverhaeltnis_id; + $obj->vertragsbestandteiltyp_kurzbz = $row->vertragsbestandteiltyp_kurzbz; + $obj->von = $row->von; + $obj->bis = $row->bis; + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + $obj->updateamum = $row->updateamum; + $obj->updatevon = $row->updatevon; + $obj->freitexttyp_kurzbz = $row->freitexttyp_kurzbz; + $obj->bezeichnung = $row->bezeichnung; + $obj->titel = $row->titel; + $obj->anmerkung = $row->anmerkung; + + $this->result[] = $obj; + } + return true; + } + else + { + return false; + } + } + else + { + $this->errormsg = "Fehler bei der Abfrage aufgetreten"; + return false; + } + } +} +?> diff --git a/include/zeitaufzeichnung_import_csv.class.php b/include/zeitaufzeichnung_import_csv.class.php index 8a8e8bb2f..71f3ab75f 100644 --- a/include/zeitaufzeichnung_import_csv.class.php +++ b/include/zeitaufzeichnung_import_csv.class.php @@ -1,6 +1,7 @@ datum->formatDatum($data[self::STARTDT], 'Y-m-d'); - $verwendung = new bisverwendung(); - $verwendung->getVerwendungDatum($data[self::USER], $vonCSV); - foreach ($verwendung->result as $v) { - if ($v->homeoffice) { - $this->zeit->homeoffice = true; - } else { - $this->addWarning($this->p->t("zeitaufzeichnung/homeofficeNichtErlaubt", [$vonCSV])); - $this->zeit->homeoffice = false; - } - } + $vbt = new vertragsbestandteil(); + $homeoffice = $vbt->hasHomeoffice($data[self::USER], $vonCSV); + + if ($homeoffice) { + $this->zeit->homeoffice = true; + } else { + $this->addWarning($this->p->t("zeitaufzeichnung/homeofficeNichtErlaubt", [$vonCSV])); + $this->zeit->homeoffice = false; + } } } }