diff --git a/application/controllers/system/MigrateHourlyRate.php b/application/controllers/system/MigrateHourlyRate.php new file mode 100644 index 000000000..4fed2f585 --- /dev/null +++ b/application/controllers/system/MigrateHourlyRate.php @@ -0,0 +1,188 @@ +_ci = & get_instance(); + + $this->load->model('codex/Bisverwendung_model', 'BisVerwendungModel'); + $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + $this->load->model('ressource/Stundensatz_model', 'StundensatzModel'); + } + + public function index($user = null) + { + $mitarbeiterResult = $this->_getMitarbeiterStunden($user); + if (isError($mitarbeiterResult)) return $mitarbeiterResult; + if (!hasData($mitarbeiterResult)) return error('Keine Mitarbeiterstunden gefunden'); + + $mitarbeiterArray = getData($mitarbeiterResult); + + foreach ($mitarbeiterArray as $mitarbeiter) + { + $this->_getUnternehmen($mitarbeiter); + $insertResult = $this->_addStundensatz($mitarbeiter, self::STUNDENSTAZTYP_LEHRE, self::DEFAULT_DATE); + if (isError($insertResult)) return $insertResult; + } + + $sapResult = $this->_getSapStunden($user); + if (isError($sapResult)) return $sapResult; + if (!hasData($sapResult)) return error('Keinen kalkulatorischen Stundensaetze gefunden'); + + $mitarbeiterArray = getData($sapResult); + + foreach ($mitarbeiterArray as $mitarbeiter) + { + $this->_getUnternehmen($mitarbeiter); + $insertResult = $this->_addStundensatz($mitarbeiter, self::STUNDENSTAZTYP_KALKULATORISCH, date_format(date_create($mitarbeiter->beginn), 'Y-m-d')); + if (isError($insertResult)) return $insertResult; + } + } + + private function _getSapStunden($user = null) + { + $dbModel = new DB_Model(); + $params = array(); + + $qry = "SELECT ss.mitarbeiter_uid as uid, + ss.sap_kalkulatorischer_stundensatz as stundensatz, + ss.insertamum as beginn + FROM sync.tbl_sap_stundensatz ss + WHERE ss.sap_kalkulatorischer_stundensatz IS NOT NULL"; + + if (!is_null($user)) + { + $qry .= " AND ss.mitarbeiter_uid = ? "; + $params[] = $user; + } + $qry .= " ORDER BY ss.mitarbeiter_uid"; + + return $dbModel->execReadOnlyQuery($qry, $params); + } + + private function _getMitarbeiterStunden($user = null) + { + $dbModel = new DB_Model(); + $params = array(); + + $qry = "SELECT mitarbeiter.mitarbeiter_uid as uid, + stundensatz + FROM public.tbl_mitarbeiter mitarbeiter + WHERE mitarbeiter.stundensatz != 0.00 + AND mitarbeiter.stundensatz IS NOT NULL"; + + if (!is_null($user)) + { + $qry .= " AND mitarbeiter.mitarbeiter_uid = ?"; + $params[] = $user; + } + + $qry .= " ORDER BY mitarbeiter.mitarbeiter_uid"; + + return $dbModel->execReadOnlyQuery($qry, $params); + } + + private function _addStundensatz($mitarbeiter, $stundensatztyp, $gueltig_von) + { + return $this->_ci->StundensatzModel->insert( + array( + 'uid' => $mitarbeiter->uid, + 'stundensatztyp' => $stundensatztyp, + 'stundensatz' => $mitarbeiter->stundensatz, + 'oe_kurzbz' => $mitarbeiter->unternehmen, + 'gueltig_von' => $gueltig_von, + 'insertamum' => date('Y-m-d H:i:s'), + 'insertvon' => 'MigrateHours' + ) + ); + } + + private function _getUnternehmen(&$mitarbeiter) + { + $bvResult = $this->_ci->BisVerwendungModel->getLast($mitarbeiter->uid); + + $beginn = null; + if (hasData($bvResult)) + { + $beginn = getData($bvResult)[0]->beginn; + } + + $unternehmenResult = $this->_findUnternehmen($mitarbeiter->uid, "'kstzuordnung', 'oezuordnung'", $beginn); + + if(!hasData($unternehmenResult)) //&& hasData($bvResult) + { + $unternehmenResult = $this->_findUnternehmen($mitarbeiter->uid, "'kstzuordnung', 'oezuordnung'"); + } + + $unternehmen = self::DEFAULT_OE; + + if (hasData($unternehmenResult)) + $unternehmen = getData($unternehmenResult)[0]->oe_kurzbz; + + $mitarbeiter->unternehmen = $unternehmen; + } + + /** + * Detailsuche fuer die Ermittlung des Unternehmenszuordnung einer Person + */ + private function _findUnternehmen($uid, $fkt=null, $datum=null) + { + $dbModel = new DB_Model(); + + $qry = " + WITH RECURSIVE meine_oes(oe_kurzbz, oe_parent_kurzbz, organisationseinheittyp_kurzbz) as + ( + SELECT + oe_kurzbz, oe_parent_kurzbz, organisationseinheittyp_kurzbz + FROM + public.tbl_organisationseinheit + WHERE + oe_kurzbz=(SELECT + oe_kurzbz + FROM + public.tbl_benutzerfunktion + WHERE + uid=".$dbModel->escape($uid); + + if(!is_null($datum)) + $qry.=" AND ".$dbModel->escape($datum)." BETWEEN datum_von AND COALESCE(datum_bis, '2999-12-31')"; + + if(!is_null($fkt)) + $qry.=" AND funktion_kurzbz in ($fkt)"; + + $qry.=" + ORDER BY funktion_kurzbz, datum_von LIMIT 1) + UNION ALL + SELECT + o.oe_kurzbz, o.oe_parent_kurzbz, o.organisationseinheittyp_kurzbz + FROM + public.tbl_organisationseinheit o, meine_oes + WHERE + o.oe_kurzbz=meine_oes.oe_parent_kurzbz + ) + SELECT + oe_kurzbz + FROM + meine_oes + WHERE + oe_parent_kurzbz is null + LIMIT 1 + "; + + return $dbModel->execReadOnlyQuery($qry); + } + +} diff --git a/application/models/ressource/Stundensatz_model.php b/application/models/ressource/Stundensatz_model.php new file mode 100644 index 000000000..c397d8573 --- /dev/null +++ b/application/models/ressource/Stundensatz_model.php @@ -0,0 +1,17 @@ +dbTable = 'hr.tbl_stundensatz'; + $this->pk = 'stundensatz_id'; + $this->hasSequence = true; + } + +} \ No newline at end of file diff --git a/application/models/ressource/Stundensatztyp_model.php b/application/models/ressource/Stundensatztyp_model.php new file mode 100644 index 000000000..8dfd54c7d --- /dev/null +++ b/application/models/ressource/Stundensatztyp_model.php @@ -0,0 +1,16 @@ +dbTable = 'hr.tbl_stundensatztyp'; + $this->pk = 'stundensatztyp'; + } + +} \ No newline at end of file diff --git a/content/dragboard.js.php b/content/dragboard.js.php index 6510cfc47..9f720c57a 100644 --- a/content/dragboard.js.php +++ b/content/dragboard.js.php @@ -385,6 +385,7 @@ var LeLektorDDObserver= req.add('lehreinheit_id', lehreinheit_id); req.add('mitarbeiter_uid', uid); + req.add('studiensemester_kurzbz', getStudiensemester()); var response = req.executePOST(); diff --git a/content/lvplanung/lehrveranstaltungDBDML.php b/content/lvplanung/lehrveranstaltungDBDML.php index da64a6619..12a28b943 100644 --- a/content/lvplanung/lehrveranstaltungDBDML.php +++ b/content/lvplanung/lehrveranstaltungDBDML.php @@ -54,6 +54,7 @@ require_once('../../include/datum.class.php'); require_once('../../include/vertrag.class.php'); require_once('../../include/benutzergruppe.class.php'); require_once('../../include/bisverwendung.class.php'); +require_once('../../include/stundensatz.class.php'); $user = get_uid(); $db = new basis_db(); @@ -543,51 +544,61 @@ if(!$error) $lem->new=true; $fixangestellt=false; - //Stundensatz aus tbl_mitarbeiter holen - $mitarbeiter = new mitarbeiter(); - if ($mitarbeiter->load($_POST['mitarbeiter_uid'])) + //"lehre" Stundensatz aus hr.tbl_stundensatz holen + + $studiensemester = new studiensemester(); + if (!$studiensemester->load($_POST['studiensemester_kurzbz'])) { - $fixangestellt = $mitarbeiter->fixangestellt; - $lem->stundensatz = $mitarbeiter->stundensatz; + $return = false; + $error = true; + $errormsg = 'Fehler beim Laden des Studiensemesters'; + } - if (defined('FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ') - && !FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ) + if (!$error) + { + $mitarbeiter = new mitarbeiter(); + if ($mitarbeiter->load($_POST['mitarbeiter_uid'])) { - $stsem = new studiensemester(); - $stsem->load($semester_aktuell); - $bisverwendung = new bisverwendung(); - $data = $mitarbeiter->stundensatz; - if(!$bisverwendung->getVerwendungRange($mitarbeiter->uid, $stsem->start, $stsem->ende)) + $fixangestellt = $mitarbeiter->fixangestellt; + + $stundensatz = new stundensatz(); + $stundensatz->getStundensatzDatum($mitarbeiter->uid, $studiensemester->start, $studiensemester->ende, 'lehre'); + $lem->stundensatz = $stundensatz->stundensatz; + + if (defined('FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ') + && !FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ) { - $bisverwendung->getLastAktVerwendung($mitarbeiter->uid); - $bisverwendung->result[] = $bisverwendung; - } - - foreach($bisverwendung->result as $row_verwendung) - { - // Bei echten Dienstvertraegen mit voller inkludierter Lehre wird kein Stundensatz - // geliefert da dies im Vertrag inkludiert ist. - - if ((in_array($row_verwendung->ba1code, $arrEchterDV)) && $row_verwendung->inkludierte_lehre == -1) + $stsem = new studiensemester(); + $stsem->load($semester_aktuell); + $bisverwendung = new bisverwendung(); + + if(!$bisverwendung->getVerwendungRange($mitarbeiter->uid, $stsem->start, $stsem->ende)) { - $fixangestellt = true; - $lem->stundensatz = ''; - - break; + $bisverwendung->getLastAktVerwendung($mitarbeiter->uid); + $bisverwendung->result[] = $bisverwendung; + } + + foreach($bisverwendung->result as $row_verwendung) + { + // Bei echten Dienstvertraegen mit voller inkludierter Lehre wird kein Stundensatz + // geliefert da dies im Vertrag inkludiert ist. + + if ((in_array($row_verwendung->ba1code, $arrEchterDV)) && $row_verwendung->inkludierte_lehre == -1) + { + $fixangestellt = true; + $lem->stundensatz = ''; + break; + } } } } else { - $lem->stundensatz = $mitarbeiter->stundensatz; + $error=true; + $return=false; + $errormsg='Mitarbeiter '.$db->convert_html_chars($_POST['mitarbeiter_uid']).' wurde nicht gefunden'; } } - else - { - $error=true; - $return=false; - $errormsg='Mitarbeiter '.$db->convert_html_chars($_POST['mitarbeiter_uid']).' wurde nicht gefunden'; - } $maxstunden=9999; @@ -1556,49 +1567,61 @@ if(!$error) } elseif(isset($_POST['type']) && $_POST['type']=='getstundensatz') { - if(isset($_POST['mitarbeiter_uid'])) + if(isset($_POST['mitarbeiter_uid']) && isset($_POST['studiensemester_kurzbz'])) { - $mitarbeiter = new mitarbeiter(); - if($mitarbeiter->load($_POST['mitarbeiter_uid'])) + $studiensemester = new studiensemester(); + if (!$studiensemester->load($_POST['studiensemester_kurzbz'])) { - if (defined('FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ') - && !FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ) + $return = false; + $error = true; + $errormsg = 'Fehler beim Laden des Studiensemesters'; + } + + if (!$error) + { + $mitarbeiter = new mitarbeiter(); + if($mitarbeiter->load($_POST['mitarbeiter_uid'])) { - $stsem = new studiensemester(); - $stsem->load($semester_aktuell); - $bisverwendung = new bisverwendung(); - $data = $mitarbeiter->stundensatz; - if(!$bisverwendung->getVerwendungRange($mitarbeiter->uid, $stsem->start, $stsem->ende)) + $stundensatz = new stundensatz(); + $stundensatz->getStundensatzDatum($mitarbeiter->uid, $studiensemester->start, $studiensemester->ende, 'lehre'); + $data = $stundensatz->stundensatz; + + if (defined('FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ') + && !FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ) { - $bisverwendung->getLastAktVerwendung($mitarbeiter->uid); - $bisverwendung->result[] = $bisverwendung; - } - - foreach($bisverwendung->result as $row_verwendung) - { - - // Bei echten Dienstvertraegen mit voller inkludierter Lehre wird kein Stundensatz - // geliefert da dies im Vertrag inkludiert ist. - if ((in_array($row_verwendung->ba1code, $arrEchterDV)) && $row_verwendung->inkludierte_lehre == -1) + $stsem = new studiensemester(); + $stsem->load($semester_aktuell); + $bisverwendung = new bisverwendung(); + if(!$bisverwendung->getVerwendungRange($mitarbeiter->uid, $stsem->start, $stsem->ende)) { - $data = ''; - break; + $bisverwendung->getLastAktVerwendung($mitarbeiter->uid); + $bisverwendung->result[] = $bisverwendung; + } + + foreach($bisverwendung->result as $row_verwendung) + { + + // Bei echten Dienstvertraegen mit voller inkludierter Lehre wird kein Stundensatz + // geliefert da dies im Vertrag inkludiert ist. + if ((in_array($row_verwendung->ba1code, $arrEchterDV)) && $row_verwendung->inkludierte_lehre == -1) + { + $data = ''; + break; + } } } + $return = true; } else - $data = $mitarbeiter->stundensatz; - $return = true; - } - else - { - $errormsg = 'Fehler beim Laden des Mitarbeitenden'; - $return = false; + { + $errormsg = 'Fehler beim Laden des Mitarbeitenden'; + $return = false; + } } } else { - $errormsg = 'MitarbeitendeUID muss uebergeben werden'; + $errormsg = 'MitarbeitendeUID und Studiensemester muessen uebergeben werden'; $return = false; } } diff --git a/content/lvplanung/lehrveranstaltungoverlay.js.php b/content/lvplanung/lehrveranstaltungoverlay.js.php index c743ff389..e9b3263ff 100644 --- a/content/lvplanung/lehrveranstaltungoverlay.js.php +++ b/content/lvplanung/lehrveranstaltungoverlay.js.php @@ -1228,6 +1228,7 @@ function LeMitarbeiterLektorChange() req.add('type', 'getstundensatz'); req.add('mitarbeiter_uid', mitarbeiter_uid); + req.add('studiensemester_kurzbz', getStudiensemester()); var response = req.executePOST(); @@ -1340,6 +1341,7 @@ function LeMitarbeiterAuswahl() req_stundensatz.add('type', 'getstundensatz'); req_stundensatz.add('mitarbeiter_uid', mitarbeiter_uid); + req_stundensatz.add('studiensemester_kurzbz', getStudiensemester()); var response_stundensatz = req_stundensatz.executePOST(); diff --git a/content/student/studentDBDML.php b/content/student/studentDBDML.php index 2d5c9e0b8..891dadc64 100644 --- a/content/student/studentDBDML.php +++ b/content/student/studentDBDML.php @@ -4614,27 +4614,44 @@ if(!$error) } elseif(isset($_POST['type']) && $_POST['type']=='getstundensatz') { - if(isset($_POST['person_id'])) + if(isset($_POST['person_id']) && isset($_POST['studiensemester_kurzbz'])) { - $qry = "SELECT stundensatz FROM public.tbl_mitarbeiter JOIN public.tbl_benutzer ON(uid=mitarbeiter_uid) - WHERE person_id=".$db->db_add_param($_POST['person_id'], FHC_INTEGER); - if($result = $db->db_query($qry)) + $studiensemester = new studiensemester(); + if ($studiensemester->load($_POST['studiensemester_kurzbz'])) { - if($row = $db->db_fetch_object($result)) + $qry = "SELECT ss.stundensatz + FROM hr.tbl_stundensatz ss + JOIN public.tbl_mitarbeiter ON ss.uid = tbl_mitarbeiter.mitarbeiter_uid + JOIN public.tbl_benutzer ON(tbl_benutzer.uid=tbl_mitarbeiter.mitarbeiter_uid) + WHERE person_id=".$db->db_add_param($_POST['person_id'], FHC_INTEGER) ." + AND stundensatztyp = ". $db->db_add_param('lehre') ." + AND gueltig_von <= ". $db->db_add_param($studiensemester->ende) ." + AND (gueltig_bis => ". $db->db_add_param($studiensemester->start) ." OR gueltig_bis IS NULL) + ORDER BY gueltig_bis DESC NULLS FIRST, gueltig_von DESC NULLS LAST LIMIT 1 + "; + if($result = $db->db_query($qry)) { - $data = $row->stundensatz; - $return = true; + if($row = $db->db_fetch_object($result)) + { + $data = $row->stundensatz; + $return = true; + } + else + { + $data = '80.00'; + $return = true; + } } else { - $data = '80.00'; - $return = true; + $return = false; + $errormsg = 'Unbekannter Fehler'; } } else { $return = false; - $errormsg = 'Unbekannter Fehler'; + $errormsg = 'Fehler beim Laden des Studiensemesters'; } } } diff --git a/content/student/studentprojektarbeit.js.php b/content/student/studentprojektarbeit.js.php index 634a2781d..a18b94b6d 100644 --- a/content/student/studentprojektarbeit.js.php +++ b/content/student/studentprojektarbeit.js.php @@ -1367,6 +1367,7 @@ function StudentProjektbetreuerLoadMitarbeiterDaten() req.add('type', 'getstundensatz'); req.add('person_id', person_id); + req.add('studiensemester_kurzbz', getStudiensemester()) var response = req.executePOST(); diff --git a/include/stundensatz.class.php b/include/stundensatz.class.php new file mode 100644 index 000000000..82368af7e --- /dev/null +++ b/include/stundensatz.class.php @@ -0,0 +1,82 @@ +load($stundensatz_id); + } + + public function getStundensatzDatum($uid, $beginn, $ende = null, $typ = null) + { + + $qry = "SELECT + * + FROM + hr.tbl_stundensatz + WHERE + uid = ". $this->db_add_param($uid) ." + AND (gueltig_bis >= ". $this->db_add_param($beginn) ." OR gueltig_bis is null)"; + + if (!is_null($ende)) + { + $qry .= " AND (gueltig_von <= ". $this->db_add_param($ende) .")"; + } + + if (!is_null($typ)) + { + $qry .= " AND stundensatztyp = ". $this->db_add_param($typ); + } + + $qry .= " ORDER BY gueltig_bis DESC NULLS FIRST, gueltig_von DESC NULLS LAST LIMIT 1;"; + + if ($this->db_query($qry)) + { + if ($row = $this->db_fetch_object()) + { + $this->stundensatz_id = $row->stundensatz_id; + $this->uid = $row->uid; + $this->stundensatztyp = $row->stundensatztyp; + $this->stundensatz = $row->stundensatz; + $this->oe_kurzbz = $row->oe_kurzbz; + $this->gueltig_von = $row->gueltig_von; + $this->gueltig_bis = $row->gueltig_bis; + $this->insertamum = $row->insertamum; + $this->insertvon = $row->insertvon; + $this->updateamum = $row->updateamum; + $this->updatevon = $row->updatevon; + } + + return true; + } + else + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + } +} +?> diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index ed60aeddf..04d2ed8d1 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -40,6 +40,7 @@ require_once('dbupdate_3.4/24913_tabelle_raumtyp_neues_attribut_aktiv.php'); require_once('dbupdate_3.4/28089_plausichecks_in_extension_hinzufuegen.php'); require_once('dbupdate_3.4/29133_einzelne_studiengaenge_aus_issuechecks_ausnehmen.php'); require_once('dbupdate_3.4/30537_anmerkung_in_tbl_rolleberechtigung.php'); +require_once('dbupdate_3.4/29094_stundensaetze.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '