diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php index 42de1b02f..e0d9daf26 100644 --- a/application/controllers/api/frontend/v1/stv/Config.php +++ b/application/controllers/api/frontend/v1/stv/Config.php @@ -128,6 +128,11 @@ class Config extends FHCAPI_Controller 'component' => './Stv/Studentenverwaltung/Details/Mobility.js' ]; + $result['jointstudies'] = [ + 'title' => $this->p->t('stv', 'tab_jointstudies'), + 'component' => './Stv/Studentenverwaltung/Details/JointStudies.js' + ]; + Events::trigger('stv_conf_student', function & () use (&$result) { return $result; }); diff --git a/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php b/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php new file mode 100644 index 000000000..dbf9efce1 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php @@ -0,0 +1,283 @@ + ['admin:r', 'assistenz:r'], + 'loadStudie' => ['admin:r', 'assistenz:r'], + 'insertStudie' => ['admin:rw', 'assistenz:rw'], + 'updateStudie' => ['admin:rw', 'assistenz:rw'], + 'deleteStudie' => ['admin:rw', 'assistenz:rw'], + 'getProgramsStudien' => ['admin:r', 'assistenz:r'], + 'getTypenMobility' => ['admin:r', 'assistenz:r'], + 'getStudiensemester' => ['admin:r', 'assistenz:r'], + 'getStudienprogramme' => ['admin:r', 'assistenz:r'], + 'getPartnerfirmen' => ['admin:r', 'assistenz:r'], + 'getStatiPrestudent' => ['admin:r', 'assistenz:r'], + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('form_validation'); + + // Load language phrases + $this->loadPhrases([ + 'ui', + 'jointstudies' + ]); + + // Load models + $this->load->model('codex/Mobilitaet_model', 'MobilitaetModel'); + + //TODO(check if additional Permissions necessary): 'student/stammdaten' + } + + public function getStudien($prestudent_id) + { + $this->MobilitaetModel->addSelect('mobilitaet_id'); + $this->MobilitaetModel->addSelect('mobilitaetstyp_kurzbz'); + $this->MobilitaetModel->addSelect('prestudent_id'); + $this->MobilitaetModel->addSelect('studiensemester_kurzbz'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.mobilitaetsprogramm_code'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.gsprogramm_id'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.firma_id'); + $this->MobilitaetModel->addSelect('status_kurzbz'); + $this->MobilitaetModel->addSelect('ausbildungssemester'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.insertvon'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.insertamum'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.updatevon'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.updateamum'); + $this->MobilitaetModel->addSelect('mp.kurzbz'); + $this->MobilitaetModel->addSelect('gp.gsprogrammtyp_kurzbz'); + $this->MobilitaetModel->addSelect('gp.bezeichnung as studienprogramm'); + $this->MobilitaetModel->addSelect('f.name as partner'); + + $this->MobilitaetModel->addJoin('bis.tbl_mobilitaetsprogramm mp', 'ON (mp.mobilitaetsprogramm_code = bis.tbl_mobilitaet.mobilitaetsprogramm_code)', 'LEFT'); + $this->MobilitaetModel->addJoin('bis.tbl_gsprogramm gp', 'ON (gp.gsprogramm_id = bis.tbl_mobilitaet.gsprogramm_id)', 'LEFT'); + $this->MobilitaetModel->addJoin('public.tbl_firma f', 'ON (f.firma_id = bis.tbl_mobilitaet.firma_id)', 'LEFT'); + + $result = $this->MobilitaetModel->loadWhere([ + 'prestudent_id' => $prestudent_id, + ]); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function getTypenMobility() + { + $this->load->model('codex/Mobilitaetstyp_model', 'MobilitaetstypModel'); + + $result = $this->MobilitaetstypModel->load(); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function getStudiensemester() + { + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $this->StudiensemesterModel->addOrder('studienjahr_kurzbz', 'DESC'); + $result = $this->StudiensemesterModel->load(); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function getStudienprogramme() + { + $this->load->model('codex/Gsprogramm_model', 'GsprogrammModel'); + + $result = $this->GsprogrammModel->load(); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function getPartnerfirmen() + { + $this->load->model('ressource/Firma_model', 'FirmaModel'); + + $result = $this->FirmaModel->loadWhere( + ['partner_code !=' => null] + ); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function getStatiPrestudent() + { + $this->load->model('crm/Status_model', 'StatusModel'); + + $result = $this->StatusModel->load(); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function loadStudie($mobilitaet_id) + { + $result = $this->MobilitaetModel->load($mobilitaet_id); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess(current($data)); + } + + public function insertStudie() + { + $this->load->library('form_validation'); + $authUID = getAuthUID(); + + $prestudent_id = $this->input->post('prestudent_id'); + if(!$prestudent_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + $_POST['ausbildungssemester'] = (isset($formData['ausbildungssemester']) && !empty($formData['ausbildungssemester'])) + ? $formData['ausbildungssemester'] + : null; + $_POST['mobilitaetstyp_kurzbz'] = (isset($formData['mobilitaetstyp_kurzbz']) && !empty($formData['mobilitaetstyp_kurzbz'])) + ? $formData['mobilitaetstyp_kurzbz'] + : null; + $_POST['studiensemester_kurzbz'] = (isset($formData['studiensemester_kurzbz']) && !empty($formData['studiensemester_kurzbz'])) + ? $formData['studiensemester_kurzbz'] : null; + + $this->form_validation->set_rules('mobilitaetstyp_kurzbz', 'Typ', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) + ]); + + $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Studiensemester']) + ]); + + $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'required|numeric', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Ausbildungssemester']), + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ausbildungssemester']), + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $status_kurzbz = (isset($formData['status_kurzbz']) && !empty($formData['status_kurzbz'])) + ? $formData['status_kurzbz'] + : null; + $mobilitaetsprogramm_code = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) + ? $formData['mobilitaetsprogramm_code'] + : null; + $gsprogramm_id = (isset($formData['gsprogramm_id']) && !empty($formData['gsprogramm_id'])) + ? $formData['gsprogramm_id'] + : null; + $firma_id= (isset($formData['firma_id']) && !empty($formData['firma_id'])) ? $formData['firma_id'] : null; + + $result = $this->MobilitaetModel->insert([ + 'prestudent_id' => $prestudent_id, + 'mobilitaetstyp_kurzbz' => $_POST['mobilitaetstyp_kurzbz'], + 'status_kurzbz' => $status_kurzbz, + 'studiensemester_kurzbz' => $_POST['studiensemester_kurzbz'], + 'mobilitaetsprogramm_code' => $mobilitaetsprogramm_code, + 'gsprogramm_id' => $gsprogramm_id, + 'firma_id' => $firma_id, + 'ausbildungssemester' => $_POST['ausbildungssemester'], + 'insertvon' => $authUID, + 'insertamum' => date('c'), + ]); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function updateStudie() + { + $this->load->library('form_validation'); + $authUID = getAuthUID(); + + $prestudent_id = $this->input->post('prestudent_id'); + if(!$prestudent_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + + $_POST['mobilitaet_id'] = (isset($formData['mobilitaet_id']) && !empty($formData['mobilitaet_id'])) + ? $formData['mobilitaet_id'] : + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Mobilitaet ID']), self::ERROR_TYPE_GENERAL); + $_POST['ausbildungssemester'] = (isset($formData['ausbildungssemester']) && !empty($formData['ausbildungssemester'])) + ? $formData['ausbildungssemester'] + : null; + $_POST['mobilitaetstyp_kurzbz'] = (isset($formData['mobilitaetstyp_kurzbz']) && !empty($formData['mobilitaetstyp_kurzbz'])) + ? $formData['mobilitaetstyp_kurzbz'] + : null; + $_POST['studiensemester_kurzbz'] = (isset($formData['studiensemester_kurzbz']) && !empty($formData['studiensemester_kurzbz'])) + ? $formData['studiensemester_kurzbz'] + : null; + + $this->form_validation->set_rules('mobilitaetstyp_kurzbz', 'Typ', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) + ]); + + $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Studiensemester']) + ]); + + $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'required|numeric', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Ausbildungssemester']), + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ausbildungssemester']), + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $status_kurzbz = (isset($formData['status_kurzbz']) && !empty($formData['status_kurzbz'])) ? $formData['status_kurzbz'] : null; + $mobilitaetsprogramm_code = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) + ? $formData['mobilitaetsprogramm_code'] + : null; + $gsprogramm_id = (isset($formData['gsprogramm_id']) && !empty($formData['gsprogramm_id'])) + ? $formData['gsprogramm_id'] + : null; + $firma_id= (isset($formData['firma_id']) && !empty($formData['firma_id'])) ? $formData['firma_id'] : null; + + $result = $this->MobilitaetModel->update( + [ + 'mobilitaet_id' => $_POST['mobilitaet_id'], + ], + [ + 'prestudent_id' => $prestudent_id, + 'mobilitaetstyp_kurzbz' => $_POST['mobilitaetstyp_kurzbz'], + 'status_kurzbz' => $status_kurzbz, + 'studiensemester_kurzbz' => $_POST['studiensemester_kurzbz'], + 'mobilitaetsprogramm_code' => $mobilitaetsprogramm_code, + 'gsprogramm_id' => $gsprogramm_id, + 'firma_id' => $firma_id, + 'ausbildungssemester' => $_POST['ausbildungssemester'], + 'updatevon' => $authUID, + 'updateamum' => date('c'), + ] + ); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function deleteStudie($mobilitaet_id) + { + if(!$mobilitaet_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Mobilität ID']), self::ERROR_TYPE_GENERAL); + } + $result = $this->MobilitaetModel->delete( + array('mobilitaet_id' => $mobilitaet_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } +} diff --git a/application/models/codex/Mobilitaetstyp_model.php b/application/models/codex/Mobilitaetstyp_model.php new file mode 100644 index 000000000..f93f588a0 --- /dev/null +++ b/application/models/codex/Mobilitaetstyp_model.php @@ -0,0 +1,14 @@ +dbTable = 'bis.tbl_mobilitaetstyp'; + $this->pk = 'mobilitaetstyp_kurzbz'; + } +} diff --git a/public/js/api/stv.js b/public/js/api/stv.js index ae88b0516..89a69c84e 100644 --- a/public/js/api/stv.js +++ b/public/js/api/stv.js @@ -10,6 +10,7 @@ import exam from './stv/exam.js'; import abschlusspruefung from './stv/abschlusspruefung.js'; import grades from './stv/grades.js'; import mobility from './stv/mobility.js'; +import jointstudies from "./stv/jointstudies.js"; export default { verband, @@ -24,6 +25,7 @@ export default { abschlusspruefung, grades, mobility, + jointstudies, configStudent() { return this.$fhcApi.get('api/frontend/v1/stv/config/student'); }, diff --git a/public/js/api/stv/jointstudies.js b/public/js/api/stv/jointstudies.js new file mode 100644 index 000000000..b550852df --- /dev/null +++ b/public/js/api/stv/jointstudies.js @@ -0,0 +1,33 @@ +export default { + getStudies(url, config, params) { + return this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudien/' + params.id); + }, + getTypenMobility(){ + return this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getTypenMobility/'); + }, + getStudiensemester(){ + return this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudiensemester/'); + }, + getStudyprograms(){ + return this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudienprogramme/'); + }, + getListPartner(){ + return this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getPartnerfirmen/'); + }, + getStatiPrestudent(){ + return this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStatiPrestudent/'); + }, + loadStudy(id){ + return this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/loadStudie/' + id); + }, + insertStudy(form, data){ + return this.$fhcApi.post(form,'api/frontend/v1/stv/GemeinsameStudien/insertStudie/', data); + }, + updateStudy(form, data){ + return this.$fhcApi.post(form,'api/frontend/v1/stv/GemeinsameStudien/updateStudie/', data); + }, + deleteStudy(id){ + return this.$fhcApi.post('api/frontend/v1/stv/GemeinsameStudien/deleteStudie/' + id); + }, + +} \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung/Details/JointStudies.js b/public/js/components/Stv/Studentenverwaltung/Details/JointStudies.js new file mode 100644 index 000000000..e80ae34f6 --- /dev/null +++ b/public/js/components/Stv/Studentenverwaltung/Details/JointStudies.js @@ -0,0 +1,16 @@ +import TblJointStudies from "./JointStudies/JointStudies.js"; + +export default { + name: 'Tab_JointStudies', + components: { + TblJointStudies + }, + props: { + modelValue: Object, + }, + template: ` +
{{$p.t('jointstudies', 'neuAnlegen')}}
+{{$p.t('jointstudies', 'edit')}}
+ + +