replace backend var semester_aktuell with api parameter in grades, student and status endpoints, adapt old and new js api definitions, adapt frontend, add validation method to studiensemester_model

This commit is contained in:
Harald Bamberger
2025-07-30 18:08:04 +02:00
parent 4d1c4bf7ab
commit fa97116ec4
19 changed files with 205 additions and 85 deletions
@@ -74,14 +74,15 @@ class Grades extends FHCAPI_Controller
* (Entries in lehre.tbl_zeugnisnote)
*
* @param string $prestudent_id
* @param string|null $all (optional) If null only the current semesters grades will be loaded, otherwise all semesters grades will be loaded.
* @param string|null $studiensemester_kurzbz If studiensemester_kurzbz only this semesters grades will be loaded, otherwise all semesters grades will be loaded.
*
* @return void
*/
public function getCertificate($prestudent_id, $all = null)
public function getCertificate($prestudent_id, $studiensemester_kurzbz = null)
{
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$result = $this->StudentModel->loadWhere([
'prestudent_id' => $prestudent_id
@@ -91,12 +92,13 @@ class Grades extends FHCAPI_Controller
if (!$student)
$this->terminateWithSuccess([]);
$student_uid = current($student)->student_uid;
$studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : null;
if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
{
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
$result = $this->ZeugnisnoteModel->getZeugnisnoten($student_uid, $studiensemester_kurzbz);
$grades = $this->getDataOrTerminateWithError($result);
@@ -109,14 +111,15 @@ class Grades extends FHCAPI_Controller
* (Entries in campus.tbl_lvgesamtnote)
*
* @param string $prestudent_id
* @param string|null $all (optional) If null only the current semesters grades will be loaded, otherwise all semesters grades will be loaded.
* @param string|null $studiensemester_kurzbz If studiensemester_kurzbz only this semesters grades will be loaded, otherwise all semesters grades will be loaded.
*
* @return void
*/
public function getTeacherProposal($prestudent_id, $all = null)
public function getTeacherProposal($prestudent_id, $studiensemester_kurzbz = null)
{
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$result = $this->StudentModel->loadWhere([
'prestudent_id' => $prestudent_id
@@ -129,9 +132,11 @@ class Grades extends FHCAPI_Controller
$student_uid = current($student)->student_uid;
$studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : null;
if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
{
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
$result = $this->LvgesamtnoteModel->getLvGesamtNoten(null, $student_uid, $studiensemester_kurzbz);
$grades = $this->getDataOrTerminateWithError($result);
@@ -144,17 +149,20 @@ class Grades extends FHCAPI_Controller
* or as not allowed because of the repeating of a semester.
*
* @param string $prestudent_id
* @param string|null $all (optional) If null only the current semesters grades will be loaded, otherwise all semesters grades will be loaded.
* @param string|false $studiensemester_kurzbz If studiensemester_kurzbz only this semesters grades will be loaded, otherwise all semesters grades will be loaded.
*
* @return void
*/
public function getRepeaterGrades($prestudent_id, $all = null)
public function getRepeaterGrades($prestudent_id, $studiensemester_kurzbz = false)
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->library('AntragLib');
$studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : false;
if ($studiensemester_kurzbz !== false && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
{
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
$result = $this->antraglib->getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz);
$grades = $this->getDataOrTerminateWithError($result);
@@ -456,13 +464,19 @@ class Grades extends FHCAPI_Controller
$this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer");
$this->form_validation->set_rules("points", $this->p->t("stv", "grades_points"), "required|numeric");
$this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t("lehre", "studiensemester"), "required|regex_match[/^[WS]S[0-9]{4}$/]");
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$this->load->model('education/Notenschluesselaufteilung_model', 'NotenschluesselaufteilungModel');
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
{
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
$this->load->model('education/Notenschluesselaufteilung_model', 'NotenschluesselaufteilungModel');
$result = $this->NotenschluesselaufteilungModel->getNote(
$this->input->post('points'),
@@ -30,6 +30,7 @@ class Status extends FHCAPI_Controller
//Load Models
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
@@ -189,9 +190,13 @@ class Status extends FHCAPI_Controller
$studiensemester_kurzbz = $lastStatusData->studiensemester_kurzbz;
if ($status_kurzbz == Prestudentstatus_model::STATUS_ABSOLVENT
|| $status_kurzbz == Prestudentstatus_model::STATUS_DIPLOMAND
) {
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
)
{
$studiensemester_kurzbz = $this->input->post('currentSemester');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
{
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
}
$ausbildungssemester = $lastStatusData->ausbildungssemester;
@@ -68,12 +68,14 @@ class Student extends FHCAPI_Controller
* @param string $prestudent_id
* @return void
*/
public function get($prestudent_id)
public function get($prestudent_id, $studiensemester_kurzbz)
{
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
{
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
$this->PrestudentModel->addSelect('p.person_id');
$this->PrestudentModel->addSelect('p.titelpre');
@@ -163,21 +165,25 @@ class Student extends FHCAPI_Controller
* @param string $prestudent_id
* @return void
*/
public function save($prestudent_id)
public function save($prestudent_id, $studiensemester_kurzbz)
{
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->library('form_validation');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
{
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
$authuid = getAuthUID();
$now = date('c');
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
$this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'is_valid_date');
$this->form_validation->set_rules('semester', 'Semester', 'integer');
+2 -7
View File
@@ -500,11 +500,6 @@ class PrestudentLib
$student = current(getData($result));
$this->_ci->load->library('VariableLib', ['uid' => $authUID]);
$semester_aktuell = $this->_ci->variablelib->getVar('semester_aktuell');
// Update Aktionen
// Status updaten
@@ -545,8 +540,8 @@ class PrestudentLib
// Studentlehrverband updaten
$result = $this->_ci->StudentlehrverbandModel->update([
'student_uid' => $student->student_uid,
'studiensemester_kurzbz' => $semester_aktuell
], [
'studiensemester_kurzbz' => $studiensemester_kurzbz
], [
'semester' => $ausbildungssemester,
'verband' => '',
'gruppe' => '',
@@ -341,4 +341,10 @@ class Studiensemester_model extends DB_Model
WHERE studiensemester_kurzbz = ?",[$studiensemester_kurzbz]);
}
public function isValidStudiensemester($studiensemester_kurzbz)
{
$result = $this->load($studiensemester_kurzbz);
return hasData($result);
}
}
+10 -4
View File
@@ -16,16 +16,22 @@
*/
export default {
get(prestudent_id) {
get(prestudent_id, studiensemester_kurzbz) {
return {
method: 'post',
url: 'api/frontend/v1/stv/student/get/' + prestudent_id
url: 'api/frontend/v1/stv/student/get/'
+ encodeURIComponent(prestudent_id)
+ '/'
+ encodeURIComponent(studiensemester_kurzbz)
};
},
save(prestudent_id, params) {
save(prestudent_id, studiensemester_kurzbz, params) {
return {
method: 'post',
url: 'api/frontend/v1/stv/student/save/' + prestudent_id,
url: 'api/frontend/v1/stv/student/save/'
+ encodeURIComponent(prestudent_id)
+ '/'
+ encodeURIComponent(studiensemester_kurzbz),
params
};
},
+24 -11
View File
@@ -22,25 +22,34 @@ export default {
url: 'api/frontend/v1/stv/grades/list'
};
},
getCertificate(prestudent_id, all) {
all = all ? '/all' : '';
getCertificate(prestudent_id, studiensemester_kurzbz) {
let url = 'api/frontend/v1/stv/grades/getCertificate/' + encodeURIComponent(prestudent_id);
if (!!studiensemester_kurzbz) {
url = url + '/' + encodeURIComponent(studiensemester_kurzbz);
}
return {
method: 'get',
url: 'api/frontend/v1/stv/grades/getCertificate/' + prestudent_id + all
url: url
};
},
getTeacherProposal(prestudent_id, all) {
all = all ? '/all' : '';
getTeacherProposal(prestudent_id, studiensemester_kurzbz) {
let url = 'api/frontend/v1/stv/grades/getTeacherProposal/' + encodeURIComponent(prestudent_id);
if (!!studiensemester_kurzbz) {
url = url + '/' + encodeURIComponent(studiensemester_kurzbz);
}
return {
method: 'get',
url: 'api/frontend/v1/stv/grades/getTeacherProposal/' + prestudent_id + all
url: url
};
},
getRepeaterGrades(prestudent_id, all) {
all = all ? '/all' : '';
getRepeaterGrades(prestudent_id, studiensemester_kurzbz) {
let url = 'api/frontend/v1/stv/grades/getRepeaterGrades/' + encodeURIComponent(prestudent_id);
if (!!studiensemester_kurzbz) {
url = url + '/' + encodeURIComponent(studiensemester_kurzbz);
}
return {
method: 'get',
url: 'api/frontend/v1/stv/grades/getRepeaterGrades/' + prestudent_id + all
url: url
};
},
updateCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, note, lehrveranstaltung_bezeichnung}) {
@@ -86,11 +95,15 @@ export default {
}
};
},
getGradeFromPoints(points, lehrveranstaltung_id) {
getGradeFromPoints(points, lehrveranstaltung_id, studiensemester_kurzbz) {
return {
method: 'post',
url: 'api/frontend/v1/stv/grades/getGradeFromPoints',
params: { points, lehrveranstaltung_id }
params: {
"points": points,
"lehrveranstaltung_id": lehrveranstaltung_id,
"studiensemester_kurzbz": studiensemester_kurzbz
}
};
}
};
+5 -2
View File
@@ -17,10 +17,13 @@
export default {
//------------- Prestudent.js------------------------------------------------------
get(prestudent_id) {
get(prestudent_id, studiensemester_kurzbz) {
return {
method: 'post',
url: 'api/frontend/v1/stv/prestudent/get/' + prestudent_id
url: 'api/frontend/v1/stv/prestudent/get/'
+ encodeURIComponent(prestudent_id)
+ '/'
+ encodeURIComponent(studiensemester_kurzbz)
};
},
updatePrestudent(prestudent_id, params) {
+12 -6
View File
@@ -1,10 +1,16 @@
export default {
get(prestudent_id) {
return this.$fhcApi.post('api/frontend/v1/stv/student/get/' + prestudent_id);
get(prestudent_id, studiensemester_kurzbz) {
let url = 'api/frontend/v1/stv/student/get/'
+ encodeURIComponent(prestudent_id)
+ '/'
+ encodeURIComponent(studiensemester_kurzbz);
return this.$fhcApi.post(url);
},
save(form, prestudent_id, data) {
return this.$fhcApi.post(form, 'api/frontend/v1/stv/student/save/' + prestudent_id,
data
);
save(form, prestudent_id, studiensemester_kurzbz, data) {
let url = 'api/frontend/v1/stv/student/save/'
+ encodeURIComponent(prestudent_id)
+ '/'
+ encodeURIComponent(studiensemester_kurzbz);
return this.$fhcApi.post(form, url, data);
},
}
+27 -11
View File
@@ -2,17 +2,26 @@ export default {
list() {
return this.$fhcApi.get('api/frontend/v1/stv/grades/list');
},
getCertificate(prestudent_id, all) {
all = all ? '/all' : '';
return this.$fhcApi.get('api/frontend/v1/stv/grades/getCertificate/' + prestudent_id + all);
getCertificate(prestudent_id, studiensemester_kurzbz) {
let url = 'api/frontend/v1/stv/grades/getCertificate/' + encodeURIComponent(prestudent_id);
if (!!studiensemester_kurzbz) {
url = url + '/' + encodeURIComponent(studiensemester_kurzbz);
}
return this.$fhcApi.get(url);
},
getTeacherProposal(prestudent_id, all) {
all = all ? '/all' : '';
return this.$fhcApi.get('api/frontend/v1/stv/grades/getTeacherProposal/' + prestudent_id + all);
getTeacherProposal(prestudent_id, studiensemester_kurzbz) {
let url = 'api/frontend/v1/stv/grades/getTeacherProposal/' + encodeURIComponent(prestudent_id);
if (!!studiensemester_kurzbz) {
url = url + '/' + encodeURIComponent(studiensemester_kurzbz);
}
return this.$fhcApi.get(url);
},
getRepeaterGrades(prestudent_id, all) {
all = all ? '/all' : '';
return this.$fhcApi.get('api/frontend/v1/stv/grades/getRepeaterGrades/' + prestudent_id + all);
getRepeaterGrades(prestudent_id, studiensemester_kurzbz) {
let url = 'api/frontend/v1/stv/grades/getRepeaterGrades/' + encodeURIComponent(prestudent_id);
if (!!studiensemester_kurzbz) {
url = url + '/' + encodeURIComponent(studiensemester_kurzbz);
}
return this.$fhcApi.get(url);
},
updateCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, note, lehrveranstaltung_bezeichnung}) {
return this.$fhcApi.post(
@@ -65,8 +74,15 @@ export default {
}
);
},
getGradeFromPoints(points, lehrveranstaltung_id, manualErrorHandling) {
getGradeFromPoints(points, lehrveranstaltung_id, studiensemester_kurzbz, manualErrorHandling) {
const config = manualErrorHandling ? {errorHandling: false} : {};
return this.$fhcApi.post('api/frontend/v1/stv/grades/getGradeFromPoints', {points, lehrveranstaltung_id}, config);
return this.$fhcApi.post('api/frontend/v1/stv/grades/getGradeFromPoints',
{
"points": points,
"lehrveranstaltung_id": lehrveranstaltung_id,
"studiensemester_kurzbz": studiensemester_kurzbz
},
config
);
}
}
+7 -2
View File
@@ -2,8 +2,13 @@ export default {
//------------- Prestudent.js------------------------------------------------------
get(prestudent_id){
return this.$fhcApi.post('api/frontend/v1/stv/prestudent/get/' + prestudent_id);
get(prestudent_id, studiensemester_kurzbz) {
return this.$fhcApi.post(
'api/frontend/v1/stv/prestudent/get/'
+ encodeURIComponent(prestudent_id)
+ '/'
+ encodeURIComponent(studiensemester_kurzbz)
);
},
updatePrestudent(form, prestudent_id, data){
return this.$fhcApi.post(form, 'api/frontend/v1/stv/prestudent/updatePrestudent/' + prestudent_id,
@@ -41,6 +41,10 @@ export default {
$reloadList: {
from: '$reloadList',
required: true
},
currentSemester: {
from: 'currentSemester',
required: true
}
},
props: {
@@ -101,7 +105,7 @@ export default {
methods: {
updateStudent(n) {
return this.$api
.call(ApiStvDetails.get(n.prestudent_id))
.call(ApiStvDetails.get(n.prestudent_id, this.currentSemester))
.then(result => {
this.data = result.data;
if (!this.data.familienstand)
@@ -116,7 +120,11 @@ export default {
this.$refs.form.clearValidation();
return this.$refs.form
.call(ApiStvDetails.save(this.modelValue.prestudent_id, this.changed))
.call(ApiStvDetails.save(
this.modelValue.prestudent_id,
this.currentSemester,
this.changed
))
.then(result => {
this.original = {...this.data};
this.changed = {};
@@ -9,6 +9,12 @@ export default {
emits: [
"copied"
],
inject: {
currentSemester: {
from: 'currentSemester',
required: true
}
},
props: {
student: Object,
allSemester: Boolean
@@ -24,7 +30,7 @@ export default {
ajaxURL: 'dummy',
ajaxRequestFunc: () => this.$api.call(ApiStvGrades.getRepeaterGrades(
this.student.prestudent_id,
this.allSemester
(!this.allSemester ? this.currentSemester : null)
)),
ajaxResponse: (url, params, response) => {
return response.data || [];
@@ -9,6 +9,12 @@ export default {
emits: [
"copied"
],
inject: {
currentSemester: {
from: 'currentSemester',
required: true
}
},
props: {
student: Object,
allSemester: Boolean
@@ -24,7 +30,7 @@ export default {
ajaxURL: 'dummy',
ajaxRequestFunc: () => this.$api.call(ApiStvGrades.getTeacherProposal(
this.student.prestudent_id,
this.allSemester
(!this.allSemester ? this.currentSemester : null)
)),
ajaxResponse: (url, params, response) => {
return response.data || [];
@@ -5,14 +5,22 @@ import ZeugnisDocuments from './Zeugnis/Documents.js';
import ApiStvGrades from '../../../../../api/factory/stv/grades.js';
export default {
name: 'Zeugnis',
components: {
CoreFilterCmpt,
ZeugnisActions,
ZeugnisDocuments
},
inject: [
'config'
],
inject: {
config: {
from: 'config',
required: true
},
currentSemester: {
from: 'currentSemester',
required: true
}
},
props: {
student: Object,
allSemester: Boolean
@@ -103,7 +111,8 @@ export default {
.call(
ApiStvGrades.getGradeFromPoints(
filterTerm,
cell.getData().lehrveranstaltung_id
cell.getData().lehrveranstaltung_id,
this.currentSemester
),
{ errorHandling: false }
)
@@ -201,7 +210,7 @@ export default {
ajaxURL: 'dummy',
ajaxRequestFunc: () => this.$api.call(ApiStvGrades.getCertificate(
this.student.prestudent_id,
this.allSemester
(!this.allSemester ? this.currentSemester : null)
)),
ajaxResponse: (url, params, response) => {
return response.data || [];
@@ -5,6 +5,7 @@ import ZeugnisDocuments from './Documents.js';
import ApiStvGrades from '../../../../../../api/factory/stv/grades.js';
export default {
name: 'ZeugnisActions',
components: {
CoreForm,
FormInput,
@@ -14,9 +15,16 @@ export default {
'setGrade',
'deleteGrade'
],
inject: [
'config'
],
inject: {
config: {
from: 'config',
required: true
},
currentSemester: {
from: 'currentSemester',
required: true
}
},
props: {
selected: Array
},
@@ -66,7 +74,8 @@ export default {
this.$refs.points
.call(ApiStvGrades.getGradeFromPoints(
query,
this.selected.find(Boolean)?.lehrveranstaltung_id
this.selected.find(Boolean)?.lehrveranstaltung_id,
this.currentSemester
))
.then(result => {
if (result.data === null) {
@@ -8,6 +8,7 @@ async function callPermissionUrl($api, url) {
}
export default {
name: 'ZeugnisDocuments',
components: {
PvTieredMenu: primevue.tieredmenu
},
@@ -30,8 +30,9 @@ export default {
from: 'hasAdminPermission',
default: false
},
defaultSemester: {
from: 'defaultSemester',
currentSemester: {
from: 'currentSemester',
required: true
}
},
props: {
@@ -107,7 +108,7 @@ export default {
methods: {
loadPrestudent() {
return this.$api
.call(ApiStvPrestudent.get(this.modelValue.prestudent_id))
.call(ApiStvPrestudent.get(this.modelValue.prestudent_id, this.currentSemester))
.then(result => result.data)
.then(result => {
this.data = result;
@@ -14,6 +14,10 @@ export default {
$reloadList: {
from: '$reloadList',
required: true
},
currentSemester: {
from: 'currentSemester',
required: true
}
},
emits: [
@@ -242,6 +246,7 @@ export default {
return askForSemester();
},
changeStatus(data) {
data.currentSemester = this.currentSemester;
Promise
.allSettled(
this.prestudentIds.map(prestudent_id => this.$api.call(