From da4e913a382a425d11d471ffbefa890d3b2c6c98 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Sat, 13 Feb 2021 00:37:33 +0100 Subject: [PATCH 1/3] =?UTF-8?q?ReihungstestJob.php:=20-=20studiensemester?= =?UTF-8?q?=20is=20passed=20as=20parameter=20-=20info=20mail=20is=20sent?= =?UTF-8?q?=20to=20lower=20priority=20when=20higher=20priority=20is=20canc?= =?UTF-8?q?elled=20(abgewiesen)=20-=20info=20mail=20is=20sent=20to=20maste?= =?UTF-8?q?r=20studieng=C3=A4nge=20as=20well=20if=20higher=20prio=20is=20c?= =?UTF-8?q?ancelled/aufgenommen=20and=20there=20are=20other=20bachelor=20p?= =?UTF-8?q?restudenten=20in=20same=20semester?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/jobs/ReihungstestJob.php | 170 ++++++++++++------ 1 file changed, 114 insertions(+), 56 deletions(-) diff --git a/application/controllers/jobs/ReihungstestJob.php b/application/controllers/jobs/ReihungstestJob.php index 859b8f265..46e889650 100644 --- a/application/controllers/jobs/ReihungstestJob.php +++ b/application/controllers/jobs/ReihungstestJob.php @@ -1,7 +1,7 @@ load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); + $this->load->model('crm/buchungstyp_model', 'BuchungstypModel'); // Load helpers $this->load->helper('hlp_sancho_helper'); @@ -799,24 +800,40 @@ class ReihungstestJob extends CLI_Controller * @param string $bcc. Optional. BCC-Mailadress to send the Mails to * @param string $from. Optional. Sender-Mailadress shown to recipient */ - public function prioritizationJob($bcc = null, $from = null) + public function prioritizationJob($studiensemester, $bcc = null, $from = null) { - $qry = " SELECT DISTINCT - get_rolle_prestudent (tbl_prestudent.prestudent_id, 'WS2020') AS laststatus, /* Todo: Studiensemester dynamisch ermitteln oder als Parameter */ - tbl_prestudentstatus.studiensemester_kurzbz, - tbl_prestudent.* + if (!isset($studiensemester) || isEmptyString($studiensemester)) + { + $this->logError("Studiensemster not passed as parameter"); + return; + } + + $qry = "WITH prst AS ( + SELECT DISTINCT + get_rolle_prestudent (tbl_prestudent.prestudent_id, ?) AS laststatus, + tbl_prestudentstatus.studiensemester_kurzbz, + tbl_prestudentstatus.datum AS prestudenstatus_datum, + tbl_prestudent.*, + tbl_studiengang.typ AS studiengang_typ FROM PUBLIC.tbl_person - JOIN PUBLIC.tbl_prestudent USING (person_id) - JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id) - JOIN lehre.tbl_studienplan USING (studienplan_id) - JOIN lehre.tbl_studienordnung USING (studienordnung_id) - JOIN PUBLIC.tbl_studiengang ON (tbl_studienordnung.studiengang_kz = tbl_studiengang.studiengang_kz) - WHERE tbl_prestudentstatus.datum >= (SELECT CURRENT_DATE -1) - AND get_rolle_prestudent (tbl_prestudent.prestudent_id, 'WS2020') IN ('Aufgenommener','Bewerber','Wartender') - AND studiensemester_kurzbz = 'WS2020' /* Todo: Studiensemester dynamisch ermitteln oder als Parameter */ - AND tbl_studiengang.typ = 'b' - ORDER BY studiengang_kz, laststatus - "; + JOIN PUBLIC.tbl_prestudent USING (person_id) + JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id) + JOIN lehre.tbl_studienplan USING (studienplan_id) + JOIN lehre.tbl_studienordnung USING (studienordnung_id) + JOIN PUBLIC.tbl_studiengang ON (tbl_studienordnung.studiengang_kz = tbl_studiengang.studiengang_kz) + WHERE get_rolle_prestudent (tbl_prestudent.prestudent_id, ?) IN ('Aufgenommener','Bewerber','Wartender','Abgewiesener') + AND studiensemester_kurzbz = ? + AND tbl_studiengang.typ IN ('b', 'm') + ) + SELECT * FROM prst + WHERE + prestudenstatus_datum >= (SELECT CURRENT_DATE - 1) + AND (studiengang_typ = 'b' OR (studiengang_typ = 'm' AND EXISTS (SELECT 1 /* Master Studiengänge berücksichtigen wenn auch Bachelor im gleichen Semester */ + FROM prst prstb + WHERE studiengang_typ = 'b' + AND laststatus != 'Abgewiesener' + AND prstb.person_id = prst.person_id ))) + ORDER BY studiengang_kz, laststatus"; // Encode Params if ($bcc != '') @@ -837,26 +854,22 @@ class ReihungstestJob extends CLI_Controller } $db = new DB_Model(); - $result_prestudents = $db->execReadOnlyQuery($qry); + $result_prestudents = $db->execReadOnlyQuery($qry, array_pad(array(), 3, $studiensemester)); $mailArray = array(); if (hasdata($result_prestudents)) { foreach ($result_prestudents->retval as $row_ps) { - // Wenn der letzte Status "Aufgenommener" ist, alle niedrigeren Prios auf "Abgewiesen" setzen - // falls diese Bewerber oder Warteliste sind - // Danach Kaution einbuchen - if ($row_ps->laststatus == 'Aufgenommener') - { - // Alle niedrigeren Prios laden - $qryNiedrPrios = " + // Alle niedrigeren Prios laden + $qryNiedrPrios = " SELECT DISTINCT get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') AS laststatus, tbl_studienplan.orgform_kurzbz, tbl_person.nachname, tbl_person.vorname, - tbl_prestudent.* + tbl_prestudent.*, + tbl_studiengang.typ AS studiengang_typ FROM PUBLIC.tbl_person JOIN PUBLIC.tbl_prestudent USING (person_id) JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id) @@ -866,18 +879,30 @@ class ReihungstestJob extends CLI_Controller AND tbl_prestudent.prestudent_id != ".$row_ps->prestudent_id." AND get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') IN ('Aufgenommener','Bewerber','Wartender') AND studiensemester_kurzbz = '".$row_ps->studiensemester_kurzbz."' - AND tbl_studiengang.typ = 'b' + AND tbl_studiengang.typ IN ('b', 'm') AND priorisierung > ".$row_ps->priorisierung." ORDER BY studiengang_kz, laststatus "; + // Wenn der letzte Status "Aufgenommener" ist, alle niedrigeren Prios auf "Abgewiesen" setzen + // falls diese Bewerber oder Warteliste sind + // Danach Kaution einbuchen + if ($row_ps->laststatus == 'Aufgenommener') + { $resultNiedrPrios = $db->execReadOnlyQuery($qryNiedrPrios); if (hasdata($resultNiedrPrios)) { foreach ($resultNiedrPrios->retval as $rowNiedrPrios) { - if ($rowNiedrPrios->laststatus == 'Bewerber') + // nur Info wenn aufgenommen oder master + if ($rowNiedrPrios->laststatus == 'Aufgenommener' || $rowNiedrPrios->studiengang_typ == 'm') + { + // Mail zur Info an Assistenz schicken, dass in höherer Prio aufgenommen wurde + $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][] + = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; + } + elseif ($rowNiedrPrios->laststatus == 'Bewerber') { // Abgewiesenen-Status mit Statusgrund "Aufnahme anderer Studiengang" (ID 5) setzen $lastStatus = $this->PrestudentstatusModel->getLastStatus($rowNiedrPrios->prestudent_id); @@ -929,43 +954,63 @@ class ReihungstestJob extends CLI_Controller = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; } } - elseif ($rowNiedrPrios->laststatus == 'Aufgenommener') - { - // Mail zur Info an Assistenz schicken, dass in höherer Prio aufgenommen wurde - $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][] - = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; - } } } - // Kaution einbuchen für $row_ps->prestudent_id + // Kaution einbuchen für $row_ps->prestudent_id (für aufgenommenen Bachelor) // Vorher prüfen, ob schon eine Kaution gebucht ist - // Todo: Betrag automatisch aus tbl_buchungstyp laden - $qryKautionExists = " + if ($row_ps->studiengang_typ == 'b') + { + $qryKautionExists = " SELECT count(*) as anzahl FROM public.tbl_konto - WHERE person_id = ".$row_ps->person_id." - AND studiensemester_kurzbz = '".$row_ps->studiensemester_kurzbz."' - AND buchungstyp_kurzbz = 'Kaution'"; + WHERE person_id = " . $row_ps->person_id . " + AND studiensemester_kurzbz = '" . $row_ps->studiensemester_kurzbz . "' + AND buchungstyp_kurzbz = 'StudiengebuehrAnzahlung'"; - $resultKautionExists = $db->execReadOnlyQuery($qryKautionExists); - if (hasdata($resultKautionExists)) - { - if ($resultKautionExists->retval[0]->anzahl == '0') + $resultKautionExists = $db->execReadOnlyQuery($qryKautionExists); + if (hasdata($resultKautionExists)) { - // Todo: Zahlungsreferenz generieren (StudiengangsOE+Buchungsnummer) - $this->KontoModel->insert(array( - "person_id" => $row_ps->person_id, - "studiengang_kz" => $row_ps->studiengang_kz, - "studiensemester_kurzbz" => $row_ps->studiensemester_kurzbz, - "betrag" => -150, - "buchungsdatum" => date('Y-m-d'), - "buchungstext" => 'Kaution', - "buchungstyp_kurzbz" => 'Kaution', - "insertvon" => 'prioritizationJob', - "insertamum" => date('Y-m-d H:i:s') - )); + if ($resultKautionExists->retval[0]->anzahl == '0') + { + // Betrag automatisch aus tbl_buchungstyp laden + $this->BuchungstypModel->addSelect('buchungstyp_kurzbz, standardbetrag, standardtext'); + $buchungstypRes = $this->BuchungstypModel->loadWhere(array('buchungstyp_kurzbz' => 'StudiengebuehrAnzahlung')); + + if (hasData($buchungstypRes)) + { + $buchungstypData = getData($buchungstypRes)[0]; + + $this->KontoModel->insert(array( + "person_id" => $row_ps->person_id, + "studiengang_kz" => $row_ps->studiengang_kz, + "studiensemester_kurzbz" => $row_ps->studiensemester_kurzbz, + "betrag" => $buchungstypData->standardbetrag, + "buchungsdatum" => date('Y-m-d'), + "buchungstext" => $buchungstypData->standardtext, + "buchungstyp_kurzbz" => $buchungstypData->buchungstyp_kurzbz, + "insertvon" => 'prioritizationJob', + "insertamum" => date('Y-m-d H:i:s') + )); + } + else + $this->logError('No Buchungstyp found for Studiengebühr Anzahlung'); + } + } + } + } + elseif ($row_ps->laststatus == 'Abgewiesener') + { + $resultNiedrPrios = $db->execReadOnlyQuery($qryNiedrPrios); + + if (hasdata($resultNiedrPrios)) + { + foreach ($resultNiedrPrios->retval as $rowNiedrPrios) + { + // Mail zur Info an Assistenz schicken, dass in höherer Prio abgewiesen wurde + $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AbgewiesenHoeherePrio'][] + = $rowNiedrPrios->nachname . ' ' . $rowNiedrPrios->vorname . ' (' . $rowNiedrPrios->prestudent_id . ')'; } } } @@ -1015,6 +1060,19 @@ class ReihungstestJob extends CLI_Controller } $mailcontent .= ''; } + if (isset($value['AbgewiesenHoeherePrio']) && !isEmptyArray($value['AbgewiesenHoeherePrio'])) + { + $mailcontent .= '

