feature(Studium API endpoinds): adds the api endpoints for the Studium View to get the studienplan from a studiensemester/studiengang/semester

This commit is contained in:
SimonGschnell
2025-04-30 13:45:01 +02:00
parent 7d3ffdde7b
commit 9b895fbd23
6 changed files with 494 additions and 3 deletions
+40
View File
@@ -0,0 +1,40 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Studium extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct([
'index' => ['basis/cis:r'],
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* index loads the Studium view
* @access public
* @return void
*/
public function index()
{
$viewData = array(
);
$this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'studium']);
}
}
@@ -0,0 +1,217 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Studium extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getStudienAllSemester'=> self::PERM_LOGGED,
'getStudiengaengeForStudienSemester'=> self::PERM_LOGGED,
'getStudienplaeneBySemester'=> self::PERM_LOGGED,
]);
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->load->model('organisation/Studienordnung_model','StudienordnungModel');
$this->load->model('organisation/Studiensemester_model',"StudiensemesterModel");
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
$this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$this->load->model('codex/Orgform_model','OrgformModel');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
public function getStudienAllSemester(){
$parameter_studiensemester = $this->input->get('studiensemester',true);
$parameter_studiengang = $this->input->get('studiengang',true);
$parameter_semester = $this->input->get('semester',true);
$parameter_studienplan = $this->input->get('studienplan',true);
$test1=null;
$test2=null;
$test3=null;
$test4=null;
if(isset($parameter_studiensemester)){
$parameter_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz" => $parameter_studiensemester])));
}
if(isset($parameter_studiengang)){
$parameter_studiengang = current($this->getDataOrTerminateWithError($this->StudiengangModel->loadWhere(["studiengang_kz" => $parameter_studiengang])));
}
if(isset($parameter_studienplan)){
$this->StudienplanModel->addJoin("lehre.tbl_studienordnung", "studienordnung_id");
$this->StudienplanModel->addJoin("lehre.tbl_studienplan_semester", "studienplan_id");
$parameter_studienplan = $this->StudienplanModel->loadWhere(["studienplan_id" => $parameter_studienplan, "aktiv" => TRUE]);
$parameter_studienplan = current($this->getDataOrTerminateWithError($parameter_studienplan));
}
// fetch studiensemester
$allStudienSemester = $this->getDataOrTerminateWithError($this->StudiensemesterModel->load());
$aktuelles_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->getAkt()));
if(isset($parameter_studiensemester) && !empty(array_filter($allStudienSemester, function($studiensemester) use($parameter_studiensemester){
return $studiensemester->studiensemester_kurzbz == $parameter_studiensemester->studiensemester_kurzbz;
}))){
$test1=true;
$aktuelles_studiensemester = $parameter_studiensemester;
}
// fetch studiengaenge
$studiengaenge = $this->computeStudiengaenge($aktuelles_studiensemester->studiensemester_kurzbz);
$aktuelles_studiengang = current($studiengaenge);
if(!$aktuelles_studiengang){
$aktuelles_studiengang = null;
}
if(isset($parameter_studiengang) && !empty(array_filter( $studiengaenge,function($studiengang)use($parameter_studiengang){
return $studiengang->studiengang_kz == $parameter_studiengang->studiengang_kz;
}))){
$test2=true;
$aktuelles_studiengang = $parameter_studiengang;
}
// compute semester and studienplaene
if($aktuelles_studiengang){
$studienplaene = $this->computeStudienplaene($aktuelles_studiengang->studiengang_kz, $aktuelles_studiensemester->studiensemester_kurzbz);
}else{
$studienplaene =[];
}
$semester = array_values(array_unique(array_map(function($item){
return $item->semester;
}, $studienplaene)));
$aktuelles_semester = current($semester);
if(!$aktuelles_semester){
$aktuelles_semester = null;
}
if(isset($parameter_semester) && in_array($parameter_semester, $semester)){
$test3=true;
$aktuelles_semester = $parameter_semester;
}
$semester_studienplan = array_filter($studienplaene, function($item) use($aktuelles_semester){
return $item->semester == $aktuelles_semester;
});
// fetch current studienplan based on semester
$aktuelles_studienplan = current($semester_studienplan);
if(!$aktuelles_studienplan){
$aktuelles_studienplan = null;
}
if(isset($parameter_studienplan) && !empty(array_filter( $semester_studienplan, function($stundenplan) use($parameter_studienplan){
return $stundenplan->studienplan_id == $parameter_studienplan->studienplan_id;
}))){
$test4=true;
$aktuelles_studienplan = $parameter_studienplan ;
}
// result object
$result = new stdClass();
$result->studienSemester = [];
$result->studienSemester["all"]= $allStudienSemester;
$result->studienSemester["preselected"]=$aktuelles_studiensemester;
$result->studiengang["all"]=$studiengaenge;
$result->studiengang["preselected"]=$aktuelles_studiengang;
$result->semester["all"] =$semester;
$result->semester["preselected"] =$aktuelles_semester;
$result->studienplan["all"]=$semester_studienplan;
$result->studienplan["preselected"]=$aktuelles_studienplan;
$result->test1=$test1;
$result->test2=$test2;
$result->test3=$test3;
$result->test4=$test4;
/* if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester_kz]);
$studentLehrverband = current($this->getDataOrTerminateWithError($studentLehrverband));
$result->studentLehrverband = $studentLehrverband;
//$currentStudienplan = $this->StudienplanModel->loadWhere(["studiengang_kz"=>$studentLehrverband->studiengang_kz,"semester"=>$studentLehrverband->semester, "verband"=>$studentLehrverband->verband, "gruppe"=>$studentLehrverband->gruppe]);
$studienplaene = $this->getDataOrTerminateWithError($this->computeStudienplaene($studentLehrverband->studiengang_kz, $studentLehrverband->studiensemester_kurzbz));
$result->studienPleane = $studienplaene;
//get the studienplan for the user
$preselectedStudienplan = $this->getStudienPlanFromPrestudentStatus(getAuthPersonId());
//set the preselected semester
$preselectedSemester = $preselectedStudienplan->semester;
//get the studienordnung for the studienplan
$preselectedStudienordnung = $this->getStudienOrdnungForStudienplan($preselectedStudienplan->studienplan_id);
} */
$this->terminateWithSuccess($result);
}
public function getStudiengaengeForStudienSemester($studiensemester){
$studiengaenge = $this->computeStudiengaenge($studiensemester);
$this->terminateWithSuccess($studiengaenge);
}
public function getStudienplaeneBySemester(){
$this->load->library('form_validation');
$this->form_validation->set_data($this->input->get());
$this->form_validation->set_rules('studiengang', 'studiengang', 'required');
$this->form_validation->set_rules('studiensemester', 'studiensemester', 'required');
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
$studiengang = $this->input->get('studiengang',true);
$studiensemester = $this->input->get('studiensemester',true);
$studienplaene = $this->computeStudienplaene($studiengang, $studiensemester);
$this->terminateWithSuccess($studienplaene);
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
private function computeStudienplaene($studiengang, $studiensemester){
$studienplaene = $this->StudienplanModel->getStudienplaeneBySemester($studiengang, $studiensemester);
$studienplaene = $this->getDataOrTerminateWithError($studienplaene);
$studienplaene = array_map(function($studienplan){
$orgform = current($this->getDataOrTerminateWithError($this->OrgformModel->loadWhere(["orgform_kurzbz" => $studienplan->orgform_kurzbz])));
$studienplan->orgform_bezeichnung = $orgform->bezeichnung;
return $studienplan;
},$studienplaene);
return $studienplaene;
}
private function computeStudiengaenge($studiensemester){
$studiengang_studiensemester_result = $this->StudiengangModel->getStudiengaengeByStudiensemester($studiensemester);
$studiengang_studiensemester_result = $this->getDataOrTerminateWithError($studiengang_studiensemester_result);
return $studiengang_studiensemester_result;
}
private function getStudienPlanFromPrestudentStatus($person_id){
$studienplan_id = current($this->getDataOrTerminateWithError($this->PrestudentstatusModel->getLastStatusPerson($person_id)))->studienplan_id;
$studienplan =current($this->getDataOrTerminateWithError($this->StudienplanModel->loadWhere(["studienplan_id"=>$studienplan_id])));
return $studienplan;
}
}
+3 -1
View File
@@ -37,6 +37,7 @@ import studiengang from "./studiengang.js";
import menu from "./menu.js";
import dashboard from "./dashboard.js";
import authinfo from "./authinfo.js";
import studium from "./studium.js";
export default {
search,
@@ -60,5 +61,6 @@ export default {
addons,
studiengang,
menu,
authinfo
authinfo,
studium,
};
+33
View File
@@ -0,0 +1,33 @@
export default {
getStudiensemester: function () {
return this.$fhcApi.get(
'/components/Cis/Mylv/Studiensemester',
{}
);
},
getAllStudienSemester: function (studiensemester=undefined, studiengang=undefined, semester=undefined, studienplan=undefined) {
console.log(studiensemester, studiengang, semester, studienplan)
return this.$fhcApi.get(
'/api/frontend/v1/Studium/getStudienAllSemester',
{studiensemester, studiengang, semester, studienplan}
);
},
getStudiengaengeForStudienSemester: function (studiensemester) {
return this.$fhcApi.get(
`/api/frontend/v1/Studium/getStudiengaengeForStudienSemester/${studiensemester}`,
{}
);
},
getStudienplaeneBySemester: function (studiengang, studiensemester) {
return this.$fhcApi.get(
`/api/frontend/v1/Studium/getStudienplaeneBySemester`,
{
studiengang,
studiensemester,
}
);
},
}
+7 -2
View File
@@ -13,14 +13,19 @@ import RoomInformation, {DEFAULT_MODE_RAUMINFO} from "../../components/Cis/Mylv/
import AbgabetoolStudent from "../../components/Cis/Abgabetool/AbgabetoolStudent.js";
import AbgabetoolMitarbeiter from "../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js";
import DeadlineOverview from "../../components/Cis/Abgabetool/DeadlineOverview.js";
import Studium from "../../components/Cis/Studium/Studium.js";
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
const router = VueRouter.createRouter({
history: VueRouter.createWebHistory(`/${ciPath}`),
routes: [
{
path: `/Cis/Studium`,
name: 'Studium',
component: Studium,
props: true
},
{
path: `/Cis/Profil/View/:uid`,
name: 'ProfilView',
+194
View File
@@ -0,0 +1,194 @@
export default {
data(){
return {
studienSemester :[],
selectedStudiensemester: null,
studiengaenge:[],
selectedStudiengang:null,
studienOrdnung: [],
selectedStudienordnung: null,
semester:[],
selectedSemester:null,
}
},
methods:{
changeSelectedStudienSemester(studiensemester) {
this.$fhcApi.factory.studium.getAllStudienSemester(studiensemester.studiensemester_kurzbz, this.selectedStudiengang, this.selectedSemester, this.selectedStudienordnung)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
},
changeSelectedStudienGang(studiengang) {
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, studiengang.studiengang_kz, this.selectedSemester, this.selectedStudienordnung)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
},
changeSelectedSemester(semester) {
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, semester, this.selectedStudienordnung)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
},
changeSelectedStudienPlan(studienplan) {
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, this.selectedSemester, studienplan.studienplan_id)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
},
/* loadStudienplan(studiengang, studiensemester){
this.$fhcApi.factory.studium.getStudienplaeneBySemester(studiengang, studiensemester)
.then(data => data.data)
.then(res => {
console.log("This is the result", res)
})
}, */
sortStudienSemester(studienSemester){
let regex = new RegExp(/^(WS|SS)([0-9]{4})/);
studienSemester.sort((sem1,sem2)=>{
let [sem1Match, sem1Semester, sem1Year] = sem1.studiensemester_kurzbz.match(regex);
let [sem2Match, sem2Semester, sem2Year] = sem2.studiensemester_kurzbz.match(regex);
if(sem1Year == sem2Year){
return sem1Semester > sem2Semester? -1:1;
}
return sem1Year > sem2Year? -1:1;
})
},
setHash(val) {
// TODO: make this a router param to enable history
location.hash = val;
},
extractPropertyValues(res){
let { studienSemester, studiengang, semester, studienplan } = res;
this.sortStudienSemester(studienSemester.all);
this.studienSemester = studienSemester.all;
this.selectedStudiensemester = studienSemester.preselected.studiensemester_kurzbz;
this.studiengaenge = studiengang.all;
this.selectedStudiengang = studiengang.preselected?.studiengang_kz;
this.semester = semester.all;
this.selectedSemester = semester?.preselected;
console.log(studienplan.all,"all studienplan")
this.studienOrdnung = studienplan.all;
console.log(this.studienOrdnung,"studienordnung")
this.selectedStudienordnung = studienplan.preselected?.studienplan_id;
},
studienordnungTitel(studienordnung){
if(!studienordnung) return "";
return `${studienordnung?.bezeichnung}-${studienordnung?.orgform_kurzbz} ( ${studienordnung?.orgform_bezeichnung}, ${studienordnung?.sprache} )`;
},
studiengangTitel(studiengang) {
if (!studiengang) return "";
return `${studiengang?.kurzbzlang} (${studiengang?.bezeichnung})`;
},
studiensemesterTitel(studiensemester){
if (!studiensemester) return "";
let studiensemester_regex = new RegExp(/^(WS|SS)([0-9]{4})/);
let match = studiensemester.match(studiensemester_regex);
switch(match[1]){
case "WS":
return `Wintersemester ${match[2]}`;
case "SS":
return `Sommersemester ${match[2]}`;
default:
return `${studiensemester}`;
}
}
},
computed:{
},
created(){
this.$fhcApi.factory.studium.getAllStudienSemester()
.then(data => data.data)
.then(res => {
this. extractPropertyValues(res);
})
},
/* selectedStudiensemester(newStudiensemester, oldStudiensemester) {
if (newStudiensemester !== oldStudiensemester) {
this.$fhcApi.factory.studium.getAllStudienSemester(newStudiensemester, this.selectedStudiengang, this.selectedSemester)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
}
},
selectedStudiengang(newStudiengang, oldStudiengang) {
if (newStudiengang !== oldStudiengang) {
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, newStudiengang, this.selectedSemester)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
}
},
selectedSemester(newSemester, oldSemester) {
if (newSemester !== oldSemester) {
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, newSemester)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
}
} */
template: `
<h2>this is a test titel</h2>
<div class="input-group">
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="prevSem">
<i class="fa fa-caret-left" aria-hidden="true"></i>
</button>
<select ref="studiensemester" v-model="selectedStudiensemester" class="form-select" :aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
<option v-for="semester in studienSemester" @click="changeSelectedStudienSemester(semester)" :key="semester" :value="semester.studiensemester_kurzbz">{{studiensemesterTitel(semester.studiensemester_kurzbz) }}</option>
</select>
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="nextSem">
<i class="fa fa-caret-right" aria-hidden="true"></i>
</button>
</div>
<div class="input-group">
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="prevSem">
<i class="fa fa-caret-left" aria-hidden="true"></i>
</button>
<select ref="studiengaenge" v-model="selectedStudiengang" class="form-select" :aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
<option v-for="studiengang in studiengaenge" @click="changeSelectedStudienGang(studiengang)" :key="studiengang.studiengang_kz" :value="studiengang.studiengang_kz" >{{studiengangTitel(studiengang)}}</option>
</select>
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="nextSem">
<i class="fa fa-caret-right" aria-hidden="true"></i>
</button>
</div>
<div class="input-group">
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="prevSem">
<i class="fa fa-caret-left" aria-hidden="true"></i>
</button>
<select ref="semester" v-model="selectedSemester" class="form-select" :aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
<option v-for="sem in semester" @click="changeSelectedSemester(sem)" :key="semester" :value="sem">{{sem}}. Semester</option>
</select>
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="nextSem">
<i class="fa fa-caret-right" aria-hidden="true"></i>
</button>
</div>
<div class="input-group">
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="prevSem">
<i class="fa fa-caret-left" aria-hidden="true"></i>
</button>
<select ref="studienordnung" v-model="selectedStudienordnung" class="form-select" :aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
<option v-for="ordnung in studienOrdnung" @click="changeSelectedStudienPlan(ordnung)" :key="ordnung.bezeichnung " :value="ordnung.studienplan_id">{{studienordnungTitel(ordnung)}}</option>
</select>
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="nextSem">
<i class="fa fa-caret-right" aria-hidden="true"></i>
</button>
</div>
`
};