Merge branch 'master' into feature-39161/PV21_Valorisierung

This commit is contained in:
Harald Bamberger
2024-09-13 12:39:05 +02:00
117 changed files with 21695 additions and 307 deletions
@@ -1,7 +1,6 @@
<?php
class Bismeldestichtag_model extends DB_Model
{
/**
* Constructor
*/
@@ -12,6 +11,88 @@ class Bismeldestichtag_model extends DB_Model
$this->pk = 'meldestichtag_id';
}
public function getLastReachedMeldestichtag($studiensemester_kurzbz = null)
{
$this->addSelect('meldestichtag_id');
$this->addSelect('meldestichtag');
$this->addSelect('studiensemester_kurzbz');
$this->addSelect('insertamum');
$this->addSelect('insertvon');
$this->addSelect('updateamum');
$this->addSelect('updatevon');
if ($studiensemester_kurzbz) {
$this->db->where('studiensemester_kurzbz', $studiensemester_kurzbz);
}
$this->addOrder('meldestichtag', 'DESC');
$this->addLimit(1);
return $this->loadWhere([
'meldestichtag < NOW()' => null
]);
}
/**
* Prüft, ob Meldestichtag für ein bestimmtes Statusdatum und Studiensemester erreicht ist.
*
* @param $status_datum
* @return boolean true wenn erreicht, oder false
*/
public function checkIfMeldestichtagErreicht($status_datum, $studiensemester_kurzbz = null)
{
$erreicht = false;
if (isset($studiensemester_kurzbz))
{
// Studiensemesterende holen
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$result = $this->StudiensemesterModel->loadWhere(
array(
'studiensemester_kurzbz' => $studiensemester_kurzbz
)
);
if(isError($result))
{
return $result;
}
$result = current(getData($result));
$studiensemester_ende = new DateTime($result->ende);
}
// letztes erreichtes Bismeldedatum holen
$result = $this->getLastReachedMeldestichtag();
if (isError($result))
{
return $result;
}
if (!hasData($result)) {
return success("0",'No Statusdata vorhanden');
}
$stichtag = current(getData($result));
$stichtag = new DateTime($stichtag->meldestichtag);
$statusDatum = new DateTime($status_datum);
// Prüfen, ob Studentstatusdatum oder Studiensemester vor dem Stichtagsdatum liegen
if (isset($statusDatum))
{
if (isset($stichtag))
$erreicht = $statusDatum < $stichtag;
}
if (isset($studiensemester_ende))
{
$erreicht = $erreicht || $studiensemester_ende < $stichtag;
}
if ($erreicht)
return success("1", "Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht hinzugefügt werden");
return success("0", "Meldestatus nicht erreicht");
}
/**
* Gets last Bismeldestichtag for a Studiensemester.
* @param $studiensemester_kurzbz
@@ -19,4 +19,13 @@ class Gemeinde_model extends DB_Model
return $this->loadWhere(array("plz" => $plz));
}
public function checkLocation($plz, $gemeinde, $ort)
{
$this->db->where('ortschaftsname', $ort);
$this->db->where('name', $gemeinde);
$this->db->where('plz', $plz);
return (boolean)$this->db->count_all_results($this->dbTable);
}
}
+215
View File
@@ -1,4 +1,7 @@
<?php
use CI3_Events as Events;
class Konto_model extends DB_Model
{
@@ -12,6 +15,218 @@ class Konto_model extends DB_Model
$this->pk = 'buchungsnr';
}
/**
* Insert Data into DB-Table
*
* @param array $data DataArray for Insert
* @return stdClass
*/
public function insert($data, $encryptedColumns = null)
{
if (isset($data['buchungsnr_verweis']) && $data['buchungsnr_verweis'])
return parent::insert($data, $encryptedColumns);
$this->db->trans_begin();
$result = parent::insert($data, $encryptedColumns);
if (isError($result)) {
$this->db->trans_rollback();
return $result;
}
$buchungsnr = $result->retval;
// If studiengang_kz is not present in $data it will fail above since it is a not null field
$studiengang_kz = $data['studiengang_kz'];
$zahlungsreferenz = false;
Events::trigger('generate_zahlungsreferenz', $buchungsnr, $data, function ($value) use ($zahlungsreferenz) {
$zahlungsreferenz = $value;
});
if ($zahlungsreferenz === false) {
$result = $this->execQuery('SELECT UPPER(oe_kurzbz) || ? as zahlungsreferenz
FROM public.tbl_studiengang
WHERE studiengang_kz=?', [$buchungsnr, $studiengang_kz]);
if (isError($result)) {
$this->db->trans_rollback();
return $result;
}
$zahlungsreferenz = current(getData($result))->zahlungsreferenz;
} elseif (isError($zahlungsreferenz)) {
$this->db->trans_rollback();
return $zahlungsreferenz;
}
$result = $this->update($buchungsnr, [
'zahlungsreferenz' => $zahlungsreferenz
]);
if (isError($result)) {
$this->db->trans_rollback();
return $result;
}
$this->db->trans_commit();
return success($buchungsnr);
}
/**
* Delete data from DB-Table
*
* @param string $id Primary Key for DELETE
*
* @return stdClass
*/
public function delete($id)
{
$this->db->where('buchungsnr_verweis', $id);
if ($this->db->count_all_results($this->dbTable))
return error('Bitte zuerst die zugeordneten Buchungen loeschen', 42);
return parent::delete($id);
}
/**
* Adds additional fields to the Query
*
* @return Konto_model
*/
public function withAdditionalInfo()
{
$this->addSelect($this->dbTable . '.*');
$this->addSelect('UPPER(typ::varchar(1) || kurzbz) AS kuerzel');
$this->addSelect('person.anrede');
$this->addSelect('person.titelpost');
$this->addSelect('person.titelpre');
$this->addSelect('person.vorname');
$this->addSelect('person.vornamen');
$this->addSelect('person.nachname');
$this->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
$this->addJoin('public.tbl_person person', 'person_id', 'LEFT');
Events::trigger('konto_query');
return $this;
}
/**
* Get all accounting entries for a person optionally filtered by Studiengang
*
* @param integer|array $person_id
* @param string (optional) $studiengang_kz
*
* @return stdClass
*/
public function getAlleBuchungen($person_id, $studiengang_kz = '')
{
$this->withAdditionalInfo();
$this->addOrder('buchungsdatum');
if (is_array($person_id))
$this->db->where_in('person_id', $person_id);
else
$this->db->where('person_id', $person_id);
if ($studiengang_kz)
return $this->loadWhere([
'studiengang_kz' => $studiengang_kz
]);
return $this->load();
}
/**
* Get all open accounting entries for a person optionally filtered by Studiengang
*
* @param integer|array $person_id
* @param string (optional) $studiengang_kz
*
* @return stdClass
*/
public function getOffeneBuchungen($person_id, $studiengang_kz = '')
{
$this->addSelect('buchungsnr');
$this->db->where('(betrag + (
SELECT CASE WHEN sum(betrag) is null THEN 0 ELSE sum(betrag) END
FROM ' . $this->dbTable . '
WHERE buchungsnr_verweis=konto_a.buchungsnr
)) !=', 0, false);
if (is_array($person_id))
$this->db->where_in('person_id', $person_id);
else
$this->db->where('person_id', $person_id);
$sql = $this->db->get_compiled_select($this->dbTable . ' konto_a');
$this->db->group_start();
$this->db->where_in('buchungsnr', $sql, false);
$this->db->or_where_in('buchungsnr_verweis', $sql, false);
$this->db->group_end();
return $this->getAlleBuchungen($person_id, $studiengang_kz);
}
/**
* Check double Buchungen
*
* @param array $person_ids
* @param string $studiensemester_kurzbz
* @param array $buchungstyp_kurzbzs
*
* @return stdClass
*/
public function checkDoubleBuchung($person_ids, $studiensemester_kurzbz, $buchungstyp_kurzbzs)
{
$this->addSelect('vorname');
$this->addSelect('nachname');
$this->addJoin('public.tbl_person', 'person_id');
$this->db->where_in('person_id', $person_ids);
$this->db->where_in('buchungstyp_kurzbz', $buchungstyp_kurzbzs);
$this->addGroupBy('vorname, nachname');
$this->addOrder('nachname');
$this->addOrder('vorname');
return $this->loadWhere([
'studiensemester_kurzbz' => $studiensemester_kurzbz
]);
}
/**
* Berechnet den offenen Betrag einer Buchung
*
* @param integer $buchungsnr
*
* @return stdClass
*/
public function getDifferenz($buchungsnr)
{
$this->addSelect('buchungsnr_verweis');
$this->db->where('buchungsnr', $buchungsnr);
$sql = $this->db->get_compiled_select($this->dbTable);
$this->addSelect('buchungsnr_verweis');
$this->db->where('buchungsnr', $buchungsnr);
$this->db->or_where('buchungsnr_verweis', '(' . $sql . ')', false);
$sql = $this->db->get_compiled_select($this->dbTable);
$this->addSelect('sum(betrag) differenz');
$this->db->where('buchungsnr', $buchungsnr);
$this->db->or_where('buchungsnr_verweis', $buchungsnr);
$this->db->or_where('buchungsnr', '(' . $sql . ')', false);
$result = $this->load();
if (isError($result))
return $result;
if (!hasData($result))
return success(null);
return success(current(getData($result))->differenz * -1);
}
/**
* Sets a Payment as paid
*/
@@ -14,6 +14,39 @@ class Prestudent_model extends DB_Model
$this->load->model('crm/prestudentstatus_model', 'PrestudentstatusModel');
}
/**
* Update Data in DB-Table
*
* @param string $id PK for DB-Table
* @param array $data DataArray for Insert
* @return array
*/
public function update($id, $data, $encryptedColumns = null)
{
if (isset($data['zgvmas_code'])
|| isset($data['zgvmanation'])
|| isset($data['zgv_code'])
|| isset($data['zgvnation'])
) {
/**
* Falls ZGV vorhanden, setze Ausstellungsstaat (für BIS-Meldung)
* auf Nation der höchsten angegebenen ZGV
*/
$case = '(CASE
WHEN zgvmas_code IS NOT NULL AND zgvmanation IS NOT NULL THEN zgvmanation
WHEN zgv_code IS NOT NULL AND zgvnation IS NOT NULL THEN zgvnation
ELSE NULL END)';
foreach (['zgvmas_code', 'zgvmanation', 'zgv_code', 'zgvnation'] as $key)
if (isset($data[$key]))
$case = str_replace($key, $this->escape($data[$key]), $case);
$this->db->set('ausstellungsstaat', $case, false);
}
return parent::update($id, $data, $encryptedColumns);
}
/**
* getLastStatuses
*/
@@ -700,4 +733,33 @@ class Prestudent_model extends DB_Model
return $this->execQuery($query, array($prestudent_id));
}
/**
* Gets history of all prestudents, person_id given
* @param int $person_id
* @return object
*/
public function getHistoryPrestudents($person_id)
{
$query = "
SELECT ps.studiensemester_kurzbz, p.priorisierung, p.studiengang_kz, sg.kurzbzlang, ps.orgform_kurzbz,
ps.status_kurzbz, s.student_uid, sp.bezeichnung, ps.ausbildungssemester,
CONCAT(ps.status_kurzbz, ' (', ps.ausbildungssemester, '. Semester)') as status, p.prestudent_id
FROM public.tbl_prestudent p
JOIN (
SELECT DISTINCT ON(prestudent_id) *
FROM public.tbl_prestudentstatus
WHERE prestudent_id IN (SELECT prestudent_id FROM public.tbl_prestudent WHERE person_id = ?)
ORDER BY prestudent_id, datum desc, insertamum desc
) ps USING(prestudent_id)
JOIN public.tbl_status USING(status_kurzbz)
LEFT JOIN public.tbl_status_grund g USING (statusgrund_id)
JOIN public.tbl_studiengang sg USING(studiengang_kz)
LEFT JOIN lehre.tbl_studienplan sp USING (studienplan_id)
LEFT JOIN public.tbl_student s USING (prestudent_id)
ORDER BY p.priorisierung
";
return $this->execQuery($query, array($person_id));
}
}
@@ -5,6 +5,15 @@ class Prestudentstatus_model extends DB_Model
const STATUS_ABBRECHER = 'Abbrecher';
const STATUS_UNTERBRECHER = 'Unterbrecher';
const STATUS_STUDENT = 'Student';
const STATUS_DIPLOMAND = 'Diplomand';
const STATUS_ABSOLVENT = 'Absolvent';
const STATUS_BEWERBER = 'Bewerber';
const STATUS_AUFGENOMMENER = 'Aufgenommener';
const STATUS_WARTENDER = 'Wartender';
const STATUS_ABGEWIESENER = 'Abgewiesener';
const STATUS_INTERESSENT = 'Interessent';
const STATUS_INCOMING = 'Incoming';
/**
* Constructor
@@ -330,13 +339,252 @@ class Prestudentstatus_model extends DB_Model
*/
public function withGrund($statusgrund_kurzbz)
{
if($statusgrund_kurzbz)
if ($statusgrund_kurzbz)
$this->db->set(
'statusgrund_id',
'(SELECT statusgrund_id FROM public.tbl_status_grund WHERE statusgrund_kurzbz =' . $this->db->escape($statusgrund_kurzbz) .')',
'(SELECT statusgrund_id FROM public.tbl_status_grund WHERE statusgrund_kurzbz=' . $this->db->escape($statusgrund_kurzbz) . ')',
false
);
return $this;
}
/**
* Check if there is only one prestudentstatus left
*
* @param integer $prestudent_id
* @param string $studiensemester_kurzbz
*
* @return stdClass
*/
public function checkIfLastStatusEntry($prestudent_id, $studiensemester_kurzbz = null)
{
$this->addSelect('COUNT(*) AS anzahl', false);
if ($studiensemester_kurzbz)
$this->db->where('studiensemester_kurzbz', $studiensemester_kurzbz);
$result = $this->loadWhere([
'prestudent_id' => $prestudent_id
]);
if (isError($result))
return $result;
$resultObject = current($result->retval);
$anzahl = (int)$resultObject->anzahl;
if ($anzahl <= 1)
return success(true, $this->p->t('lehre', 'error_lastRole'));
return success(false, $this->p->t('lehre', 'anzahl_existingRoles', ['anzahl' => $anzahl]));
}
public function getAllPrestudentstatiWithStudiensemester($prestudent_id)
{
$qry = "
SELECT
tbl_prestudentstatus.status_kurzbz,
tbl_prestudentstatus.studiensemester_kurzbz,
tbl_prestudentstatus.ausbildungssemester,
tbl_prestudentstatus.datum,
s.start AS studiensemester_start,
pl.orgform_kurzbz AS studienplan_orgform_kurzbz,
stud.matrikelnr,
pers.vorname,
pers.nachname
FROM
public.tbl_prestudentstatus
JOIN public.tbl_studiensemester s USING (studiensemester_kurzbz)
JOIN public.tbl_prestudent USING (prestudent_id)
JOIN public.tbl_person pers USING (person_id)
LEFT JOIN public.tbl_student stud USING (prestudent_id)
LEFT JOIN lehre.tbl_studienplan pl USING (studienplan_id)
WHERE
prestudent_id = ?
ORDER BY
public.tbl_prestudentstatus.datum DESC,
public.tbl_prestudentstatus.insertamum DESC,
public.tbl_prestudentstatus.ext_id DESC
";
return $this->execQuery($qry, array($prestudent_id));
}
/**
* Gets status history of a prestudent
* This function uses the language of the logged in user to
* translate the given statusgrund
*
* @param integer $prestudent_id
*
* @return stdClass
*/
public function getHistoryPrestudent($prestudent_id)
{
$lang= getUserLanguage();
$this->addSelect('tbl_prestudentstatus.prestudent_id');
$this->addSelect('tbl_prestudentstatus.status_kurzbz');
$this->addSelect('tbl_prestudentstatus.studiensemester_kurzbz');
$this->addSelect('tbl_prestudentstatus.ausbildungssemester');
$this->addSelect('tbl_prestudentstatus.datum');
$this->addSelect("TO_CHAR(tbl_prestudentstatus.datum::timestamp, 'DD.MM.YYYY') AS format_datum");
$this->addSelect('tbl_prestudentstatus.insertamum');
$this->addSelect('tbl_prestudentstatus.insertvon');
$this->addSelect('tbl_prestudentstatus.updateamum');
$this->addSelect('tbl_prestudentstatus.updatevon');
$this->addSelect('tbl_prestudentstatus.orgform_kurzbz');
$this->addSelect('tbl_prestudentstatus.bestaetigtam');
$this->addSelect("TO_CHAR(tbl_prestudentstatus.bestaetigtam::timestamp, 'DD.MM.YYYY') AS format_bestaetigtam");
$this->addSelect('tbl_prestudentstatus.bestaetigtvon');
$this->addSelect('tbl_prestudentstatus.bewerbung_abgeschicktamum');
$this->addSelect("TO_CHAR(tbl_prestudentstatus.bewerbung_abgeschicktamum::timestamp, 'DD.MM.YYYY') AS format_bewerbung_abgeschicktamum");
$this->addSelect('tbl_prestudentstatus.anmerkung');
$this->addSelect('plan.studienplan_id');
$this->addSelect('plan.bezeichnung');
$this->addSelect('grund.beschreibung[(
SELECT index
FROM public.tbl_sprache
WHERE sprache=' . $this->escape($lang) . '
)] AS statusgrund_bezeichnung', false);
$this->addSelect("CASE
WHEN s.student_uid IS NOT NULL
AND tbl_prestudentstatus.status_kurzbz IN (" . implode(",", $this->escape([
'Student',
'Diplomand',
'Abbrecher',
'Absolvent',
'Ausserodentlicher',
'Incoming',
'Outgoing',
'Unterbrecher'
])) . ")
THEN lv.semester || lv.verband || lv.gruppe
ELSE '-'
END AS lehrverband", false);
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('public.tbl_status_grund grund', 'statusgrund_id', 'LEFT');
$this->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
$this->addJoin(
'public.tbl_studentlehrverband lv',
's.student_uid IS NOT NULL AND s.student_uid=lv.student_uid AND tbl_prestudentstatus.studiensemester_kurzbz=lv.studiensemester_kurzbz',
'LEFT'
);
$this->addOrder('tbl_prestudentstatus.datum', 'DESC');
$this->addOrder('tbl_prestudentstatus.insertamum', 'DESC');
$this->addOrder('tbl_prestudentstatus.ext_id', 'DESC');
return $this->loadWhere([
'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;
}
/**
* For checks if Orgform of Student status and Bewerber status match.
* Returns any Bewerber status that does not match the first Student
* status' Orgform.
*
* @param integer $prestudent_id
*
* @return stdClass
*/
public function getBewerberWhereOrgformNotStudent($prestudent_id)
{
$this->addSelect('plan.orgform_kurzbz');
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addOrder('tbl_prestudentstatus.datum', 'DESC');
$this->addOrder('tbl_prestudentstatus.insertamum', 'DESC');
$this->addOrder('tbl_prestudentstatus.ext_id', 'DESC');
$this->addLimit(1);
$this->db->where('prestudent_id', $prestudent_id);
$this->db->where('status_kurzbz', self::STATUS_STUDENT);
$sql = $this->db->get_compiled_select($this->dbTable);
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->db->where('plan.orgform_kurzbz !=', '(' . $sql . ')', false);
return $this->loadWhere([
'prestudent_id' => $prestudent_id,
'status_kurzbz' => self::STATUS_BEWERBER
]);
}
}
+17
View File
@@ -11,4 +11,21 @@ class Status_model extends DB_Model
$this->dbTable = 'public.tbl_status';
$this->pk = 'status_kurzbz';
}
public function getAllStatiWithStatusgruende()
{
$lang = '[(SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()) . ' LIMIT 1)]';
$this->addSelect('sg.status_kurzbz');
$this->addSelect('statusgrund_id');
$this->addSelect('sg.bezeichnung_mehrsprachig' . $lang . ' AS bezeichnung');
$this->addSelect('sg.beschreibung' . $lang . ' AS beschreibung');
$this->addJoin('public.tbl_status_grund sg', 'ON (sg.status_kurzbz = public.tbl_status.status_kurzbz)', 'LEFT');
return $this->loadWhere([
'aktiv'=> true,
]);
}
}
@@ -27,4 +27,19 @@ class Statusgrund_model extends DB_Model
return success($status->retval);
}
public function getAktiveGruende()
{
$lang = '[(SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()) . ' LIMIT 1)]';
$this->addSelect('tbl_status_grund.*');
$this->addSelect('bezeichnung_mehrsprachig' . $lang . ' AS bezeichnung');
$this->addSelect('beschreibung' . $lang . ' AS beschreibung');
$this->addOrder('bezeichnung_mehrsprachig' . $lang);
return $this->loadWhere([
'aktiv' => true
]);
}
}
+166 -1
View File
@@ -1,4 +1,8 @@
<?php
use \InvalidArgumentException as InvalidArgumentException;
use \CI3_Events as Events;
class Student_model extends DB_Model
{
@@ -43,9 +47,169 @@ class Student_model extends DB_Model
$max = 0;
$max += 1;
return $matrikelnummer.sprintf("%03d", $max);
}
/**
* Generiert die Matrikelnummer
* FORMAT: 0710254001
* 07 = Jahr
* 1/2/0 = WS/SS/incoming
* 0254 = Studiengangskennzahl vierstellig
* 001 = Laufende Nummer
* copy of generateMatrikelnummer plus
* logic FH Burgenland
*
* TODO(chris): replace function above with this?
* TODO(chris): rename to generatePersonenkennzeichen?
*
* @param integer $studiengang_kz
* @param string $studiensemester_kurzbz
* @param string $typ
*
* @return stdClass
*/
public function generateMatrikelnummer2($studiengang_kz, $studiensemester_kurzbz, $typ = null)
{
$personenkennzeichen = false;
Events::trigger(
'generate_personenkennzeichen',
function ($value) use ($personenkennzeichen) {
$personenkennzeichen = $value;
},
$studiengang_kz,
$studiensemester_kurzbz,
$typ
);
if ($personenkennzeichen !== false)
return success($personenkennzeichen);
// Validierung der Eingabewerte
if (strlen($studiensemester_kurzbz) < 6) {
throw new InvalidArgumentException("Ungültiges studiensemester_kurzbz Format.");
}
$jahr = mb_substr($studiensemester_kurzbz, 4);
$art = substr($studiensemester_kurzbz, 0, 2);
if (($studiengang_kz < 0) || (isset($typ) && ($typ == 'l')))
{
$studiengang_kz=abs($studiengang_kz);
//Lehrgang
switch($art)
{
case 'WS':
$art = '3';
break;
case 'SS':
$art = '4';
break;
default:
$art = '0';
break;
}
}
else
{
//Studiengang
switch($art)
{
case 'WS':
$art = '1';
break;
case 'SS':
$art = '2';
break;
default:
$art = '0';
break;
}
}
if($art=='2' || $art=='4')
$jahr = $jahr-1;
//FH-Burgenland - weil leider die AO Studiengänge aufgeteilt sind
//(AO sind normal 9+erhalter Nummer, matrikelnr/personenkz wird auch im DVUH Extension berücksichtigt)
if ($studiengang_kz >= 90010 && $studiengang_kz <= 90019)
{
$matrikelnummer = sprintf("%02d", $jahr).$art.substr($studiengang_kz, 0, 4);
}
else
{
$matrikelnummer = sprintf("%02d", $jahr).$art.sprintf("%04d", $studiengang_kz);
}
$qry = "SELECT matrikelnr FROM public.tbl_student WHERE matrikelnr LIKE ? ORDER BY matrikelnr DESC LIMIT 1";
$matrikelnrres = $this->execQuery($qry, array($matrikelnummer.'%'));
$max = 0;
if ($matrikelnrres && hasData($matrikelnrres)) {
$max = mb_substr($matrikelnrres->retval[0]->matrikelnr, 7);
if (!is_numeric($max)) {
$max = (int)$max;
}
}
$max += 1;
return success($matrikelnummer.sprintf("%03d", $max));
}
/**
* Generiert die UID
* FORMAT: el07b001
* $stgkzl: el = studiengangskuerzel
* $jahr: 07 = Jahr
* $stgtyp: b/m/d/x = Bachelor/Master/Diplom/Incoming
* $matrikelnummer
* 001 = Laufende Nummer Wenn StSem==SS dann wird zur Nummer 500 dazugezaehlt
* Bei Incoming im Masterstudiengang wird auch 500 dazugezaehlt
*
* @param string $stgkzl
* @param string $jahr
* @param string $stgtyp
* @param string $matrikelnummer
* @param string $vorname
* @param string $nachname
*
* @return stdClass
*/
public function generateUID($stgkzl, $jahr, $stgtyp, $matrikelnummer, $vorname, $nachname)
{
$uid = false;
Events::trigger(
'generate_student_uid',
function ($value) use ($uid) {
$uid = $value;
},
$stgkzl,
$jahr,
$stgtyp,
$matrikelnummer,
$vorname,
$nachname
);
if ($uid !== false)
return success($uid);
$art = mb_substr($matrikelnummer, 2, 1);
$nr = mb_substr($matrikelnummer, mb_strlen(trim($matrikelnummer))-3);
if($art=='2') //Sommersemester
$nr = $nr+500;
elseif($art=='0' && $stgtyp=='m') //Incoming im Masterstudiengang
$nr = $nr+500;
elseif($art=='4' && $stgtyp=='l') // Lehrgangsteilnehmer im Sommersemester
$nr = $nr+500;
return success(mb_strtolower($stgkzl.$jahr.($art!='0'?$stgtyp:'x').$nr));
}
/**
* Get students UID by PrestudentID.
* @param $prestudent_id
@@ -78,7 +242,8 @@ class Student_model extends DB_Model
OR lower(person.nachname) like ".$this->db->escape('%'.$filter.'%')."
OR lower(person.vorname) like ".$this->db->escape('%'.$filter.'%')."
OR lower(person.nachname || ' ' || person.vorname) like ".$this->db->escape('%'.$filter.'%')."
OR lower(person.vorname || ' ' || person.nachname) like ".$this->db->escape('%'.$filter.'%'));
OR lower(person.vorname || ' ' || person.nachname) like ".$this->db->escape('%'.$filter.'%')
);
return $result;
}
@@ -0,0 +1,14 @@
<?php
class Gsstudientyp_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'bis.tbl_gsstudientyp';
$this->pk = 'gsstudientyp_kurzbz';
}
}
@@ -493,4 +493,11 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($qry, array($student_uid));
}
public function getStg($lehrveranstaltung_id)
{
$this->addSelect('stg.*');
$this->addJoin('public.tbl_studiengang stg', 'studiengang_kz');
return $this->load($lehrveranstaltung_id);
}
}
@@ -11,5 +11,7 @@ class Studentlehrverband_model extends DB_Model
$this->dbTable = 'public.tbl_studentlehrverband';
$this->pk = array('studiensemester_kurzbz', 'student_uid');
$this->hasSequence = false;
$this->load->model('crm/prestudentstatus_model', 'PrestudentstatusModel');
}
}
@@ -11,4 +11,34 @@ class Lehrverband_model extends DB_Model
$this->dbTable = 'public.tbl_lehrverband';
$this->pk = array('gruppe', 'verband', 'semester', 'studiengang_kz');
}
/**
* Gets the maximum possible semester for one or more Studiengaenge.
* If there are more than one Studiengang each maximum is calculated and
* the smallest result is returned.
*
* @param array $studiengang_kzs
*
* @return stdClass
*/
public function getMaxSemester($studiengang_kzs)
{
$sqls = [];
foreach ($studiengang_kzs as $studiengang_kz) {
$this->addSelect('MAX(semester) AS maxsem');
$this->db->where('studiengang_kz', $studiengang_kz);
$sqls[] = $this->db->get_compiled_select($this->dbTable);
}
$this->addSelect('MIN(a.maxsem) AS maxsem');
$dbTable = $this->dbTable;
$this->dbTable = '(' . implode(' UNION ', $sqls) . ') AS a';
$result = $this->load();
$this->dbTable = $dbTable;
return $result;
}
}
@@ -11,4 +11,29 @@ class Standort_model extends DB_Model
$this->dbTable = 'public.tbl_standort';
$this->pk = 'standort_id';
}
public function searchStandorte($filter)
{
$filter = strtoLower($filter);
$qry = "
SELECT
s.kurzbz, s.standort_id
FROM
public.tbl_standort s
WHERE
lower (s.kurzbz) LIKE '%". $this->db->escape_like_str($filter)."%'
OR
lower (s.bezeichnung) LIKE '%". $this->db->escape_like_str($filter)."%'";
return $this->execQuery($qry);
}
public function getStandorteByFirma($firma_id)
{
$this->addSelect("DISTINCT ON (standort_id) bezeichnung, standort_id");
return $this->loadWhere(array("firma_id" => $firma_id));
}
}
@@ -106,4 +106,32 @@ class Studienplan_model extends DB_Model
'tbl_studienplan_lehrveranstaltung.semester' => $semester
));
}
public function getAllOesForLv($lehrveranstaltung_id)
{
$this->addDistinct('oe_kurzbz');
$this->addJoin('lehre.tbl_studienplan_lehrveranstaltung lv', 'studienplan_id');
$this->addJoin('lehre.tbl_studienordnung', 'studienordnung_id');
$this->addJoin('public.tbl_studiengang', 'studiengang_kz');
return $this->loadWhere([
'lv.lehrveranstaltung_id' => $lehrveranstaltung_id
]);
}
public function getStudienplaeneByPrestudents($prestudent_id)
{
$this->addDistinct();
$this->addSelect($this->dbTable . '.*');
$this->addSelect('sem.start AS start_stsem');
$this->addJoin('lehre.tbl_studienordnung o', 'studienordnung_id');
$this->addJoin('public.tbl_prestudent p', 'studiengang_kz');
$this->addJoin('public.tbl_studiensemester sem', 'sem.studiensemester_kurzbz = o.gueltigvon', 'LEFT');
$this->addOrder('sem.start');
return $this->loadWhere([
'prestudent_id' => $prestudent_id
]);
}
}
@@ -13,35 +13,35 @@ class Studiensemester_model extends DB_Model
$this->hasSequence = false;
}
/**
* Get actual Studiensemester.
*
* @return array
*/
public function getAkt()
{
return $this->loadWhere(array(
'start <= ' => 'NOW()',
'ende >= ' => 'NOW()'
)
);
}
/**
* Get actual Studiensemester.
*
* @return array
*/
public function getAkt()
{
return $this->loadWhere(array(
'start <= ' => 'NOW()',
'ende >= ' => 'NOW()'
)
);
}
// Get next study semester
public function getNext()
{
$query = '
SELECT *
FROM
public.tbl_studiensemester
WHERE
start > now()
ORDER BY start
LIMIT 1;
';
{
$query = '
SELECT *
FROM
public.tbl_studiensemester
WHERE
start > now()
ORDER BY start
LIMIT 1;
';
return $this->execQuery($query);
}
return $this->execQuery($query);
}
/**
* getLastOrAktSemester
@@ -182,10 +182,10 @@ class Studiensemester_model extends DB_Model
return success(array());
$query = "
SELECT *
FROM public.tbl_studiensemester
WHERE ( ?::date < ende AND ?::date > start )
ORDER BY start DESC";
SELECT *
FROM public.tbl_studiensemester
WHERE ( ?::date < ende AND ?::date > start )
ORDER BY start DESC";
return $this->execQuery($query, array($from, $to));
}
@@ -200,7 +200,7 @@ class Studiensemester_model extends DB_Model
{
$query = "SELECT studiensemester_kurzbz, start, ende FROM public.vw_studiensemester
WHERE studiensemester_kurzbz <> ?
ORDER BY delta, start LIMIT 1";
ORDER BY delta, start LIMIT 1";
return $this->execQuery($query, array($studiensemester_kurzbz));
}
@@ -211,7 +211,46 @@ class Studiensemester_model extends DB_Model
FROM public.tbl_studiensemester
WHERE start >= NOW() OR (start <= NOW() AND ende >= NOW())
ORDER BY start';
return $this->execQuery($query);
}
/**
* Liefert ausgehend von heutigen Datum $plus studiensemester in die Zukunft und $minus Studiensemester in die Vergangenheit
*
* @param integer $plus Optional. Wieviele Studiensemester in die Zukunft sollen ausgegeben werden. Wenn NULL werden alle zukuenftigen geliefert.
* @param integer $minus Optional. Wieviele Studiensemester in die Vergangenheit sollen ausgegeben werden. Wenn NULL werden alle vergangenen geliefert.
*
* @return stdClass
*/
public function addPlusMinus($plus = null, $minus = null)
{
$this->addSelect($this->pk);
$this->addOrder('ende');
if ($plus)
$this->addLimit($plus);
$this->db->where('start >= NOW()', null, false);
$plus = $this->db->get_compiled_select($this->dbTable);
$this->addSelect($this->pk);
$this->addOrder('start', 'DESC');
if ($minus)
$this->addLimit($minus);
$this->db->where('start <= NOW()', null, false);
$minus = $this->db->get_compiled_select($this->dbTable);
$this->db->where_in($this->pk, '(' . $plus . ') UNION (' . $minus . ')', false);
}
/**
* Holt letzen zwei Ziffern des Studienjahres von Studiensemester, z.B. 24 für WS2024 und SS2025
* @param studiensemester_kurzbz
* @return string Studienjahr Nummer
*/
public function getStudienjahrNumberFromStudiensemester($studiensemester_kurzbz)
{
$studienjahrNumber = mb_substr($studiensemester_kurzbz, 4, 2);
if (is_numeric($studienjahrNumber) && mb_substr($studiensemester_kurzbz, 0, 2) == 'SS') (int)$studienjahrNumber -= 1;
return $studienjahrNumber;
}
}
+1 -1
View File
@@ -24,4 +24,4 @@ class Adresse_model extends DB_Model
$this->addSelect($select);
return $this->loadWhere(array('person_id' => $person_id, 'zustelladresse'=> true));
}
}
}
+81 -11
View File
@@ -1,4 +1,7 @@
<?php
use \CI3_Events as Events;
class Benutzer_model extends DB_Model
{
@@ -74,22 +77,88 @@ class Benutzer_model extends DB_Model
*/
public function generateAlias($uid)
{
$aliasres = '';
$this->addLimit(1);
$this->addSelect('vorname, nachname');
$this->addJoin('public.tbl_person', 'person_id');
$nameresult = $this->loadWhere(array('uid' => $uid));
if (hasData($nameresult))
{
$aliasdata = getData($nameresult);
$alias = $this->_sanitizeAliasName($aliasdata[0]->vorname).'.'.$this->_sanitizeAliasName($aliasdata[0]->nachname);
$aliasexists = $this->aliasExists($alias);
if (isError($nameresult))
return $nameresult;
if (hasData($aliasexists) && !getData($aliasexists)[0])
$aliasres = $alias;
}
return success($aliasres);
if (!hasData($nameresult))
return success('');
$aliasdata = current(getData($nameresult));
return $this->generateAliasFromName($aliasdata->vorname, $aliasdata->nachname);
}
/**
* Generates alias for a vor- and nachname.
*
* @param string $vorname
* @param string $nachname
*
* @return stdClass
*/
public function generateAliasFromName($vorname, $nachname)
{
$alias = $this->_sanitizeAliasName($vorname . '.' . $nachname);
$result = $this->aliasExists($alias);
if (isError($result))
return $result;
if (current(getData($result)))
return success('');
return success($alias);
}
/**
* Generates a matrikelnummer
*
* @param string $oe_kurzbz
*
* @return stdClass
*/
public function generateMatrikelnummer($oe_kurzbz)
{
$matrikelnummer = false;
Events::trigger(
'generate_matrikelnummer',
function ($value) use ($matrikelnummer) {
$matrikelnummer = $value;
},
$oe_kurzbz
);
if ($matrikelnummer !== false)
return success($matrikelnummer);
return success(null);
}
/**
* Generates an activation key
*
* @return string
*/
public function generateActivationkey()
{
$this->load->library('CryptLib');
$key = '';
for ($i=0; $i<32; $i++)
$key .= ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'][mt_rand(0, 15)];
$value = uniqid(mt_rand(), true);
$length = strlen($value);
$value = str_pad($value, $length + 32 - ($length % 32), chr(0));
return md5($this->cryptlib->RIJNDAEL_256_ECB($value, $key, true));
}
// --------------------------------------------------------------------------------------------
@@ -100,9 +169,10 @@ class Benutzer_model extends DB_Model
* @param string $str
* @return string
*/
private function _sanitizeAliasName($str)
{
$str = sanitizeProblemChars($str);
return mb_strtolower(str_replace(' ','_', $str));
return mb_strtolower(str_replace(' ', '_', $str));
}
}
+40 -3
View File
@@ -139,12 +139,51 @@ class Notiz_model extends DB_Model
*/
public function getNotiz($person_id)
{
// Join with the table public.tbl_notizzuordnung using notiz_id
$this->addSelect('public.tbl_notiz.*');
$this->addJoin('public.tbl_notizzuordnung', 'notiz_id');
return $this->loadWhere(array('person_id' => $person_id));
}
/**
* gets all Notizen with Documententries for a certain type and type_id
* @param String type of id eg. person_id, prestudent_id, mitarbeiter_uid, projekt_kurzbz, projektphase_id, projekttask_id,
* bestellung_id, lehreinheit_id, anrechnung_id, uid)
* @param $id the corresponding id, part of public.tbl_notizzuordnung
*/
public function getNotizWithDocEntries($id, $type)
{
$qry = "
SELECT
n.*, count(dms_id) as countDoc, z.notizzuordnung_id,
TO_CHAR (CASE
WHEN n.updateamum >= n.insertamum THEN n.updateamum
ELSE n.insertamum
END::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS lastUpdate,
regexp_replace(n.text, '<[^>]*>', '', 'g') as text_stripped,
TO_CHAR(n.start::timestamp, 'DD.MM.YYYY') AS start_format,
TO_CHAR(n.ende::timestamp, 'DD.MM.YYYY') AS ende_format,
z.notiz_id, z.person_id as id, ? as type_id
FROM
public.tbl_notiz n
JOIN
public.tbl_notizzuordnung z USING (notiz_id)
LEFT JOIN
public.tbl_notiz_dokument dok USING (notiz_id)
LEFT JOIN
campus.tbl_dms_version USING (dms_id)
WHERE
z.$type = ?
GROUP BY
notiz_id, z.notizzuordnung_id
";
return $this->execQuery($qry, array($type, $id));
}
/**
* gets all Notizen for a person with a specific title
* @param $person_id
@@ -231,6 +270,4 @@ class Notiz_model extends DB_Model
return $this->loadWhere(array('anrechnung_id' => $anrechnung_id));
}
// ------------------------------------------------------------------------------------------------------
}
@@ -0,0 +1,14 @@
<?php
class Notizdokument_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'public.tbl_notiz_dokument';
$this->pk= array('notiz_id' , 'dms_id');
}
}
@@ -11,4 +11,38 @@ class Notizzuordnung_model extends DB_Model
$this->dbTable = 'public.tbl_notizzuordnung';
$this->pk = 'notizzuordnung_id';
}
public function isValidType($type)
{
$validTypes = [];
$qry = "
SELECT column_name
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'tbl_notizzuordnung'
AND column_name not in ('notizzuordnung_id', 'notiz_id')
";
$type_arr = $this->execQuery($qry);
$type_arr = $type_arr->retval;
foreach ($type_arr as $t)
{
$validTypes[] = $t->column_name;
}
//TODO(manu) param id
if (in_array($type, $validTypes) )
//if (in_array($type, $validTypes) ||($type == 'software_id')) //Just for testing
{
return success("Type " . $type . " is valid");
// $result = success('Type of Id is valid');
}
else
{
return error("Type " . $type . " is NOT valid");
}
//return $result;
}
}
@@ -11,4 +11,18 @@ class Firma_model extends DB_Model
$this->dbTable = 'public.tbl_firma';
$this->pk = 'firma_id';
}
public function searchFirmen($filter)
{
$filter = strtoLower($filter);
$qry = "
SELECT
f.name, f.firma_id
FROM
public.tbl_firma f
WHERE
lower (f.name) LIKE '%". $this->db->escape_like_str($filter)."%'";
return $this->execQuery($qry);
}
}
@@ -216,4 +216,26 @@ class Mitarbeiter_model extends DB_Model
return success($kurzbz);
}
public function searchMitarbeiter($filter)
{
$filter = strtoLower($filter);
$qry = "
SELECT
ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter
FROM
public.tbl_mitarbeiter ma
JOIN
public.tbl_benutzer b on (ma.mitarbeiter_uid = b.uid)
JOIN
public.tbl_person p on (p.person_id = b.person_id)
WHERE
lower (p.nachname) LIKE '%". $this->db->escape_like_str($filter)."%'
OR
lower (p.vorname) LIKE '%". $this->db->escape_like_str($filter)."%'
OR
(ma.mitarbeiter_uid) LIKE '%". $this->db->escape_like_str($filter)."%'";
return $this->execQuery($qry);
}
}