From 5e6262da56208a7d300078ea051d026e1a05aca6 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Mon, 17 Jul 2023 16:29:03 +0200 Subject: [PATCH] =?UTF-8?q?Config=20f=C3=BCr=20Datum=20Start=20Digitalisie?= =?UTF-8?q?rung,=20finish=20handleWiederholerDeadline,=20start=20Sammelmai?= =?UTF-8?q?l=20an=20Stgl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/config/studierendenantrag.php | 11 ++ application/controllers/jobs/AntragJob.php | 156 ++++++++++++---- .../models/education/Pruefung_model.php | 172 ++++++++---------- 3 files changed, 210 insertions(+), 129 deletions(-) diff --git a/application/config/studierendenantrag.php b/application/config/studierendenantrag.php index 85a3e1658..89b066d33 100644 --- a/application/config/studierendenantrag.php +++ b/application/config/studierendenantrag.php @@ -88,6 +88,17 @@ $config['wiederholung_job_request_2_date_modifier'] = '+3 weeks'; */ $config['wiederholung_job_deadline_date_modifier'] = '+1 month'; +/** + * before this exam dates for Wiederholer will be ignored + * + * @var string A string formated as Date + * + */ +$config['digitalization_start'] = '2022-07-01'; + + + + /** * Objection period - the student will be abgemeldet if he hasn't objected in this period * diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 61c3a2eaa..e0c88ac3a 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -3,11 +3,12 @@ if (!defined("BASEPATH")) exit("No direct script access allowed"); use \DateTime as DateTime; -// TODO(chris): Achtung not working class AntragJob extends JOB_Controller { - /** + private $allPrestudentsWhereCommitteeExamFailed; + + /** * API constructor */ public function __construct() @@ -33,11 +34,102 @@ class AntragJob extends JOB_Controller */ public function sendStglSammelmail() { - // TODO(chris): get all Abmeldung:Created, Unterbrechung:Created, Wiederholung:LvZugeordnet - // TODO(chris): get stgs for all these - // TODO(chris): get stgls for all these - // TODO(chris): sort antraege in stgls - // TODO(chris): send email + $this->logInfo('Start Job sendStglSammelmail'); + + // TODO(chris): get all Abmeldung:Created, Unterbrechung:Created, Wiederholung:LvZugeordnet + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $this->StudierendenantragModel->addJoin('public.tbl_prestudent','prestudent_id'); + $this->db->group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); + + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); + + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_UNTERBRECHUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); + + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_WIEDERHOLUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_LVSASSIGNED); + $this->db->group_end(); + + $result = $this->StudierendenantragModel->load(); + if(isError($result)) + return $this->logError(getError($result)); + + if(!hasData($result)) + return $this->logInfo('End Job sendStglSammelmail: 0 Mails sent'); + + $antraege = getData($result); + + $stgs = array(); + $stgLeitungen = array(); + + foreach($antraege as $antrag) + { + if(!isset($stgs[$antrag->studiengang_kz])) + { + $result = $this->StudiengangModel->getLeitung($antrag->studiengang_kz); + if(isError($result)) + { + $this->logError(getError($result)); + continue; + } + if(!hasData($result)) + { + $this->logError('Keine Leitung für Studiengang ' . $antrag->studiengang_kz . ' gefunden!'); + continue; + } + + $leitung = current(getData($result)); + if(!isset($stgLeitungen[$leitung->uid])) + { + $stgLeitungen[$leitung->uid] = [ 'Details' => $leitung, 'stgs' => [] ]; + } + $stgLeitungen[$leitung->uid] ['stgs'][] = $antrag->studiengang_kz; + + $result = $this->StudiengangModel->load($antrag->studiengang_kz); + if(isError($result)) + { + $this->logError(getError($result)); + continue; + } + if(!hasData($result)) + { + $this->logError('Keine Details für Studiengang ' . $antrag->studiengang_kz . ' gefunden!'); + continue; + } + $details = current(getData($result)); + + $stgs[$antrag->studiengang_kz] = [ 'Abmeldung' => [], 'Unterbrechung' => [], 'Wiederholung' => [], 'Details' => $details ]; + } + $stgs[$antrag->studiengang_kz] [$antrag->typ] = $antrag; + } + +/* var_dump($stgs); + var_dump($stgLeitungen);*/ + + $count = 0; + foreach($stgLeitungen as $leitung) + { + $data = array(); + if(sendSanchoMail("Sancho_Mail_Antrag_Stgl",$data,$leitung['Details']->email, 'Anträge - Aktion(en) erforderlich')) + $count++; + } + + $this->logInfo($count . " Emails erfolgreich versandt"); + + // TODO(chris): Emailadresse stg + // TODO(chris): data Fertig + + $this->logInfo('End Job sendStglSammelmail'); } /** @@ -118,19 +210,22 @@ class AntragJob extends JOB_Controller return; } + $digi_start= $this->config->item('digitalization_start'); + if($digi_start) + $digi_start = new DateTime($digi_start); + $dateDeadline = new DateTime(); $dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline)); - $result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed( - [ - null, - Studierendenantragstatus_model::STATUS_REQUESTSENT_1, - Studierendenantragstatus_model::STATUS_REQUESTSENT_2 - ], - $dateDeadline, - null - ); - + $result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed( + [ + null, + Studierendenantragstatus_model::STATUS_REQUESTSENT_1, + Studierendenantragstatus_model::STATUS_REQUESTSENT_2 + ], + $dateDeadline, + $digi_start + ); if(isError($result)) { $this->logError(getError($result)); @@ -142,24 +237,19 @@ class AntragJob extends JOB_Controller $prestudents = $this->prestudentsGetUnique($prestudents); - foreach ($prestudents as $prestudent) - { - // TODO(chris): DEBUG REMOVE! - if ($prestudent->studiensemester_kurzbz == 'WS2021') - var_dump([$prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $prestudent->lvbezeichnung]); - $result = success(); - // TODO(chris): find out how to filter old/wrong datasets!!! - #$result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $insertvon); - if (isError($result)) - $this->logError(getError($result)); - else - $count++; - } - $this->logInfo($count . " Students set to Abbrecher"); - } - $this->logInfo('Ende Job handleWiederholerDeadline'); + foreach ($prestudents as $prestudent) + { + $result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $insertvon); + if (isError($result)) + $this->logError(getError($result)); + else + $count++; + } + $this->logInfo($count . " Students set to Abbrecher"); + } + $this->logInfo('Ende Job handleWiederholerDeadline'); } /** diff --git a/application/models/education/Pruefung_model.php b/application/models/education/Pruefung_model.php index 4236a5c6a..047cac02f 100644 --- a/application/models/education/Pruefung_model.php +++ b/application/models/education/Pruefung_model.php @@ -37,106 +37,52 @@ class Pruefung_model extends DB_Model return $this->execQuery($qry, array($person_id, $studiensemester_kurzbz)); } - /** - * @param integer $prestudent_id student_uid - * - * @return stdClass - */ - public function loadWhereCommitteeExamFailedForPrestudent($prestudent_id) - { - $this->load->config('studierendenantrag'); - $this->dbTable = 'lehre.tbl_pruefung p'; + /** + * @return string + */ + protected function loadWhereThreeExamsFailed() + { + $this->load->config('studierendenantrag'); - $this->addSelect('p.datum'); - $this->addSelect('pers.vorname'); - $this->addSelect('pers.nachname'); - $this->addSelect('s.matrikelnr'); - $this->addSelect('g.bezeichnung'); - $this->addSelect('g.studiengang_kz'); - $this->addSelect('o.bezeichnung_mehrsprachig'); - $this->addSelect('ps.prestudent_id'); - $this->addSelect('lv.bezeichnung as lvbezeichnung'); - $this->addSelect('le.studiensemester_kurzbz'); - $this->addSelect('a.typ'); - $this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status'); + $this->dbTable = 'lehre.tbl_pruefung p'; - $this->addJoin('lehre.tbl_note n', 'note'); - $this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); - $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); - $this->addJoin('public.tbl_student s', 'student_uid'); - $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); - $this->addJoin('public.tbl_person pers', 'person_id'); - $this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz'); - $this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz'); - $this->addJoin('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id', 'LEFT'); + $sprache_index = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; - $this->db->where("n.positiv", false); - $this->db->where("p.pruefungstyp_kurzbz", 'kommPruef'); - $this->db->where("ps.prestudent_id", $prestudent_id); - $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, NULL)", $this->config->item('antrag_prestudentstatus_whitelist')); - $this->db->where("g.aktiv", true); + $this->addSelect('max(p.datum) as datum'); + $this->addSelect('pers.vorname'); + $this->addSelect('pers.nachname'); + $this->addSelect('pers.person_id'); + $this->addSelect('s.matrikelnr'); + $this->addSelect('g.bezeichnung'); + $this->addSelect('g.studiengang_kz'); + $this->addSelect('o.bezeichnung_mehrsprachig[(' . $sprache_index . ')] AS orgform', false); + $this->addSelect('ps.prestudent_id'); + $this->addSelect('lv.bezeichnung as lvbezeichnung'); + $this->addSelect('le.studiensemester_kurzbz'); + $this->addSelect('a.typ'); + $this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status'); + $this->addSelect('count(1) as count'); - $this->db->where('lv.studiengang_kz not in( - SELECT ps.studiengang_kz - FROM - public.tbl_student s - JOIN public.tbl_prestudent ps USING (prestudent_id) - JOIN public.tbl_prestudentstatus pss USING (prestudent_id) - WHERE pss.statusgrund_id in ? - and ps.prestudent_id = ?)', null, false); + $this->addGroupBy(['pers.vorname','pers.nachname','pers.person_id', 's.matrikelnr','g.bezeichnung', 'g.studiengang_kz','o.bezeichnung_mehrsprachig','ps.prestudent_id', 'lv.bezeichnung', 'le.studiensemester_kurzbz', 'a.typ', 'a.studierendenantrag_id']); + $this->addJoin('lehre.tbl_note n', 'note'); + $this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); + $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->addJoin('public.tbl_student s', 'student_uid'); + $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); + $this->addJoin('public.tbl_person pers', 'person_id'); + $this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); + $this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz'); + $this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz'); + $this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false); - $sql = $this->db->get_compiled_select($this->dbTable); + $this->db->where("n.positiv", false); + /* $this->db->where_in("p.pruefungstyp_kurzbz1", ['kommPruef','zusKommPruef']);*/ + $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist')); - return $this->execQuery($sql, [$this->config->item('status_gruende_wiederholer'), $prestudent_id]); - } + $this->db->where("g.aktiv", true); - public function getAllPrestudentsWhereCommitteeExamFailed($status, $maxDate, $minDate) - { - $this->load->config('studierendenantrag'); - $this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); - - $this->dbTable = 'lehre.tbl_pruefung p'; - - $sprache_index = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; - - $this->addSelect('p.datum'); - $this->addSelect('pers.vorname'); - $this->addSelect('pers.nachname'); - $this->addSelect('pers.person_id'); - $this->addSelect('s.matrikelnr'); - $this->addSelect('g.bezeichnung'); - $this->addSelect('g.studiengang_kz'); - $this->addSelect('o.bezeichnung_mehrsprachig[(' . $sprache_index . ')] AS orgform', false); - $this->addSelect('ps.prestudent_id'); - $this->addSelect('lv.bezeichnung as lvbezeichnung'); - $this->addSelect('le.studiensemester_kurzbz'); - $this->addSelect('a.typ'); - $this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status'); - - $this->addJoin('lehre.tbl_note n', 'note'); - $this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); - $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); - $this->addJoin('public.tbl_student s', 'student_uid'); - $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); - $this->addJoin('public.tbl_person pers', 'person_id'); - $this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); - $this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz'); - $this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz'); - $this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false); - - $this->db->where("n.positiv", false); - $this->db->where("p.pruefungstyp_kurzbz", 'kommPruef'); - $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist')); - - if ($maxDate) - $this->db->where("p.datum < ", $maxDate->format('c')); - if ($minDate) - $this->db->where("p.datum > ", $minDate->format('c')); - $this->db->where("g.aktiv", true); - $this->db->where("b.aktiv", true); - - $this->db->where('lv.studiengang_kz not in( + $this->db->where('lv.studiengang_kz not in( SELECT ps.studiengang_kz FROM public.tbl_prestudent ps1 @@ -144,8 +90,42 @@ class Pruefung_model extends DB_Model WHERE pss.statusgrund_id in ? AND ps.prestudent_id = ps1.prestudent_id)', null, false); - // NOTE(chris): is Wiederholer without set statusgrund (legacy?) - $this->db->where('(SELECT COUNT(*) FROM (SELECT DISTINCT studiensemester_kurzbz FROM tbl_prestudentstatus _s WHERE ausbildungssemester=get_absem_prestudent(ps.prestudent_id, le.studiensemester_kurzbz) AND prestudent_id=ps.prestudent_id) a) = 1', null, false); + // NOTE(chris): is Wiederholer without set statusgrund (legacy?) + $this->db->where('(SELECT COUNT(*) FROM (SELECT DISTINCT studiensemester_kurzbz FROM tbl_prestudentstatus _s WHERE ausbildungssemester=get_absem_prestudent(ps.prestudent_id, le.studiensemester_kurzbz) AND prestudent_id=ps.prestudent_id) a) = 1', null, false); + + return $this->db->get_compiled_select($this->dbTable); + } + + + + + /** + * @param integer $prestudent_id student_uid + * + * @return stdClass + */ + public function loadWhereCommitteeExamFailedForPrestudent($prestudent_id) + { + + $sql = $this->loadWhereThreeExamsFailed(); + + $statusgruende = $this->config->item('status_gruende_wiederholer'); + if (!is_array($statusgruende)) + $statusgruende = []; + + return $this->execQuery('select * from ( ' . $sql . ') temp where count >= 3 AND prestudent_id = ?' , [Studierendenantrag_model::TYP_WIEDERHOLUNG, $statusgruende, $prestudent_id]); + } + + public function getAllPrestudentsWhereCommitteeExamFailed($status, $maxDate, $minDate) + { + $this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + + if ($maxDate) + $this->db->where("p.datum < ", $maxDate->format('c')); + if ($minDate) + $this->db->where("p.datum > ", $minDate->format('c')); + + $this->db->where("b.aktiv", true); if (is_array($status)) { if (in_array(null, $status)) { @@ -165,12 +145,12 @@ class Pruefung_model extends DB_Model $this->db->where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status); } - $sql = $this->db->get_compiled_select($this->dbTable); + $sql = $this->loadWhereThreeExamsFailed(); $statusgruende = $this->config->item('status_gruende_wiederholer'); if (!is_array($statusgruende)) $statusgruende = []; - return $this->execQuery($sql, [Studierendenantrag_model::TYP_WIEDERHOLUNG, $statusgruende]); + return $this->execQuery('select * from ( ' . $sql . ') temp where count >= 3', [Studierendenantrag_model::TYP_WIEDERHOLUNG, $statusgruende]); } }