diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php
index f717137a2..4b50a1970 100644
--- a/application/controllers/api/frontend/v1/stv/Config.php
+++ b/application/controllers/api/frontend/v1/stv/Config.php
@@ -155,6 +155,11 @@ class Config extends FHCAPI_Controller
]
];
+ $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/factory/stv/jointstudies.js b/public/js/api/factory/stv/jointstudies.js
new file mode 100644
index 000000000..18f398bb4
--- /dev/null
+++ b/public/js/api/factory/stv/jointstudies.js
@@ -0,0 +1,81 @@
+/**
+ * Copyright (C) 2025 fhcomplete.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+export default {
+ getStudies(uid) {
+ return {
+ method: 'get',
+ url: 'api/frontend/v1/stv/GemeinsameStudien/getStudien/' + uid
+ };
+ },
+ getTypenMobility(){
+ return {
+ method: 'get',
+ url: 'api/frontend/v1/stv/GemeinsameStudien/getTypenMobility/'
+ };
+ },
+ getStudiensemester(){
+ return {
+ method: 'get',
+ url: 'api/frontend/v1/stv/GemeinsameStudien/getStudiensemester/'
+ };
+ },
+ getStudyprograms(){
+ return {
+ method: 'get',
+ url: 'api/frontend/v1/stv/GemeinsameStudien/getStudienprogramme/'
+ };
+ },
+ getListPartner(){
+ return {
+ method: 'get',
+ url: 'api/frontend/v1/stv/GemeinsameStudien/getPartnerfirmen/'
+ };
+ },
+ getStatiPrestudent(){
+ return {
+ method: 'get',
+ url: 'api/frontend/v1/stv/GemeinsameStudien/getStatiPrestudent/'
+ };
+ },
+ loadStudy(id){
+ return {
+ method: 'get',
+ url: 'api/frontend/v1/stv/GemeinsameStudien/loadStudie/' + id
+ };
+ },
+ insertStudy(params){
+ return {
+ method: 'post',
+ url: 'api/frontend/v1/stv/GemeinsameStudien/insertStudie/',
+ params
+ };
+ },
+ updateStudy(params){
+ return {
+ method: 'post',
+ url: 'api/frontend/v1/stv/GemeinsameStudien/updateStudie/',
+ params
+ };
+ },
+ deleteStudy(id){
+ return {
+ method: 'post',
+ url: 'api/frontend/v1/stv/GemeinsameStudien/deleteStudie/' + id
+ };
+ },
+}
diff --git a/public/js/api/stv.js b/public/js/api/stv.js
index 7a6022fb9..18de1e1cf 100644
--- a/public/js/api/stv.js
+++ b/public/js/api/stv.js
@@ -14,6 +14,7 @@ import mobility from './stv/mobility.js';
import archiv from './stv/archiv.js';
import documents from './stv/documents.js';
import exemptions from './stv/exemptions.js';
+import jointstudies from "./stv/jointstudies.js";
export default {
verband,
@@ -32,6 +33,7 @@ export default {
archiv,
documents,
exemptions,
+ 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: `
+
+
+
+ `
+}
\ No newline at end of file
diff --git a/public/js/components/Stv/Studentenverwaltung/Details/JointStudies/JointStudies.js b/public/js/components/Stv/Studentenverwaltung/Details/JointStudies/JointStudies.js
new file mode 100644
index 000000000..16d1593d3
--- /dev/null
+++ b/public/js/components/Stv/Studentenverwaltung/Details/JointStudies/JointStudies.js
@@ -0,0 +1,477 @@
+import {CoreFilterCmpt} from "../../../../filter/Filter.js";
+import BsModal from "../../../../Bootstrap/Modal.js";
+import FormForm from "../../../../Form/Form.js";
+import FormInput from "../../../../Form/Input.js";
+
+import ApiStvJointstudies from '../../../../../api/factory/stv/jointstudies.js';
+import ApiStvMobility from "../../../../../api/factory/stv/mobility";
+
+export default {
+ name: 'Tbl_JointStudies',
+ components: {
+ CoreFilterCmpt,
+ BsModal,
+ FormForm,
+ FormInput,
+ },
+ inject: {
+ currentSemester: {
+ from: 'currentSemester',
+ },
+ },
+ props: {
+ student: Object
+ },
+ data(){
+ return {
+ tabulatorOptions: {
+ ajaxURL: 'dummy',
+ ajaxRequestFunc: () => this.$api.call(
+ ApiStvJointstudies.getStudies(this.student.prestudent_id)
+ ),
+ ajaxResponse: (url, params, response) => response.data,
+ columns: [
+ {title: "mobilitaet_id", field: "mobilitaet_id", visible: false},
+ {title: "StSem", field: "studiensemester_kurzbz"},
+ // {title: "mobilitaetstyp_kurzbz", field: "mobilitaetstyp_kurzbz"},
+ {title: "kurzbz", field: "kurzbz"},
+ {title: "prestudent_id", field: "prestudent_id", visible: false},
+ {title: "Status", field: "status_kurzbz"},
+ {title: "Partner", field: "partner", visible: false},
+ {title: "Sem", field: "ausbildungssemester"},
+ {title: "gsprogrammtyp_kurzbz", field: "gsprogrammtyp_kurzbz"},
+ {title: "studienprogramm", field: "studienprogramm", visible: false},
+ {title: "insertvon", field: "insertvon", visible: false},
+ {
+ title: "insertamum", field: "insertamum",
+ formatter: function (cell) {
+ const dateStr = cell.getValue();
+ if (!dateStr) return "";
+
+ const date = new Date(dateStr);
+ return date.toLocaleString("de-DE", {
+ day: "2-digit",
+ month: "2-digit",
+ year: "numeric",
+ });
+ },
+ visible: false
+ },
+ {title: "updatevon", field: "updatevon", visible: false},
+ {
+ title: "updateamum", field: "updateamum",
+ formatter: function (cell) {
+ const dateStr = cell.getValue();
+ if (!dateStr) return "";
+
+ const date = new Date(dateStr);
+ return date.toLocaleString("de-DE", {
+ day: "2-digit",
+ month: "2-digit",
+ year: "numeric",
+ });
+ },
+ visible: false
+ },
+ {
+ title: 'Aktionen',
+ field: 'actions',
+ minWidth: 150,
+ maxWidth: 150,
+ formatter: (cell, formatterParams, onRendered) => {
+ let container = document.createElement('div');
+ container.className = "d-flex gap-2";
+
+ let button = document.createElement('button');
+ button.className = 'btn btn-outline-secondary btn-action';
+ button.innerHTML = '';
+ button.title = this.$p.t('exam', 'newFromOld_studies');
+ button.addEventListener(
+ 'click',
+ (event) =>
+ this.actionNewFromOldJointStudy(cell.getData().mobilitaet_id)
+ );
+ container.append(button);
+
+ button = document.createElement('button');
+ button.className = 'btn btn-outline-secondary btn-action';
+ button.innerHTML = '';
+ button.title = this.$p.t('exam', 'edit_studies');
+ button.addEventListener(
+ 'click',
+ (event) =>
+ this.actionEditJointStudy(cell.getData().mobilitaet_id)
+ );
+ container.append(button);
+
+ button = document.createElement('button');
+ button.className = 'btn btn-outline-secondary btn-action';
+ button.innerHTML = '';
+ button.title = this.$p.t('exam', 'delete_studies');
+ button.addEventListener(
+ 'click',
+ () =>
+ this.actionDeleteJointStudy(cell.getData().mobilitaet_id)
+ );
+ container.append(button);
+
+ return container;
+ },
+ frozen: true
+ },
+ ],
+ },
+ tabulatorEvents: [
+ {
+ event: 'tableBuilt',
+ handler: async() => {
+ await this.$p.loadCategory(['global', 'jointstudies', 'ui', 'lehre', 'mobility']);
+
+
+ let cm = this.$refs.table.tabulator.columnManager;
+
+ cm.getColumnByField('mobilitaet_id').component.updateDefinition({
+ title: this.$p.t('global', 'mobilitaet_id')
+ });
+/* cm.getColumnByField('studiensemester_kurzbz').component.updateDefinition({
+ title: this.$p.t('lehre', 'studiensemester')
+ });*/
+ cm.getColumnByField('gsprogrammtyp_kurzbz').component.updateDefinition({
+ title: this.$p.t('global', 'typ')
+ });
+/* cm.getColumnByField('ausbildungssemester').component.updateDefinition({
+ title: this.$p.t('lehre', 'semester')
+ });*/
+ cm.getColumnByField('prestudent_id').component.updateDefinition({
+ title: this.$p.t('global', 'prestudentID')
+ });
+ cm.getColumnByField('kurzbz').component.updateDefinition({
+ title: this.$p.t('mobility', 'mobilitaetsprogramm')
+ });
+ cm.getColumnByField('studienprogramm').component.updateDefinition({
+ title: this.$p.t('jointstudies', 'studienprogramm')
+ });
+ cm.getColumnByField('insertamum').component.updateDefinition({
+ title: this.$p.t('global', 'insertamum')
+ });
+ cm.getColumnByField('insertvon').component.updateDefinition({
+ title: this.$p.t('global', 'insertvon')
+ });
+ cm.getColumnByField('updateamum').component.updateDefinition({
+ title: this.$p.t('global', 'updateamum')
+ });
+ cm.getColumnByField('updatevon').component.updateDefinition({
+ title: this.$p.t('global', 'updatevon')
+ });
+
+/* cm.getColumnByField('actions').component.updateDefinition({
+ title: this.$p.t('global', 'aktionen')
+ });*/
+ }
+ }
+ ],
+ formData: {
+ mobilitaetstyp_kurzbz: "GS",
+ studiensemester_kurzbz: this.currentSemester,
+ status_kurzbz: 'Student',
+ mobilitaet_id: null
+ },
+ statusNew: true,
+ listTypenMobility: [],
+ listStudiensemester: [],
+ programsMobility: [],
+ listStudienprogramme: [],
+ listPartner: [],
+ statiPrestudent: [],
+ }
+ },
+ methods: {
+ actionDeleteJointStudy(mobilitaet_id) {
+ this.$fhcAlert
+ .confirmDelete()
+ .then(result => result
+ ? mobilitaet_id
+ : Promise.reject({handled: true}))
+ .then(this.deleteJointStudy)
+ .catch(this.$fhcAlert.handleSystemError);
+ },
+ actionEditJointStudy(mobilitaet_id) {
+ this.resetForm();
+ this.statusNew = false;
+ this.loadJointStudy(mobilitaet_id);
+ this.$refs.jointstudyModal.show();
+ },
+ actionNewFromOldJointStudy(mobilitaet_id) {
+ this.resetForm();
+ this.loadJointStudy(mobilitaet_id);
+ this.statusNew = true;
+ this.$refs.jointstudyModal.show();
+ },
+ actionNewJointStudy() {
+ this.resetForm();
+ this.statusNew = true;
+ this.$refs.jointstudyModal.show();
+ },
+ addNewJointStudy() {
+ const data = {
+ prestudent_id: this.student.prestudent_id,
+ formData: this.formData
+ };
+ return this.$refs.formJointStudies
+ .call(ApiStvJointstudies.insertStudy(data))
+ .then(response => {
+ this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave'));
+ this.hideModal("jointstudyModal");
+ this.resetForm();
+ })
+ .catch(this.$fhcAlert.handleSystemError)
+ .finally(() => {
+ this.reload();
+ });
+ },
+ updateJointStudy() {
+ const data = {
+ prestudent_id: this.student.prestudent_id,
+ formData: this.formData
+ };
+ return this.$refs.formJointStudies
+ .call(ApiStvJointstudies.updateStudy(data))
+ .then(response => {
+ this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave'));
+ this.hideModal("jointstudyModal");
+ this.resetForm();
+ })
+ .catch(this.$fhcAlert.handleSystemError)
+ .finally(() => {
+ this.reload();
+ });
+ },
+ loadJointStudy(mobilitaet_id) {
+ return this.$api
+ .call(ApiStvJointstudies.loadStudy(mobilitaet_id))
+ .then(result => {
+ this.formData = result.data;
+ })
+ .catch(this.$fhcAlert.handleSystemError);
+ },
+ deleteJointStudy(mobilitaet_id) {
+ return this.$api
+ .call(ApiStvJointstudies.deleteStudy(mobilitaet_id))
+ .then(response => {
+ this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete'));
+ })
+ .catch(this.$fhcAlert.handleSystemError)
+ .finally(() => {
+ this.reload();
+ });
+ },
+ hideModal(modalRef){
+ this.$refs[modalRef].hide();
+ },
+ reload() {
+ this.$refs.table.reloadTable();
+ },
+ resetForm() {
+ this.formData = {};
+ this.formData.mobilitaetstyp_kurzbz = "GS";
+ this.formData.status_kurzbz = 'Student';
+ this.formData.studiensemester_kurzbz = this.currentSemester;
+ this.formData.prestudent_id = this.student.prestudent_id;
+ }
+ },
+ created(){
+ this.$api
+ .call(ApiStvJointstudies.getTypenMobility())
+ .then(result => {
+ this.listTypenMobility = result.data;
+ })
+ .catch(this.$fhcAlert.handleSystemError);
+ this.$api
+ .call(ApiStvJointstudies.getStudiensemester())
+ .then(result => {
+ this.listStudiensemester = result.data;
+ })
+ .catch(this.$fhcAlert.handleSystemError);
+ this.$api
+ .call(ApiStvMobility.getProgramsMobility())
+ .then(result => {
+ this.programsMobility = result.data;
+ })
+ .catch(this.$fhcAlert.handleSystemError);
+ this.$api
+ .call(ApiStvJointstudies.getStudyprograms())
+ .then(result => {
+ this.listStudienprogramme = result.data;
+ })
+ .catch(this.$fhcAlert.handleSystemError);
+ this.$api
+ .call(ApiStvJointstudies.getListPartner())
+ .then(result => {
+ this.listPartner = result.data;
+ })
+ .catch(this.$fhcAlert.handleSystemError);
+ this.$api
+ .call(ApiStvJointstudies.getStatiPrestudent())
+ .then(result => {
+ this.statiPrestudent = result.data;
+ })
+ .catch(this.$fhcAlert.handleSystemError);
+
+ },
+ template: `
+
+
{{$p.t('jointstudies', 'gemeinsameStudien')}}
+
+
+
+
+
+
+
+ {{$p.t('jointstudies', 'neuAnlegen')}}
+ {{$p.t('jointstudies', 'edit')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `
+}
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php
index b91294817..4385160fa 100644
--- a/system/phrasesupdate.php
+++ b/system/phrasesupdate.php
@@ -42947,6 +42947,148 @@ and represent the current state of research on the topic. The prescribed citatio
)
),
// FHC4 Phrases Anrechnungen End
+ // FHC4 JOINT STUDIES START ----------------------------------------------------------------------------------------
+ array(
+ 'app' => 'core',
+ 'category' => 'stv',
+ 'phrase' => 'tab_jointstudies',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'GS',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Joint Studies',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'jointstudies',
+ 'phrase' => 'gemeinsamesStudium',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Gemeinsames Studium',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Joint Study',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'jointstudies',
+ 'phrase' => 'gemeinsameStudien',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Gemeinsame Studien',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Joint Studies',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'jointstudies',
+ 'phrase' => 'studienprogramm',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Studienprogramm',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Study Program',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'jointstudies',
+ 'phrase' => 'neuAnlegen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Gemeinsames Studium anlegen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Add Joint Study',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'jointstudies',
+ 'phrase' => 'edit',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Gemeinsames Studium bearbeiten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Edit Joint Study',
+ 'description' => '',
+ 'insertvon' => 'system',
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'global',
+ 'phrase' => 'mobilitaet_id',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Mobilität ID',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Mobility Id',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ // FHC4 JOINT STUDIES END ----------------------------------------------------------------------------------------
);