diff --git a/application/controllers/api/frontend/v1/stv/Grades.php b/application/controllers/api/frontend/v1/stv/Grades.php index aac11dece..990bbc113 100644 --- a/application/controllers/api/frontend/v1/stv/Grades.php +++ b/application/controllers/api/frontend/v1/stv/Grades.php @@ -31,8 +31,10 @@ class Grades extends FHCAPI_Controller 'list' => 'student/noten:r', 'getCertificate' => 'student/noten:r', 'getTeacherProposal' => 'student/noten:r', + 'getRepeaterGrades' => 'student/noten:r', 'updateCertificate' => ['admin:w', 'assistenz:w'], 'copyTeacherProposalToCertificate' => 'student/noten:w', + 'copyRepeaterGradeToCertificate' => 'student/noten:w', 'getGradeFromPoints' => 'student/noten:r' ]); @@ -111,6 +113,20 @@ class Grades extends FHCAPI_Controller $this->terminateWithSuccess($grades); } + public function getRepeaterGrades($prestudent_id) + { + $this->load->library('AntragLib'); + + $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); + + + $result = $this->antraglib->getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz); + + $grades = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($grades); + } + public function updateCertificate() { $this->load->model('crm/Student_model', 'StudentModel'); @@ -264,6 +280,79 @@ class Grades extends FHCAPI_Controller $this->terminateWithSuccess(); } + public function copyRepeaterGradeToCertificate() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules("studierendenantrag_lehrveranstaltung_id", "", "required|integer"); // TODO(chris): phrase + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $id = $this->input->post('studierendenantrag_lehrveranstaltung_id'); + $authUID = getAuthUID(); + + $this->load->model('education/Studierendenantraglehrveranstaltung_model', 'StudierendenantraglehrveranstaltungModel'); + + $this->StudierendenantraglehrveranstaltungModel->addSelect("tbl_studierendenantrag_lehrveranstaltung.*"); + $this->StudierendenantraglehrveranstaltungModel->addSelect("student_uid"); + $this->StudierendenantraglehrveranstaltungModel->addJoin("campus.tbl_studierendenantrag", "studierendenantrag_id"); + $this->StudierendenantraglehrveranstaltungModel->addJoin("public.tbl_student", "prestudent_id", "LEFT"); + + $result = $this->StudierendenantraglehrveranstaltungModel->load($id); + $repeaterGrade = $this->getDataOrTerminateWithError($result); + + if (!$repeaterGrade) + show_404(); + + $repeaterGrade = current($repeaterGrade); + + // NOTE(chris): Stg Permissions + // TODO(chris): Are those permissions correct? + if (!$this->hasPermissionCopy($repeaterGrade->lehrveranstaltung_id, $repeaterGrade->student_uid)) + return $this->_outputAuthError([$this->router->method => 'student/noten']); + + $data = [ + 'note' => $repeaterGrade->note, + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $repeaterGrade->insertamum, + 'bemerkung' => $repeaterGrade->anmerkung + ]; + + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $result = $this->ZeugnisnoteModel->load([ + $repeaterGrade->studiensemester_kurzbz, + $repeaterGrade->student_uid, + $repeaterGrade->lehrveranstaltung_id + ]); + $certificateGrade = $this->getDataOrTerminateWithError($result); + + if ($certificateGrade) { + // NOTE(chris): update + $data['updateamum'] = $data['uebernahmedatum']; + $data['updatevon'] = $authUID; + + $this->ZeugnisnoteModel->update([ + $repeaterGrade->studiensemester_kurzbz, + $repeaterGrade->student_uid, + $repeaterGrade->lehrveranstaltung_id + ], $data); + } else { + // NOTE(chris): insert + $data['insertamum'] = $data['uebernahmedatum']; + $data['insertvon'] = $authUID; + $data['lehrveranstaltung_id'] = $repeaterGrade->lehrveranstaltung_id; + $data['student_uid'] = $repeaterGrade->student_uid; + $data['studiensemester_kurzbz'] = $repeaterGrade->studiensemester_kurzbz; + + $this->ZeugnisnoteModel->insert($data); + } + + + $this->terminateWithSuccess(); + } + public function getGradeFromPoints() { $this->load->library('form_validation'); diff --git a/public/js/api/stv/grades.js b/public/js/api/stv/grades.js index 0a2d15e3b..8e3e00e28 100644 --- a/public/js/api/stv/grades.js +++ b/public/js/api/stv/grades.js @@ -10,6 +10,9 @@ export default { all = all ? '/all' : ''; return this.$fhcApi.get('api/frontend/v1/stv/grades/getTeacherProposal/' + prestudent_id + all); }, + getRepeaterGrades(prestudent_id) { + return this.$fhcApi.get('api/frontend/v1/stv/grades/getRepeaterGrades/' + prestudent_id); + }, updateCertificate(data) { return this.$fhcApi.post('api/frontend/v1/stv/grades/updateCertificate', data); }, @@ -26,6 +29,17 @@ export default { } ); }, + copyRepeaterGradeToCertificate({studierendenantrag_lehrveranstaltung_id, lv_bezeichnung}) { + return this.$fhcApi.post( + 'api/frontend/v1/stv/grades/copyRepeaterGradeToCertificate', + { + studierendenantrag_lehrveranstaltung_id + }, + { + errorHeader: lv_bezeichnung + } + ); + }, getGradeFromPoints(points) { return this.$fhcApi.post('api/frontend/v1/stv/grades/getGradeFromPoints', data); } diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Noten/Repeater.js b/public/js/components/Stv/Studentenverwaltung/Details/Noten/Repeater.js new file mode 100644 index 000000000..2ff92450f --- /dev/null +++ b/public/js/components/Stv/Studentenverwaltung/Details/Noten/Repeater.js @@ -0,0 +1,105 @@ +import {CoreFilterCmpt} from "../../../../filter/Filter.js"; + +export default { + components: { + CoreFilterCmpt + }, + emits: [ + "copied" + ], + props: { + student: Object, + allSemester: Boolean + }, + data() { + return { + tabulatorEvents: [] + }; + }, + computed: { + tabulatorOptions() { + return { + ajaxURL: 'dummy', + ajaxRequestFunc: (url, config, params) => { + return this.$fhcApi.factory.stv.grades.getRepeaterGrades(params.prestudent_id, params.stdsem); + }, + ajaxParams: () => { + return { + prestudent_id: this.student.prestudent_id, + stdsem: this.allSemester + }; + }, + ajaxResponse: (url, params, response) => { + return response.data || []; + }, + // TODO(chris): phrasen + columns: [ + { field: 'lv_bezeichnung', title: 'Lehrveranstaltung' }, + { field: 'note_bezeichnung', title: 'Note' }, + { field: 'insertvon', title: 'MitarbeiterInUID', visible: false }, + { field: 'benotungsdatum', title: 'Benotungsdatum', visible: false }, + { field: 'freigabedatum', title: 'Freigabedatum', visible: false }, + { field: 'studiensemester_kurzbz', title: 'Studiensemester', visible: false }, + { field: 'stg_bezeichnung', title: 'Studiengang', visible: false }, + { field: 'note', title: 'Note', visible: false }, + { field: 'prestudent_uid', title: 'PrestudentID', visible: false }, + { field: 'lehrveranstaltung_id', title: 'Lehrveranstaltung ID', visible: false }, + { field: 'studierendenantrag_lehrveranstaltung_id', title: 'StudstatusLvID', visible: false } + ], + layout: 'fitDataStretch', + height: '100%', + selectable: true, + selectableRangeMode: 'click', + persistenceID: 'stv-details-noten-repeater' + }; + } + }, + watch: { + student(n) { + this.$refs.table.reloadTable(); + }, + allSemester(n) { + this.$refs.table.reloadTable(); + } + }, + methods: { + copyGrades(selected) { + const promises = selected.map( + grade => this.$fhcApi.factory + .stv.grades.copyRepeaterGradeToCertificate(grade) + .then(() => { + this.$refs.table.tabulator.deselectRow(this.$refs.table.tabulator.getRows().find(el => el.getData() == grade).getElement()); + }) + ); + Promise + .allSettled(promises) + .then(results => { + if (results.some(res => res.status == "fulfilled")) { + // TODO(chris): phrase + this.$fhcAlert.alertSuccess("updated"); + this.$emit('copied'); + } + }); + } + }, + template: ` +
+ + + + +
` +}; \ No newline at end of file