Compare commits

...

12 Commits

Author SHA1 Message Date
ma0048 7f91e20d03 lvverwaltung: vilesci lehrveranstaltung verwaltung verlinkt 2026-03-04 15:15:12 +01:00
ma0048 233a6e8b89 lvverwaltung:
- event hinzugefuegt damit tabs erweitert werden können
- berichte hinzugefuegt
2026-02-25 15:25:36 +01:00
Andreas Österreicher 9b114c5fb1 Merge branch 'feature-71344/LVEvaluierungZeitfenster' 2026-02-23 09:51:47 +01:00
Andreas Österreicher 2228b4d683 Sancho Header LV-Evaluierung 2026-02-20 13:29:01 +01:00
kindlm 32fc029bd3 Merge remote-tracking branch 'origin/master' 2026-02-20 11:20:19 +01:00
kindlm f4e0516d89 Prüfung ob jede Fragen mindestens 2 Vorschläge hat auf Warning geändert
- Kleines Padding vor "Blättern"-Text
2026-02-20 11:20:09 +01:00
Harald Bamberger d98b7fd67a fix duplicates in lvplan for special groups 2026-02-19 18:34:27 +01:00
Harald Bamberger 7169cb68a2 fix bug when sending multi messages introduced by loading time optimisation 2026-02-19 09:20:10 +01:00
Harald Bamberger f8da0b0915 Merge branch 'feature-69551/Einmeldeformular_als_VueJS_Component_fuer_LV-Evaluierung' 2026-02-19 07:46:15 +01:00
Andreas Österreicher 6ec4737b22 Merge branch 'bug-71685/bewerbungstool_login_zugangscode' 2026-02-18 12:47:02 +01:00
ma0048 1d8c4b7159 bug behoben, login wieder nur mit zugangscode moeglich 2026-02-17 16:49:09 +01:00
Harald Bamberger 3d1aef617f add phrase error.opproject_does_not_exists in category kvp 2026-02-17 08:13:07 +01:00
12 changed files with 351 additions and 16 deletions
@@ -19,6 +19,8 @@
if (!defined('BASEPATH'))
exit('No direct script access allowed');
use CI3_Events as Events;
class Setup extends FHCAPI_Controller
{
private $_ci;
@@ -65,6 +67,11 @@ class Setup extends FHCAPI_Controller
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'),
'config' => []
);
Events::trigger('lvv_conf_tabs', function & () use (&$tabs) {
return $tabs;
});
$this->terminateWithSuccess($tabs);
}
@@ -470,12 +470,12 @@ class Stundenplan_model extends DB_Model
}
foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband)
{
$query .= "((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
$query .= "(((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
// Eintraege fuer den ganzen Verband
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND (sp.gruppe is null OR sp.gruppe='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
// Eintraege fuer das ganze Semester
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND (sp.verband is null OR sp.verband='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)
." AND ".$this->escape($sem_date_range->ende).")". $stringGroupLv. ")";
." AND ".$this->escape($sem_date_range->ende).")) AND gruppe_kurzbz is null)";
$query .="OR";
}
+2 -2
View File
@@ -581,14 +581,14 @@ if($frage->frage_id!='')
else
$value=$p->t('testtool/blaettern').' >>';
echo " <a href='$PHP_SELF?gebiet_id=$gebiet_id&amp;frage_id=$nextfrage' class='Item'>$value</a>";
echo "<a href='$PHP_SELF?gebiet_id=$gebiet_id&amp;frage_id=$nextfrage' class='Item' style='padding-left: 5px'>$value</a>";
}
else
{
if(!$demo)
{
//Wenns der letzte Eintrag ist, wieder zum ersten springen
echo " <a href='$PHP_SELF?gebiet_id=$gebiet_id' class='Item'>".$p->t('testtool/blaettern')." &gt;&gt;</a>";
echo "<a href='$PHP_SELF?gebiet_id=$gebiet_id' class='Item' style='padding-left: 5px'>".$p->t('testtool/blaettern')." &gt;&gt;</a>";
}
}
}
+20 -7
View File
@@ -340,13 +340,26 @@ else
}
}
if ((isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) &&
!isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code'])) ||
(isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true &&
isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === true &&
isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true &&
isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === true &&
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])))
if (
(
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) &&
!isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code']) &&
!isset($_SESSION['externe_ueberwachung']) && !isset($_SESSION['externe_ueberwachung_verified'])
)
||
(
isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true &&
isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === true &&
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])
)
||
(
isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true &&
isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === true &&
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])
)
)
{
$pruefling = new pruefling();
@@ -41,6 +41,12 @@ else
$user = get_uid();
loadVariables($user);
if (isset($_GET['studiensemester_kurzbz']))
{
if (check_stsem($_GET['studiensemester_kurzbz']))
$semester_aktuell = $_GET['studiensemester_kurzbz'];
}
//Studiengang laden
$studiengang = new studiengang($studiengang_kz);
+6
View File
@@ -50,6 +50,12 @@ else
$user = get_uid();
loadVariables($user);
if (isset($_GET['studiensemester_kurzbz']))
{
if (check_stsem($_GET['studiensemester_kurzbz']))
$semester_aktuell = $_GET['studiensemester_kurzbz'];
}
$rechte = new benutzerberechtigung();
$rechte->getBerechtigungen($user);
+48 -1
View File
@@ -345,6 +345,7 @@ class gebiet extends basis_db
}
//Pruefen ob jede Fragen mindestens 2 Vorschlaege hat
//Angepasst am 28.01.2026 auf ein Warning.
$qry = "SELECT frage_id, nummer FROM testtool.tbl_frage
WHERE (SELECT count(*) as anzahl FROM testtool.tbl_vorschlag WHERE frage_id=tbl_frage.frage_id)<2
AND gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." AND NOT demo;";
@@ -352,7 +353,7 @@ class gebiet extends basis_db
{
while($row = $this->db_fetch_object())
{
$this->errormsg .= "Frage Nummer $row->nummer (ID: $row->frage_id) hat weniger als 2 Vorschlaege.\n";
$this->warningmsg .= "Frage Nummer $row->nummer (ID: $row->frage_id) hat weniger als 2 Vorschlaege.\n";
}
}
@@ -448,6 +449,52 @@ class gebiet extends basis_db
}
}
//Pruefen ob es leere Fragen (ohne Text, Bild oder Audio) gibt
$qry = "SELECT
fr.frage_id,
fr.nummer,
fs.sprache
FROM
testtool.tbl_frage fr
JOIN testtool.tbl_frage_sprache fs
USING (frage_id)
WHERE
(fs.text IS NULL
OR fs.text = '')
AND fs.bild IS NULL
AND fs.audio IS NULL
AND demo = false
AND gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)."
AND EXISTS (
SELECT
1
FROM
testtool.tbl_frage fr2
JOIN testtool.tbl_frage_sprache fs2
USING (frage_id)
WHERE
fs2.sprache = fs.sprache
AND fr2.gebiet_id = fr.gebiet_id
AND fr2.frage_id != fr.frage_id
AND (
(fs2.text IS NOT NULL
AND fs2.text != '')
OR fs2.bild IS NOT NULL
OR fs2.audio IS NOT NULL
)
AND demo = false
)
ORDER BY
fs.sprache,
fr.nummer;";
if($this->db_query($qry))
{
while($row = $this->db_fetch_object())
{
$this->warningmsg .= "Frage Nummer $row->nummer (ID: $row->frage_id), Sprache $row->sprache hat keinen Text, Bild oder Audio.\n";
}
}
if($this->errormsg=='')
return true;
else
@@ -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";
@@ -205,6 +204,21 @@ export default {
this.$router.push({ name: routeName, params: newParams });
this.selected = [];
},
isDisabled(item)
{
if (!item?.requires?.length)
return false;
const values = {
stg: this.stg,
emp: this.emp,
studiensemester: this.selectedStudiensemester,
semester: this.semester
};
return item.requires.some(req => !values[req]);
}
},
created() {
this.$p.loadCategory(['lehre', 'person', 'global'])
@@ -239,6 +253,74 @@ export default {
})
.catch(this.$fhcAlert.handleSystemError);
},
computed:
{
appMenuExtraItems()
{
let extraItems = [];
const studiengang_kz = this.stg || '';
const studiensemester = this.selectedStudiensemester;
const semester = this.semester || '';
const uid = this.emp || '';
extraItems.push(
{
description: 'lehre/berichte',
requires: ['stg'],
children: [
{
link: FHC_JS_DATA_STORAGE_OBJECT.app_root
+ 'content/statistik/lvplanung.xls.php'
+ '?studiengang_kz=' + studiengang_kz
+ '&studiensemester_kurzbz=' + studiensemester
+ '&semester=' + semester,
description: 'lehre/lvplanung',
requires: ['stg']
},
{
link: FHC_JS_DATA_STORAGE_OBJECT.app_root
+ 'content/statistik/lehrauftragsliste_gst.xls.php'
+ '?studiengang_kz=' + studiengang_kz
+ '&studiensemester_kurzbz=' + studiensemester
+ '&semester=' + semester,
description: 'lehre/lehrauftragsliste',
requires: ['stg']
},
{
link: FHC_JS_DATA_STORAGE_OBJECT.app_root
+ 'content/pdfExport.php?xml=lehrauftrag.xml.php'
+ '&xsl=Lehrauftrag'
+ '&stg_kz=' + studiengang_kz
+ '&ss=' + studiensemester,
description: 'lehre/lehrauftraege',
requires: ['stg']
},
{
link: FHC_JS_DATA_STORAGE_OBJECT.app_root
+ 'content/pdfExport.php?xml=lehrauftrag.xml.php'
+ '&xsl=Lehrauftrag'
+ '&stg_kz=' + studiengang_kz
+ '&ss=' + studiensemester
+ '&uid=' + uid,
description: 'lehre/lehrauftragslisteemp',
requires: ['emp']
}
]
},
{
link: FHC_JS_DATA_STORAGE_OBJECT.app_root
+ 'vilesci/lehre/lehrveranstaltung.php'
+ '?stg_kz=' + studiengang_kz,
description: 'lehre/extrakvverwaltung',
requires: ['stg']
}
);
return extraItems;
}
},
template: /* html */`
<div class="stv">
@@ -278,7 +360,40 @@ export default {
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" :aria-label="$p.t('ui/schliessen')"></button>
</div>
<div class="offcanvas-body">
<app-menu app-identifier="lvv" />
<app-menu app-identifier="lvv">
<template v-for="(item, key) in appMenuExtraItems" :key="key">
<li v-if="item.children" class="dropend">
<a
class="dropdown-toggle"
href="#"
role="button"
data-bs-toggle="dropdown"
aria-expanded="false"
data-bs-popper-config='{"strategy":"fixed"}'
>
{{ $p.t(item.description) }}
</a>
<ul class="dropdown-menu p-0">
<li
v-for="(child, childKey) in item.children"
:key="childKey"
>
<a class="dropdown-item" :href="child.link" target="_blank" :class="{ disabled: isDisabled(child) }">
{{ $p.t(child.description) }}
</a>
</li>
</ul>
</li>
<li v-else>
<a
:href="item.link"
target="_blank"
:class="{ disabled: isDisabled(item) }">
{{ $p.t(item.description) }}
</a>
</li>
</template>
</app-menu>
</div>
</aside>
<nav id="sidebarMenu" class="bg-light offcanvas offcanvas-start col-md p-md-0 h-100">
+2 -2
View File
@@ -158,7 +158,7 @@ export default {
</form>
<message-modal
v-if="tablebuilt"
v-if="tablebuilt || id.length > 1"
ref="modalMsg"
:type-id="typeId"
:id="id"
@@ -172,7 +172,7 @@ export default {
<!--in same page-->
<div v-if="isVisibleDiv" class="overflow-auto m-3" style="max-height: 500px; border: 1px solid #ccc;">
<form-only
v-if="tablebuilt"
v-if="tablebuilt || id.length > 1"
ref="templateNewDivMessage"
:type-id="typeId"
:id="id"
Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

+141
View File
@@ -19087,6 +19087,27 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'kvp',
'phrase' => 'error.opproject_does_not_exists',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Es ist kein Openproject Projekt verknüpft.",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "No Openproject project is linked.",
'description' => '',
'insertvon' => 'system'
)
)
),
//******************* KVP end
array(
'app' => 'international',
'category' => 'international',
@@ -48828,6 +48849,126 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'berichte',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Berichte',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Reports',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'lvplanung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'LV-Planung',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Course Planning',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'lehrauftragsliste',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Lehrauftragsliste',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Teaching Assignments',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'lehrauftraege',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Lehraufträge',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Lectureships',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'lehrauftragslisteemp',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Lehrauftrag Lehrende',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Teaching Assignment Lecturers',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'extrakvverwaltung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Lehrveranstaltung Verwaltung',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Course Management',
'description' => '',
'insertvon' => 'system'
)
)
),
// feature-55614 end
array(
'app' => 'softwarebereitstellung',