termine tab hinzugefuegt

This commit is contained in:
ma0048
2025-12-01 10:55:04 +01:00
parent 89ec51bd0a
commit 0de033e428
17 changed files with 263 additions and 51 deletions
@@ -41,7 +41,9 @@ class LvPlan extends FHCAPI_Controller
'getLehreinheitStudiensemester' => self::PERM_LOGGED,
'studiensemesterDateInterval' => self::PERM_LOGGED,
'getLvPlanForStudiensemester' => self::PERM_LOGGED,
'getLv' => self::PERM_LOGGED
'getLv' => self::PERM_LOGGED,
'getLeEvents' => self::PERM_LOGGED,
'getLvEvents' => self::PERM_LOGGED,
]);
$this->load->library('LogLib');
@@ -54,6 +56,12 @@ class LvPlan extends FHCAPI_Controller
));
$this->load->library('form_validation');
$this->load->library('PhrasesLib');
$this->loadPhrases(
array(
'ui'
)
);
}
//------------------------------------------------------------------------------------------------------------------
@@ -145,6 +153,39 @@ class LvPlan extends FHCAPI_Controller
));
}
public function getLeEvents($le_id = null, $start_date = null, $end_date = null, $stundenplan = 'stundenplandev')
{
if (is_null($le_id) || is_null($start_date) || is_null($end_date))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
if ($stundenplan !== 'stundenplandev' && $stundenplan !== 'stundenplan')
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->load->library('StundenplanLib');
$result = $this->stundenplanlib->getEventsByLE($le_id, $start_date, $end_date, $stundenplan);
$lvplanEvents = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($lvplanEvents);
}
public function getLvEvents($lv_id = null, $start_date = null, $end_date = null, $stundenplan = 'stundenplandev')
{
if (is_null($lv_id) || is_null($start_date) || is_null($end_date))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
if ($stundenplan !== 'stundenplandev' && $stundenplan !== 'stundenplan')
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->load->library('StundenplanLib');
$result = $this->stundenplanlib->getEventsByLV($lv_id, $start_date, $end_date, $stundenplan);
$lvplanEvents = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($lvplanEvents);
}
//TODO: delete this function if we don't use the old calendar export endpoints anymore
public function studiensemesterDateInterval($date){
$this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
@@ -28,6 +28,7 @@ class Setup extends FHCAPI_Controller
{
parent::__construct([
'getTabs' => ['admin:r', 'assistenz:r'],
'getTab' => ['admin:r', 'assistenz:r'],
'getStudiensemester' => ['admin:r', 'assistenz:r'],
'getSprache' => ['admin:r', 'assistenz:r'],
'getRaumtyp' => ['admin:r', 'assistenz:r'],
@@ -60,6 +61,11 @@ class Setup extends FHCAPI_Controller
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Lektor.js',
'config' => []
);
$tabs['termine'] = array (
'title' => 'Termine',
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Termine.js',
'config' => []
);
$tabs['notiz'] = array (
'title' => 'Notizen',
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Notiz.js',
@@ -68,6 +74,16 @@ class Setup extends FHCAPI_Controller
$this->terminateWithSuccess($tabs);
}
public function getTab()
{
$tabs['termine'] = array (
'title' => 'Termine',
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/LVTermine.js',
'config' => []
);
$this->terminateWithSuccess($tabs);
}
public function getStudiensemester()
{
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
@@ -34,7 +34,7 @@ class LvTermine extends FHCAPI_Controller
//TODO Build own lib or combine with Controller Stundenplan.php
//here use of logic of Stundenplan.php, extended with parameters uid, grouping, and used dbTable
public function getStundenplan($uid, $start_date = null, $end_date = null, $groupConsecutiveHours = false, $dbStundenplanTable = "stundenplan")
public function getStundenplan($uid, $start_date = null, $end_date = null, $dbStundenplanTable = "stundenplan", $groupConsecutiveHours = false)
{
$student_uid = $uid;
$semester_range = $this->studienSemesterErmitteln($start_date, $end_date);
@@ -80,13 +80,6 @@ class LvTermine extends FHCAPI_Controller
$stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? [];
$this->terminateWithSuccess($stundenplan_data);
$this->expand_object_information($stundenplan_data);
$this->returnObj['$stundenplan_query'] = $stundenplan_query;
$this->returnObj['$student_lehrverband'] = $student_lehrverband;
$this->returnObj['$benutzer_gruppen'] = $benutzer_gruppen;
$this->terminateWithSuccess($stundenplan_data);
}
public function getStudiensemester()
+15
View File
@@ -181,6 +181,21 @@ class StundenplanLib
return success($stundenplan_data);
}
public function getEventsByLE($lehreinheit_id, $start, $end, $stundenplan)
{
$this->_ci =& get_instance();
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
return $this->_ci->StundenplanModel->getStundenplanLE($lehreinheit_id, $start, $end, $stundenplan);
}
public function getEventsByLV($lehrveranstaltung_id, $start, $end, $stundenplan)
{
$this->_ci =& get_instance();
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
return $this->_ci->StundenplanModel->getStundenplanLV($lehrveranstaltung_id, $start, $end, $stundenplan);
}
/**
* Get stundenplan for a room
*
@@ -333,6 +333,64 @@ class Stundenplan_model extends DB_Model
", [$start_date, $end_date, $lv_id]);
}
public function getStundenplanLE($lehreinheit, $start_date, $end_date, $stundenplan)
{
$qry = "
WITH lehreinheiten AS (
SELECT lehreinheit_id FROM lehre.tbl_lehreinheit WHERE lehreinheit_id = ?
), " . $this->getStundenplanCTE($stundenplan) . "
SELECT *
FROM stundenplanentries
";
return $this->execReadOnlyQuery($qry, array($lehreinheit, $start_date, $end_date));
}
public function getStundenplanLV($lehrveranstaltung_id, $start_date, $end_date, $stundenplan)
{
$qry = "
WITH lehreinheiten AS (
SELECT lehreinheit_id FROM lehre.tbl_lehreinheit WHERE lehrveranstaltung_id = ?
), " . $this->getStundenplanCTE($stundenplan) . "
SELECT *
FROM stundenplanentries
";
return $this->execReadOnlyQuery($qry, array($lehrveranstaltung_id, $start_date, $end_date));
}
private function getStundenplanCTE($stundenplan)
{
return "entries AS (
SELECT
datum, min(stunde) as stunde_beginn, max(stunde) as stunde_ende,
array_agg(DISTINCT(
CASE WHEN gruppe_kurzbz is not null THEN gruppe_kurzbz
ELSE (UPPER(stg_typ || stg_kurzbz) || COALESCE(semester,'0') || COALESCE(verband,'') || COALESCE(gruppe,''))
END)) as gruppen_kuerzel,
array_agg(DISTINCT CONCAT(vorname || ' ' || nachname)) as lektorname,
array_agg(DISTINCT stundenplan.ort_kurzbz) as ort_kurzbz,
array_agg(DISTINCT titel) as titel,
lehrfach_bez, stundenplan.lehreinheit_id, lehrveranstaltung_id
FROM lehre.vw_$stundenplan as stundenplan
JOIN public.tbl_mitarbeiter ON stundenplan.uid = tbl_mitarbeiter.mitarbeiter_uid
JOIN tbl_benutzer ON tbl_mitarbeiter.mitarbeiter_uid = tbl_benutzer.uid
JOIN tbl_person USING(person_id)
JOIN lehreinheiten ON stundenplan.lehreinheit_id = lehreinheiten.lehreinheit_id
WHERE datum >= ? AND datum <= ?
GROUP BY datum, unr, stundenplan.lehreinheit_id, lehrveranstaltung_id, lehrfach_bez, lehrfach_bez
ORDER BY datum, min(stunde), unr, lehreinheit_id
),
stundenplanentries AS (
SELECT
entries.*,
stundeb.beginn AS beginn,
stundee.ende AS ende
FROM entries
JOIN lehre.tbl_stunde stundeb ON stundeb.stunde = entries.stunde_beginn
JOIN lehre.tbl_stunde stundee ON stundee.stunde = entries.stunde_ende
)";
}
/**
* queries Stundenplan and filters by assigned ma_kurzbz, very similar to get by LVA
*
+8
View File
@@ -0,0 +1,8 @@
export default {
getStudiensemester(){
return {
method: 'get',
url: 'api/frontend/v1/stv/LvTermine/getStudiensemester/'
};
},
};
+9 -11
View File
@@ -16,20 +16,18 @@
*/
export default {
getCourselist(params) {
getCourselist(student_uid, start_date, end_date, stundenplan) {
return {
method: 'get',
url: 'api/frontend/v1/stv/LvTermine/getStundenplan/' + params.student_uid + '/'
+ params.start_date + '/'
+ params.end_date + '/'
+ params.group_consecutiveHours + '/'
+ params.dbStundenplanTable
url: 'api/frontend/v1/stv/LvTermine/getStundenplan/' + encodeURIComponent(student_uid) + '/'
+ encodeURIComponent(start_date) + '/'
+ encodeURIComponent(end_date) + '/'
+ encodeURIComponent(stundenplan) + '/'
+ encodeURIComponent(true)
};
},
getStudiensemester(){
return {
method: 'get',
url: 'api/frontend/v1/stv/LvTermine/getStudiensemester/'
};
exportCalendar(student_uid, stundenplan)
{
return FHC_JS_DATA_STORAGE_OBJECT.app_root + 'content/statistik/termine.xls.php?student_uid=' + encodeURIComponent(student_uid) + '&db_stpl_table='+encodeURIComponent(stundenplan);
},
}
@@ -0,0 +1,13 @@
export default {
getCourselist(le_id, start_date, end_date, stundenplan)
{
return {
method: 'get',
url: '/api/frontend/v1/lvPlan/getLeEvents/' + encodeURIComponent(le_id) + "/" + encodeURIComponent(start_date) + "/" + encodeURIComponent(end_date) + "/" + encodeURIComponent(stundenplan),
};
},
exportCalendar(le_id, stundenplan)
{
return FHC_JS_DATA_STORAGE_OBJECT.app_root + 'content/statistik/termine.xls.php?lehreinheit_id=' + encodeURIComponent(le_id) + '&db_stpl_table='+encodeURIComponent(stundenplan);
}
};
@@ -0,0 +1,13 @@
export default {
getCourselist(lv_id, start_date, end_date, stundenplan)
{
return {
method: 'get',
url: '/api/frontend/v1/lvPlan/getLvEvents/' + encodeURIComponent(lv_id) + "/" + encodeURIComponent(start_date) + "/" + encodeURIComponent(end_date) + "/" + encodeURIComponent(stundenplan),
};
},
exportCalendar(lv_id, stundenplan)
{
return FHC_JS_DATA_STORAGE_OBJECT.app_root + 'content/statistik/termine.xls.php?lehrveranstaltung_id=' + encodeURIComponent(lv_id) + '&db_stpl_table='+encodeURIComponent(stundenplan);
}
};
+7
View File
@@ -6,4 +6,11 @@ export default {
url: '/api/frontend/v1/lv/setup/getTabs/'
};
},
getTab()
{
return {
method: 'get',
url: '/api/frontend/v1/lv/setup/getTab/'
};
},
}
@@ -8,7 +8,6 @@ import LvTabs from "./Setup/Tabs.js";
import ApiDetails from "../../api/lehrveranstaltung/details.js";
import ApiLektor from "../../api/lehrveranstaltung/lektor.js";
import ApiGruppe from "../../api/lehrveranstaltung/gruppe.js";
import ApiStudiengangTree from "../../api/lehrveranstaltung/studiengangtree.js";
import ApiSearchbar from "../../api/factory/searchbar.js";
@@ -367,14 +367,13 @@ export default {
if (data[0]?.lehreinheit_id !== undefined && this.selectedColumnValues.length === 1)
{
this.$emit('update:selected', [data[0]]);
this.lv_info = false
}
else if (data[0]?.lehrveranstaltung_id)
{
this.$emit('update:selected', {});
this.getLVInfos(data[0]);
}
this.$emit('update:selected', [data[0]]);
},
getLVInfos(data)
{
@@ -9,6 +9,7 @@ export default {
data() {
return {
configLVTabs: {},
configLVTab: {},
};
},
props: {
@@ -37,21 +38,34 @@ export default {
})
.catch(this.$fhcAlert.handleSystemError);
this.$api.call(Setup.getTab())
.then(result => {
this.configLVTab = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
template: `
<div class="stv-details h-100 pb-3 d-flex flex-column">
<div v-if="!lv?.length" class="justify-content-center d-flex h-100 align-items-center">
Bitte eine Lehreinheit auswählen!
</div>
<div v-else-if="configLVTabs" class="d-flex flex-column h-100 pb-3">
<div v-else-if="configLVTabs && configLVTab" class="d-flex flex-column h-100 pb-3">
<fhc-tabs
v-if="lv.length === 1"
v-if="lv.length === 1 && lv[0]?.lehreinheit_id"
ref="tabs"
:modelValue="lv[0]"
:config="configLVTabs"
:default="$route.params.tab"
@changed="reload"
/>
<fhc-tabs
v-else-if="lv.length === 1"
ref="tabs"
:modelValue="lv[0]"
:config="configLVTab"
:default="$route.params.tab"
@changed="reload"
/>
</div>
<div v-else>
Loading...
@@ -0,0 +1,21 @@
import TableLvList from "../../Stv/Studentenverwaltung/Details/Lehrveranstaltungstermine/ListLehrveranstaltungstermine.js";
import ApiLVTermine from "../../../api/lehrveranstaltung/lvtermine.js";
export default {
name: "TabCourseList",
components: {
TableLvList
},
props: {
modelValue: Object,
},
data() {
return {
endpoint: ApiLVTermine
};
},
template: `
<div class="stv-details-course-list h-100 d-flex flex-column">
<table-lv-list ref="tbl_course_list" :id="modelValue.lehrveranstaltung_id" :endpoint="endpoint"></table-lv-list>
</div>`
};
@@ -0,0 +1,21 @@
import TableLvList from "../../Stv/Studentenverwaltung/Details/Lehrveranstaltungstermine/ListLehrveranstaltungstermine.js";
import ApiLETermine from "../../../api/lehrveranstaltung/letermine.js";
export default {
name: "TabCourseList",
components: {
TableLvList
},
props: {
modelValue: Object,
},
data() {
return {
endpoint: ApiLETermine
};
},
template: `
<div class="stv-details-course-list h-100 d-flex flex-column">
<table-lv-list ref="tbl_course_list" :id="modelValue.lehreinheit_id" :endpoint="endpoint"></table-lv-list>
</div>`
};
@@ -1,4 +1,6 @@
import TableLvList from "./Lehrveranstaltungstermine/ListLehrveranstaltungstermine.js";
import ApiStvCoursedates from "../../../../api/factory/stv/coursedates.js";
export default {
name: "TabCourseList",
@@ -8,11 +10,13 @@ export default {
props: {
modelValue: Object,
},
data(){
return {}
data() {
return {
endpoint: ApiStvCoursedates
};
},
template: `
<div class="stv-details-course-list h-100 d-flex flex-column">
<table-lv-list ref="tbl_course_list" :student="modelValue"></table-lv-list>
<table-lv-list ref="tbl_course_list" :id="modelValue.uid" :endpoint="endpoint"></table-lv-list>
</div>`
};
@@ -2,7 +2,7 @@ import {CoreFilterCmpt} from "../../../../filter/Filter.js";
import FormInput from "../../../../Form/Input.js";
import FormForm from '../../../../Form/Form.js';
import ApiStvCoursedates from "../../../../../api/factory/stv/coursedates.js";
import ApiStudiensemester from "../../../../../api/factory/studiensemester.js";
export default {
name: "TblCourseList",
@@ -12,17 +12,6 @@ export default {
FormForm
},
computed: {
downloadLink: function(){
if(!this.dataSem.start || !this.dataSem.ende || !this.student.uid) return;
let start = new Date(this.dataSem.start);
start = Math.floor(start.getTime()/1000);
let ende = new Date(this.dataSem.ende);
ende = Math.floor(ende.getTime() / 1000);
let link =
FHC_JS_DATA_STORAGE_OBJECT.app_root + "cis/private/lvplan/stpl_kalender.php?type=student&pers_uid=" + this.student.uid + "&begin=" + start + "&ende= " +ende + "&format=excel";
return link;
},
dbStundenplanTable: function (){
return this.showStundenplanDev ? 'stundenplandev' : 'stundenplan';
}
@@ -33,7 +22,14 @@ export default {
},
},
props: {
student: Object
id: {
type: [Number, String],
required: true
},
endpoint: {
type: Object,
required: true
},
},
data(){
return {
@@ -48,14 +44,7 @@ export default {
initTabulatorOptions(){
this.tabulatorOptions = {
ajaxURL: 'dummy',
ajaxRequestFunc: () => this.$api.call(
ApiStvCoursedates.getCourselist({
student_uid: this.student.uid,
start_date: this.dataSem.start,
end_date: this.dataSem.ende,
group_consecutiveHours: true,
dbStundenplanTable: this.dbStundenplanTable})
),
ajaxRequestFunc: () => this.$api.call(this.endpoint.getCourselist(this.id, this.dataSem.start, this.dataSem.ende, this.dbStundenplanTable)),
ajaxResponse: (url, params, response) => {
return response.data;
},
@@ -137,7 +126,7 @@ export default {
this.dataSem = this.listStudiensemester.find(item => item.studiensemester_kurzbz === studiensemester_kurzbz);
},
exportToExcel(){
window.open(this.downloadLink, '_blank');
window.open(this.endpoint.exportCalendar(this.id, this.dbStundenplanTable), '_blank');
},
reload() {
this.$refs.table.reloadTable();
@@ -151,10 +140,13 @@ export default {
currentSemester(newVal, oldVal) {
this.getDatesOfSemester(newVal);
},
id() {
this.reload();
}
},
created(){
this.$api
.call(ApiStvCoursedates.getStudiensemester())
.call(ApiStudiensemester.getStudiensemester())
.then(result => {
this.listStudiensemester = result.data;
this.getDatesOfSemester(this.currentSemester);