mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-16 14:32:18 +00:00
Merge branch 'feature-63468/Studierendenverwaltung_Neuanlage_von_Interessenten_ueberarbeiten' into studvw_2025-12_rc3
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
/**
|
||||
* FH-Complete
|
||||
*
|
||||
* @package FHC-API
|
||||
* @author FHC-Team
|
||||
* @copyright Copyright (c) 2016, fhcomplete.org
|
||||
* @license GPLv3
|
||||
* @link http://fhcomplete.org
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class Studienplan extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
// TODO(chris): access!
|
||||
parent::__construct([
|
||||
'getBySemester' => self::PERM_LOGGED
|
||||
]);
|
||||
}
|
||||
|
||||
public function getBySemester()
|
||||
{
|
||||
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
|
||||
|
||||
$studiengang_kz = $this->input->get('studiengang_kz');
|
||||
$studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz');
|
||||
$ausbildungssemester = $this->input->get('ausbildungssemester') ?: null;
|
||||
$orgform_kurzbz = $this->input->get('orgform_kurzbz') ?: null;
|
||||
|
||||
if (!$studiengang_kz || !is_numeric($studiengang_kz))
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiengangskennzahl']), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
if (!$studiensemester_kurzbz)
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiensemester']), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
if (isset($ausbildungssemester) && !is_numeric($ausbildungssemester))
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Ausbildungssemester']), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
|
||||
//~ $this->load->library('form_validation');
|
||||
|
||||
//~ $this->form_validation->set_rules('studiengang_kz', 'StudiengangKz', 'required|numeric');
|
||||
//~ $this->form_validation->set_rules('studiensemester_kurzbz', 'StudiensemesterKurbz', 'required');
|
||||
//~ $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'numeric');
|
||||
|
||||
//~ if (!$this->form_validation->run())
|
||||
//~ {
|
||||
//~ $this->addMeta('fail2', 'fail2');
|
||||
//~ return $this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
//~ }
|
||||
|
||||
|
||||
$this->addMeta('stg_kz', $studiengang_kz);
|
||||
$this->addMeta('sem', $studiensemester_kurzbz);
|
||||
$this->addMeta('sem2', $ausbildungssemester);
|
||||
$this->addMeta('org', $orgform_kurzbz);
|
||||
|
||||
$result = $this->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $ausbildungssemester, $orgform_kurzbz);
|
||||
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||
|
||||
$this->terminateWithSuccess(hasData($result) ? getData($result) : []);
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@ class Student extends FHCAPI_Controller
|
||||
'get' => ['admin:r', 'assistenz:r'],
|
||||
'save' => ['admin:rw', 'assistenz:rw'],
|
||||
'saveStudent' => ['admin:rw', 'assistenz:rw'],
|
||||
'check' => ['admin:rw', 'assistenz:rw'],
|
||||
'getPerson' => ['admin:rw', 'assistenz:rw'],
|
||||
'add' => ['admin:rw', 'assistenz:rw'] // TODO(chris): extra permissions
|
||||
]);
|
||||
|
||||
@@ -159,9 +159,9 @@ class Student extends FHCAPI_Controller
|
||||
'LEFT');*/
|
||||
|
||||
$result = $this->PrestudentModel->loadWhere(['tbl_prestudent.prestudent_id' => $prestudent_id]);
|
||||
|
||||
|
||||
$student = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
|
||||
if (!$student)
|
||||
return show_404();
|
||||
|
||||
@@ -221,7 +221,7 @@ class Student extends FHCAPI_Controller
|
||||
]);
|
||||
|
||||
$this->load->library('UDFLib');
|
||||
|
||||
|
||||
$result = $this->udflib->getCiValidations($this->PersonModel, $this->input->post());
|
||||
|
||||
$udf_field_validations = $this->getDataOrTerminateWithError($result);
|
||||
@@ -232,7 +232,7 @@ class Student extends FHCAPI_Controller
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
|
||||
$result = $this->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]);
|
||||
|
||||
|
||||
$student = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$uid = $student ? current($student)->student_uid : null;
|
||||
@@ -245,7 +245,6 @@ class Student extends FHCAPI_Controller
|
||||
|
||||
$person_id = $person ? current($person)->person_id : null;
|
||||
|
||||
|
||||
$array_allowed_props_lehrverband = ['verband', 'semester', 'gruppe'];
|
||||
$update_lehrverband = array();
|
||||
foreach ($array_allowed_props_lehrverband as $prop) {
|
||||
@@ -305,7 +304,7 @@ class Student extends FHCAPI_Controller
|
||||
}
|
||||
|
||||
$array_allowed_props_student = ['matrikelnr'];
|
||||
if($this->isLaufendesSemester($studiensemester_kurzbz))
|
||||
if($this->isLaufendesSemester($studiensemester_kurzbz))
|
||||
{
|
||||
$array_allowed_props_student = ['matrikelnr', 'verband', 'semester', 'gruppe'];
|
||||
}
|
||||
@@ -462,7 +461,7 @@ class Student extends FHCAPI_Controller
|
||||
return $this->save($student->prestudent_id, $studiensemester_kurzbz);
|
||||
}
|
||||
|
||||
public function check()
|
||||
public function getPerson()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
@@ -480,21 +479,55 @@ class Student extends FHCAPI_Controller
|
||||
|
||||
$this->load->model('person/Person_model', 'PersonModel');
|
||||
|
||||
$this->PersonModel->addSelect(
|
||||
'person_id, vorname, nachname, vornamen, wahlname, gebdatum, staatsbuergerschaft, geburtsnation, sprache, anrede,
|
||||
titelpost, titelpre, gebort, gebzeit, homepage, geschlecht, matr_nr,
|
||||
aktiv, unruly, tbl_geschlecht.bezeichnung_mehrsprachig AS geschlecht_bezeichnung'
|
||||
);
|
||||
$this->PersonModel->addJoin('public.tbl_geschlecht', 'geschlecht');
|
||||
|
||||
if ($gebdatum)
|
||||
$this->PersonModel->db->where('gebdatum', (new DateTime($gebdatum))->format('Y-m-d'));
|
||||
if ($vorname && $nachname) {
|
||||
$this->PersonModel->db->or_group_start();
|
||||
$this->PersonModel->db->where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->db->escape($nachname) . ')', false);
|
||||
$this->PersonModel->db->where('LOWER(vorname)', 'LOWER(' . $this->PersonModel->db->escape($vorname) . ')', false);
|
||||
$this->PersonModel->db->where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->db->escape(trim($nachname)) . ')', false);
|
||||
$this->PersonModel->db->where('LOWER(vorname)', 'LOWER(' . $this->PersonModel->db->escape(trim($vorname)) . ')', false);
|
||||
$this->PersonModel->db->group_end();
|
||||
} elseif ($nachname) {
|
||||
$this->PersonModel->db->or_where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->escape($nachname) . ')', false);
|
||||
$this->PersonModel->db->or_where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->escape(trim($nachname)) . ')', false);
|
||||
}
|
||||
|
||||
$result = $this->PersonModel->load();
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->load->model('person/Adresse_model', 'AdresseModel');
|
||||
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||
|
||||
foreach ($data as $person)
|
||||
{
|
||||
// get adresses
|
||||
$langIdx = $this->_getLanguageIndex() - 1;
|
||||
$person->geschlecht_bezeichnung = isset($person->geschlecht_bezeichnung[$langIdx]) ? $person->geschlecht_bezeichnung[$langIdx] : '';
|
||||
|
||||
// get Adresse
|
||||
$this->AdresseModel->addOrder('heimatadresse', 'DESC');
|
||||
$this->AdresseModel->addOrder('zustelladresse', 'DESC');
|
||||
$this->AdresseModel->addOrder('adresse_id', 'DESC');
|
||||
$result = $this->AdresseModel->loadWhere(['person_id' => $person->person_id]);
|
||||
|
||||
$adressen = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$person->adressen = $adressen;
|
||||
|
||||
// get status
|
||||
$result = $this->PrestudentstatusModel->getLastStatusPerson($person->person_id);
|
||||
|
||||
$status = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$person->status = $status;
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
|
||||
@@ -508,71 +541,52 @@ class Student extends FHCAPI_Controller
|
||||
$_POST['ausbildungssemester'] = 0;
|
||||
}
|
||||
|
||||
$this->load->library('form_validation');
|
||||
$this->_validate();
|
||||
|
||||
$this->form_validation->set_rules('nachname', 'Nachname', 'callback_requiredIfNotPersonId', [
|
||||
'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'nachname')])
|
||||
]);
|
||||
$this->form_validation->set_rules('geschlecht', 'Geschlecht', 'callback_requiredIfNotPersonId', [
|
||||
'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'geschlecht')])
|
||||
]);
|
||||
$this->form_validation->set_rules('gebdatum', 'Geburtsdatum', ['isValidDate', function($value) { return isValidDate($value); }], [
|
||||
'isValidDate' => $this->p->t('ui', 'error_invalid_date')
|
||||
]);
|
||||
$this->form_validation->set_rules('address[func]', 'Address', 'required|integer|less_than[2]|greater_than[-2]');
|
||||
$this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [
|
||||
'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'plz')])
|
||||
]);
|
||||
$this->form_validation->set_rules('address[gemeinde]', 'Gemeinde', 'callback_requiredIfAddressFunc', [
|
||||
'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'gemeinde')])
|
||||
]);
|
||||
$this->form_validation->set_rules('address[ort]', 'Ort', 'callback_requiredIfAddressFunc', [
|
||||
'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'ort')])
|
||||
]);
|
||||
$this->form_validation->set_rules('address[address]', 'Adresse', 'callback_requiredIfAddressFunc', [
|
||||
'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'adresse')])
|
||||
]);
|
||||
$this->form_validation->set_rules('email', 'E-Mail', 'valid_email');
|
||||
$this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'callback_requiredIfStudentFunc', [
|
||||
'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiengang')])
|
||||
]);
|
||||
$this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'callback_requiredIfStudentFunc', [
|
||||
'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiensemester')])
|
||||
]);
|
||||
$this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'callback_requiredIfStudentFunc|integer|less_than[9]|greater_than[-1]', [
|
||||
'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'ausbildungssemester')])
|
||||
]);
|
||||
// TODO(chris): validate studienplan with studiengang, semester and orgform?
|
||||
// TODO(chris): validate person_id, studiengang_kz, studiensemester_kurzbz, orgform_kurzbz, nation, gemeinde, ort, geschlecht?
|
||||
|
||||
if (!$this->form_validation->run())
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
|
||||
// TODO(chris): This should be in a library
|
||||
$this->load->model('crm/Student_model', 'StudentModel');
|
||||
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
|
||||
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||
$this->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
|
||||
$this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
|
||||
|
||||
$this->db->trans_start();
|
||||
$this->load->library('PrestudentLib');
|
||||
|
||||
$result = $this->addInteressent();
|
||||
$errors = [];
|
||||
$person_id = null;
|
||||
|
||||
$this->db->trans_complete();
|
||||
$this->db->trans_begin();
|
||||
|
||||
if ($this->db->trans_status() === FALSE)
|
||||
$this->terminateWithError('TODO(chris): TEXT', self::ERROR_TYPE_GENERAL);
|
||||
$result = $this->_addPerson();
|
||||
if (isError($result)) $errors[] = getError($result);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
if (hasData($result))
|
||||
{
|
||||
$person_id = getData($result);
|
||||
$result = $this->_addAdresse($person_id);
|
||||
if (isError($result)) $errors[] = getError($result);
|
||||
$result = $this->_addKontakt($person_id);
|
||||
if (isError($result)) $errors[] = getError($result);
|
||||
if (!$this->input->post('personOnly')) $result = $this->_addFirstPrestudentstatus($person_id);
|
||||
if (isError($result)) $errors[] = getError($result);
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess($data);
|
||||
if ($this->db->trans_status() === FALSE || !isEmptyArray($errors))
|
||||
{
|
||||
$this->db->trans_rollback();
|
||||
$this->terminateWithError(isEmptyArray($errors) ? $this->p->t('stv', 'error_add_student') : $errors);
|
||||
}
|
||||
$this->db->trans_commit();
|
||||
|
||||
$this->terminateWithSuccess($person_id);
|
||||
}
|
||||
|
||||
protected function addInteressent()
|
||||
private function _addPerson()
|
||||
{
|
||||
// Person anlegen wenn nötig
|
||||
$person_id = $this->input->post('person_id');
|
||||
if (!$person_id) {
|
||||
$this->load->model('person/Person_model', 'PersonModel');
|
||||
|
||||
|
||||
$data = [
|
||||
'nachname' => $this->input->post('nachname'),
|
||||
'insertamum' => date('c'),
|
||||
@@ -595,19 +609,25 @@ class Student extends FHCAPI_Controller
|
||||
if ($this->input->post('geschlecht'))
|
||||
$data['geschlecht'] = $this->input->post('geschlecht');
|
||||
if ($this->input->post('gebdatum'))
|
||||
$data['gebdatum'] = (new DateTime($this->input->post('datum_obj')))->format('Y-m-d');
|
||||
$data['gebdatum'] = (new DateTime($this->input->post('gebdatum')))->format('Y-m-d');
|
||||
if ($this->input->post('geburtsnation'))
|
||||
$data['geburtsnation'] = $this->input->post('geburtsnation');
|
||||
if ($this->input->post('staatsbuergerschaft'))
|
||||
$data['staatsbuergerschaft'] = $this->input->post('staatsbuergerschaft');
|
||||
|
||||
$result = $this->PersonModel->insert($data);
|
||||
$person_id = $this->getDataOrTerminateWithError($result);
|
||||
return $this->PersonModel->insert($data);
|
||||
}
|
||||
|
||||
// Addresse anlegen
|
||||
$anlegen = $this->input->post('address[func]');
|
||||
if ($anlegen) {
|
||||
return success($person_id);
|
||||
}
|
||||
|
||||
private function _addAdresse($person_id)
|
||||
{
|
||||
// Addresse anlegen?
|
||||
$anlegen = $this->input->post('address[checked]');
|
||||
if ($anlegen === true)
|
||||
{
|
||||
// Adresse laden
|
||||
$this->load->model('person/Adresse_model', 'AdresseModel');
|
||||
|
||||
$data = [
|
||||
@@ -619,52 +639,45 @@ class Student extends FHCAPI_Controller
|
||||
'typ' => 'h',
|
||||
'zustelladresse' => true,
|
||||
];
|
||||
if ($anlegen < 0) { // Überschreiben
|
||||
|
||||
$this->AdresseModel->addSelect('adresse_id');
|
||||
$this->AdresseModel->addJoin('public.tbl_adressentyp', 'typ = adressentyp_kurzbz');
|
||||
$this->AdresseModel->addOrder('zustelladresse', 'DESC');
|
||||
$this->AdresseModel->addOrder('sort');
|
||||
$result = $this->AdresseModel->loadWhere([
|
||||
'person_id' => $person_id
|
||||
]);
|
||||
$address = $this->getDataOrTerminateWithError($result);
|
||||
if ($address) {
|
||||
$address = current($address);
|
||||
|
||||
$data['updateamum'] = date('c');
|
||||
$data['updatevon'] = getAuthUID();
|
||||
if (isError($result)) return $result;
|
||||
|
||||
// wenn neue Adresse, heimatadresse setzen
|
||||
if (!hasData($result)) $data['heimatadresse'] = true;
|
||||
|
||||
$result = $this->AdresseModel->update($address->adresse_id, $data);
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
} else {
|
||||
//Wenn keine Adrese vorhanden ist dann eine neue Anlegen
|
||||
$anlegen = 1;
|
||||
$data['heimatadresse'] = true;
|
||||
}
|
||||
}
|
||||
if ($anlegen > 0) {
|
||||
$data['person_id'] = $person_id;
|
||||
$data['insertamum'] = date('c');
|
||||
$data['insertvon'] = getAuthUID();
|
||||
if (!isset($data['heimatadresse']))
|
||||
$data['heimatadresse'] = !$this->input->post('person_id');
|
||||
|
||||
$result = $this->AdresseModel->insert($data);
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
}
|
||||
|
||||
return $this->AdresseModel->insert($data);
|
||||
}
|
||||
|
||||
|
||||
return success(null);
|
||||
}
|
||||
|
||||
private function _addKontakt($person_id)
|
||||
{
|
||||
// Kontaktdaten
|
||||
$kontaktdaten = [];
|
||||
foreach (['email', 'telefon', 'mobil'] as $k) {
|
||||
|
||||
foreach (['email', 'telefon', 'mobil'] as $k)
|
||||
{
|
||||
$v = $this->input->post($k);
|
||||
if ($v)
|
||||
$kontaktdaten[$k] = $v;
|
||||
}
|
||||
if (count($kontaktdaten)) {
|
||||
|
||||
if (count($kontaktdaten))
|
||||
{
|
||||
$this->load->model('person/Kontakt_model', 'KontaktModel');
|
||||
|
||||
foreach ($kontaktdaten as $typ => $kontakt) {
|
||||
foreach ($kontaktdaten as $typ => $kontakt)
|
||||
{
|
||||
$data = [
|
||||
'person_id' => $person_id,
|
||||
'kontakttyp' => $typ,
|
||||
@@ -674,87 +687,70 @@ class Student extends FHCAPI_Controller
|
||||
'insertvon' => getAuthUID()
|
||||
];
|
||||
$result = $this->KontaktModel->insert($data);
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
if (isError($result)) return $result;
|
||||
}
|
||||
}
|
||||
return success(null);
|
||||
}
|
||||
|
||||
$personOnly = $anlegen = $this->input->post('personOnly');
|
||||
private function _addFirstPrestudentstatus($person_id)
|
||||
{
|
||||
// Prestudent anlegen
|
||||
|
||||
if (!$personOnly)
|
||||
// Anmerkung with Ausbildungsart
|
||||
$studiengang_kz = $this->input->post('studiengang_kz');
|
||||
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
|
||||
$ausbildungsart = $this->input->post('ausbildungsart');
|
||||
$anmerkung = $this->input->post('anmerkungen');
|
||||
$foerderrelevant = null;
|
||||
if ($ausbildungsart)
|
||||
$anmerkung .= ' Ausbildungsart:' . $ausbildungsart;
|
||||
|
||||
// Incomings und ausserordentliche sind bei Meldung nicht förderrelevant
|
||||
$incoming = $this->input->post('incoming');
|
||||
if ($incoming || substr($studiengang_kz, 0, 1) == '9')
|
||||
$foerderrelevant = false;
|
||||
|
||||
// Prestudent speichern
|
||||
$result = $this->prestudentlib->setPrestudent(
|
||||
$person_id,
|
||||
$studiengang_kz,
|
||||
$this->input->post('letzteausbildung'),
|
||||
$anmerkung,
|
||||
$foerderrelevant
|
||||
);
|
||||
if (isError($result)) return $result;
|
||||
if (!hasData($result)) return error('Error when adding prestudent');
|
||||
|
||||
$prestudent_id = getData($result);
|
||||
|
||||
// wenn Incoming, Incoming Daten hinzufügen
|
||||
if ($incoming)
|
||||
{
|
||||
// Prestudent anlegen
|
||||
$data = [
|
||||
'aufmerksamdurch_kurzbz' => 'k.A.',
|
||||
'person_id' => $person_id,
|
||||
'studiengang_kz' => $this->input->post('studiengang_kz'),
|
||||
'ausbildungcode' => $this->input->post('letzteausbildung'),
|
||||
'anmerkung' => $this->input->post('anmerkungen'),
|
||||
'reihungstestangetreten' => false,
|
||||
'bismelden' => true
|
||||
];
|
||||
$ausbildungsart = $this->input->post('ausbildungsart');
|
||||
if ($ausbildungsart)
|
||||
$data['anmerkung'] .= ' Ausbildungsart:' . $ausbildungsart;
|
||||
// Incomings und ausserordentliche sind bei Meldung nicht förderrelevant
|
||||
$incoming = $this->input->post('incoming');
|
||||
if ($incoming || substr($data['studiengang_kz'], 0, 1) == '9')
|
||||
$data['foerderrelevant'] = false;
|
||||
// Wenn die Person schon im System erfasst ist, dann die ZGV des Datensatzes uebernehmen
|
||||
$this->PrestudentModel->addOrder('zgvmas_code');
|
||||
$this->PrestudentModel->addOrder('zgv_code', 'DESC');
|
||||
$this->PrestudentModel->addLimit(1);
|
||||
$result = $this->PrestudentModel->loadWhere([
|
||||
'person_id' => $person_id
|
||||
]);
|
||||
$prestudent = $this->getDataOrTerminateWithError($result);
|
||||
if ($prestudent) {
|
||||
$prestudent = current($prestudent);
|
||||
if ($prestudent->zgv_code) {
|
||||
$data['zgv_code'] = $prestudent->zgv_code;
|
||||
$data['zgvort'] = $prestudent->zgvort;
|
||||
$data['zgvdatum'] = $prestudent->zgvdatum;
|
||||
|
||||
$data['zgvmas_code'] = $prestudent->zgvmas_code;
|
||||
$data['zgvmaort'] = $prestudent->zgvmaort;
|
||||
$data['zgvmadatum'] = $prestudent->zgvmadatum;
|
||||
}
|
||||
}
|
||||
// Prestudent speichern
|
||||
$result = $this->PrestudentModel->insert($data);
|
||||
$prestudent_id = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
// Prestudent Rolle Anlegen
|
||||
$data = [
|
||||
'prestudent_id' => $prestudent_id,
|
||||
'status_kurzbz' => $incoming ? 'Incoming' : 'Interessent',
|
||||
'studiensemester_kurzbz' => $this->input->post('studiensemester_kurzbz'),
|
||||
'ausbildungssemester' => $this->input->post('ausbildungssemester') ?: 0,
|
||||
'orgform_kurzbz' => $this->input->post('orgform_kurzbz') ?: null,
|
||||
'studienplan_id' => $this->input->post('studienplan_id') ?: null,
|
||||
'datum' => date('Y-m-d'),
|
||||
'insertamum' => date('c'),
|
||||
'insertvon' => getAuthUID()
|
||||
];
|
||||
$result = $this->PrestudentstatusModel->insert($data);
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
|
||||
if ($incoming) {
|
||||
// TODO(chris): IMPLEMENT!
|
||||
//Matrikelnummer und UID generieren
|
||||
//Benutzerdatensatz anlegen
|
||||
//Studentendatensatz anlegen
|
||||
//StudentLehrverband anlegen
|
||||
}
|
||||
$statusResult = $this->prestudentlib->setFirstIncoming(
|
||||
$prestudent_id,
|
||||
$studiengang_kz,
|
||||
$studiensemester_kurzbz,
|
||||
$this->input->post('orgform_kurzbz'),
|
||||
$this->input->post('studienplan_id')
|
||||
);
|
||||
}
|
||||
// TODO(chris): DEBUG
|
||||
/*$result = $this->PrestudentModel->loadWhere([
|
||||
'pestudent_id' => 1
|
||||
]);
|
||||
if (isError($result)) {
|
||||
return $result;
|
||||
}*/
|
||||
else
|
||||
{
|
||||
// Prestudent Rolle Anlegen
|
||||
$statusResult = $this->prestudentlib->setFirstStatus(
|
||||
$prestudent_id,
|
||||
$this->PrestudentstatusModel::STATUS_INTERESSENT,
|
||||
$studiensemester_kurzbz,
|
||||
$this->input->post('ausbildungssemester'),
|
||||
$this->input->post('orgform_kurzbz'),
|
||||
$this->input->post('studienplan_id')
|
||||
);
|
||||
}
|
||||
if (!hasData($statusResult)) return error('error when adding status');
|
||||
if (isError($statusResult)) return $statusResult;
|
||||
|
||||
return success($person_id);
|
||||
return success($prestudent_id);
|
||||
}
|
||||
|
||||
public function requiredIfNotPersonId($value)
|
||||
@@ -766,20 +762,84 @@ class Student extends FHCAPI_Controller
|
||||
|
||||
public function requiredIfAddressFunc($value)
|
||||
{
|
||||
if (!$_POST['address']['func'] || $_POST['address']['func'] == 0)
|
||||
if (!isset($_POST['address']['checked']) || !$_POST['address']['checked'])
|
||||
return true;
|
||||
return !!$value;
|
||||
}
|
||||
|
||||
public function requiredIfStudentFunc($value)
|
||||
{
|
||||
if ($_POST['personOnly'])
|
||||
if (isset($_POST['personOnly']) && $_POST['personOnly'])
|
||||
return true;
|
||||
return !!$value;
|
||||
}
|
||||
|
||||
public function isValidDate($value)
|
||||
public function requiredIfStudentAndNotIncomingFunc($value)
|
||||
{
|
||||
return isValidDate($value);
|
||||
if ((isset($_POST['incoming']) && $_POST['incoming']) || $this->requiredIfStudentFunc($value))
|
||||
return true;
|
||||
return !!$value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates input data. Terminates with validation errors, if invalid.
|
||||
*/
|
||||
private function _validate()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$this->form_validation->set_rules('nachname', 'Nachname', 'callback_requiredIfNotPersonId', [
|
||||
'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'nachname')])
|
||||
]);
|
||||
$this->form_validation->set_rules('geschlecht', 'Geschlecht', 'callback_requiredIfNotPersonId', [
|
||||
'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'geschlecht')])
|
||||
]);
|
||||
$this->form_validation->set_rules('gebdatum', 'Geburtsdatum', ['isValidDate', function($value) { return isValidDate($value); }], [
|
||||
'isValidDate' => $this->p->t('ui', 'error_invalid_date')
|
||||
]);
|
||||
//$this->form_validation->set_rules('address[checked]', 'Address', 'required');
|
||||
$this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [
|
||||
'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'plz')])
|
||||
]);
|
||||
$this->form_validation->set_rules('address[gemeinde]', 'Gemeinde', 'callback_requiredIfAddressFunc', [
|
||||
'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'gemeinde')])
|
||||
]);
|
||||
$this->form_validation->set_rules('address[ort]', 'Ort', 'callback_requiredIfAddressFunc', [
|
||||
'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'ort')])
|
||||
]);
|
||||
$this->form_validation->set_rules('address[address]', 'Adresse', 'callback_requiredIfAddressFunc', [
|
||||
'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'adresse')])
|
||||
]);
|
||||
$this->form_validation->set_rules('email', 'E-Mail', 'valid_email');
|
||||
$this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'callback_requiredIfStudentFunc', [
|
||||
'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiengang')])
|
||||
]);
|
||||
$this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'callback_requiredIfStudentFunc', [
|
||||
'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiensemester')])
|
||||
]);
|
||||
$this->form_validation->set_rules(
|
||||
'ausbildungssemester',
|
||||
'Ausbildungssemester',
|
||||
'callback_requiredIfStudentAndNotIncomingFunc|integer|less_than[9]|greater_than[-1]',
|
||||
[
|
||||
'requiredIfStudentAndNotIncomingFunc' =>
|
||||
$this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'ausbildungssemester')]),
|
||||
]
|
||||
);
|
||||
// TODO(chris): validate studienplan with studiengang, semester and orgform?
|
||||
// TODO(chris): validate person_id, studiengang_kz, studiensemester_kurzbz, orgform_kurzbz, nation, gemeinde, ort, geschlecht?
|
||||
|
||||
if (!$this->form_validation->run())
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
private function _getLanguageIndex()
|
||||
{
|
||||
$this->load->model('system/Sprache_model', 'SpracheModel');
|
||||
$this->SpracheModel->addSelect('index');
|
||||
$result = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage()));
|
||||
$this->addMeta('lang', getUserLanguage());
|
||||
|
||||
return hasData($result) ? getData($result)[0]->index : 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,89 @@ class PrestudentLib
|
||||
$this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets initial prestudent entry, no status yet.
|
||||
* @return object success or error
|
||||
*/
|
||||
public function setPrestudent(
|
||||
$person_id,
|
||||
$studiengang_kz,
|
||||
$ausbildungscode,
|
||||
$anmerkung,
|
||||
$foerderrelevant
|
||||
)
|
||||
{
|
||||
// Prestudent anlegen
|
||||
$data = [
|
||||
'aufmerksamdurch_kurzbz' => 'k.A.',
|
||||
'person_id' => $person_id,
|
||||
'studiengang_kz' => $studiengang_kz,
|
||||
'ausbildungcode' => $ausbildungscode,
|
||||
'anmerkung' => $anmerkung,
|
||||
'reihungstestangetreten' => false,
|
||||
'bismelden' => true,
|
||||
'foerderrelevant' => $foerderrelevant,
|
||||
'insertamum' => date('c'),
|
||||
'insertvon' => getAuthUID()
|
||||
];
|
||||
|
||||
// Wenn die Person schon im System erfasst ist, dann die ZGV des Datensatzes uebernehmen
|
||||
$this->_ci->PrestudentModel->addSelect('public.tbl_prestudent.*, public.tbl_person.vorname, public.tbl_person.nachname');
|
||||
$this->_ci->PrestudentModel->addJoin('public.tbl_person', 'person_id');
|
||||
$this->_ci->PrestudentModel->addOrder('zgvmas_code');
|
||||
$this->_ci->PrestudentModel->addOrder('zgv_code', 'DESC');
|
||||
$this->_ci->PrestudentModel->addLimit(1);
|
||||
$result = $this->_ci->PrestudentModel->loadWhere([
|
||||
'person_id' => $person_id
|
||||
]);
|
||||
|
||||
if (isError($result)) return $result;
|
||||
|
||||
if (hasData($result)) {
|
||||
$prestudent = getData($result)[0];
|
||||
if ($prestudent->zgv_code) {
|
||||
$data['zgv_code'] = $prestudent->zgv_code;
|
||||
$data['zgvort'] = $prestudent->zgvort;
|
||||
$data['zgvdatum'] = $prestudent->zgvdatum;
|
||||
|
||||
$data['zgvmas_code'] = $prestudent->zgvmas_code;
|
||||
$data['zgvmaort'] = $prestudent->zgvmaort;
|
||||
$data['zgvmadatum'] = $prestudent->zgvmadatum;
|
||||
}
|
||||
}
|
||||
// Prestudent speichern
|
||||
return $this->_ci->PrestudentModel->insert($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets first status of a prestudent.!
|
||||
* @return object success or error
|
||||
*/
|
||||
public function setFirstStatus(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$studiensemester_kurzbz,
|
||||
$ausbildungssemester = null,
|
||||
$orgform_kurzbz = null,
|
||||
$studienplan_id = null
|
||||
)
|
||||
{
|
||||
// Prestudent Rolle Anlegen
|
||||
$data = [
|
||||
'prestudent_id' => $prestudent_id,
|
||||
'status_kurzbz' => $status_kurzbz,
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'ausbildungssemester' => $ausbildungssemester ?: 0,
|
||||
'orgform_kurzbz' => $orgform_kurzbz ?: null,
|
||||
'studienplan_id' => $studienplan_id ?: null,
|
||||
'datum' => date('Y-m-d'),
|
||||
'insertamum' => date('c'),
|
||||
'insertvon' => getAuthUID()
|
||||
];
|
||||
|
||||
return $this->_ci->PrestudentstatusModel->insert($data);
|
||||
}
|
||||
|
||||
public function setAbbrecher(
|
||||
$prestudent_id,
|
||||
$studiensemester_kurzbz,
|
||||
@@ -889,6 +972,155 @@ class PrestudentLib
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an incoming, saves necessary data for an incoming.
|
||||
* @param $prestudent_id existing prestudent, for which incoming entry is created
|
||||
* @param $studiengang_kz Studiengang assigned to incoming
|
||||
* @param $studiensemester_kurzbz start semester for incoming
|
||||
* @return object success if incoming successfully saved, or error
|
||||
*/
|
||||
public function setFirstIncoming($prestudent_id, $studiengang_kz, $studiensemester_kurzbz, $orgform_kurzbz, $studienplan_id)
|
||||
{
|
||||
// Verband and Ausbildungssemester for incoming
|
||||
$authUID = getAuthUID();
|
||||
$incomingVerband = 'I';
|
||||
$incomingAusbildungssemester = '0';
|
||||
|
||||
// get prestudent
|
||||
$this->_ci->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
|
||||
$this->_ci->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz');
|
||||
$result = $this->_ci->PrestudentModel->load($prestudent_id);
|
||||
|
||||
if (isError($result)) return $result;
|
||||
if (!hasData($result)) return error('No prestudent');
|
||||
|
||||
$student_data = getData($result)[0];
|
||||
|
||||
$result = $this->setFirstStatus(
|
||||
$prestudent_id,
|
||||
$this->_ci->PrestudentstatusModel::STATUS_INCOMING,
|
||||
$studiensemester_kurzbz,
|
||||
$incomingAusbildungssemester,
|
||||
$orgform_kurzbz,
|
||||
$studienplan_id
|
||||
);
|
||||
if (isError($result)) return $result;
|
||||
if (!hasData($result)) return error('Error when adding prestudentstatus');
|
||||
|
||||
// generate Personenkennzeichen
|
||||
$result = $this->_ci->StudentModel->generateMatrikelnummer2($studiengang_kz, $studiensemester_kurzbz);
|
||||
if (isError($result)) return $result;
|
||||
if (!hasData($result)) return error('No personenkennzeichen could be generated');
|
||||
|
||||
$personenkennzeichen = getData($result);
|
||||
|
||||
$jahr = mb_substr($personenkennzeichen, 0, 2);
|
||||
$stg = mb_substr($personenkennzeichen, 3, 4);
|
||||
|
||||
$nachname_clean = mb_strtolower(sanitizeProblemChars($student_data->nachname));
|
||||
$vorname_clean = mb_strtolower(sanitizeProblemChars($student_data->vorname));
|
||||
$nachname_clean = str_replace(' ','_', $nachname_clean);
|
||||
$vorname_clean = str_replace(' ','_', $vorname_clean);
|
||||
|
||||
// get Studiengang data
|
||||
$result = $this->_ci->StudiengangModel->load(ltrim($stg, '0'));
|
||||
if (isError($result)) return $result;
|
||||
if (!hasData($result)) return error('No Studiengang');
|
||||
|
||||
$stgObj = getData($result)[0];
|
||||
|
||||
// gernerate uid
|
||||
$result = $this->_ci->StudentModel->generateUID($stgObj->kurzbz, $jahr, $stgObj->typ, $personenkennzeichen, $vorname_clean, $nachname_clean);
|
||||
if (isError($result)) return $result;
|
||||
if (!hasData($result)) return error("UID could not be generated");
|
||||
$uid = getData($result);
|
||||
|
||||
//Benutzerdatensatz anlegen
|
||||
$benutzer = [
|
||||
'uid' => $uid,
|
||||
'person_id' => $student_data->person_id,
|
||||
'aktiv' => true,
|
||||
'aktivierungscode' => $this->_ci->BenutzerModel->generateActivationkey()
|
||||
];
|
||||
|
||||
// Generate Alias
|
||||
$alias = '';
|
||||
if (!defined('GENERATE_ALIAS_STUDENT') || GENERATE_ALIAS_STUDENT === true)
|
||||
{
|
||||
$result = $this->_ci->BenutzerModel->generateAliasFromName($student_data->vorname, $student_data->nachname);
|
||||
if (isError($result))
|
||||
return $result;
|
||||
$alias = getData($result);
|
||||
}
|
||||
|
||||
$benutzer['alias'] = $alias;
|
||||
$benutzer['insertamum'] = date('Y-m-d H:i:s');
|
||||
$benutzer['insertvon'] = $authUID;
|
||||
|
||||
$result = $this->_ci->BenutzerModel->insert($benutzer);
|
||||
|
||||
if (isError($result)) return $result;
|
||||
|
||||
// Studentendatensatz anlegen
|
||||
$student = [
|
||||
'student_uid' => $uid,
|
||||
'matrikelnr' => $personenkennzeichen,
|
||||
'prestudent_id' => $prestudent_id,
|
||||
'studiengang_kz' => $studiengang_kz,
|
||||
'semester' => $incomingAusbildungssemester,
|
||||
'verband' => $incomingVerband,
|
||||
'gruppe' => ' '
|
||||
];
|
||||
|
||||
$result = $this->_ci->LehrverbandModel->loadWhere([
|
||||
'studiengang_kz' => $student['studiengang_kz'],
|
||||
'semester' => $student['semester'],
|
||||
'verband' => $student['verband'],
|
||||
'gruppe' => $student['gruppe']
|
||||
]);
|
||||
|
||||
if (isError($result)) return $result;
|
||||
|
||||
if (!hasData($result))
|
||||
{
|
||||
// Add Lehrverband if it does not exist
|
||||
$result = $this->_ci->LehrverbandModel->insert([
|
||||
'studiengang_kz' => $student_data->studiengang_kz,
|
||||
'semester' => $student['semester'],
|
||||
'verband' => $student['verband'],
|
||||
'gruppe' => $student['gruppe'],
|
||||
'bezeichnung' => 'Incoming',
|
||||
'aktiv' => true
|
||||
]);
|
||||
|
||||
if (isError($result)) return $result;
|
||||
}
|
||||
|
||||
// add student
|
||||
$student['insertamum'] = date('Y-m-d H:i:s');
|
||||
$student['insertvon'] = $authUID;
|
||||
|
||||
$result = $this->_ci->StudentModel->insert($student);
|
||||
if (isError($result)) return $result;
|
||||
|
||||
// Add Studentlehrverband
|
||||
$result = $this->_ci->StudentlehrverbandModel->insert([
|
||||
'student_uid' => $uid,
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'studiengang_kz' => $student_data->studiengang_kz,
|
||||
'semester' => $incomingAusbildungssemester,
|
||||
'verband' => $incomingVerband,
|
||||
'gruppe' => ' ',
|
||||
'insertamum' => date('Y-m-d H:i:s'),
|
||||
'insertvon' => $authUID
|
||||
]);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
|
||||
return success($prestudent_id);
|
||||
}
|
||||
|
||||
protected function setBasic($authUID, $now, $status_kurzbz, $prestudent_id, $studiensemester_kurzbz, $ausbildungssemester, $statusgrund_id = null)
|
||||
{
|
||||
$result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id);
|
||||
|
||||
@@ -290,7 +290,11 @@ class Prestudentstatus_model extends DB_Model
|
||||
*/
|
||||
public function getLastStatusPerson($person_id, $studiensemester_kurzbz = null)
|
||||
{
|
||||
$query = 'SELECT *
|
||||
$query = 'SELECT p.*, ps.*, s.*,
|
||||
stg.kurzbz AS studiengang_kurzbz, stg.kurzbzlang AS studiengang_kurzbzlang,
|
||||
UPPER(typ::varchar(1) || kurzbz) AS studiengang_kuerzel,
|
||||
stg.typ AS studiengang_typ, stg.bezeichnung AS studiengang_bezeichnung, stg.english AS studiengang_bezeichnung_english,
|
||||
stg.orgform_kurzbz AS studiengang_orgform
|
||||
FROM public.tbl_prestudent p
|
||||
JOIN (
|
||||
SELECT DISTINCT ON(prestudent_id) *
|
||||
@@ -298,7 +302,8 @@ class Prestudentstatus_model extends DB_Model
|
||||
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)';
|
||||
JOIN public.tbl_status s USING(status_kurzbz)
|
||||
JOIN public.tbl_studiengang stg USING (studiengang_kz)';
|
||||
|
||||
$parametersArray = array($person_id);
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ class Student_model extends DB_Model
|
||||
$this->addSelect('1');
|
||||
|
||||
$result = $this->loadWhere(array('student_uid' => $uid));
|
||||
|
||||
|
||||
|
||||
if(hasData($result))
|
||||
{
|
||||
@@ -169,7 +169,7 @@ class Student_model extends DB_Model
|
||||
|
||||
$max = 0;
|
||||
if ($matrikelnrres && hasData($matrikelnrres)) {
|
||||
$max = mb_substr($matrikelnrres->retval[0]->matrikelnr, 7);
|
||||
$max = mb_substr(getData($matrikelnrres)[0]->matrikelnr, 7);
|
||||
if (!is_numeric($max)) {
|
||||
$max = (int)$max;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
export default {
|
||||
|
||||
getStudienplaeneBySemester(studiengang_kz, studiensemester_kurzbz, ausbildungssemester, orgform_kurzbz)
|
||||
{
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/organisation/studienplan/getBySemester',
|
||||
params: { studiengang_kz, studiensemester_kurzbz, ausbildungssemester, orgform_kurzbz },
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
export default {
|
||||
|
||||
getAll(order = null, start = null)
|
||||
{
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/organisation/studiensemester/getAll',
|
||||
params: { order, start }
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -60,10 +60,10 @@ export default {
|
||||
url: 'api/frontend/v1/stv/students/' + relative_path
|
||||
};
|
||||
},
|
||||
check(params) {
|
||||
getPerson(params) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/stv/student/check',
|
||||
url: 'api/frontend/v1/stv/student/getPerson',
|
||||
params
|
||||
};
|
||||
},
|
||||
|
||||
@@ -381,7 +381,6 @@ export default {
|
||||
return false;
|
||||
},
|
||||
actionNewPerson() {
|
||||
this.$refs.newPersonModal.reset();
|
||||
this.$refs.newPersonModal.open();
|
||||
},
|
||||
actionKontaktdatenBearbeiten() {
|
||||
|
||||
@@ -495,9 +495,7 @@ export default {
|
||||
:side-menu="false"
|
||||
reload
|
||||
:download="downloadConfig"
|
||||
` + /* TODO(chris): Ausgeblendet für Testing
|
||||
new-btn-show
|
||||
*/`
|
||||
:new-btn-label="$p.t('stv/action_new')"
|
||||
@click:new="actionNewPrestudent"
|
||||
@table-built="translateTabulator"
|
||||
|
||||
@@ -6,13 +6,18 @@ import FormInput from '../../../Form/Input.js';
|
||||
import accessibility from '../../../../directives/accessibility.js';
|
||||
|
||||
import ApiStvStudents from '../../../../api/factory/stv/students.js';
|
||||
import ApiStvAddress from '../../../../api/factory/stv/kontakt/address.js';
|
||||
import ApiStudiensemester from '../../../../api/factory/studiensemester.js';
|
||||
import ApiStudienplan from '../../../../api/factory/studienplan.js';
|
||||
|
||||
var _uuid = 0;
|
||||
const FORMDATA_DEFAULT = {
|
||||
address: {
|
||||
func: 1,
|
||||
checked: true,
|
||||
nation: 'A'
|
||||
},
|
||||
vorname: '',
|
||||
nachname: '',
|
||||
geburtsnation: 'A',
|
||||
staatsbuergerschaft: 'A',
|
||||
ausbildungssemester: 1,
|
||||
@@ -35,14 +40,14 @@ export default {
|
||||
],
|
||||
emits: ['saved'],
|
||||
props: {
|
||||
personOnly: Boolean,
|
||||
personOnly: Boolean,
|
||||
studiengangKz: Number,
|
||||
studiensemesterKurzbz: String
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
places: [],
|
||||
formData: FORMDATA_DEFAULT,
|
||||
formData: null,
|
||||
suggestions: {},
|
||||
person: null,
|
||||
semester: [],
|
||||
@@ -60,7 +65,7 @@ export default {
|
||||
return this.formData;
|
||||
},
|
||||
orte() {
|
||||
return this.places.filter(ort => ort.name == this.formData.address.gemeinde);
|
||||
return this.places.filter(ort => ort.name == this.formData?.address.gemeinde);
|
||||
},
|
||||
gemeinden() {
|
||||
return Object.values(this.places.reduce((res,place) => {
|
||||
@@ -70,7 +75,7 @@ export default {
|
||||
},
|
||||
formDataStg: {
|
||||
get() {
|
||||
return this.formData.studiengang_kz !== undefined ? this.formData.studiengang_kz : this.studiengangKz;
|
||||
return this.formData?.studiengang_kz !== undefined ? this.formData?.studiengang_kz : this.studiengangKz;
|
||||
},
|
||||
set(v) {
|
||||
this.formData.studiengang_kz = v;
|
||||
@@ -78,7 +83,7 @@ export default {
|
||||
},
|
||||
formDataSem: {
|
||||
get() {
|
||||
return this.formData.studiensemester_kurzbz !== undefined ? this.formData.studiensemester_kurzbz : this.studiensemesterKurzbz;
|
||||
return this.formData?.studiensemester_kurzbz !== undefined ? this.formData?.studiensemester_kurzbz : this.studiensemesterKurzbz;
|
||||
},
|
||||
set(v) {
|
||||
this.formData.studiensemester_kurzbz = v;
|
||||
@@ -98,10 +103,10 @@ export default {
|
||||
this.$refs.modal.show();
|
||||
},
|
||||
reset() {
|
||||
this.formData = FORMDATA_DEFAULT;
|
||||
this.formData = JSON.parse(JSON.stringify(FORMDATA_DEFAULT));
|
||||
this.person = null;
|
||||
this.suggestions = [];
|
||||
this.$refs.form.clearValidation();
|
||||
if (this.$refs.form) this.$refs.form.clearValidation();
|
||||
},
|
||||
loadSuggestions() {
|
||||
if (this.abortController.suggestions)
|
||||
@@ -112,10 +117,10 @@ export default {
|
||||
this.abortController.suggestions = new AbortController();
|
||||
|
||||
this.$api
|
||||
.call(ApiStvStudents.check({
|
||||
vorname: this.formData.vorname,
|
||||
nachname: this.formData.nachname,
|
||||
gebdatum: this.formData.gebdatum
|
||||
.call(ApiStvStudents.getPerson({
|
||||
vorname: this.formData?.vorname,
|
||||
nachname: this.formData?.nachname,
|
||||
gebdatum: this.formData?.gebdatum
|
||||
}), {
|
||||
signal: this.abortController.suggestions.signal
|
||||
})
|
||||
@@ -134,41 +139,40 @@ export default {
|
||||
loadPlaces() {
|
||||
if (this.abortController.places)
|
||||
this.abortController.places.abort();
|
||||
if (this.formData.address.nation != 'A' || !this.formData.address.plz)
|
||||
if (this.formData?.address?.nation != 'A' || !this?.formData?.address?.plz)
|
||||
return;
|
||||
|
||||
this.abortController.places = new AbortController();
|
||||
this.$refs.form
|
||||
.get(
|
||||
'api/frontend/v1/stv/address/getPlaces/' + this.formData.address.plz,
|
||||
undefined,
|
||||
{
|
||||
signal: this.abortController.places.signal
|
||||
}
|
||||
)
|
||||
.then(result => {
|
||||
this.places = result.data
|
||||
})
|
||||
.catch(error => {
|
||||
if (error.code != "ERR_CANCELED")
|
||||
window.setTimeout(this.loadPlaces, 100);
|
||||
else
|
||||
this.$fhcAlert.handleSystemError(error);
|
||||
});
|
||||
this.$refs.form.call(
|
||||
ApiStvAddress.getPlaces(this.formData?.address.plz)
|
||||
//~ undefined,
|
||||
//~ {
|
||||
//~ signal: this.abortController.places.signal
|
||||
//~ }
|
||||
)
|
||||
.then(result => {
|
||||
this.places = result.data
|
||||
})
|
||||
.catch(error => {
|
||||
if (error.code != "ERR_CANCELED")
|
||||
window.setTimeout(this.loadPlaces, 100);
|
||||
else
|
||||
this.$fhcAlert.handleSystemError(error);
|
||||
});
|
||||
},
|
||||
loadStudienplaene() {
|
||||
if (this.formDataStg)
|
||||
CoreRESTClient
|
||||
.post('components/stv/studienplan/get', {
|
||||
studiengang_kz: this.formDataStg,
|
||||
studiensemester_kurzbz: this.formDataSem,
|
||||
ausbildungssemester: this.formData.ausbildungssemester,
|
||||
orgform_kurzbz: this.formData.orgform_kurzbz
|
||||
})
|
||||
.then(result => CoreRESTClient.getData(result.data) || [])
|
||||
if (this.formDataStg) {
|
||||
this.$api
|
||||
.call(ApiStudienplan.getStudienplaeneBySemester(
|
||||
this.formDataStg,
|
||||
this.formDataSem,
|
||||
this.formData?.ausbildungssemester,
|
||||
this.formData?.orgform_kurzbz
|
||||
))
|
||||
.then(result => result.data || [])
|
||||
.then(result => {
|
||||
this.studienplaene = result;
|
||||
if (this.formData.studienplan_id !== '' && !this.studienplaene.filter(plan => plan.studienplan_id == this.formData.studienplan_id).length)
|
||||
if (this.formData?.studienplan_id !== '' && !this.studienplaene.filter(plan => plan.studienplan_id == this.formData?.studienplan_id).length)
|
||||
this.formData.studienplan_id = '';
|
||||
})
|
||||
.catch(error => {
|
||||
@@ -179,12 +183,13 @@ export default {
|
||||
if (error.code != "ERR_CANCELED")
|
||||
window.setTimeout(this.loadStudienplaene, 100);
|
||||
})
|
||||
}
|
||||
},
|
||||
changeAddressNation(e) {
|
||||
if (this.formData['geburtsnation'] == this.formData['address']['nation'])
|
||||
this.formData['geburtsnation'] = e.target.value;
|
||||
if (this.formData['staatsbuergerschaft'] == this.formData['address']['nation'])
|
||||
this.formData['staatsbuergerschaft'] = e.target.value;
|
||||
if (this.formData.geburtsnation == this.formData?.address.nation)
|
||||
this.formData.geburtsnation = e.target.value;
|
||||
if (this.formData.staatsbuergerschaft == this.formData?.address.nation)
|
||||
this.formData.staatsbuergerschaft = e.target.value;
|
||||
this.loadPlaces();
|
||||
},
|
||||
send(e) {
|
||||
@@ -213,29 +218,38 @@ export default {
|
||||
setPerson(suggestion)
|
||||
{
|
||||
this.person = suggestion;
|
||||
this.formData.address.func = -1;
|
||||
this.formData.address.checked = false;
|
||||
},
|
||||
dateFormatter(val)
|
||||
{
|
||||
if (!val)
|
||||
return '';
|
||||
let date = new Date(val);
|
||||
return date.toLocaleDateString('de-AT', {
|
||||
"day": "2-digit",
|
||||
"month": "2-digit",
|
||||
"year": "numeric"
|
||||
});
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.uuid = _uuid++;
|
||||
CoreRESTClient
|
||||
.get('components/stv/Studiensemester')
|
||||
.then(result => CoreRESTClient.getData(result.data) || [])
|
||||
.then(result => {
|
||||
this.semester = result;
|
||||
})
|
||||
.catch(this.$fhcAlert.handleSystemError);
|
||||
this.reset();
|
||||
this.$api.call(ApiStudiensemester.getAll())
|
||||
.then(result => result.data || [])
|
||||
.then(result => {
|
||||
this.semester = result;
|
||||
})
|
||||
.catch(this.$fhcAlert.handleSystemError);
|
||||
},
|
||||
template: `
|
||||
<fhc-form ref="form" class="stv-list-new" @submit.prevent="send">
|
||||
<bs-modal ref="modal" dialog-class="modal-lg modal-dialog-scrollable" @hidden-bs-modal="reset">
|
||||
<bs-modal ref="modal" dialog-class="modal-lg modal-dialog-scrollable" style="min-height: 500px" @hidden-bs-modal="reset">
|
||||
<template #title>
|
||||
{{ personOnly ? $p.t('person', 'personAnlegen') : $p.t('lehre', 'interessentAnlegen') }}
|
||||
</template>
|
||||
<template #default>
|
||||
|
||||
<form-validation></form-validation>
|
||||
|
||||
<template v-if="person === null">
|
||||
<div class="row">
|
||||
<div class="col-sm-4 mb-3">
|
||||
@@ -275,16 +289,24 @@ export default {
|
||||
@update:model-value="loadSuggestions"
|
||||
text-input
|
||||
auto-apply
|
||||
no-today
|
||||
no-today
|
||||
:enable-time-picker="false"
|
||||
format="dd.MM.yyyy"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
</div>
|
||||
<!-- TODO(chris): more details -->
|
||||
<table class="table caption-top table-striped table-hover">
|
||||
<table class="table caption-top table-striped table-hover" >
|
||||
<caption>{{ $p.t('person', 'personExistiertPruefung') }}</caption>
|
||||
<thead v-if="suggestions?.length">
|
||||
<th>{{ $p.t('person', 'nachname') }}</th>
|
||||
<th>{{ $p.t('person', 'vorname') }}</th>
|
||||
<th>{{ $p.t('person', 'weitereVornamen') }}</th>
|
||||
<th>{{ $p.t('person', 'geburtsdatum') }}</th>
|
||||
<th>{{ $p.t('person', 'geschlecht') }}</th>
|
||||
<th>{{ $p.t('person', 'adresse') }}</th>
|
||||
<th>Status</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr
|
||||
v-for="(suggestion, index) in suggestions"
|
||||
@@ -293,8 +315,21 @@ export default {
|
||||
@click="(index == 2) ? suggestions.shift() : setPerson(suggestion)"
|
||||
v-accessibility:tab.vertical
|
||||
>
|
||||
<td>{{suggestion.vorname + ' ' + suggestion.nachname}}</td>
|
||||
<td></td>
|
||||
<td>{{ suggestion.nachname }}</td>
|
||||
<td>{{ suggestion.vorname }}</td>
|
||||
<td>{{ suggestion.vornamen }}</td>
|
||||
<td>{{ dateFormatter(suggestion.gebdatum) }}</td>
|
||||
<td>{{ suggestion.geschlecht_bezeichnung }}</td>
|
||||
<td>
|
||||
<div v-for="adresse in suggestion.adressen">
|
||||
{{ (adresse.plz ?? '') + (adresse.plz && adresse.ort ? ' ' : '') + (adresse.ort ?? '') + (adresse.ort && adresse.strasse ? ', ' : '') + (adresse.strasse ?? '') }}
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div v-for="status in suggestion.status">
|
||||
{{ status.status_kurzbz + " " + status.studiengang_kuerzel }}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -418,23 +453,22 @@ export default {
|
||||
</form-input>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-6 mb-3">
|
||||
<form-input
|
||||
type="select"
|
||||
id="stv-list-new-address-func"
|
||||
name="address[func]"
|
||||
v-model="formData['address']['func']"
|
||||
:label="$p.t('person', 'adresseHinzufuegen')"
|
||||
type="checkbox"
|
||||
id="stv-new-adresse"
|
||||
name="adresseChecked"
|
||||
v-model="formData['address']['checked']"
|
||||
value="true"
|
||||
>
|
||||
<option value="-1" v-if="person">{{ $p.t('person', 'bestehendeAdresseUeberschreiben') }}</option>
|
||||
<option value="1">{{ $p.t('person', 'adresseHinzufuegen') }}</option>
|
||||
<option value="0">{{ $p.t('person', 'adresseNichtAnlegen') }}</option>
|
||||
</form-input>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<fieldset v-if="formData['address']['func'] != 0">
|
||||
<fieldset v-if="formData['address']['checked']">
|
||||
<hr>
|
||||
<legend>Adresse</legend>
|
||||
<div class="row">
|
||||
<div class="col-sm-4 mb-3">
|
||||
@@ -519,6 +553,7 @@ export default {
|
||||
</form-input>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
</fieldset>
|
||||
|
||||
<div class="row">
|
||||
@@ -644,7 +679,7 @@ export default {
|
||||
name="ausbildungssemester"
|
||||
v-model="formData['ausbildungssemester']"
|
||||
:disabled="formData['incoming']"
|
||||
@input="loadStudienplaene"
|
||||
@change="loadStudienplaene"
|
||||
>
|
||||
<option v-for="sem in Array.from({length:8}).map((u,i) => i+1)" :key="sem" :value="sem">{{sem}}. Semester</option>
|
||||
</form-input>
|
||||
@@ -658,7 +693,7 @@ export default {
|
||||
id="stv-list-new-orgform_kurzbz"
|
||||
name="orgform_kurzbz"
|
||||
v-model="formData['orgform_kurzbz']"
|
||||
@input="loadStudienplaene"
|
||||
@change="loadStudienplaene"
|
||||
>
|
||||
<option value="">-- keine Auswahl --</option>
|
||||
<option v-for="orgform in lists.orgforms" :key="orgform.orgform_kurzbz" :value="orgform.orgform_kurzbz">{{orgform.bezeichnung}}</option>
|
||||
@@ -679,7 +714,7 @@ export default {
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-10 mb-3">
|
||||
<div class="form-check">
|
||||
<div>
|
||||
<form-input
|
||||
label="Incoming"
|
||||
type="checkbox"
|
||||
@@ -696,7 +731,7 @@ export default {
|
||||
</template>
|
||||
</template>
|
||||
<template #footer>
|
||||
<button v-if="person !== null" type="button" class="btn btn-secondary" @click="person = null; formData.address.func = 1;"><i class="fa fa-chevron-left"></i>{{ $p.t('ui', 'zurueck') }}</button>
|
||||
<button v-if="person !== null" type="button" class="btn btn-secondary" @click="person = null; formData.address.checked = true;"><i class="fa fa-chevron-left"></i>{{ $p.t('ui', 'zurueck') }}</button>
|
||||
<button type="submit" class="btn btn-primary">{{ person === null || personOnly ? $p.t('person', 'personAnlegen') : $p.t('lehre', 'interessentAnlegen') }}</button>
|
||||
</template>
|
||||
</bs-modal>
|
||||
|
||||
Reference in New Issue
Block a user