Repeater Grades

This commit is contained in:
cgfhtw
2024-11-25 10:45:45 +01:00
parent e0e123f264
commit 334fc870d0
3 changed files with 208 additions and 0 deletions
@@ -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');
+14
View File
@@ -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);
}
@@ -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: `
<div class="stv-details-noten-repeater d-flex flex-column">
<!-- TODO(chris): phrase -->
<core-filter-cmpt
ref="table"
title="Repeater Grades"
:tabulator-options="tabulatorOptions"
:tabulator-events="tabulatorEvents"
table-only
:side-menu="false"
reload
>
<template #actions="{selected}">
<button class="btn btn-primary" :disabled="!selected.length" @click="copyGrades(selected)">
<!-- TODO(chris): phrase -->
<i class="fa-solid fa-arrow-left"></i> copy
</button>
</template>
</core-filter-cmpt>
</div>`
};