diff --git a/application/controllers/Cis/Pub.php b/application/controllers/Cis/Pub.php index bebc844ab..de456145b 100644 --- a/application/controllers/Cis/Pub.php +++ b/application/controllers/Cis/Pub.php @@ -14,7 +14,7 @@ class Pub extends Auth_Controller { parent::__construct( array( - 'bild' => ['basis/cis:r'] + 'bild' => ['basis/cis:r', 'assistenz:r'] ) ); } diff --git a/application/controllers/Studentenverwaltung.php b/application/controllers/Studentenverwaltung.php index 2ce19c58a..3fba97e91 100644 --- a/application/controllers/Studentenverwaltung.php +++ b/application/controllers/Studentenverwaltung.php @@ -32,6 +32,10 @@ class Studentenverwaltung extends Auth_Controller 'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'), 'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'), 'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'), + 'student/editBakkZgv' => $this->permissionlib->isBerechtigt('student/editBakkZgv'), + 'student/editMakkZgv' => $this->permissionlib->isBerechtigt('student/editMakkZgv'), + 'student/editDokZgv' => $this->permissionlib->isBerechtigt('student/editDokZgv'), + 'student/editBismelden' => $this->permissionlib->isBerechtigt('student/editBismelden') ], 'variables' => [ 'semester_aktuell' => $this->variablelib->getVar('semester_aktuell') diff --git a/application/controllers/api/frontend/v1/messages/Messages.php b/application/controllers/api/frontend/v1/messages/Messages.php index 714492203..3035e532d 100644 --- a/application/controllers/api/frontend/v1/messages/Messages.php +++ b/application/controllers/api/frontend/v1/messages/Messages.php @@ -1,6 +1,5 @@ loadPhrases([ - 'ui' + 'ui', 'messages' ]); } @@ -156,19 +155,6 @@ class Messages extends FHCAPI_Controller $this->terminateWithSuccess($data); } -/* public function getNameOfDefaultRecipient($id, $type_id) - { - $id = ($type_id != 'person_id') ? $this->_getPersonId($id, $type_id) : $id; - - $this->load->model('person/Person_model', 'PersonModel'); - - $result = $this->PersonModel->load($id); - $data = $this->getDataOrTerminateWithError($result); - $name = current($data); - - $this->terminateWithSuccess($name->vorname . " " . $name->nachname ); - }*/ - public function getNameOfDefaultRecipients($type_id) { $ids = $this->input->post('ids'); @@ -178,7 +164,8 @@ class Messages extends FHCAPI_Controller $recipients = []; if (empty($ids)) { - throw new InvalidArgumentException("Keine ID(s) übergeben."); + + throw new InvalidArgumentException($this->p->t('ui', 'errorMissingOrInvalidParameters', ['parameter'=> 'Id(s)']), self::ERROR_TYPE_GENERAL); } $this->load->model('person/Person_model', 'PersonModel'); @@ -253,6 +240,10 @@ class Messages extends FHCAPI_Controller } } + if (!is_array($ids)) { + $ids = [$ids]; + } + foreach ($ids as $id) { $receiversPersonId = $typeId == "person_id" ? $id : $this->_getPersonId($id, $typeId); @@ -283,7 +274,7 @@ class Messages extends FHCAPI_Controller } else { - $this->terminateWithError("type_id " . $typeId . " not valid", self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL); } $result =$this->messagelib->sendMessageUser($receiversPersonId, $subject, $bodyParsed, $benutzer->person_id, null, $relationmessage_id); @@ -302,7 +293,7 @@ class Messages extends FHCAPI_Controller unset($_POST['data']); } else - $this->terminateWithError("Textbody missing ", self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('messages', 'errorMissingOrInvalidParameters', ['parameter'=> "Textbody"]), self::ERROR_TYPE_GENERAL); if (isset($_POST['ids'])) { @@ -314,7 +305,7 @@ class Messages extends FHCAPI_Controller unset($_POST['ids']); } else - $this->terminateWithError("IDs missing ", self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('ui', 'errorMissingOrInvalidParameters', ['parameter'=> 'Id(s)']), self::ERROR_TYPE_GENERAL); $bodyParsed = []; @@ -343,7 +334,7 @@ class Messages extends FHCAPI_Controller } break; default: - $this->terminateWithError("MESSAGES::getPreviewText logic for type_id " . $type_id . " not defined yet", self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $type_id]), self::ERROR_TYPE_GENERAL); break; } } @@ -353,7 +344,9 @@ class Messages extends FHCAPI_Controller public function getReplyData($messageId) { - //TODO(Manu) validation of messageId: if number + if (!is_numeric($messageId)) { + $this->terminateWithError($this->p->t('ui', 'error_valueNotNumeric', ['value'=> 'Message ID']), self::ERROR_TYPE_GENERAL); + } $this->MessageModel->addSelect('public.tbl_msg_message.*'); $this->MessageModel->addSelect('r.*'); @@ -376,7 +369,6 @@ class Messages extends FHCAPI_Controller $replyBody = $this->_getReplyBody($body, $dataMessage[0]->nachname, $dataMessage[0]->vorname, $dataMessage[0]->insertamum); $dataMessage[0]->replyBody = $replyBody; - $dataMessage[0]->rest = "Help Manu"; $dataMessage[0]->replySubject = $prefix . $subject; $this->terminateWithSuccess($dataMessage); @@ -424,6 +416,11 @@ class Messages extends FHCAPI_Controller ['prestudent_id' => $id] ); } + else + { + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL); + } + $data = $this->getDataOrTerminateWithError($result); $person = current($data); @@ -431,50 +428,6 @@ class Messages extends FHCAPI_Controller $this->terminateWithSuccess($person->person_id); } - public function getUid($typeId) - { - if (!$typeId) - { - $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Type ID']), self::ERROR_TYPE_GENERAL); - } - elseif ($typeId == 'person_id') - { - $this->load->model('person/Benutzer_model', 'BenutzerModel'); - $result = $this->BenutzerModel->loadWhere( - ['person_id' => $id] - ); - } - elseif($typeId == 'prestudent_id') - { - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - $result = $this->PrestudentModel->loadWhere( - ['prestudent_id' => $id] - ); - - $data = $this->getDataOrTerminateWithError($result); - $person = current($data); - $person_id = $person->person_id; - - $this->load->model('person/Benutzer_model', 'BenutzerModel'); - $result = $this->BenutzerModel->loadWhere( - ['person_id' => $person_id] - ); - } - elseif($typeId == 'uid' || $typeId == 'mitarbeiter_uid') - { - $this->terminateWithSuccess($id); - } - else - { - $this->terminateWithError("MESSAGES::getUID logic for type_id " . $typeId . " not defined yet", self::ERROR_TYPE_GENERAL); - } - - $data = $this->getDataOrTerminateWithError($result); - $benutzer = current($data); - - $this->terminateWithSuccess($benutzer->uid); - } - public function getUids($typeId) { $ids = $this->input->post('ids'); @@ -527,13 +480,9 @@ class Messages extends FHCAPI_Controller } else { - $this->terminateWithError("MESSAGES::getUID logic for type_id " . $typeId . " not defined yet", self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL); } - - //$data = $this->getDataOrTerminateWithError($resultBenutzer); - //$benutzer = current($data); - $this->terminateWithSuccess($benutzerIds); } @@ -553,11 +502,16 @@ class Messages extends FHCAPI_Controller ['prestudent_id' => $id] ); } + else + { + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL); + } + $data = $this->getDataOrTerminateWithError($result); if (count($data) < 1) { - $this->terminateWithError('Error: Messages API no person_id found.'); + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); } $person = current($data); @@ -566,7 +520,6 @@ class Messages extends FHCAPI_Controller private function _getPrestudentIdFromUid($uid) { - // $this->terminateWithError($uid, self::ERROR_TYPE_GENERAL); $this->load->model('crm/Student_model', 'StudentModel'); $result = $this->StudentModel->loadWhere( ['student_uid' => $uid] @@ -575,7 +528,7 @@ class Messages extends FHCAPI_Controller $data = $this->getDataOrTerminateWithError($result); if (count($data) < 1) { - $this->terminateWithError('Error: Messages API no prestudent_id found.'); + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL); } $student = current($data); diff --git a/application/controllers/api/frontend/v1/organisation/Studienplan.php b/application/controllers/api/frontend/v1/organisation/Studienplan.php new file mode 100644 index 000000000..c5a69fdee --- /dev/null +++ b/application/controllers/api/frontend/v1/organisation/Studienplan.php @@ -0,0 +1,69 @@ + 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) : []); + } +} diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php index 8a2f86b5f..17b360f8c 100644 --- a/application/controllers/api/frontend/v1/stv/Config.php +++ b/application/controllers/api/frontend/v1/stv/Config.php @@ -331,7 +331,10 @@ class Config extends FHCAPI_Controller ]; $result['status'] = [ 'title' => 'Status', - 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js') + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js'), + 'config' => [ + 'showStatusVorruecken' => defined('STATUS_VORRUECKEN_ANZEIGEN') ? STATUS_VORRUECKEN_ANZEIGEN : true, + ] ]; $result['documents'] = [ 'title' => $this->p->t('stv', 'tab_documents'), diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php index e490772db..36d445fc6 100644 --- a/application/controllers/api/frontend/v1/stv/Status.php +++ b/application/controllers/api/frontend/v1/stv/Status.php @@ -1341,6 +1341,7 @@ class Status extends FHCAPI_Controller 'updateamum' => date('c'), 'updatevon' => $authUID ]; + $nullableFields = ['statusgrund_id', 'anmerkung', 'rt_stufe']; foreach ([ 'orgform_kurzbz', 'anmerkung', @@ -1349,8 +1350,17 @@ class Status extends FHCAPI_Controller 'rt_stufe', 'statusgrund_id' ] as $key) - if ($this->input->post($key)) + { + if (in_array($key, $nullableFields)) + { + $updateData[$key] = ($this->input->post($key) === '') ? null : $this->input->post($key); + } + else if ($this->input->post($key)) + { $updateData[$key] = $this->input->post($key); + } + } + if ($this->input->post('bestaetigtam')) { $updateData['bestaetigtam'] = $this->input->post('bestaetigtam'); diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php index f0172da8a..ad6883f94 100644 --- a/application/controllers/api/frontend/v1/stv/Student.php +++ b/application/controllers/api/frontend/v1/stv/Student.php @@ -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; } } diff --git a/application/libraries/PrestudentLib.php b/application/libraries/PrestudentLib.php index 2d795369f..28879fb47 100644 --- a/application/libraries/PrestudentLib.php +++ b/application/libraries/PrestudentLib.php @@ -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); diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php index de91319b9..c0ed8595e 100644 --- a/application/models/crm/Prestudentstatus_model.php +++ b/application/models/crm/Prestudentstatus_model.php @@ -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); diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php index 539c3cf56..6f2404cbd 100644 --- a/application/models/crm/Student_model.php +++ b/application/models/crm/Student_model.php @@ -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; } diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php index f24a302cc..37bedbdcb 100644 --- a/config/global.config-default.inc.php +++ b/config/global.config-default.inc.php @@ -360,4 +360,8 @@ define('SANCHO_MAIL_HEADER_IMG', 'sancho_header_DEFAULT.jpg'); // footer image for eigene Mails define('SANCHO_MAIL_FOOTER_IMG', 'sancho_footer_DEFAULT.jpg'); + +// Gibt an, ob in der StudVW der Status vorgerueckt werden kann +define('STATUS_VORRUECKEN_ANZEIGEN', true); + ?> diff --git a/public/css/Cis4/Cis.css b/public/css/Cis4/Cis.css index ff1b181dd..2bb467048 100644 --- a/public/css/Cis4/Cis.css +++ b/public/css/Cis4/Cis.css @@ -407,6 +407,7 @@ html { background-color: var(--fhc-background); border-color: var(--fhc-border); padding: var(--fhc-cis-main-py) var(--fhc-cis-main-px); + min-width: 0; /* fix flex-grow with tabulator exceeding width */ } #cis-main .fa-arrow-up-right-from-square { @@ -854,4 +855,4 @@ html { #cis-main .modal-footer { background-color: var(--fhc-secondary); -} \ No newline at end of file +} diff --git a/public/js/api/factory/messages/messages.js b/public/js/api/factory/messages/messages.js index c3542308a..b7b21dd8a 100644 --- a/public/js/api/factory/messages/messages.js +++ b/public/js/api/factory/messages/messages.js @@ -58,13 +58,6 @@ export default { url: 'api/frontend/v1/messages/messages/getPersonId/' + params.id + '/' + params.type_id }; }, -/* getUid(ids, type_id){ - return { - method: 'post', - url: 'api/frontend/v1/messages/messages/getUids/' + type_id, - params: {ids} - }; - },*/ getDataVorlage(vorlage_kurzbz){ return { method: 'get', @@ -91,20 +84,6 @@ export default { url: 'api/frontend/v1/messages/messages/getReplyData/' + messageId }; }, -/* sendMessageFromModalContext(id, params) { - return { - method: 'post', - url: 'api/frontend/v1/messages/messages/sendMessage/' + id, - params - }; - }, */ - sendMessageFromModalContext(type_id, params) { - return { - method: 'post', - url: 'api/frontend/v1/messages/messages/sendMessage/' + type_id, - params - }; - }, sendMessage(type_id, params) { return { method: 'post', diff --git a/public/js/api/factory/studienplan.js b/public/js/api/factory/studienplan.js new file mode 100644 index 000000000..550a5211c --- /dev/null +++ b/public/js/api/factory/studienplan.js @@ -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 }, + }; + } +} \ No newline at end of file diff --git a/public/js/api/factory/studiensemester.js b/public/js/api/factory/studiensemester.js new file mode 100644 index 000000000..367ec9558 --- /dev/null +++ b/public/js/api/factory/studiensemester.js @@ -0,0 +1,11 @@ +export default { + + getAll(order = null, start = null) + { + return { + method: 'get', + url: 'api/frontend/v1/organisation/studiensemester/getAll', + params: { order, start } + }; + } +} \ No newline at end of file diff --git a/public/js/api/factory/stv/students.js b/public/js/api/factory/stv/students.js index cae2f31b2..c17e32ff9 100644 --- a/public/js/api/factory/stv/students.js +++ b/public/js/api/factory/stv/students.js @@ -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 }; }, diff --git a/public/js/components/Messages/Details/NewMessage/Modal.js b/public/js/components/Messages/Details/NewMessage/Modal.js index d173bc7d0..47187de89 100644 --- a/public/js/components/Messages/Details/NewMessage/Modal.js +++ b/public/js/components/Messages/Details/NewMessage/Modal.js @@ -4,6 +4,8 @@ import FormInput from '../../../Form/Input.js'; import ListBox from "../../../../../../index.ci.php/public/js/components/primevue/listbox/listbox.esm.min.js"; import DropdownComponent from "../../../VorlagenDropdown/VorlagenDropdown.js"; +import ApiMessages from '../../../../api/factory/messages/messages.js'; + export default { name: "ModalNewMessages", components: { @@ -14,10 +16,6 @@ export default { ListBox }, props: { - endpoint: { - type: Object, - required: true - }, typeId: String, id: { type: Array, @@ -58,7 +56,6 @@ export default { previewText: null, previewBody: "", replyData: null, - } }, methods: { @@ -117,7 +114,7 @@ export default { data.append('ids', JSON.stringify(this.id)); return this.$refs.formMessage - .call(this.endpoint.sendMessageFromModalContext(this.typeId, data)) + .call(ApiMessages.sendMessage(this.typeId, data)) .then(response => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSent')); this.hideModal('modalNewMessage'); @@ -134,7 +131,7 @@ export default { }, getDataVorlage(vorlage_kurzbz){ return this.$api - .call(this.endpoint.getDataVorlage(vorlage_kurzbz)) + .call(ApiMessages.getDataVorlage(vorlage_kurzbz)) .then(response => { this.formData.body = response.data.text; this.formData.subject = response.data.subject; @@ -146,14 +143,13 @@ export default { data.append('ids', JSON.stringify(this.id)); return this.$api - .call(this.endpoint.getPreviewText( + .call(ApiMessages.getPreviewText( this.typeId, data)) .then(response => { const previews = response.data; this.previewText = previews[this.defaultRecipient]; }).catch(this.$fhcAlert.handleSystemError) .finally(() => { - //this.resetForm(); //closeModal //closewindwo }); @@ -168,7 +164,7 @@ export default { this.editor.save(); } else { - console.error("Editor instance is not available."); + console.error(this.$p.t('messages', 'errorEditorNotAvailable')); } }, resetForm(){ @@ -177,6 +173,7 @@ export default { body: null, subject: null, }; + this.$emit('resetMessageId'); if (this.editor) { @@ -230,7 +227,7 @@ export default { if (!newMessageId) return; try { - const result = await this.$api.call(this.endpoint.getReplyData(newMessageId)); + const result = await this.$api.call(ApiMessages.getReplyData(newMessageId)); this.replyData = result.data; if (this.replyData.length > 0) { @@ -247,7 +244,7 @@ export default { created(){ if(this.typeId == 'person_id' || this.typeId == 'mitarbeiter_uid'){ this.$api - .call(this.endpoint.getMessageVarsPerson(this.id, this.typeId)) + .call(ApiMessages.getMessageVarsPerson(this.id, this.typeId)) .then(result => { this.fieldsPerson = result.data; const person = this.fieldsPerson[0]; @@ -261,7 +258,7 @@ export default { if(this.typeId == 'prestudent_id' || this.typeId == 'uid'){ this.$api - .call(this.endpoint.getMsgVarsPrestudent(this.id, this.typeId)) + .call(ApiMessages.getMsgVarsPrestudent(this.id, this.typeId)) .then(result => { this.fieldsPrestudent = result.data; const prestudent = this.fieldsPrestudent[0]; @@ -274,7 +271,7 @@ export default { } this.$api - .call(this.endpoint.getMsgVarsLoggedInUser()) + .call(ApiMessages.getMsgVarsLoggedInUser()) .then(result => { this.fieldsUser = result.data; const user = this.fieldsUser; @@ -286,7 +283,7 @@ export default { .catch(this.$fhcAlert.handleSystemError); this.$api - .call(this.endpoint.getNameOfDefaultRecipients(this.id, this.typeId)) + .call(ApiMessages.getNameOfDefaultRecipients(this.id, this.typeId)) .then(result => { this.defaultRecipients = result.data; this.defaultRecipientString = Object.values(this.defaultRecipients).join("; "); @@ -297,7 +294,7 @@ export default { //case of reply if(this.messageId) { this.$api - .call(this.endpoint.getReplyData(this.messageId)) + .call(ApiMessages.getReplyData(this.messageId)) .then(result => { this.replyData = result.data; this.formData.subject = this.replyData[0].replySubject; diff --git a/public/js/components/Messages/Details/NewMessage/NewDiv.js b/public/js/components/Messages/Details/NewMessage/NewDiv.js index 8c8e371a0..b0c52f0f7 100644 --- a/public/js/components/Messages/Details/NewMessage/NewDiv.js +++ b/public/js/components/Messages/Details/NewMessage/NewDiv.js @@ -13,12 +13,6 @@ export default { DropdownComponent, }, props: { -/* - endpoint: { - type: Object, - required: true - }, -*/ openMode: String, typeId: String, id: { @@ -113,7 +107,6 @@ export default { if(this.openMode == "inSamePage" && this.id.length == 1 ){ this.$emit('reloadTable'); } - this.resetForm(); } ); }, @@ -126,10 +119,14 @@ export default { }).catch(this.$fhcAlert.handleSystemError); }, getPreviewText(){ + console.log("subj" + this.formData.subject); const data = new FormData(); + data.append('data', JSON.stringify(this.formData.body)); data.append('ids', JSON.stringify(this.id)); + console.log("subj" + this.formData.subject); + return this.$api .call(ApiMessages.getPreviewText( this.typeId, data)) @@ -150,7 +147,7 @@ export default { this.editor.save(); } else { - console.error("Editor instance is not available."); + console.error(this.$p.t('messages', 'errorEditorNotAvailable')); } }, resetForm(){ @@ -182,14 +179,28 @@ export default { this.isVisible = false; }, showTemplate(){ - if (this.openMode == "inSamePage") + if (this.openMode == "inSamePage") { this.isVisible = true; + //to enable send newMessage after sentMessage + this.messageSent = false; + } }, showPreview(){ this.getPreviewText().then(() => { this.previewBody = this.previewText; }); }, + loadReplyData(messageId){ + this.$api + .call(ApiMessages.getReplyData(messageId)) + .then(result => { + this.replyData = result.data; + this.formData.subject = this.replyData[0].replySubject; + this.formData.body = this.replyData[0].replyBody; + this.formData.relationmessage_id = messageId; + }) + .catch(this.$fhcAlert.handleSystemError); + } }, watch: { 'formData.body': { @@ -216,14 +227,12 @@ export default { const missingparamsmsgs = []; if(!this.typeId) { - // TODO(bh) Phrase - missingparamsmsgs.push('Fehlender oder ungültiger Parameter Empfänger-Id-Typ.'); + missingparamsmsgs.push(this.$p.t('messages', 'errorMissingOrInvalidParameterRecipientTypeId')); } if(!this.id || this.id.length < 1) { - // TODO(bh) Phrase - missingparamsmsgs.push('Fehlender oder ungültiger Parameter Empfänger-Id(s).'); + missingparamsmsgs.push(this.$p.t('messages', 'errorMissingOrInvalidParameterRecipientIds')); } if(missingparamsmsgs.length > 0) @@ -283,7 +292,8 @@ export default { //case of reply if(this.messageId != null) { - this.$api + this.loadReplyData(this.messageId); +/* this.$api .call(ApiMessages.getReplyData(this.messageId)) .then(result => { this.replyData = result.data; @@ -291,7 +301,7 @@ export default { this.formData.body = this.replyData[0].replyBody; this.formData.relationmessage_id = this.messageId; }) - .catch(this.$fhcAlert.handleSystemError); + .catch(this.$fhcAlert.handleSystemError);*/ } }, @@ -305,7 +315,7 @@ export default {
-
+

{{ $p.t('messages', 'neueNachricht') }}

diff --git a/public/js/components/Messages/Details/TableMessages.js b/public/js/components/Messages/Details/TableMessages.js index 4654bed8c..a55ddec63 100644 --- a/public/js/components/Messages/Details/TableMessages.js +++ b/public/js/components/Messages/Details/TableMessages.js @@ -1,6 +1,8 @@ import {CoreFilterCmpt} from "../../filter/Filter.js"; import FormForm from '../../Form/Form.js'; +import ApiMessages from "../../../api/factory/messages/messages.js" + export default { name: "TableMessages", components: { @@ -13,10 +15,6 @@ export default { }, }, props: { - endpoint: { - type: Object, - required: true - }, typeId: String, id: { type: Array, @@ -281,7 +279,7 @@ export default { }, deleteMessage(message_id){ return this.$api - .call(this.endpoint.deleteMessage(message_id)) + .call(ApiMessages.deleteMessage(message_id)) .then(response => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); }).catch(this.$fhcAlert.handleSystemError) @@ -347,7 +345,7 @@ export default { }, loadAjaxCall(url, config, params){ return this.$api.call( - this.endpoint.getMessages(params) + ApiMessages.getMessages(params) ); } }, @@ -378,7 +376,7 @@ export default { type_id: this.typeId }; this.$api - .call(this.endpoint.getPersonId(params)) + .call(ApiMessages.getPersonId(params)) .then(result => { this.personId = result.data; }) diff --git a/public/js/components/Messages/Messages.js b/public/js/components/Messages/Messages.js index 61a260ffd..1f9afcb9e 100644 --- a/public/js/components/Messages/Messages.js +++ b/public/js/components/Messages/Messages.js @@ -14,10 +14,6 @@ export default { } }, props: { - endpoint: { - type: Object, - required: true - }, typeId: { type: String, required: true, @@ -74,18 +70,25 @@ export default { handleMessage(id, typeId, messageId){ this.messageId = messageId; if (this.openMode == "window") { - //this.$refs['newMsgForm'].submit(); this.openInNewWindow(id, typeId, messageId); } else if (this.openMode == "newTab"){ - //this.$refs['newMsgForm'].submit(); this.openInNewTab(id, typeId, messageId); } else if (this.openMode == "modal"){ + if(!messageId) + this.$refs.modalMsg.resetForm(); this.$refs.modalMsg.show(); } else if (this.openMode == "inSamePage"){ + console.log("in same Page"); this.isVisibleDiv = true; + if(messageId) + this.$refs.templateNewDivMessage.loadReplyData(messageId); + else + this.$refs.templateNewDivMessage.resetForm(); + + this.$refs.templateNewDivMessage.showTemplate(); } else console.log("no valid openMode"); @@ -156,7 +159,6 @@ export default { :type-id="typeId" :id="id" :message-id="messageId" - :endpoint="endpoint" :openMode="openMode" @reloadTable="reloadTable" @resetMessageId="resetMessageId" @@ -164,13 +166,12 @@ export default { -
+
@@ -182,7 +183,6 @@ export default { ref="templateTableMessage" :type-id="typeId" :id="id" - :endpoint="endpoint" :messageLayout="messageLayout" :openMode="openMode" @newMessage="handleMessage" diff --git a/public/js/components/Stv/Studentenverwaltung.js b/public/js/components/Stv/Studentenverwaltung.js index 4931a15ba..42a775bb4 100644 --- a/public/js/components/Stv/Studentenverwaltung.js +++ b/public/js/components/Stv/Studentenverwaltung.js @@ -84,7 +84,12 @@ export default { configShowAufnahmegruppen: this.config.showAufnahmegruppen, configAllowUebernahmePunkte: this.config.allowUebernahmePunkte, configUseReihungstestPunkte: this.config.useReihungstestPunkte, - appConfig: Vue.computed(() => this.appconfig) + appConfig: Vue.computed(() => this.appconfig), + hasZGVBakkPermission: this.permissions['student/editBakkZgv'], + hasZGVMasterPermission: this.permissions['student/editMakkZgv'], + hasZGVDoctorPermission: this.permissions['student/editDokZgv'], + hasBismeldenPermission: this.permissions['student/editBismelden'], + } }, data() { @@ -155,7 +160,7 @@ export default { extraItems.push({ link: FHC_JS_DATA_STORAGE_OBJECT.app_root - + 'content/statistik/notenspiegel.php?type=xls' + + 'content/statistik/notenspiegel.php?typ=xls' + '&studiengang_kz=' + studiengang_kz + '&semester=' + semester + '&studiensemester=' + this.studiensemesterKurzbz @@ -173,7 +178,7 @@ export default { }); extraItems.push({ link: FHC_JS_DATA_STORAGE_OBJECT.app_root - + 'content/statistik/notenspiegel.php?type=html' + + 'content/statistik/notenspiegel.php?typ=html' + '&studiengang_kz=' + studiengang_kz + '&semester=' + semester + '&studiensemester=' + this.studiensemesterKurzbz diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung/Abschlusspruefung.js b/public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung/Abschlusspruefung.js index 6ed710c29..2f15a57ef 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung/Abschlusspruefung.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung/Abschlusspruefung.js @@ -438,11 +438,9 @@ export default { if (this.stgInfo.typ === 'b') { this.formData.pruefungstyp_kurzbz = 'Bachelor'; - this.formData.protokoll = this.$p.t('abschlusspruefung', 'pruefungsnotizenMaster'); } if (this.stgInfo.typ === 'd' || this.stgInfo === 'm') { this.formData.pruefungstyp_kurzbz = 'Diplom'; - this.formData.protokoll = this.$p.t('abschlusspruefung', 'pruefungsnotizenMaster'); } if (this.stgInfo.typ === 'lg') { this.formData.pruefungstyp_kurzbz = 'lgabschluss'; diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Messages.js b/public/js/components/Stv/Studentenverwaltung/Details/Messages.js index 4acb0aef4..8bbb596d6 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Messages.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Messages.js @@ -1,5 +1,5 @@ import CoreMessages from "../../../Messages/Messages.js"; -import ApiMessages from "../../../../api/factory/messages/messages.js"; +//import ApiMessages from "../../../../api/factory/messages/messages.js"; export default { name: "TabMessages", @@ -11,7 +11,7 @@ export default { }, data(){ return { - endpoint: ApiMessages + //endpoint: ApiMessages }; }, computed: { @@ -36,7 +36,6 @@ export default {