add variables from and to to show time of validity in backend

refactor function getZuordnungIds of all single tagLibs
add description line for editing/showing modal tag
This commit is contained in:
ma0068
2026-04-23 16:39:21 +02:00
parent 39f1716ae2
commit 5e72161ab0
16 changed files with 300 additions and 287 deletions
+3 -3
View File
@@ -142,14 +142,14 @@ $config['stv_prestudent_tags'] = [
'finished_stg' => ['readonly' => false],
'finished_kf' => ['readonly' => false],
'inwork_kf' => ['readonly' => false],
'dd_auto' => ['readonly' => true],
'dd_auto' => ['readonly' => false],
'wh_auto' => ['readonly' => true],
'prewh_auto' => ['readonly' => true],
'out_auto' => ['readonly' => true],
'out_auto' => ['readonly' => false],
'zgv_auto' => ['readonly' => true],
'wiedereinstieg_auto' => ['readonly' => true],
'stbtr_erh_auto' => ['readonly' => true],
'beitr_befr_auto' => ['readonly' => true],
'jgv_auto' => ['readonly' => true],
'jgv_auto' => ['readonly' => false],
'nachteilausgl_auto' => ['readonly' => true],
];
+4 -119
View File
@@ -37,56 +37,6 @@ class TagJob extends JOB_Controller
]);
}
public function pocTagLibs()
{
$automatedTagsRes = $this->NotiztypModel->loadWhere(array('automatisiert' => true, 'taglib IS NOT NULL' => null));
//echo $this->NotiztypModel->db->last_query();
$automatedTags = hasData($automatedTagsRes) ? getData($automatedTagsRes) : [];
print_r($automatedTags);
foreach($automatedTags as $autoTag)
{
$taglib = strtolower(basename($autoTag->taglib));
$this->load->library($autoTag->taglib);
$ids = $this->$taglib->getZuordnungIds(array('studiensemester_kurzbz' => self::SEMESTER));
print_r($ids);
}
}
public function loadTagLibs()
{
$automatedTagsRes = $this->NotiztypModel->loadWhere(array('automatisiert' => true, 'taglib IS NOT NULL' => null));
//echo $this->NotiztypModel->db->last_query();
$automatedTags = hasData($automatedTagsRes) ? getData($automatedTagsRes) : [];
print_r($automatedTags);
foreach($automatedTags as $autoTag)
{
// getPath: must not be lost
$filePath = APPPATH . 'libraries/' . $autoTag->taglib . '.php'; // APPPATH = application/
if(file_exists($filePath)) {
require_once($filePath);
} else {
echo "File not found: " . $filePath;
continue;
}
// className without PATH (basename)
$className = basename($autoTag->taglib);
$obj = new $className();
$ids = $obj->getZuordnungIds(['studiensemester_kurzbz' => self::SEMESTER]);
$kurz_bz = $autoTag->typ_kurzbz;
echo PHP_EOL . $className . ": ";
echo PHP_EOL . $kurz_bz . ": ";
print_r($ids);
}
}
public function rebuildAutomatedTags()
{
print_r( PHP_EOL . "Start Job rebuild" . PHP_EOL);
@@ -112,11 +62,12 @@ class TagJob extends JOB_Controller
$className = basename($autoTag->taglib);
$obj = new $className();
$ids = $obj->getZuordnungIds(['studiensemester_kurzbz' => self::SEMESTER]);
$idsArray = $ids->prestudent_id;
$outputArray = $obj->getZuordnungIds(['studiensemester_kurzbz' => self::SEMESTER]);
$data = $outputArray->data;
$result = $this->taglib->updateAutomatedTags($kurz_bz, $data);
$result = $this->taglib->updateAutomatedTags($kurz_bz, $idsArray);
$data = $result->retval;
if (isError($result))
return error ('Error occurred during updateAutomatedTags');
@@ -132,70 +83,4 @@ class TagJob extends JOB_Controller
print_r( PHP_EOL . "End Job rebuild" . PHP_EOL);
}
public function rebuildAutomatedTags_DEPR()
{
print_r( PHP_EOL . "Start Job rebuild" . PHP_EOL);
$automaticTags = $this->config->item('stv_automatic_tags');
print_r( implode( ", ", $automaticTags) . PHP_EOL);
//TODO(Manu) use a loop in library?
if(in_array('wh_auto', $automaticTags))
{
$result = $this->PrestudentstatusModel-> loadWhere(array(
'statusgrund_id' => 16,
'studiensemester_kurzbz' => self::SEMESTER
));
$data = $result->retval;
$ids = array_map(function($item) {
return $item->prestudent_id;
}, $data);
$result = $this->taglib->updateAutomatedTags('wh_auto', $ids);
$data = $result->retval;
if (isError($result))
return error ('Error occurred during updateAutomatedTags');
print_r(PHP_EOL ."ALL TAGS 'wh_auto' " . count($data[0]) . " TO ADD " . count($data[1]) . " TO RECYLE: " . count($data[2]) . " TO DELETE: " . count($data[3]));
print_r( PHP_EOL . "Count Recycled: ");
print_r($data[4]);
print_r( PHP_EOL . "Count Added: ");
print_r($data[6]);
print_r( PHP_EOL . "Count Deleted: ");
print_r($data[8] . PHP_EOL);
}
if(in_array('prewh_auto', $automaticTags))
{
$result = $this->PrestudentstatusModel->loadWhere(array(
'statusgrund_id' => 15,
'studiensemester_kurzbz' => self::SEMESTER
));
$data = $result->retval;
$ids = array_map(function ($item) {
return $item->prestudent_id;
}, $data);
$result = $this->taglib->updateAutomatedTags('prewh_auto', $ids);
if (isError($result))
return error('Error occurred during updateAutomatedTags');
$data = $result->retval;
print_r(PHP_EOL . "ALL TAGS 'prewh_auto' " . count($data[0]) . " TO ADD " . count($data[1]) . " TO RECYLE: " . count($data[2]) . " TO DELETE: " . count($data[3]));
print_r(PHP_EOL . "Count Recycled: ");
print_r($data[4]);
print_r(PHP_EOL . "Count Added: ");
print_r($data[6]);
print_r(PHP_EOL . "Count Deleted: ");
print_r($data[8] . PHP_EOL);
}
print_r( PHP_EOL . "End Job rebuild" . PHP_EOL);
}
}
+6 -2
View File
@@ -76,7 +76,9 @@ class Tag_Controller extends FHCAPI_Controller
tbl_notiz.insertamum,
tbl_notiz.updateamum,
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter,
tbl_notiz.start,
tbl_notiz.ende
"
);
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
@@ -315,7 +317,9 @@ class Tag_Controller extends FHCAPI_Controller
tbl_notiz.insertamum,
tbl_notiz.updateamum,
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter,
tbl_notiz.start,
tbl_notiz.ende
"
);
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
+120 -128
View File
@@ -48,18 +48,49 @@ class TagLib
}
public function updateAutomatedTags($tag, $prestudentIds)
public function updateAutomatedTags($tag, $inputData)
{
/*
$inputData expected pattern
[
[
'prestudent_id' => 123456,
'von' => '2026-04-01',
'bis' => '2026-06-30'
],
...
]
*/
// ---------------------------------
// prepare input
// ---------------------------------
$zeitraum = [];
$prestudentIds = [];
foreach ($inputData as $row) {
$pid = $row['prestudent_id'];
$prestudentIds[] = $pid;
$zeitraum[$pid] = [
'von' => $row['von'] ?? null,
'bis' => $row['bis'] ?? null
];
}
$prestudentIds = array_unique($prestudentIds);
$toRecycle = [];
$toAdd = [];
$toDelete = [];
// ---------------------------------
// load existing tags
// ---------------------------------
$allTags = [];
$this->_ci->NotizModel->addSelect('nz.notiz_id');
$this->_ci->NotizModel->addSelect('prestudent_id');
$this->_ci->NotizModel->addJoin('public.tbl_notizzuordnung nz', 'notiz_id');
$resultAllTags = $this->_ci->NotizModel->loadWhere([
'typ' => $tag
]);
@@ -72,117 +103,143 @@ class TagLib
}
}
// ---------------------------------
// map the data
// ---------------------------------
$toRecycle = [];
$toAdd = [];
$toDelete = [];
foreach ($prestudentIds as $value)
{
if (isset($allTags[$value])) {
// if already existing: recyceln: nothing to do
$toRecycle[$value] = $allTags[$value] ;
foreach ($prestudentIds as $pid) {
if (isset($allTags[$pid])) {
$toRecycle[$pid] = $allTags[$pid];
} else {
$toAdd[] = $value;
$toAdd[] = $pid;
}
}
foreach ($allTags as $prestudent_id => $notiz_id) {
if (!in_array($prestudent_id, $prestudentIds)) {
$toDelete[$prestudent_id] = $notiz_id;
foreach ($allTags as $pid => $notizId) {
if (!in_array($pid, $prestudentIds)) {
$toDelete[$pid] = $notizId;
}
}
//RECYCLE: Just insert new update Date
$countRecyled = 0;
// ---------------------------------
// recycle (update existing)
// ---------------------------------
$countRecycled = 0;
$retagged = [];
foreach ($toRecycle as $value)
{
//TODO(Manu) refactor for recycle, add
$resultUpdateNotiz = $this->_ci->NotizModel->update(
foreach ($toRecycle as $pid => $notizId) {
$result = $this->_ci->NotizModel->update(
['notiz_id' => $notizId],
[
'notiz_id' => $value
],
array(
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => 'BatchJobTagUpdate',
));
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => 'BatchJobTagUpdate',
'start' => $zeitraum[$pid]['von'],
'ende' => $zeitraum[$pid]['bis']
]
);
if (isError($resultUpdateNotiz))
return error ('Error occurred update Result ' . $value);
if (isError($result)) {
return error('Error updating tag ' . $notizId);
}
$countRecyled++;
$retagged[] = $resultUpdateNotiz->retval;
$countRecycled++;
$retagged[] = $notizId;
}
//ADD: Create new Tags
// ---------------------------------
// ADD
// ---------------------------------
$countAdded = 0;
$tagged = [];
foreach ($toAdd as $value)
{
//TODO(Manu) refactor for recycle, add
$resultInsertNotiz = $this->_ci->NotizModel->insert(array(
foreach ($toAdd as $pid) {
$resultInsert = $this->_ci->NotizModel->insert([
'titel' => 'TAG',
'text' => 'AUTOMATED TAG',
'verfasser_uid' => self::BATCHUSER, //has to be an uid
'verfasser_uid' => self::BATCHUSER,
'erledigt' => false,
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => 'BatchJobTagAdd',
'typ' => $tag
));
'typ' => $tag,
'start' => $zeitraum[$pid]['von'],
'ende' => $zeitraum[$pid]['bis']
]);
if (isError($resultInsertNotiz))
return error ('Error occurred insert Result ' . $value);
if (isError($resultInsert)) {
return error('Error inserting tag for prestudent ' . $pid);
}
$resultInsertZuordnung = $this->_ci->NotizzuordnungModel->insert(array(
'notiz_id' => $resultInsertNotiz->retval,
self::TYP_ZUORDNUNG => $value
));
$notizId = $resultInsert->retval;
if (isError($resultInsertZuordnung))
return error ('Error occurred insert Zuordnung' . $value);
$resultZuordnung = $this->_ci->NotizzuordnungModel->insert([
'notiz_id' => $notizId,
self::TYP_ZUORDNUNG => $pid
]);
if (isError($resultZuordnung)) {
return error('Error inserting relation for prestudent ' . $pid);
}
$countAdded++;
$tagged[$resultInsertNotiz->retval] = $value;
$tagged[$notizId] = $pid;
}
//DELETE OLD Tags, no more valid
// ---------------------------------
// delete
// ---------------------------------
$countDeleted = 0;
$deleted = [];
foreach ($toDelete as $value)
{
foreach ($toDelete as $pid => $notizId) {
$result = $this->_ci->NotizzuordnungModel->delete([
'notiz_id' => $value
'notiz_id' => $notizId
]);
if (isError($result))
return error ('Error occurred delete Notizzuordnung' . $notiz_id);
if (isError($result)) {
return error('Error deleting relation ' . $notizId);
}
$result = $this->_ci->NotizModel->delete([
'notiz_id' => $notiz_id
'notiz_id' => $notizId
]);
if (isError($result))
return error ('Error occurred delete Notiz' . $notiz_id);
if (isError($result)) {
return error('Error deleting note ' . $notizId);
}
$countDeleted++;
$deleted[] = $value;
$deleted[] = $notizId;
}
// ---------------------------------
// return
// ---------------------------------
return success([
'input' => [
'tag' => $tag,
'prestudentIds' => $prestudentIds,
'prestudentIds' => $prestudentIds
],
'summary' => [
'recycled' => $countRecyled,
'recycled' => $countRecycled,
'added' => $countAdded,
'deleted' => $countDeleted,
'deleted' => $countDeleted
],
'details' => [
'existingTags' => $allTags,
'toAdd' => $toAdd,
'toRecycle' => $toRecycle,
'toDelete' => $toDelete,
'toDelete' => $toDelete
],
'results' => [
'retaggedNotizIds' => $retagged,
'newTags' => $tagged,
'deletedNotizIds' => $deleted,
'deletedNotizIds' => $deleted
]
]);
}
@@ -248,14 +305,11 @@ class TagLib
$return = ['added' => $resultInsertNotiz->retval];
}
return success($return);
}
/*
* main function for rebuild Tags for single prestudent
* manually triggered
* */
public function rebuildTagsForPrestudent($prestudent_id)
{
@@ -285,11 +339,11 @@ class TagLib
$criteriaIsSet = $obj->isCriteriaSetFor([
'prestudent_id' => $prestudent_id,
'studiensemester_kurzbz' => self::SEMESTER
]);
]);
//$return = $this->_ci->PrestudentstatusModel->db->last_query();
$kurz_bz = $autoTag->typ_kurzbz;
// $return[$kurz_bz] = $criteriaIsSet;
// $return[$kurz_bz] = $criteriaIsSet;
if($criteriaIsSet)
{
@@ -313,32 +367,6 @@ class TagLib
}
public function rebuildTagsForPrestudentDEPR($prestudent_id)
{
$automaticTags = $this->_ci->config->item('stv_automatic_tags');
$return = [];
foreach ($automaticTags as $tag)
{
if($this->isCriteriaSetFor($tag, $prestudent_id))
{
$result = $this->updateAutomatedTagsForPrestudent($tag, $prestudent_id);
if (isError($result))
return error ('Error occurred during updateAutomatedTags' . $tag);
else
$return[$tag] = $result;
}
else {
$result = $this->checkForDelete($tag, $prestudent_id);
if($result != null)
$return[$tag] = $result;
}
}
return success($return);
}
public function checkForDelete($tag, $prestudent_id)
{
$return = null;
@@ -378,40 +406,4 @@ class TagLib
return $return;
}
public function isCriteriaSetFor_DEPR($tag, $prestudent_id)
{
//TODO(finish list)
if($tag == 'wh_auto')
{
$result = $this->_ci->PrestudentstatusModel->loadWhere(array(
'statusgrund_id' => 16,
'studiensemester_kurzbz' => self::SEMESTER,
'prestudent_id' => $prestudent_id
));
if(hasData($result))
{
return true;
}
else
return false;
}
if($tag == 'prewh_auto')
{
$result = $this->_ci->PrestudentstatusModel->loadWhere(array(
'statusgrund_id' => 15,
'studiensemester_kurzbz' => self::SEMESTER,
'prestudent_id' => $prestudent_id
));
if(hasData($result))
{
return true;
}
else
return false;
}
return false;
}
}
@@ -26,17 +26,24 @@ class CoreDoubleDegreeTagLib
$semester = $params['studiensemester_kurzbz'];
$this->ci->MobilitaetModel->addJoin('bis.tbl_gsprogramm', 'gsprogramm_id');
$this->ci->MobilitaetModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
$result = $this->ci->MobilitaetModel-> loadWhere(array(
'gsprogrammtyp_kurzbz' => 'Double',
'studiensemester_kurzbz' => $semester
));
$data = $result->retval;
$ids = array_map(function($item) {
return $item->prestudent_id;
$doubledegree_data = array_map(function($item) {
return [
'prestudent_id' => $item->prestudent_id,
'von' => $item->start,
'bis' => $item->ende
];
}, $data);
return (object) array(
'prestudent_id' => $ids
'data' => $doubledegree_data
);
}
+8 -3
View File
@@ -28,12 +28,17 @@ class CoreJgvTagLib
$result = $this->ci->BenutzerfunktionModel->getPrestudentsOfJgv($semester);
$data = $result->retval;
$ids = array_map(function($item) {
return $item->prestudent_id;
$jgv_data = array_map(function($item) {
return [
'prestudent_id' => $item->prestudent_id,
'von' => $item->datum_von,
'bis' => $item->datum_bis
];
}, $data);
return (object) array(
'prestudent_id' => $ids
'data' => $jgv_data
);
}
@@ -36,13 +36,19 @@ class CoreMissingZgvTagLib
));
$data = $result->retval;
$ids = array_map(function($item) {
return $item->prestudent_id;
$zgvmissing_data = array_map(function($item) {
return [
'prestudent_id' => $item->prestudent_id,
'von' => null,
'bis' => null
];
}, $data);
return (object) array(
'prestudent_id' => $ids
'data' => $zgvmissing_data
);
}
public function isCriteriaSetFor(array $params)
@@ -28,19 +28,25 @@ class CoreOutgoingTagLib
$result = $this->ci->BisioModel->getOutgoingsOfSemester($semester);
$data = $result->retval;
$ids = array_map(function($item) {
return $item->prestudent_id;
$outgoing_data = array_map(function($item) {
return [
'prestudent_id' => $item->prestudent_id,
'von' => $item->von,
'bis' => $item->bis
];
}, $data);
return (object) array(
'prestudent_id' => $ids
'data' => $outgoing_data
);
}
public function isCriteriaSetFor(array $params)
{
if(!isset($params['prestudent_id']) || !isset($params['studiensemester_kurzbz']))
{
if (!isset($params['prestudent_id']) || !isset($params['studiensemester_kurzbz'])) {
return false;
}
@@ -48,12 +54,68 @@ class CoreOutgoingTagLib
$prestudent_id = $params['prestudent_id'];
$result = $this->ci->BisioModel->isPrestudentOutgoing($semester, $prestudent_id);
if(hasData($result))
{
if (hasData($result)) {
return true;
} else
return false;
}
/* if(hasData($result))
{
return array(
$result
);
var_dump($result);
die();
$row = $result->data->retval[0] ?? null;
return [
'prestudent_id' => $row->prestudent_id, //trying to get property of non-object
'von' => $row->von, //trying to get property of non-object
'bis' => $row->bis //trying to get property of non-object
];
return current($result);//-> warum retvall = []
return getData($result); //-> warum retvall = []
$row = $result->data->retval[0] ?? null;
$row = $result->data->retval[0] ?? null;
return [
'prestudent_id' => $row->prestudent_id,
'von' => $row->von,
'bis' => $row->bis
];
}
else
return false;
}
return false;*/
//return $result;
/* if(hasData($result))
{
$data = $result->retval;
return $result;
return [
'prestudent_id' => $data->prestudent_id,
'von' => $data->von,
'bis' => $data->bis
];
}
else
return [
'prestudent_id' => $prestudent_id,
'von' => null,
'bis' => null
];*/
/* return (object) array(
'data' => $data
);*/
// return $data;
//}
}
@@ -24,17 +24,24 @@ class CorePrewiederholerTagLib
}
$semester = $params['studiensemester_kurzbz'];
$this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
$result = $this->ci->PrestudentstatusModel-> loadWhere(array(
'statusgrund_id' => 15,
'studiensemester_kurzbz' => $semester
));
$data = $result->retval;
$ids = array_map(function($item) {
return $item->prestudent_id;
$prewiederholer_data = array_map(function($item) {
return [
'prestudent_id' => $item->prestudent_id,
'von' => $item->start,
'bis' => $item->ende
];
}, $data);
return (object) array(
'prestudent_id' => $ids
'data' => $prewiederholer_data
);
}
@@ -26,17 +26,24 @@ class CoreStudienbeitragErhoehtTagLib
$semester = $params['studiensemester_kurzbz'];
$this->ci->KontoModel->addJoin('public.tbl_prestudent', 'person_id');
$this->ci->KontoModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
$result = $this->ci->KontoModel-> loadWhere(array(
'buchungstyp_kurzbz' => 'StudiengebuehrErhoeht',
'studiensemester_kurzbz' => $semester
));
$data = $result->retval;
$ids = array_map(function($item) {
return $item->prestudent_id;
$konto_data = array_map(function($item) {
return [
'prestudent_id' => $item->prestudent_id,
'von' => $item->start,
'bis' => $item->ende
];
}, $data);
return (object) array(
'prestudent_id' => $ids
'data' => $konto_data
);
}
@@ -24,17 +24,24 @@ class CoreUnterbrecherTagLib
}
$semester = $params['studiensemester_kurzbz'];
$this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
$result = $this->ci->PrestudentstatusModel-> loadWhere(array(
'status_kurzbz' => 'Unterbrecher',
'studiensemester_kurzbz' => $semester
));
$data = $result->retval;
$ids = array_map(function($item) {
return $item->prestudent_id;
$unterbrecher_data = array_map(function($item) {
return [
'prestudent_id' => $item->prestudent_id,
'von' => $item->start,
'bis' => $item->ende
];
}, $data);
return (object) array(
'prestudent_id' => $ids
'data' => $unterbrecher_data
);
}
@@ -24,17 +24,24 @@ class CoreWiederholerTagLib
}
$semester = $params['studiensemester_kurzbz'];
$this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
$result = $this->ci->PrestudentstatusModel-> loadWhere(array(
'statusgrund_id' => 16,
'studiensemester_kurzbz' => $semester
));
$data = $result->retval;
$ids = array_map(function($item) {
return $item->prestudent_id;
$wiederholer_data = array_map(function($item) {
return [
'prestudent_id' => $item->prestudent_id,
'von' => $item->start,
'bis' => $item->ende
];
}, $data);
return (object) array(
'prestudent_id' => $ids
'data' => $wiederholer_data
);
}
+3 -3
View File
@@ -53,7 +53,7 @@ class Bisio_model extends DB_Model
public function getOutgoingsOfSemester($studiensemester_kurzbz)
{
$query = "
SELECT DISTINCT ps.prestudent_id
SELECT DISTINCT ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis
FROM bis.tbl_bisio
JOIN public.tbl_student USING (student_uid)
JOIN public.tbl_prestudent ps USING (prestudent_id)
@@ -76,14 +76,14 @@ class Bisio_model extends DB_Model
{
$query = "
SELECT
*
ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis
FROM bis.tbl_bisio
JOIN public.tbl_student USING (student_uid)
JOIN public.tbl_prestudent ps USING (prestudent_id)
JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
WHERE ss.studiensemester_kurzbz = ?
AND pss.status_kurzbz = 'Student'
--AND pss.status_kurzbz = 'Student'
AND (
tbl_bisio.von <= ss.ende
AND (
@@ -323,7 +323,7 @@ class Benutzerfunktion_model extends DB_Model
public function getPrestudentsOfJgv($semester)
{
$query = "
SELECT DISTINCT ps.prestudent_id
SELECT DISTINCT ps.prestudent_id, bf.datum_von, bf.datum_bis
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_benutzer bn USING (uid)
JOIN public.tbl_prestudent ps USING (person_id)
+24 -1
View File
@@ -45,7 +45,9 @@ export default {
insertvon: "",
updateamum: "",
updatevon: "",
response: ""
response: "",
start: "",
ende: ""
},
mode: "create"
};
@@ -88,6 +90,10 @@ export default {
this.tagData.bearbeiter = item.bearbeiter;
this.tagData.verfasser = item.verfasser;
this.tagData.readonly = item.readonly;
//add for automated tags
this.tagData.automatisiert = item.automatisiert;
this.tagData.start = this.formatDateTimeDay(item.start);
this.tagData.ende = this.formatDateTimeDay(item.ende);
if (item && item.notiz_id)
{
@@ -202,6 +208,14 @@ export default {
second: "2-digit"
});
},
formatDateTimeDay: (dateString) => {
if (!dateString) return null;
return new Date(dateString).toLocaleString('de-AT', {
year: "numeric",
month: "2-digit",
day: "2-digit",
});
},
async copy (){
await navigator.clipboard.writeText(this.tagData.notiz);
}
@@ -259,6 +273,15 @@ export default {
<span v-if="tagData.bearbeiter && tagData.insertamum !== tagData.updateamum">
{{ $p.t('notiz', 'tag_bearbeiter', { 0: tagData.bearbeiter, 1: tagData.updateamum }) }}
</span>
<span v-if="tagData.start || tagData.ende" >
gültig
</span>
<span v-if="tagData.start">
von {{tagData.start}}
</span>
<span v-if="tagData.ende">
bis {{tagData.ende}}
</span>
</div>
</div>
</template>
+1
View File
@@ -46,6 +46,7 @@ export function tagFormatter(cell, tagComponent)
const tagDef = mappedData.find(t => t.typ_kurzbz === tag.typ_kurzbz);
//todo: check trigger manually after creation of manual automatic tag
if (!tagDef && tag.typ_kurzbz.includes("_auto") || tagDef?.automatisiert) {
tagElement.className += " tag_auto";
tagElement.innerHTML = "<i class='fa-solid fa-lock'></i> " + tag.beschreibung;