From b56fb6deb8ba6a15c48da14f5346134944a4aa98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Thu, 31 Jan 2019 08:43:24 +0100 Subject: [PATCH] Added Cronjob to automatically add direct groups to schedule --- application/controllers/jobs/LVPlanJob.php | 178 ++++++++++++++++++ .../education/Lehreinheitgruppe_model.php | 10 + .../organisation/Studiensemester_model.php | 21 ++- .../models/ressource/Stundenplandev_model.php | 50 +++++ 4 files changed, 256 insertions(+), 3 deletions(-) create mode 100644 application/controllers/jobs/LVPlanJob.php diff --git a/application/controllers/jobs/LVPlanJob.php b/application/controllers/jobs/LVPlanJob.php new file mode 100644 index 000000000..dd368974c --- /dev/null +++ b/application/controllers/jobs/LVPlanJob.php @@ -0,0 +1,178 @@ + + */ +if (! defined('BASEPATH')) + exit('No direct script access allowed'); + +class LVPlanJob extends FHC_Controller +{ + /** + * Initialize LVPlanJob Class + * + * @return void + */ + public function __construct() + { + // An empty array as parameter will ensure that this controller is ONLY callable from command line + parent::__construct(array()); + + if ($this->input->is_cli_request()) + { + $cli = true; + } + else + { + $this->output->set_status_header(403, 'Jobs must be run from the CLI'); + echo "Jobs must be run from the CLI"; + exit; + } + } + + /** + * Main function index as help + * + * @return void + */ + public function index() + { + $result = "The following are the available command line interface commands\n\n"; + $result .= "php ".$this->config->item('index_page')." jobs/LVPlanJob AddDirectGroups"; + + echo $result.PHP_EOL; + } + + /** + * Check all Courses with direkt Groups attached and adds the Groups to the Schedule if missing + */ + public function addDirectGroups() + { + $studiensemester_arr = array(); + + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('ressource/Stundenplandev_model', 'StundenplandevModel'); + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + $this->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel'); + + // Get actual Studiensemester + $resultsem = $this->StudiensemesterModel->getAktOrNextSemester(); + + if(hasData($resultsem)) + { + $studiensemester_arr[] = $resultsem->retval[0]->studiensemester_kurzbz; + } + else + { + echo 'kein Studiensemester gefunden'; + return false; + } + + // Get nearest Studiensemester to actual + $resultsem = $this->StudiensemesterModel->getNearestFrom($studiensemester_arr[0]); + if(hasData($resultsem)) + { + $studiensemester_arr[] = $resultsem->retval[0]->studiensemester_kurzbz; + } + + foreach($studiensemester_arr as $studiensemester) + { + echo "LVPlanJob/addDirectGroups Studiensemester: ".$studiensemester."\n"; + $succ = 0; + $fail = 0; + + // get all schedule entries where group is missing + $result = $this->StundenplandevModel->getMissingDirectGroups($studiensemester); + if(hasData($result)) + { + foreach($result->retval as $row) + { + $this->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung','lehrveranstaltung_id'); + $result_le = $this->LehreinheitModel->loadWhere(array('lehreinheit_id' => $row->lehreinheit_id)); + + // load additional data of course + $unr = null; + $stg_kz = null; + $semester = null; + $gruppe_kurzbz = null; + + if (hasData($result_le)) + { + $le = $result_le->retval[0]; + $unr = $le->unr; + $stg_kz = $le->studiengang_kz; + $semester = $le->semester; + } + else + { + echo 'Failed to load Lehreinheit '.$row->lehreinheit_id; + $fail++; + continue; + } + + // get direct group if course + $result_leg = $this->LehreinheitgruppeModel->getDirectGroup($row->lehreinheit_id); + if (hasData($result_leg)) + { + $gruppe_kurzbz = $result_leg->retval[0]->gruppe_kurzbz; + } + else + { + echo 'Failed to load direct group for le '.$row->lehreinheit_id; + $fail++; + continue; + } + + // add group to schedule + $result = $this->StundenplandevModel->insert( + array( + 'lehreinheit_id' => $row->lehreinheit_id, + 'unr' => $unr, + 'studiengang_kz' => $stg_kz, + 'semester' => $semester, + 'verband' => '', + 'gruppe' => '', + 'gruppe_kurzbz' => $gruppe_kurzbz, + 'mitarbeiter_uid' => $row->mitarbeiter_uid, + 'ort_kurzbz' => $row->ort_kurzbz, + 'datum' => $row->datum, + 'stunde' => $row->stunde, + 'titel' => null, + 'anmerkung' => null, + 'fix' => false, + 'updateamum' => date('Y-m-d H:i:s'), + 'updatevon' => 'lvplanjob', + 'insertvon' => 'lvplanjob', + 'insertamum' => date('Y-m-d H:i:s') + ) + ); + + if (isSuccess($result)) + { + $succ++; + } + else + { + $fail++; + } + } + } + echo "New Entries ".$succ."\n"; + echo "Failed ".$fail."\n"; + } + } +} diff --git a/application/models/education/Lehreinheitgruppe_model.php b/application/models/education/Lehreinheitgruppe_model.php index cfd59f937..8390d41c5 100644 --- a/application/models/education/Lehreinheitgruppe_model.php +++ b/application/models/education/Lehreinheitgruppe_model.php @@ -11,4 +11,14 @@ class Lehreinheitgruppe_model extends DB_Model $this->dbTable = 'lehre.tbl_lehreinheitgruppe'; $this->pk = 'lehreinheitgruppe_id'; } + + public function getDirectGroup($lehreinheit_id) + { + $this->addJoin('public.tbl_gruppe', 'gruppe_kurzbz'); + return $this->loadWhere(array( + 'tbl_gruppe.direktinskription' => true, + 'lehreinheit_id' => $lehreinheit_id + ) + ); + } } diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index ff48708dd..9248b241d 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -109,7 +109,7 @@ class Studiensemester_model extends DB_Model */ public function getAusbildungssemesterByStudiensemesterAndStudiengang($studiensemester_kurzbz, $studiengang_kz) { - $query = "SELECT DISTINCT semester + $query = "SELECT DISTINCT semester FROM lehre.tbl_studienplan JOIN lehre.tbl_studienordnung USING(studienordnung_id) JOIN lehre.tbl_studienplan_semester USING(studienplan_id) @@ -131,9 +131,9 @@ class Studiensemester_model extends DB_Model if (date_format(date_create($from), 'Y-m-d') > (date_format(date_create($to), 'Y-m-d'))) return success(array()); - $query = "SELECT * + $query = "SELECT * FROM public.tbl_studiensemester - WHERE + WHERE (ende > ?::date AND start < ?::date) OR start = ?::date OR ende = ?::date @@ -141,4 +141,19 @@ class Studiensemester_model extends DB_Model return $this->execQuery($query, array($from, $to, $from, $to)); } + + /** + * Liefert das Studiensemester das aktuell am naehesten zu $studiensemester_kurzbz liegt + * + * @param $studiensemester_kurzbz + * @return array | null + */ + public function getNearestFrom($studiensemester_kurzbz) + { + $query = "SELECT studiensemester_kurzbz, start, ende FROM public.vw_studiensemester + WHERE studiensemester_kurzbz <> ? + ORDER BY delta LIMIT 1"; + + return $this->execQuery($query, array($studiensemester_kurzbz)); + } } diff --git a/application/models/ressource/Stundenplandev_model.php b/application/models/ressource/Stundenplandev_model.php index 9d737e3ec..9fa92ae5e 100644 --- a/application/models/ressource/Stundenplandev_model.php +++ b/application/models/ressource/Stundenplandev_model.php @@ -11,4 +11,54 @@ class Stundenplandev_model extends DB_Model $this->dbTable = 'lehre.tbl_stundenplandev'; $this->pk = 'stundenplandev_id'; } + + public function getMissingDirectGroups($studiensemester_kurzbz = null) + { + $qry = " + SELECT + distinct lehreinheit_id, datum, stunde, mitarbeiter_uid, ort_kurzbz + FROM + lehre.tbl_stundenplandev stpl + WHERE + lehreinheit_id IN( + SELECT + lehreinheit_id + FROM + lehre.tbl_lehreinheit + JOIN lehre.tbl_lehreinheitgruppe USING(lehreinheit_id) + JOIN public.tbl_gruppe USING(gruppe_kurzbz) + WHERE + tbl_gruppe.direktinskription = true + "; + + $parametersArray = array(); + + if (!is_null($studiensemester_kurzbz)) + { + $parametersArray[] = $studiensemester_kurzbz; + $qry .= ' AND tbl_lehreinheit.studiensemester_kurzbz = ?'; + } + $qry .= ") + AND NOT EXISTS( + SELECT + 1 + FROM + lehre.tbl_stundenplandev + WHERE + datum=stpl.datum + AND stunde=stpl.stunde + AND lehreinheit_id=stpl.lehreinheit_id + AND gruppe_kurzbz=(SELECT + gruppe_kurzbz + FROM + lehre.tbl_lehreinheitgruppe + JOIN public.tbl_gruppe USING(gruppe_kurzbz) + WHERE + lehreinheit_id=stpl.lehreinheit_id + AND tbl_gruppe.direktinskription = true + ) + )"; + + return $this->execQuery($qry, $parametersArray); + } }