Config für Datum Start Digitalisierung, finish handleWiederholerDeadline, start Sammelmail an Stgl

This commit is contained in:
ma0068
2023-07-17 16:29:03 +02:00
parent a96d99bcd1
commit 5e6262da56
3 changed files with 210 additions and 129 deletions
+11
View File
@@ -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
*
+123 -33
View File
@@ -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');
}
/**
+76 -96
View File
@@ -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]);
}
}