mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-16 22:42:16 +00:00
PrestudentstatusCheckLib: status history
This commit is contained in:
@@ -17,6 +17,8 @@ class PrestudentstatusCheckLib
|
||||
private $_statusAbfolgeVorStudent = [self::INTERESSENT_STATUS, self::BEWERBER_STATUS, self::AUFGENOMMENER_STATUS];
|
||||
private $_endStatusArr = [self::ABSOLVENT_STATUS, self::ABBRECHER_STATUS];
|
||||
|
||||
private $_cache_history = [];
|
||||
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
@@ -140,7 +142,7 @@ class PrestudentstatusCheckLib
|
||||
*
|
||||
* @param integer $prestudent_id
|
||||
*
|
||||
* @return boolean
|
||||
* @return stdClass
|
||||
*/
|
||||
public function checkIfExistingStudentRolle($prestudent_id)
|
||||
{
|
||||
@@ -265,9 +267,10 @@ class PrestudentstatusCheckLib
|
||||
/**
|
||||
* Check if Bismeldestichtag erreicht
|
||||
*
|
||||
* @param DateTime $datum
|
||||
* @param DateTime $statusDatum
|
||||
* @param string $studiensemester_kurzbz
|
||||
*
|
||||
* @return boolean
|
||||
* @return stdClass
|
||||
*/
|
||||
public function checkIfMeldestichtagErreicht($statusDatum, $studiensemester_kurzbz = null)
|
||||
{
|
||||
@@ -279,6 +282,319 @@ class PrestudentstatusCheckLib
|
||||
return success(getData($result) == "1");
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs all checks on Status History and saves it in cache.
|
||||
*
|
||||
* @param integer $prestudent_id
|
||||
* @param string $status_kurzbz
|
||||
* @param DateTime $new_date
|
||||
* @param string $new_studiensemester_kurzbz
|
||||
* @param integer $new_ausbildungssemester
|
||||
* @param string $old_studiensemester_kurzbz
|
||||
* @param integer $old_ausbildungssemester
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
protected function prepareStatusHistory(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
) {
|
||||
// Generate key for caching
|
||||
$primary = implode('|', [
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date->format('Y-m-d'),
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
]);
|
||||
|
||||
if (isset($this->_cache_history[$primary]))
|
||||
return $this->_cache_history[$primary];
|
||||
|
||||
$this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||
|
||||
// Get the history
|
||||
$result = $this->_ci->PrestudentstatusModel->getHistoryWithNewOrEditedState(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
|
||||
if (!hasData($result))
|
||||
return error('This is impossible');
|
||||
|
||||
$history = getData($result);
|
||||
$historyCount = count($history);
|
||||
|
||||
// Run checks
|
||||
$checks = [
|
||||
'timesequence' => true,
|
||||
'laststatus' => true,
|
||||
'unterbrechersemester' => true,
|
||||
'abbrechersemester' => true,
|
||||
'diplomant' => true
|
||||
];
|
||||
|
||||
for ($n = 0, $c = 1; $c < $historyCount; $n++, $c++) {
|
||||
if (!$checks['timesequence']
|
||||
&& !$checks['laststatus']
|
||||
&& !$checks['unterbrechersemester']
|
||||
&& !$checks['abbrechersemester']
|
||||
&& !$checks['diplomant']
|
||||
)
|
||||
break; // early out
|
||||
|
||||
$next = $history[$n];
|
||||
$current = $history[$c];
|
||||
|
||||
// Zeitabfolge ungültig?
|
||||
if ($checks['timesequence']
|
||||
&& $next->start < $current->start
|
||||
)
|
||||
$checks['timesequence'] = false;
|
||||
|
||||
// Abbrecher- oder Absolventenstatus muss Endstatus sein
|
||||
if ($checks['laststatus']
|
||||
&& in_array($current->status_kurzbz, ['Absolvent', 'Abbrecher'])
|
||||
)
|
||||
$checks['laststatus'] = false;
|
||||
|
||||
// wenn Unterbrecher auf Unterbrecher folgt, muss Ausbildungssemester gleich sein
|
||||
if ($checks['unterbrechersemester']
|
||||
&& $current->status_kurzbz == 'Unterbrecher'
|
||||
&& $next->status_kurzbz == 'Unterbrecher'
|
||||
&& $current->ausbildungssemester != $next->ausbildungssemester
|
||||
)
|
||||
$checks['unterbrechersemester'] = false;
|
||||
|
||||
// wenn Abbrecher auf Unterbrecher folgt, muss Ausbildungssemester gleich sein
|
||||
if ($checks['abbrechersemester']
|
||||
&& $current->status_kurzbz == 'Unterbrecher'
|
||||
&& $next->status_kurzbz == 'Abbrecher'
|
||||
&& $current->ausbildungssemester != $next->ausbildungssemester
|
||||
)
|
||||
$checks['abbrechersemester'] = false;
|
||||
|
||||
// keine Studenten nach Diplomand Status
|
||||
if ($checks['diplomant']
|
||||
&& $current->status_kurzbz == 'Diplomand'
|
||||
&& $next->status_kurzbz == 'Student'
|
||||
)
|
||||
$checks['diplomant'] = false;
|
||||
}
|
||||
|
||||
$this->_cache_history[$primary] = success($checks);
|
||||
|
||||
return success($checks);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the time sequence of the status history is valid.
|
||||
*
|
||||
* @param integer $prestudent_id
|
||||
* @param string $status_kurzbz
|
||||
* @param DateTime $new_date
|
||||
* @param string $new_studiensemester_kurzbz
|
||||
* @param integer $new_ausbildungssemester
|
||||
* @param string $old_studiensemester_kurzbz
|
||||
* @param integer $old_ausbildungssemester
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function checkStatusHistoryTimesequence(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
) {
|
||||
$result = $this->prepareStatusHistory(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
|
||||
return success(getData($result)['timesequence']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the last status of the status history is not Abbrecher or
|
||||
* Absolvent.
|
||||
*
|
||||
* @param integer $prestudent_id
|
||||
* @param string $status_kurzbz
|
||||
* @param DateTime $new_date
|
||||
* @param string $new_studiensemester_kurzbz
|
||||
* @param integer $new_ausbildungssemester
|
||||
* @param string $old_studiensemester_kurzbz
|
||||
* @param integer $old_ausbildungssemester
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function checkStatusHistoryLaststatus(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
) {
|
||||
$result = $this->prepareStatusHistory(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
|
||||
return success(getData($result)['laststatus']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if two consecutively Unterbrecher have the same
|
||||
* ausbildungssemester in the status history.
|
||||
*
|
||||
* @param integer $prestudent_id
|
||||
* @param string $status_kurzbz
|
||||
* @param DateTime $new_date
|
||||
* @param string $new_studiensemester_kurzbz
|
||||
* @param integer $new_ausbildungssemester
|
||||
* @param string $old_studiensemester_kurzbz
|
||||
* @param integer $old_ausbildungssemester
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function checkStatusHistoryUnterbrechersemester(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
) {
|
||||
$result = $this->prepareStatusHistory(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
|
||||
return success(getData($result)['unterbrechersemester']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if an Unterbrecher followed by an Abbrecher have the same
|
||||
* ausbildungssemester in the status history.
|
||||
*
|
||||
* @param integer $prestudent_id
|
||||
* @param string $status_kurzbz
|
||||
* @param DateTime $new_date
|
||||
* @param string $new_studiensemester_kurzbz
|
||||
* @param integer $new_ausbildungssemester
|
||||
* @param string $old_studiensemester_kurzbz
|
||||
* @param integer $old_ausbildungssemester
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function checkStatusHistoryAbbrechersemester(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
) {
|
||||
$result = $this->prepareStatusHistory(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
|
||||
return success(getData($result)['abbrechersemester']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if no Diplomant is followed by a Student in the status history.
|
||||
*
|
||||
* @param integer $prestudent_id
|
||||
* @param string $status_kurzbz
|
||||
* @param DateTime $new_date
|
||||
* @param string $new_studiensemester_kurzbz
|
||||
* @param integer $new_ausbildungssemester
|
||||
* @param string $old_studiensemester_kurzbz
|
||||
* @param integer $old_ausbildungssemester
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function checkStatusHistoryDiplomant(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
) {
|
||||
$result = $this->prepareStatusHistory(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
|
||||
return success(getData($result)['diplomant']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if History of StatusData is valid
|
||||
* @param integer $prestudent_id
|
||||
|
||||
@@ -629,4 +629,73 @@ class Prestudentstatus_model extends DB_Model
|
||||
'tbl_prestudentstatus.prestudent_id' => $prestudent_id
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets status history of a prestudent for checking purposes.
|
||||
* This function adds the new state or replaces the edited.
|
||||
*
|
||||
* @param integer $prestudent_id
|
||||
* @param string $status_kurzbz
|
||||
* @param DateTime $new_date
|
||||
* @param string $new_studiensemester_kurzbz
|
||||
* @param integer $new_ausbildungssemester
|
||||
* @param string $old_studiensemester_kurzbz
|
||||
* @param integer $old_ausbildungssemester
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function getHistoryWithNewOrEditedState(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_date,
|
||||
$new_studiensemester_kurzbz,
|
||||
$new_ausbildungssemester,
|
||||
$old_studiensemester_kurzbz,
|
||||
$old_ausbildungssemester
|
||||
) {
|
||||
$new_date = $new_date->format('Y-m-d');
|
||||
|
||||
$this->addSelect('status_kurzbz');
|
||||
$this->addSelect('studiensemester_kurzbz');
|
||||
$this->addSelect('ausbildungssemester');
|
||||
$this->addSelect('datum');
|
||||
$this->addSelect('insertamum');
|
||||
$this->addSelect('ext_id');
|
||||
|
||||
if ($old_studiensemester_kurzbz || $old_ausbildungssemester) {
|
||||
$this->db->not_group_start();
|
||||
$this->db->where('status_kurzbz', $status_kurzbz);
|
||||
$this->db->where('studiensemester_kurzbz', $old_studiensemester_kurzbz);
|
||||
$this->db->where('ausbildungssemester', $old_ausbildungssemester);
|
||||
$this->db->group_end();
|
||||
}
|
||||
|
||||
$this->db->where('prestudent_id', $prestudent_id);
|
||||
|
||||
$tmpTable = $this->db->get_compiled_select($this->dbTable);
|
||||
|
||||
$tmpTable .= "UNION
|
||||
SELECT " .
|
||||
$this->escape($status_kurzbz) . " AS status_kurzbz, " .
|
||||
$this->escape($new_studiensemester_kurzbz) . " AS studiensemester_kurzbz, " .
|
||||
$this->escape($new_ausbildungssemester) . " AS ausbildungssemester, " .
|
||||
$this->escape($new_date) . "::date AS datum," .
|
||||
$this->escape(date('c')) . "::date AS insertamum," .
|
||||
"NULL AS ext_id";
|
||||
|
||||
$this->addJoin('public.tbl_studiensemester sem', 'studiensemester_kurzbz');
|
||||
|
||||
$this->addOrder('s.datum', 'DESC');
|
||||
$this->addOrder('s.insertamum', 'DESC');
|
||||
$this->addOrder('s.ext_id', 'DESC');
|
||||
|
||||
$dbTable = $this->dbTable;
|
||||
$this->dbTable = "(" . $tmpTable . ") s";
|
||||
|
||||
$result = $this->load();
|
||||
|
||||
$this->dbTable = $dbTable;
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user