dbTable = 'lehre.tbl_vertrag'; $this->pk = 'vertrag_id'; $this->load->model('accounting/Vertragvertragsstatus_model', 'VertragvertragsstatusModel'); $this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); } /** * Saves Vertrag for a Lehrauftrag and sets Vertragsstatus to 'bestellt'. * Also updates vertrag_id in tbl_lehreinheitmitarbeiter or tbl_projektbetreuer. * @param $person_id * @param $lehrveranstaltung_id * @param $lehreinheit_id * @param $projektarbeit_id * @param $betrag Monetary amount of that Lehreinheit / Projektbetreuung. * @param $vertragsstunden Working hours of that Lehreinheit / Projektbetreuung. * @param $studiensemester_kurzbz * @param $vertragstyp_kurzbz * @return array|null On success object. On failure null. */ public function save($person_id, $mitarbeiter_uid, $lehrveranstaltung_id, $lehreinheit_id, $projektarbeit_id = null, $vertragsstunden, $betrag, $studiensemester_kurzbz) { $person_id = (isset($person_id) && is_numeric($person_id)) ? $person_id : show_error('peron_id must be set and numeric.'); $lehreinheit_id = (isset($lehreinheit_id) && is_numeric($lehreinheit_id)) ? $lehreinheit_id : show_error('lehreinheit_id must be set and numeric.'); $lehrveranstaltung_id = (isset($lehrveranstaltung_id) && is_numeric($lehrveranstaltung_id)) ? $lehrveranstaltung_id : show_error('lehrveranstaltung_id must be set and numeric.'); $projektarbeit_id = (isset($projektarbeit_id) && is_numeric($projektarbeit_id)) ? $projektarbeit_id : null; $vertragsstunden = (isset($vertragsstunden) && is_numeric($vertragsstunden)) ? $vertragsstunden : 0; $betrag = (isset($betrag) && is_numeric($betrag)) ? $betrag : 0; $mitarbeiter_uid = (isset($mitarbeiter_uid) && is_string($mitarbeiter_uid)) ? $mitarbeiter_uid : show_error('mitarbeiter_uid must be set and a string value.');; $vertragstyp_kurzbz = (is_null($projektarbeit_id)) ? 'Lehrauftrag' : 'Betreuung'; // First check if Vertrag already exists for that Lehrauftrag or for that Projektbetreuerauftrag if ($vertragstyp_kurzbz == 'Lehrauftrag') { if ($this->LehreinheitmitarbeiterModel->hasVertrag($mitarbeiter_uid, $lehreinheit_id)) { return error('Lehrauftrag existiert bereits'); // Exit if Lehrauftrag already has Vertrag } } elseif ($vertragstyp_kurzbz == 'Betreuung') { if ($this->ProjektbetreuerModel->hasVertrag($person_id, $projektarbeit_id)) { return error('Lehrauftrag existiert bereits'); // Exit if Projektbetreuung already has Vertrag } } // If Vertrag does not exist, create now // Vertragsbezeichnung $bezeichnung = $this->_writeVertragsbezeichung($lehrveranstaltung_id, $studiensemester_kurzbz); // Start DB transaction $this->db->trans_start(false); // Insert Vertragsdata $result = $this->insert( array( 'person_id' => $person_id, 'lehrveranstaltung_id' => $lehrveranstaltung_id, 'vertragstyp_kurzbz' => $vertragstyp_kurzbz, 'bezeichnung' => $bezeichnung, 'betrag' => $betrag, 'insertamum' => 'NOW()', 'insertvon' => getAuthUID(), 'vertragsdatum' => 'NOW()', 'vertragsstunden' => $vertragsstunden, 'vertragsstunden_studiensemester_kurzbz' => $studiensemester_kurzbz ) ); // Retrieve primary key $vertrag_id = $result->retval; // If Vertrag was created successfully, update vertrag_id if (isSuccess($result)) { // if Lehrtätigkeit, update vertrag_id in tbl_lehreinheitmitarbeiter if ($vertragstyp_kurzbz == 'Lehrauftrag') { $this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); $result = $this->LehreinheitmitarbeiterModel->update( array( 'lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' =>$mitarbeiter_uid ), array( 'vertrag_id' => $vertrag_id ) ); } // if (Projekt-)Betreuung, update vertrag_id in tbl_projektbetreuer elseif ($vertragstyp_kurzbz == 'Betreuung') { $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); $result = $this->ProjektbetreuerModel->update( array( 'person_id' => $person_id, 'projektarbeit_id' => $projektarbeit_id ), array( 'vertrag_id' => $vertrag_id ) ); } } // If updating vertrag_id was successfully, set Status to 'bestellt' if (isSuccess($result)) { $result = $this->VertragvertragsstatusModel->setStatus($vertrag_id, $mitarbeiter_uid, 'bestellt'); } // Transaction complete! $this->db->trans_complete(); // Check if everything went ok during the transaction if ($this->db->trans_status() === false || isError($result)) { $this->db->trans_rollback(); return error($result->msg, EXIT_ERROR); } else { $this->db->trans_commit(); return success($vertrag_id); } } /** * Updates Vertrag and, if resets vertragsstatus as follows: * - if vertragsstatus 'erteilt': delete status 'erteilt' and update date of status 'bestellt' * - if vertragsstatus 'bestellt': update date of status 'bestellt' * @param $vertrag_obj Object with vertrag properties vertrag_id, vertragsstunden, betrag. * @param $mitarbeiter_uid */ public function updateVertrag($vertrag_id, $vertragsstunden, $betrag, $mitarbeiter_uid) { $vertrag_id = (isset($vertrag_id) && is_numeric($vertrag_id)) ? $vertrag_id : show_error('vertrag_id must be set and numeric.'); $vertragsstunden = (isset($vertragsstunden) && is_numeric($vertragsstunden)) ? $vertragsstunden : 0; $betrag = (isset($betrag) && is_numeric($betrag)) ? $betrag : 0; $mitarbeiter_uid = (isset($mitarbeiter_uid) && is_string($mitarbeiter_uid)) ? $mitarbeiter_uid : show_error('mitarbeiter_uid must be set and a string value.'); // Start DB transaction $this->db->trans_start(false); // Update contract $result = $this->update( $vertrag_id, array( 'vertragsstunden' => $vertragsstunden, 'betrag' => $betrag, 'updateamum' => $this->escape('NOW()'), 'updatevon' => getAuthUID() ) ); // If last vertragsstatus is 'erteilt', delete the status if (isSuccess($result)) { $result = $this->VertragvertragsstatusModel->getLastStatus($vertrag_id, $mitarbeiter_uid); $lastStatus = getData($result)[0]->vertragsstatus_kurzbz; if ($lastStatus == 'erteilt') { $result = $this->VertragvertragsstatusModel->deleteStatus($vertrag_id, 'erteilt'); } } // Update date of status 'bestellt' if (isSuccess($result)) { $result = $this->VertragvertragsstatusModel->updateStatus($vertrag_id, 'bestellt'); } // Transaction complete! $this->db->trans_complete(); // Check if everything went ok during the transaction if ($this->db->trans_status() === false || isError($result)) { $this->db->trans_rollback(); return error($result->msg, EXIT_ERROR); } else { $this->db->trans_commit(); return success('Contract successfully updated.'); } } /** * Gets Lehreinheit ID corresponding to the contract. * @param $vertrag_id * @return array */ public function getLehreinheitID($vertrag_id) { $vertragstyp_kurzbz = null; $this->addSelect('vertragstyp_kurzbz'); if ($result = getData($this->load($vertrag_id))) { $vertragstyp_kurzbz = $result[0]->vertragstyp_kurzbz; } else { return error('Fehler beim Laden des Vertrags.'); } if ($vertragstyp_kurzbz == 'Lehrauftrag') { $this->LehreinheitmitarbeiterModel->addSelect('lehreinheit_id'); if ($result = $this->LehreinheitmitarbeiterModel->loadWhere(array('vertrag_id' => $vertrag_id))) { return success($result->retval); } else { return error('Fehler beim Ermitteln der Lehreinheit ID'); } } elseif ($vertragstyp_kurzbz == 'Betreuung') { $this->addSelect('lehreinheit_id'); $this->addJoin('lehre.tbl_projektbetreuer', 'vertrag_id'); $this->addJoin('lehre.tbl_projektarbeit', 'projektarbeit_id'); if ($result = $this->loadWhere(array('vertrag_id' => $vertrag_id))) { return success($result->retval); } else { return error('Fehler beim Ermitteln der Lehreinheit ID'); } } } /** * Gets (table) data of lehreinheit_id corresponding to the contract. * @param integer $vertrag_id * @param string $select To restrict fields, pass select string. e.g. 'lehrveranstaltung_id'. * @return array */ public function getLehreinheitData($vertrag_id, $select = '*') { if ($result = getData($this->getLehreinheitID($vertrag_id))) { $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); $this->LehreinheitModel->addSelect($select); if($result = $this->LehreinheitModel->load($result[0]->lehreinheit_id)) { return success($result->retval); } else { return error('Fehler beim Laden der Lehreinheit'); } } else { return error('Fehler beim Ermitteln der Lehreinheit ID'); } } /** * Prueft ob ein Mitarbeiter einen erteilten Vertrag zu einer Lehrveranstaltung besitzt. * @param $lehrveranstaltung_id ID der Lehrveranstaltung * @param $studiensemester_kurzbz Studiensemester das geprueft wird * @param $mitarbeiter_uid UID des Mitarbeiters */ public function isVertragErteiltLV($lehrveranstaltung_id, $studiensemester_kurzbz, $mitarbeiter_uid) { if (defined('CIS_LV_LEKTORINNENZUTEILUNG_VERTRAGSPRUEFUNG_VON') && CIS_LV_LEKTORINNENZUTEILUNG_VERTRAGSPRUEFUNG_VON != '') { // Liegt das Studiensemester vor dem Pruefdatum, wird die LV immer als Erteilt angezeigt $stsemquery = " SELECT tbl_studiensemester.start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz)." AND tbl_studiensemester.start < ( SELECT start FROM public.tbl_studiensemester stsem WHERE stsem.studiensemester_kurzbz = " . $this->escape(CIS_LV_LEKTORINNENZUTEILUNG_VERTRAGSPRUEFUNG_VON)." )"; if ($stsemresult = $this->execReadOnlyQuery($stsemquery)) { $stsemdata = getData($stsemresult); if ($stsemdata && count($stsemdata) > 0) { // Wenn das Studiensemester vor dem Pruefdatum liegt, gilt der Vertrag immer als erteilt. return true; } } else { return false; } } $query = " SELECT 1 FROM lehre.tbl_lehreinheitmitarbeiter JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) JOIN lehre.tbl_vertrag USING(vertrag_id) JOIN lehre.tbl_vertrag_vertragsstatus USING(vertrag_id) WHERE tbl_lehreinheitmitarbeiter.mitarbeiter_uid = " . $this->escape($mitarbeiter_uid) . " AND tbl_lehreinheit.studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . " AND tbl_lehreinheit.lehrveranstaltung_id = " . $this->escape(intval($lehrveranstaltung_id)) . " AND tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz='erteilt' AND NOT EXISTS( SELECT 1 FROM lehre.tbl_vertrag_vertragsstatus vstatus WHERE vstatus.vertrag_id = tbl_vertrag.vertrag_id AND vstatus.vertragsstatus_kurzbz = 'storno' ) "; if ($result = $this->execReadOnlyQuery($query)) { $data = getData($result); if ($data && count($data) > 0) { return true; } else { return false; } } else { return false; } } public function getVertrag($mitarbeiter_uid, $lehreinheit_id) { $this->addSelect('tbl_lehreinheitmitarbeiter.*, tbl_vertrag.*, status.bezeichnung as vertragsstatus, status.vertragsstatus_kurzbz'); $this->addJoin('lehre.tbl_lehreinheitmitarbeiter', 'vertrag_id'); $this->addJoin('lehre.tbl_vertragstyp', 'vertragstyp_kurzbz', 'LEFT'); $this->addJoin(' ( SELECT DISTINCT ON(vertrag_id) vertrag_id, bezeichnung, tbl_vertragsstatus.vertragsstatus_kurzbz FROM lehre.tbl_vertrag_vertragsstatus JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz) ORDER BY vertrag_id, datum DESC ) as status', 'status.vertrag_id = lehre.tbl_vertrag.vertrag_id', 'LEFT'); return $this->loadWhere(array('mitarbeiter_uid' => $mitarbeiter_uid, 'lehreinheit_id' => $lehreinheit_id)); } public function getVertragById($vertrag_id) { $this->addSelect( 'tbl_vertrag.vertrag_id, vertragstyp_kurzbz, vertragsstunden, vertragsstunden_studiensemester_kurzbz, status.vertragsstatus_kurzbz, status.bezeichnung AS vertragsstatus, tbl_vertrag.betrag, lema.semesterstunden, lema.stundensatz' ); $this->addJoin('lehre.tbl_lehreinheitmitarbeiter lema', 'tbl_vertrag.vertrag_id = lema.vertrag_id', 'LEFT'); $this->addJoin(' ( SELECT DISTINCT ON(vst.vertrag_id) vst.vertrag_id, bezeichnung, tbl_vertragsstatus.vertragsstatus_kurzbz FROM lehre.tbl_vertrag_vertragsstatus vst JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz) ORDER BY vst.vertrag_id, datum DESC ) as status', 'status.vertrag_id = lehre.tbl_vertrag.vertrag_id', 'LEFT'); return $this->loadWhere(['tbl_vertrag.vertrag_id' => $vertrag_id]); } public function cancelVertrag($vertrag_id, $mitarbeiter_uid) { $vertrag = $this->load($vertrag_id); if (!hasData($vertrag)) return error("Contract not found"); $vertrag = getData($vertrag)[0]; $this->_updateVertragRelevant($vertrag->vertrag_id); return $this->VertragvertragsstatusModel->insert(array( 'vertrag_id' => $vertrag->vertrag_id, 'vertragsstatus_kurzbz' => 'storno', 'uid' => $mitarbeiter_uid, 'datum' => 'NOW()', 'insertamum' => 'NOW()', 'insertvon' => getAuthUID() )); } public function deleteVertrag($vertrag_id) { $vertrag = $this->load($vertrag_id); if (!hasData($vertrag)) return error("Contract not found"); $vertrag = getData($vertrag)[0]; $this->_updateVertragRelevant($vertrag->vertrag_id); $this->VertragvertragsstatusModel->delete(array('vertrag_id' => $vertrag->vertrag_id)); return $this->delete(array('vertrag_id' => $vertrag->vertrag_id)); } // ----------------------------------------------------------------------------------------------------------------- // Private methods /** * Generate contract description. * Example: WS2017-BEE3-LIA-LAB * @param $lehrveranstaltung_id * @param $studiensemester_kurzbz Studiensemester of Lehrauftrag (= when the lector will teach the lehrveranstaltung) * @return string Returns e.g. WS2017-BBE5-GAP-LAB */ private function _writeVertragsbezeichung($lehrveranstaltung_id, $studiensemester_kurzbz) { $bezeichnung = ''; $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); $this->LehrveranstaltungModel->addSelect('tbl_lehrveranstaltung.semester, tbl_lehrveranstaltung.kurzbz AS "lv_kurzbz", lehrform_kurzbz, public.tbl_studiengang.typ, public.tbl_studiengang.kurzbz'); $this->LehrveranstaltungModel->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'lehrveranstaltung_id'); $this->LehrveranstaltungModel->addJoin('lehre.tbl_studienplan', 'studienplan_id'); $this->LehrveranstaltungModel->addJoin('lehre.tbl_studienordnung', 'studienordnung_id'); $this->LehrveranstaltungModel->addJoin('public.tbl_studiengang', 'public.tbl_studiengang.studiengang_kz = lehre.tbl_studienordnung.studiengang_kz'); $result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id); if (hasData($result)) { $bezeichnung = $studiensemester_kurzbz. '-'; $bezeichnung.= strtoupper($result->retval[0]->typ. $result->retval[0]->kurzbz). $result->retval[0]->semester. '-'; $bezeichnung.= $result->retval[0]->lv_kurzbz. '-'; $bezeichnung.= $result->retval[0]->lehrform_kurzbz; } return $bezeichnung; } /** * Loads all Contracts of a Person * @param $person_id * @return array of objects */ public function loadContractsOfPerson($person_id) { $query = " SELECT *, tbl_vertrag.bezeichnung as bezeichnung, tbl_vertragstyp.bezeichnung as vertragstyp_bezeichnung, tbl_vertrag.vertragsdatum, (SELECT bezeichnung FROM lehre.tbl_vertragsstatus JOIN lehre.tbl_vertrag_vertragsstatus USING(vertragsstatus_kurzbz) WHERE vertrag_id=tbl_vertrag.vertrag_id ORDER BY datum desc limit 1) as status, anmerkung, CASE WHEN EXISTS ( SELECT 1 FROM lehre.tbl_vertrag_vertragsstatus WHERE vertrag_id = tbl_vertrag.vertrag_id AND vertragsstatus_kurzbz = 'abgerechnet' ) THEN true ELSE false END AS isAbgerechnet FROM lehre.tbl_vertrag LEFT JOIN lehre.tbl_vertragstyp USING(vertragstyp_kurzbz) WHERE person_id= ?"; return $this->execQuery($query, array($person_id)); } /** * Loads all Contracts of a Person that are not assigned yet * @param $person_id * @return array of objects */ public function loadContractsOfPersonNotAssigned($person_id) { $query = " SELECT 'Lehrauftrag' as type, lehreinheit_id, mitarbeiter_uid, null as pruefung_id, null as projektarbeit_id, (tbl_lehreinheitmitarbeiter.semesterstunden*tbl_lehreinheitmitarbeiter.stundensatz) as betrag1, tbl_lehreinheit.studiensemester_kurzbz, null as betreuerart_kurzbz, ( SELECT upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz FROM lehre.tbl_lehrveranstaltung JOIN public.tbl_studiengang USING(studiengang_kz) WHERE lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id) as bezeichnung FROM lehre.tbl_lehreinheitmitarbeiter JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) WHERE mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?) AND vertrag_id IS NULL UNION SELECT 'Betreuung' as type, tbl_projektarbeit.lehreinheit_id as lehreinheit_id, null as mitarbeiter_uid, null::integer as pruefung_id, projektarbeit_id, (tbl_projektbetreuer.stunden*tbl_projektbetreuer.stundensatz) as betrag1, tbl_lehreinheit.studiensemester_kurzbz, tbl_projektbetreuer.betreuerart_kurzbz, (SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid) as bezeichnung FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_projektarbeit USING(projektarbeit_id) JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) WHERE tbl_projektbetreuer.person_id=? AND vertrag_id IS NULL "; return $this->execQuery($query, array($person_id, $person_id)); } /** * Loads all Contracts of a Person that are assigned yet * @param $person_id, $vertrag_id * @return array of objects */ public function loadContractsOfPersonAssigned($person_id, $vertrag_id) { $query = " SELECT 'Lehrauftrag' as type, lehreinheit_id, mitarbeiter_uid, null as pruefung_id, null as projektarbeit_id, (tbl_lehreinheitmitarbeiter.semesterstunden * tbl_lehreinheitmitarbeiter.stundensatz) as betrag, tbl_lehreinheit.studiensemester_kurzbz, null as betreuerart_kurzbz, ( SELECT upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz FROM lehre.tbl_lehrveranstaltung JOIN public.tbl_studiengang USING(studiengang_kz) WHERE lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id) as bezeichnung, vertrag_id FROM lehre.tbl_lehreinheitmitarbeiter JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) WHERE mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?) AND vertrag_id = ? UNION SELECT 'Betreuung' as type, tbl_projektarbeit.lehreinheit_id as lehreinheit_id, null as mitarbeiter_uid, null::integer as pruefung_id, projektarbeit_id, (tbl_projektbetreuer.stunden * tbl_projektbetreuer.stundensatz) as betrag, tbl_lehreinheit.studiensemester_kurzbz, tbl_projektbetreuer.betreuerart_kurzbz, (SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid) as bezeichnung, vertrag_id FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_projektarbeit USING(projektarbeit_id) JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) WHERE tbl_projektbetreuer.person_id=? AND vertrag_id = ? "; return $this->execQuery($query, array($person_id, $vertrag_id, $person_id, $vertrag_id)); } /** * Returns all stati of a contract * * @param $vertrag_id * @return array */ public function getStatiOfContract($vertrag_id) { $query = " SELECT *, tbl_vertrag_vertragsstatus.datum, tbl_vertrag_vertragsstatus.insertamum, tbl_vertrag_vertragsstatus.updateamum FROM lehre.tbl_vertrag_vertragsstatus JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz) WHERE tbl_vertrag_vertragsstatus.vertrag_id = ? ORDER BY tbl_vertrag_vertragsstatus.datum DESC"; return $this->execQuery($query, array($vertrag_id)); } private function _updateVertragRelevant($vertrag_id) { $this->LehreinheitmitarbeiterModel->update( array("vertrag_id" => $vertrag_id), array( 'vertrag_id' => null ) ); $this->ProjektbetreuerModel->update( array("vertrag_id" => $vertrag_id), array( 'vertrag_id' => null ) ); } }