+ Folgende Bewerber wurden in einem höher priorisierten Studiengang abgewiesen:

'; + $mailcontent .= ''; + $mailcontent .= ' '; + sort($value['AbgewiesenHoeherePrio']); + foreach ($value['AbgewiesenHoeherePrio'] AS $key=>$bewerber) + { + $mailcontent .= ''; + } + $mailcontent .= '
'.$bewerber.'
'; + } if ($bcc != '' && isset($value['AbgewiesenWeilBewerber']) && !isEmptyArray($value['AbgewiesenWeilBewerber'])) { $mailcontent .= '

From 94d335600cc5082ffba8c2facb28b627fd9b1c2a Mon Sep 17 00:00:00 2001 From: Paolo Date: Tue, 16 Feb 2021 21:21:11 +0100 Subject: [PATCH 2/3] - Added new protected method getOldestJob to JQW_Controller - Added new public method getOldestJob to JobsQueueLib --- application/core/JQW_Controller.php | 13 +++++++++++++ application/libraries/JobsQueueLib.php | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/application/core/JQW_Controller.php b/application/core/JQW_Controller.php index 72a2a972b..1b78a2a70 100644 --- a/application/core/JQW_Controller.php +++ b/application/core/JQW_Controller.php @@ -47,6 +47,19 @@ abstract class JQW_Controller extends JOB_Controller return $jobs; } + /** + * To get the oldest added job using the given job type + */ + protected function getOldestJob($type) + { + $jobs = $this->jobsqueuelib->getOldestJob($type); + + // If an error occurred then log it in database + if (isError($jobs)) $this->logError(getError($jobs), $type); + + return $jobs; + } + /** * To get all the jobs specified by the given parameters */ diff --git a/application/libraries/JobsQueueLib.php b/application/libraries/JobsQueueLib.php index 0eb7c9b72..a65bb0d29 100644 --- a/application/libraries/JobsQueueLib.php +++ b/application/libraries/JobsQueueLib.php @@ -56,6 +56,19 @@ class JobsQueueLib return $this->_ci->JobsQueueModel->loadWhere(array('status' => self::STATUS_NEW, 'type' => $type)); } + /** + * To get the oldest added jobs using the given job type + */ + public function getOldestJob($type) + { + $this->_ci->JobsQueueModel->resetQuery(); + + $this->_ci->JobsQueueModel->addOrder('creationtime', 'ASC'); + $this->_ci->JobsQueueModel->addLimit('1'); + + return $this->_ci->JobsQueueModel->loadWhere(array('status' => self::STATUS_NEW, 'type' => $type)); + } + /** * To get all the jobs specified by the given parameters */ From eb95421ff9d607358a650fb5c160f95e590dc84a Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Thu, 18 Feb 2021 04:26:54 +0100 Subject: [PATCH 3/3] ReihungstestJob.php: formatted sql --- application/controllers/jobs/ReihungstestJob.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/application/controllers/jobs/ReihungstestJob.php b/application/controllers/jobs/ReihungstestJob.php index 46e889650..ab6c429a0 100644 --- a/application/controllers/jobs/ReihungstestJob.php +++ b/application/controllers/jobs/ReihungstestJob.php @@ -826,8 +826,7 @@ class ReihungstestJob extends JOB_Controller AND tbl_studiengang.typ IN ('b', 'm') ) SELECT * FROM prst - WHERE - prestudenstatus_datum >= (SELECT CURRENT_DATE - 1) + WHERE prestudenstatus_datum >= (SELECT CURRENT_DATE - 1) AND (studiengang_typ = 'b' OR (studiengang_typ = 'm' AND EXISTS (SELECT 1 /* Master Studiengänge berücksichtigen wenn auch Bachelor im gleichen Semester */ FROM prst prstb WHERE studiengang_typ = 'b'