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();