From 1b70d70edda07bb02ae233d8e5746e5684bdd7dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Tue, 6 Feb 2024 12:40:11 +0100 Subject: [PATCH] - Pruefung hinzugefuegt ob eine Person Vorgesetzte oder indirekt Vorgesetzte einer anderen Person ist - Bei mehreren OEZuordnungen wird bevorzugt die nicht karenzierte ermittelt --- include/mitarbeiter.class.php | 159 +++++++++++++++++++++++++++++++++- 1 file changed, 156 insertions(+), 3 deletions(-) diff --git a/include/mitarbeiter.class.php b/include/mitarbeiter.class.php index 88ba217b8..bb2a7b478 100644 --- a/include/mitarbeiter.class.php +++ b/include/mitarbeiter.class.php @@ -1086,12 +1086,33 @@ class mitarbeiter extends benutzer funktion_kurzbz='Leitung' AND (datum_von is null OR datum_von<=now()) AND (datum_bis is null OR datum_bis>=now()) AND - oe_kurzbz in (SELECT oe_kurzbz - FROM public.tbl_benutzerfunktion - WHERE + oe_kurzbz in ( + SELECT + oe_kurzbz + FROM + public.tbl_benutzerfunktion + WHERE funktion_kurzbz='oezuordnung' AND uid=".$this->db_add_param($uid)." AND (datum_von is null OR datum_von<=now()) AND (datum_bis is null OR datum_bis>=now()) + ORDER BY + ( + SELECT + 1 + FROM + hr.tbl_vertragsbestandteil_funktion + JOIN hr.tbl_vertragsbestandteil vbsfkt USING(vertragsbestandteil_id) + JOIN hr.tbl_vertragsbestandteil vbskarenz USING(dienstverhaeltnis_id) + WHERE + tbl_vertragsbestandteil_funktion.benutzerfunktion_id=tbl_benutzerfunktion.benutzerfunktion_id + AND vbskarenz.vertragsbestandteiltyp_kurzbz='karenz' + AND + ( + now()::date BETWEEN COALESCE(vbskarenz.von, '1970-01-01') AND COALESCE(vbskarenz.bis, '2170-12-31') + OR + now()::date BETWEEN COALESCE(vbskarenz.von, '1970-01-01') AND COALESCE(vbskarenz.bis, '2170-12-31') + ) + ) NULLS FIRST LIMIT 1 ) ORDER BY datum_von DESC "; @@ -1120,6 +1141,138 @@ class mitarbeiter extends benutzer return $return; } + /** + * Prueft ob eine Person im angegebenen Zeitraum Vorgesetzter von einem Mitarbeiter ist + * @param $leiter UID der zu pruefenden Leitungsposition + * @param $mitarbeiter UID der zu pruefenden Leitungsposition + * @param $datumvon Von Datum des zu pruefenden Zeitraums + * @param $datumbis BIS Datum des zu pruefenden Zeitraums + */ + public function isVorgesetzterByDate($leiter, $mitarbeiter, $datumvon, $datumbis) + { + // Alle OEs der zu pruefenden Leitungsposition holen (oes_leitung) + // Alle OEs des zu pruefenden Mitarbeiters holen (oes_mitarbeiter) + // OE-Ueberschneidungen pruefen + + $qry = " + WITH RECURSIVE + oes_leitung (oe_kurzbz, oe_parent_kurzbz, level) AS + ( + SELECT + oe_kurzbz, + oe_parent_kurzbz, + 1 as level + FROM + public.tbl_organisationseinheit + WHERE + oe_kurzbz IN ( + + -- Leitung im Zeitraum X + SELECT oe_kurzbz FROM public.tbl_benutzerfunktion + WHERE + funktion_kurzbz='Leitung' + AND uid=".$this->db_add_param($leiter)." + AND + ( + ".$this->db_add_param($datumvon)." BETWEEN COALESCE(tbl_benutzerfunktion.datum_von, '1970-01-01') AND COALESCE(tbl_benutzerfunktion.datum_bis, '2170-12-31') + OR + ".$this->db_add_param($datumbis)." BETWEEN COALESCE(tbl_benutzerfunktion.datum_von, '1970-01-01') AND COALESCE(tbl_benutzerfunktion.datum_bis, '2170-12-31') + ) + + ) + + UNION ALL + + SELECT + o.oe_kurzbz, + o.oe_parent_kurzbz, + oes_leitung.level + 1 as level + FROM + public.tbl_organisationseinheit o, oes_leitung + WHERE + o.oe_parent_kurzbz = oes_leitung.oe_kurzbz + ), + oes_mitarbeiter (oe_kurzbz, oe_parent_kurzbz, level) AS + ( + SELECT + oe_kurzbz, + oe_parent_kurzbz, + 1 as level + FROM + public.tbl_organisationseinheit + WHERE + oe_kurzbz IN ( + + -- OEZuordnung im Zeitraum X - bevorzugt nicht karenziert + SELECT oe_kurzbz FROM public.tbl_benutzerfunktion + WHERE + funktion_kurzbz='oezuordnung' + AND uid=".$this->db_add_param($mitarbeiter)." + AND ( + ".$this->db_add_param($datumvon)." BETWEEN COALESCE(tbl_benutzerfunktion.datum_von, '1970-01-01') AND COALESCE(tbl_benutzerfunktion.datum_bis, '2170-12-31') + OR + ".$this->db_add_param($datumbis)." BETWEEN COALESCE(tbl_benutzerfunktion.datum_von, '1970-01-01') AND COALESCE(tbl_benutzerfunktion.datum_bis, '2170-12-31') + ) + ORDER BY + ( + SELECT + 1 + FROM + hr.tbl_vertragsbestandteil_funktion + JOIN hr.tbl_vertragsbestandteil vbsfkt USING(vertragsbestandteil_id) + JOIN hr.tbl_vertragsbestandteil vbskarenz USING(dienstverhaeltnis_id) + WHERE + tbl_vertragsbestandteil_funktion.benutzerfunktion_id=tbl_benutzerfunktion.benutzerfunktion_id + AND vbskarenz.vertragsbestandteiltyp_kurzbz='karenz' + AND + ( + ".$this->db_add_param($datumvon)." BETWEEN COALESCE(vbskarenz.von, '1970-01-01') AND COALESCE(vbskarenz.bis, '2170-12-31') + OR + ".$this->db_add_param($datumbis)." BETWEEN COALESCE(vbskarenz.von, '1970-01-01') AND COALESCE(vbskarenz.bis, '2170-12-31') + ) + ) NULLS FIRST LIMIT 1 + + ) + + UNION ALL + + SELECT + o.oe_kurzbz, + o.oe_parent_kurzbz, + oes_mitarbeiter.level + 1 as level + FROM + public.tbl_organisationseinheit o, oes_mitarbeiter + WHERE + o.oe_kurzbz = oes_mitarbeiter.oe_parent_kurzbz + ) + SELECT + oe_kurzbz, level + FROM + oes_leitung + WHERE + oe_kurzbz in (SELECT oe_kurzbz FROM oes_mitarbeiter) + ORDER BY + oe_kurzbz, level + "; + + 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; + } + } + /** * Gibt ein Array mit den UIDs der Vorgesetzten zum Zeitpunkt des korrespondierenden Timesheets zurück * @param $uid