diff --git a/application/libraries/StundenplanLib.php b/application/libraries/StundenplanLib.php index 7ed64da2c..113487330 100644 --- a/application/libraries/StundenplanLib.php +++ b/application/libraries/StundenplanLib.php @@ -382,11 +382,7 @@ class StundenplanLib $tz = new DateTimeZone($this->_ci->config->item('timezone')); - $ferienEvents = $this->_ci->FerienModel->execReadOnlyQuery(" - SELECT * - FROM lehre.tbl_ferien - WHERE (bisdatum >= ? AND vondatum < ?) AND (studiengang_kz = 0 OR studiengang_kz = ?) - ", [$start_date, $end_date, $studiengang_kz]); + $ferienEvents = $this->_ci->FerienModel->getByDateRange($start_date, $end_date, $studiengang_kz); if (isError($ferienEvents)) return $ferienEvents; diff --git a/application/models/organisation/Ferien_model.php b/application/models/organisation/Ferien_model.php index d1af53f21..3fe3db1c5 100644 --- a/application/models/organisation/Ferien_model.php +++ b/application/models/organisation/Ferien_model.php @@ -11,4 +11,56 @@ class Ferien_model extends DB_Model $this->dbTable = 'lehre.tbl_ferien'; $this->pk = 'ferien_id'; } + + /** + * Loads all Ferien between two dates. + * @param $vondatum + * @param $bisdatum + * @param $studiengang_kz by default, loads only Ferien from oe of 0 Studiengang (and parents) + * @return object success or error + */ + public function getByDateRange($vondatum, $bisdatum, $studiengang_kz = 0) + { + if (!is_numeric($studiengang_kz)) return error("Invalid Studiengang Kz"); + if (!is_valid_date($vondatum)) return error("Invalid von date"); + if (!is_valid_date($bisdatum)) return error("Invalid bis date"); + + // get oe from studiengang + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $result = $this->StudiengangModel->loadWhere(['studiengang_kz' => $studiengang_kz]); + + if (isError($result)) return $result; + if (!hasData($result)) return success([]); + + $oe_kurzbz = getData($result)[0]->oe_kurzbz; + + // get all parents oes + $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); + $result = $this->OrganisationseinheitModel->getParents($oe_kurzbz); + + if (isError($result)) return $result; + if (!hasData($result)) return success([]); + + $parents = array_column(getData($result), 'oe_kurzbz'); + + // get ferien - use oe_kurzbz, if "old" ferien without oe, use studiengang + $qry = " + SELECT + * + FROM + lehre.tbl_ferien + WHERE + (bisdatum >= ? AND vondatum < ?) + AND (CASE + WHEN oe_kurzbz IS NOT NULL + THEN oe_kurzbz IN ? + ELSE + studiengang_kz=0 + OR studiengang_kz=? + END) + ORDER BY + vondatum"; + + return $this->execReadOnlyQuery($qry, [$vondatum, $bisdatum, $parents, $studiengang_kz]); + } }