diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php
index f5e77b258..6bfd2b020 100644
--- a/application/controllers/api/frontend/v1/stv/Status.php
+++ b/application/controllers/api/frontend/v1/stv/Status.php
@@ -23,14 +23,14 @@ class Status extends FHCAPI_Controller
'loadStatus' => ['admin:r', 'assistenz:r'],
'insertStatus' => ['admin:rw', 'assistenz:rw'],
'updateStatus' => ['admin:rw', 'assistenz:rw'],
- 'advanceStatus' => ['admin:r', 'assistenz:r'],
+ 'advanceStatus' => ['admin:rw', 'assistenz:rw'],
'confirmStatus' => ['admin:rw', 'assistenz:rw'],
]);
//Load Models
- $this->load->model('crm/Prestudentstatus_model','PrestudentstatusModel');
- $this->load->model('person/Person_model','PersonModel');
+ $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+ $this->load->model('person/Person_model', 'PersonModel');
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
@@ -41,6 +41,7 @@ class Status extends FHCAPI_Controller
|| $this->router->method == 'updateStatus'
|| $this->router->method == 'confirmStatus'
|| $this->router->method == 'deleteStatus'
+ || $this->router->method == 'advanceStatus'
) {
$prestudent_id = current(array_slice($this->uri->rsegments, 2));
$this->checkPermissionsForPrestudent($prestudent_id, ['admin:rw', 'assistenz:rw']);
@@ -1078,7 +1079,7 @@ class Status extends FHCAPI_Controller
[
'required',
['status_stud_exists', function ($value) use ($prestudent_id) {
- if ($value != 'Student')
+ if ($value != Prestudentstatus_model::STATUS_STUDENT)
return true; // Only test if new status is Student
$result = $this->prestudentstatuschecklib->checkIfExistingStudentRolle($prestudent_id);
@@ -1568,189 +1569,163 @@ class Status extends FHCAPI_Controller
return $this->outputJsonSuccess(true);
}
- public function advanceStatus($key_prestudent_id, $key_status_kurzbz, $key_studiensemester_kurzbz, $key_ausbildungssemester)
+ public function advanceStatus($prestudent_id, $status_kurzbz, $key_studiensemester_kurzbz, $key_ausbildungssemester)
{
- //get Studiengang von prestudent_id
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
- $result = $this->PrestudentModel->load([
- 'prestudent_id'=> $key_prestudent_id,
+ $result = $this->PrestudentstatusModel->load([
+ $key_ausbildungssemester,
+ $key_studiensemester_kurzbz,
+ $status_kurzbz,
+ $prestudent_id
]);
- if(isError($result))
- {
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
- $result = current(getData($result));
+ $oldstatus = $this->getDataOrTerminateWithError($result);
+ if (!$oldstatus)
+ show_404(); // Status that should be updated does not exist
- $stg = $result->studiengang_kz;
+ $oldstatus = current($oldstatus);
- if(!$this->permissionlib->isBerechtigt('admin', 'suid', $stg) && !$this->permissionlib->isBerechtigt('assistenz', 'suid', $stg))
- {
- return $this->terminateWithError($this->p->t('lehre','error_keineSchreibrechte'), self::ERROR_TYPE_GENERAL);
- }
-
- //Data Vorrücken
- $result = $this->PrestudentstatusModel->loadWhere(
- array(
- 'prestudent_id' => $key_prestudent_id,
- 'status_kurzbz' => $key_status_kurzbz,
- 'ausbildungssemester' => $key_ausbildungssemester,
- 'studiensemester_kurzbz' => $key_studiensemester_kurzbz
- )
- );
-
- if (isError($result))
- {
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
-
- elseif (!hasData($result))
- {
- return $this->terminateWithError($this->p->t('lehre','error_noStatusFound'), self::ERROR_TYPE_GENERAL);
- }
- else
- {
- $statusData = current(getData($result));
- }
+ //Target studiensemester_kurzbz
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$result = $this->StudiensemesterModel->getNextFrom($key_studiensemester_kurzbz);
- if (isError($result))
- {
- $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
- return $this->outputJson(getError($result));
- }
- $studiensem_next = current(getData($result));
- $studiensem_next = $studiensem_next->studiensemester_kurzbz;
+ $studiensemester_kurzbz = $this->getDataOrTerminateWithError($result);
+ $studiensemester_kurzbz = current($studiensemester_kurzbz)->studiensemester_kurzbz;
+
+
+ //Target ausbildungssemester
+ $ausbildungssemester = $key_ausbildungssemester + 1;
- $ausbildungssem_next = $key_ausbildungssemester+1;
//Form Validation
$this->load->library('form_validation');
+
+ $this->form_validation->set_data([
+ 'status_kurzbz' => $status_kurzbz
+ ]);
- $last_status_kurzbz = $lastStatusData->status_kurzbz; // TODO(chris): copy pasta!
-
- $this->form_validation->set_rules('_global', '', [
- //check if Rolle already exists
- ['checkIfExistingPrestudentRolle', function () use (
- $key_prestudent_id,
- $key_status_kurzbz,
- $studiensem_next,
- $ausbildungssem_next
- ) {
- $result = $this->prestudentstatuschecklib->checkIfExistingPrestudentRolle(
- $key_prestudent_id,
- $key_status_kurzbz,
- $studiensem_next,
- $ausbildungssem_next
- );
- return $this->getDataOrTerminateWithError($result);
- }],
- ['status_stud_exists', function () use ($key_prestudent_id, $key_status_kurzbz, $last_status_kurzbz) {
- if ($key_status_kurzbz != Prestudentstatus_model::STATUS_STUDENT
- && $key_status_kurzbz != Prestudentstatus_model::STATUS_DIPLOMAND
- && $last_status_kurzbz != Prestudentstatus_model::STATUS_STUDENT
- )
+ $this->form_validation->set_rules('status_kurzbz', $this->p->t('lehre', 'status_rolle'), [
+ 'in_list[' .
+ Prestudentstatus_model::STATUS_STUDENT . ',' .
+ Prestudentstatus_model::STATUS_DIPLOMAND . ',' .
+ Prestudentstatus_model::STATUS_UNTERBRECHER . ']',
+ ['status_stud_exists', function ($value) use ($prestudent_id) {
+ if ($value != Prestudentstatus_model::STATUS_STUDENT)
return true;
- $result = $this->prestudentstatuschecklib->checkIfExistingStudentRolle($key_prestudent_id);
+ $result = $this->prestudentstatuschecklib->checkIfExistingStudentRolle($prestudent_id);
return $this->getDataOrTerminateWithError($result);
}]
], [
- 'checkIfExistingPrestudentRolle' => $this->p->t('lehre', 'error_rolleBereitsVorhanden'),
'status_stud_exists' => $this->p->t('lehre', 'error_noStudstatus')
]);
+ $this->form_validation->set_rules('_default', '', [
+ //check if Rolle already exists
+ ['rolle_doesnt_exist', function () use (
+ $prestudent_id,
+ $status_kurzbz,
+ $studiensemester_kurzbz,
+ $ausbildungssemester
+ ) {
+ $result = $this->PrestudentstatusModel->load([$ausbildungssemester, $studiensemester_kurzbz, $status_kurzbz, $prestudent_id]);
+
+ return !$this->getDataOrTerminateWithError($result);
+ }]
+ ], [
+ 'rolle_doesnt_exist' => $this->p->t('lehre', 'error_rolleBereitsVorhanden')
+ ]);
+
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
- //check if studentrolle already exists
- // if($key_status_kurzbz == Prestudentstatus_model::STATUS_STUDENT)
- // {
- // $this->load->model('crm/Student_model', 'StudentModel');
- // $result = $this->StudentModel->checkIfExistingStudentRolle($key_prestudent_id);
- // if (isError($result))
- // {
- // return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- // }
- // if ($result->retval == "0")
- // {
- // return $this->terminateWithError($this->p->t('lehre','error_noStudstatus'), self::ERROR_TYPE_GENERAL);
- // }
- // }
// Start DB transaction
$this->db->trans_begin();
+ $authUID = getAuthUID();
+ $now = date('c');
+
//insert prestudentstatus
- $uid = getAuthUID();
- $result = $this->PrestudentstatusModel->insert(
- [
- 'prestudent_id' => $key_prestudent_id,
- 'status_kurzbz' => $key_status_kurzbz,
- 'studiensemester_kurzbz' => $studiensem_next,
- 'ausbildungssemester' => $ausbildungssem_next,
- 'insertamum' => date('c'),
- 'insertvon' => $uid,
- 'bestaetigtam' => date('c'),
- 'bestaetigtvon' => $uid,
- 'studienplan_id' => $statusData->studienplan_id,
- 'datum' => date('c'),
- 'anmerkung' => $statusData->anmerkung
- ]
- );
+ $result = $this->PrestudentstatusModel->insert([
+ 'prestudent_id' => $prestudent_id,
+ 'status_kurzbz' => $status_kurzbz,
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'ausbildungssemester' => $ausbildungssemester,
+ 'datum' => $now,
+ 'insertamum' => $now,
+ 'insertvon' => $authUID,
+ 'orgform_kurzbz' => $oldstatus->orgform_kurzbz,
+ 'studienplan_id' => $oldstatus->studienplan_id,
+ 'bestaetigtam' => $now,
+ 'bestaetigtvon' => $authUID,
+ 'anmerkung' => $oldstatus->anmerkung
+ ]);
- if (isError($result))
- {
- $this->db->trans_rollback();
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
+ $this->getDataOrTerminateWithError($result);
+
+ //get student_uid
$this->load->model('crm/Student_model', 'StudentModel');
- $result = $this->StudentModel->checkIfUid($key_prestudent_id);
- if(isError($result))
- {
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
- if (!hasData($result))
- {
- $this->terminateWithError($this->p->t('studierendenantrag','error_no_student_for_prestudent', ['prestudent_id' => $prestudent_id]), self::ERROR_TYPE_GENERAL);
- }
- $student_uid = $result->retval;
+ $result = $this->StudentModel->loadWhere([
+ 'prestudent_id' => $prestudent_id
+ ]);
+ $student = $this->getDataOrTerminateWithError($result);
+
+ if (!$student)
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_no_student_for_prestudent', ['prestudent_id' => $prestudent_id]));
+
+
//process studentlehrverband
$this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
- $result = $this->StudentlehrverbandModel->loadWhere(
- array(
- 'student_uid' => $student_uid,
- 'studiensemester_kurzbz' => $key_studiensemester_kurzbz
- )
- );
- if (isError($result))
- {
- $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
- }
+ $result = $this->StudentlehrverbandModel->load([
+ $key_studiensemester_kurzbz,
+ $student->student_uid
+ ]);
+
+ $studentlvb = $this->getDataOrTerminateWithError($result);
+ if (!$studentlvb)
+ $this->terminateWithError($this->p->t('lehre', 'error_noStudentlehrverband'));
//Data of current Semester
- $result = getData($result) ? : [];
- $studentlvbData = current($result);
+ $studentlvb = current($studentlvb);
- $this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
- $result = $this->StudentlehrverbandModel->processStudentlehrverband(
- $student_uid,
- $studentlvbData->studiengang_kz,
- $ausbildungssem_next,
- $studentlvbData->verband,
- $studentlvbData->gruppe,
- $studiensem_next
- );
- if ($this->db->trans_status() === false || isError($result))
- {
- $this->db->trans_rollback();
- return $this->terminateWithError($this->p->t('lehre','error_duringInsertUpdateLehrverband'), self::ERROR_TYPE_GENERAL);
- }
+ $newStudentlvb = [
+ 'student_uid' => $studentlvb->student_uid,
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'studiengang_kz' => $studentlvb->studiengang_kz,
+ 'semester' => $studentlvb->semester,
+ 'verband' => $studentlvb->verband,
+ 'gruppe' => $studentlvb->gruppe,
+ 'insertamum' => $now,
+ 'insertvon' => $authUID,
+ 'ext_id' => $studentlvb->ext_id
+
+ ];
+
+
+ $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
+
+ $result = $this->LehrverbandModel->load([
+ $student->gruppe,
+ $student->verband,
+ $ausbildungssemester,
+ $student->studiengang_kz
+ ]);
+
+ $lv = $this->getDataOrTerminateWithError($result);
+ if ($lv) {
+ $newStudentlvb['semester'] = $ausbildungssemester;
+ } // If there is no lehrverband just use the same as in the previous studiensemester
+
+
+ //add studentlehrverband
+ $result = $this->StudentlehrverbandModel->insert($newStudentlvb);
+
+ $this->getDataOrTerminateWithError($result);
+
$this->db->trans_commit();
return $this->outputJsonSuccess(true);
@@ -1868,11 +1843,11 @@ class Status extends FHCAPI_Controller
$this->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
$this->LehrverbandModel->addLimit(1);
- $result = $this->LehrverbandModel->loadWhere([
- 'studiengang_kz' => $student->studiengang_kz,
- 'semester' => $ausbildungssemester,
- 'verband' => $student->verband,
- 'gruppe' => $student->gruppe
+ $result = $this->LehrverbandModel->load([
+ $student->gruppe,
+ $student->verband,
+ $ausbildungssemester,
+ $student->studiengang_kz
]);
$lv = $this->getDataOrTerminateWithError($result);
diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Prestudent/MultiStatus.js b/public/js/components/Stv/Studentenverwaltung/Details/Prestudent/MultiStatus.js
index 6658e541e..146450341 100644
--- a/public/js/components/Stv/Studentenverwaltung/Details/Prestudent/MultiStatus.js
+++ b/public/js/components/Stv/Studentenverwaltung/Details/Prestudent/MultiStatus.js
@@ -116,59 +116,53 @@ export default{
minWidth: 150, // Ensures Action-buttons will be always fully displayed
formatter: (cell, formatterParams, onRendered) => {
- let container = document.createElement('div');
+ const container = document.createElement('div');
container.className = "d-flex gap-2";
+ const data = cell.getData();
+
let button = document.createElement('button');
- if (this.dataMeldestichtag && this.dataMeldestichtag > cell.getData().datum && !this.hasPermissionToSkipStatusCheck)
- button.className = 'btn btn-outline-secondary btn-action';
- else
- button.className = 'btn btn-outline-secondary btn-action';
+ button.className = 'btn btn-outline-secondary btn-action';
button.innerHTML = '';
button.title = 'Status vorrücken';
- button.addEventListener(
- 'click',
- () =>
- this.actionAdvanceStatus(cell.getData().status_kurzbz, cell.getData().studiensemester_kurzbz, cell.getData().ausbildungssemester)
- );
- container.append(button);
-
- button = document.createElement('button');
- if (this.dataMeldestichtag && this.dataMeldestichtag > cell.getData().datum && !this.hasPermissionToSkipStatusCheck)
- button.className = 'btn btn-outline-secondary btn-action';
- else
- button.className = 'btn btn-outline-secondary btn-action';
- button.innerHTML = '';
- button.title = 'Status bestätigen';
button.addEventListener('click', () =>
- this.actionConfirmStatus(cell.getData().status_kurzbz, cell.getData().studiensemester_kurzbz, cell.getData().ausbildungssemester)
+ this.actionAdvanceStatus(data.status_kurzbz, data.studiensemester_kurzbz, data.ausbildungssemester)
);
- if (cell.getData().bestaetigtam || !cell.getData().bewerbung_abgeschicktamum)
+ if (!['Student', 'Diplomand', 'Unterbrecher'].includes(data.status_kurzbz))
button.disabled = true;
container.append(button);
button = document.createElement('button');
- if (this.dataMeldestichtag && this.dataMeldestichtag > cell.getData().datum && !this.hasPermissionToSkipStatusCheck)
- button.className = 'btn btn-outline-secondary btn-action';
- else
- button.className = 'btn btn-outline-secondary btn-action';
- button.innerHTML = '';
- button.title = 'Status bearbeiten';
- button.addEventListener('click', (event) =>
- this.actionEditStatus(cell.getData().status_kurzbz, cell.getData().studiensemester_kurzbz, cell.getData().ausbildungssemester)
+ button.className = 'btn btn-outline-secondary btn-action';
+ button.innerHTML = '';
+ button.title = 'Status bestätigen';
+ button.addEventListener('click', () =>
+ this.actionConfirmStatus(data.status_kurzbz, data.studiensemester_kurzbz, data.ausbildungssemester)
);
+ if (data.bestaetigtam || !data.bewerbung_abgeschicktamum)
+ button.disabled = true;
container.append(button);
button = document.createElement('button');
- if (this.dataMeldestichtag && this.dataMeldestichtag > cell.getData().datum && !this.hasPermissionToSkipStatusCheck)
- button.className = 'btn btn-outline-secondary btn-action';
- else
- button.className = 'btn btn-outline-secondary btn-action';
+ button.className = 'btn btn-outline-secondary btn-action';
+ button.innerHTML = '';
+ button.title = 'Status bearbeiten';
+ button.addEventListener('click', () =>
+ this.actionEditStatus(data.status_kurzbz, data.studiensemester_kurzbz, data.ausbildungssemester)
+ );
+ if (this.dataMeldestichtag && this.dataMeldestichtag > data.datum && !this.hasPermissionToSkipStatusCheck)
+ button.disabled = true;
+ container.append(button);
+
+ button = document.createElement('button');
+ button.className = 'btn btn-outline-secondary btn-action';
button.innerHTML = '';
button.title = 'Status löschen';
button.addEventListener('click', () =>
- this.actionDeleteStatus(cell.getData().status_kurzbz, cell.getData().studiensemester_kurzbz, cell.getData().ausbildungssemester)
+ this.actionDeleteStatus(data.status_kurzbz, data.studiensemester_kurzbz, data.ausbildungssemester)
);
+ if (this.dataMeldestichtag && this.dataMeldestichtag > data.datum && !this.hasPermissionToSkipStatusCheck)
+ button.disabled = true;
container.append(button);
return container;
@@ -291,16 +285,17 @@ export default{
.catch(this.$fhcAlert.handleSystemError);
},
actionAdvanceStatus(status, stdsem, ausbildungssemester) {
- this.statusId = {
- 'prestudent_id': this.modelValue.prestudent_id,
- 'status_kurzbz': status,
- 'studiensemester_kurzbz': stdsem,
- 'ausbildungssemester': ausbildungssemester
+ const statusId = {
+ prestudent_id: this.modelValue.prestudent_id,
+ status_kurzbz: status,
+ studiensemester_kurzbz: stdsem,
+ ausbildungssemester: ausbildungssemester
};
- this.loadStatus(this.statusId).then(() => {
- if(this.statusData)
- this.advanceStatus(this.statusId);
- });
+ this.$fhcApi
+ .post('api/frontend/v1/stv/status/advanceStatus/' + Object.values(statusId).join('/'))
+ .then(() => this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successAdvance')))
+ .then(this.reload)
+ .catch(this.$fhcAlert.handleSystemError);
},
actionConfirmStatus(status, stdsem, ausbildungssemester) {
BsConfirm
@@ -316,32 +311,6 @@ export default{
.then(this.reload)
.catch(this.$fhcAlert.handleSystemError);
},
- advanceStatus(statusId) {
- return this.$fhcApi.post('api/frontend/v1/stv/status/advanceStatus/' +
- this.statusId.prestudent_id + '/' +
- this.statusId.status_kurzbz + '/' +
- this.statusId.studiensemester_kurzbz + '/' +
- this.statusId.ausbildungssemester)
- .then(
- result => {
- this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successAdvance'));
- })
- .catch(this.$fhcAlert.handleSystemError)
- .finally(() => {
- window.scrollTo(0, 0);
- this.reload();
- });
- },
- loadStatus(status_id) {
- this.statusNew = false;
- return this.$fhcApi.post('api/frontend/v1/stv/status/loadStatus/',
- status_id)
- .then(result => {
- this.statusData = result.data;
- return result;
- })
- .catch(this.$fhcAlert.handleSystemError);
- },
reload() {
if (this.$refs.table)
this.$refs.table.reloadTable();