Compare commits

..

4 Commits

Author SHA1 Message Date
Harald Bamberger d1ef2e4f74 refactor 2026-06-22 09:52:08 +02:00
Harald Bamberger b0fea017f2 further progress on rendering partMenu 2026-05-29 08:42:02 +02:00
Harald Bamberger 861623750d Merge branch 'master' of github.com:FH-Complete/FHC-Core into bhdev_treemenu 2026-05-13 21:14:35 +02:00
Harald Bamberger 51d73c862b treemenu trial 2026-05-11 16:42:48 +02:00
22 changed files with 606 additions and 431 deletions
+47
View File
@@ -0,0 +1,47 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
$config['stv_menu'] = array(
'library' => 'treemenu/TreeMenuLib',
'children' => array(
'stg' => array(
'library' => 'treemenu/StgLib',
'children' => array(
/*
'pre' => array(
'library' => 'treemenu/PrestudentLib'
),
'sem' => array(
'library' => 'treemenu/AusbSemesterLib',
'children' => array(
'vbd' => array(
'library' => 'treemenu/VerbandLib'
)
)
),
*/
'orgform' => array(
'library' => 'treemenu/OrgFormLib',
'children' => array(
/*
'pre' => array(
'library' => 'treemenu/PrestudentLib'
),
'sem' => array(
'library' => 'treemenu/AusbSemesterLib',
'children' => array(
'vbd' => array(
'library' => 'treemenu/VerbandLib'
)
)
)
*/
)
)
)
),
'inout' => array(
'library' => 'treemenu/InOutLib'
),
)
);
@@ -0,0 +1,103 @@
<?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');
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about verbände
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class TreeMenu extends FHCAPI_Controller
{
protected $treemenuconfig;
public function __construct()
{
parent::__construct([
'fullMenu' => ['admin:r', 'assistenz:r'],
'partMenu' => ['admin:r', 'assistenz:r'],
]);
}
public function fullMenu($treemenu=null)
{
$includeSubMenu = true;
$this->getMenu($treemenu, $includeSubMenu);
}
public function partMenu($treemenu=null)
{
$includeSubMenu = false;
$this->getMenu($treemenu, $includeSubMenu);
}
protected function getMenu($treemenu=null, $includeSubMenu=false)
{
if(is_null($treemenu))
{
$this->terminateWithError('missing parameter treemenu.');
}
$this->loadMenuConfig($treemenu);
$uri = $this->uri->uri_to_assoc(7);
$startconfig = $this->findStartLib($this->treemenuconfig, array_keys($uri));
$libpath = $startconfig['library'];
$children = isset($startconfig['children']) ? $startconfig['children'] : array();
$libname = basename($startconfig['library']);
$this->load->library(
$libpath,
$children,
$libname
);
$bhdebug = (object) array(
'treemenu' => $treemenu,
'treemenuconfig' => $this->treemenuconfig,
'uri' => $uri,
'libpath' => $libpath,
'libname' => $libname,
'children' => $children,
'startconfig' => $startconfig
);
$this->addMeta('bhdebug', $bhdebug);
//$this->addMeta('bhci', $this);
$this->$libname->init($uri, $includeSubMenu);
$data = $this->$libname->getSubMenu();
$this->terminateWithSuccess($data);
}
protected function findStartLib($config, $uri)
{
$level = array_shift($uri);
if(is_null($level)) {
return $config;
}
return $this->findStartLib($config['children'][$level], $uri);
}
protected function loadMenuConfig($treemenu)
{
$this->config->load('treemenu/' . $treemenu . '.php');
$this->treemenuconfig = $this->config->item($treemenu);
}
}
@@ -45,8 +45,7 @@ class Leitung extends FHCAPI_Controller
'unpauseAntrag' => ['student/antragfreigabe:w', 'student/studierendenantrag:w'],
'objectAntrag' => ['student/antragfreigabe:w', 'student/studierendenantrag:w'],
'approveObjection' => ['student/antragfreigabe:w', 'student/studierendenantrag:w'],
'denyObjection' => ['student/antragfreigabe:w', 'student/studierendenantrag:w'],
'terminateAntrag' => ['student/antragstornieren:w']
'denyObjection' => ['student/antragfreigabe:w', 'student/studierendenantrag:w']
]);
// Libraries
@@ -427,37 +426,4 @@ class Leitung extends FHCAPI_Controller
return $this->terminateWithSuccess($studierendenantrag_id);
}
public function terminateAntrag()
{
$this->load->library('form_validation');
$this->form_validation->set_rules(
'studierendenantrag_id',
'Studierenden Antrag',
[
'required',
['isEntitledToTerminateAntrag', [$this->antraglib, 'isEntitledToTerminateAntrag']],
['antragCanBeTerminated', [$this->antraglib, 'antragCanBeTerminated']]
],
[
'isEntitledToUnpauseAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
'antragCanBeTerminated' => $this->p->t(
'studierendenantrag',
'error_not_terminated',
['id' => $this->input->post('studierendenantrag_id')]
)
]
);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
$result = $this->antraglib->terminateAntrag($studierendenantrag_id, getAuthUID());
$this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($studierendenantrag_id);
}
}
@@ -86,12 +86,9 @@ class Studierendenantrag extends FHC_Controller
$stgA = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag') ?: [];
$permissionTerminateAntrag = $this->permissionlib->isBerechtigt('student/antragstornieren');
$this->load->view('lehre/Antrag/Leitung/List', [
'stgA' => $stgA,
'stgL' => $stgL,
'permissionTerminateAntrag' => $permissionTerminateAntrag
'stgL' => $stgL
]);
}
-47
View File
@@ -1948,22 +1948,6 @@ class AntragLib
return $result;
}
/**
* @param integer $antrag_id
* @param string $insertvon
*
* @return stdClass
*/
public function terminateAntrag($antrag_id, $insertvon)
{
$result = $this->_ci->StudierendenantragstatusModel->insert([
'studierendenantrag_id' => $antrag_id,
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_TERMINATED,
'insertvon' => $insertvon
]);
return $result;
}
/**
* @param integer $studierendenantrag_id
@@ -2135,16 +2119,6 @@ class AntragLib
return $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe');
}
/**
* @param integer $antrag_id
*
* @return boolean
*/
public function isEntitledToTerminateAntrag($antrag_id)
{
return ($this->hasAccessToAntrag($antrag_id, 'student/antragstornieren'));
}
/**
* @param integer $antrag_id
*
@@ -2175,27 +2149,6 @@ class AntragLib
return $this->_ci->StudierendenantragModel->isManuallyPaused($antrag_id);
}
/**
* @param integer $antrag_id
*
* @return boolean
*/
public function antragCanBeTerminated($antrag_id)
{
$this->_ci->StudierendenantragModel->db->where_not_in('campus.get_status_studierendenantrag(studierendenantrag_id)', [
Studierendenantragstatus_model::STATUS_DEREGISTERED,
Studierendenantragstatus_model::STATUS_APPROVED,
Studierendenantragstatus_model::STATUS_TERMINATED
]);
$result = $this->_ci->StudierendenantragModel->loadWhere([
'studierendenantrag_id' => $antrag_id,
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG
]);
return hasData($result);
}
/**
* @param integer $antrag_id
* @param string|array $status
@@ -0,0 +1,37 @@
<?php
require_once APPPATH . 'libraries/treemenu/TreeMenuLib.php';
/**
* Description of InOutLib
*
* @author bambi
*/
class InOutLib extends TreeMenuLib
{
public function getNodes($params=array(), $includeSubMenu=false)
{
return [
[
'name' => 'International',
'link' => 'inout',
'children' => [
[
'name' => 'Incoming',
'link' => 'inout/incoming',
'leaf' => true
],
[
'name' => 'Outgoing',
'link' => 'inout/outgoing',
'leaf' => true
],
[
'name' => 'Gemeinsame Studien',
'link' => 'inout/gemeinsamestudien',
'leaf' => true
]
]
]
];
}
}
@@ -0,0 +1,64 @@
<?php
require_once APPPATH . 'libraries/treemenu/TreeMenuLib.php';
/**
* Description of OrgFormLib
*
* @author bambi
*/
class OrgFormLib extends TreeMenuLib
{
public function getData()
{
if(!isset($this->params['stg']))
{
throw new Exception(self::class . ' Missing Parameter stg.');
}
$this->ci->load->model('codex/Orgform_model', 'OrgFormModel');
$sql = <<<EOSQL
select
o.*
from
bis.tbl_orgform o
join (
SELECT
tl.orgform_kurzbz
FROM
public.tbl_lehrverband AS tl
WHERE
studiengang_kz = {$this->ci->OrgFormModel->escape($this->params['stg'])}
and
orgform_kurzbz IS NOT null
group by
orgform_kurzbz
) v on o.orgform_kurzbz = v.orgform_kurzbz
order by
o.orgform_kurzbz
EOSQL;
$res = $this->ci->OrgFormModel->execReadonlyQuery($sql);
$orgforms = hasData($res) ? getData($res) : array();
$this->ci->addMeta('bhorgform_' . $this->params['stg'] , $orgforms);
return $orgforms;
}
protected function getParamsForNextLevel($element=null)
{
if($element)
{
$paramsstg = array_merge($this->params, array('orgform' => $element->orgform_kurzbz));
return $paramsstg;
}
return $this->params;
}
protected function getName($element)
{
$name = $element->orgform_kurzbz . ' ' . $element->bezeichnung;
return $name;
}
}
@@ -0,0 +1,37 @@
<?php
require_once APPPATH . 'libraries/treemenu/TreeMenuLib.php';
/**
* Description of PreStudentLib
*
* @author bambi
*/
class PreStudentLib extends TreeMenuLib
{
public function getNodes($params=array())
{
return [
[
'name' => 'International',
'link' => 'inout',
'children' => [
[
'name' => 'Incoming',
'link' => 'inout/incoming',
'leaf' => true
],
[
'name' => 'Outgoing',
'link' => 'inout/outgoing',
'leaf' => true
],
[
'name' => 'Gemeinsame Studien',
'link' => 'inout/gemeinsamestudien',
'leaf' => true
]
]
]
];
}
}
+39
View File
@@ -0,0 +1,39 @@
<?php
require_once APPPATH . 'libraries/treemenu/TreeMenuLib.php';
/**
* Description of InOutLib
*
* @author bambi
*/
class StgLib extends TreeMenuLib
{
protected function getData()
{
$this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->ci->StudiengangModel->addOrder('typ');
$this->ci->StudiengangModel->addOrder('kurzbz');
$res = $this->ci->StudiengangModel->loadWhere(array('aktiv' => true));
$stgs = hasData($res) ? getData($res) : array();
$this->ci->addMeta('bhstg', $stgs);
return $stgs;
}
protected function getParamsForNextLevel($element=null)
{
if($element)
{
$paramsstg = array_merge($this->params, array('stg' => $element->studiengang_kz));
return $paramsstg;
}
return $this->params;
}
protected function getName($element)
{
$name = strtoupper($element->typ . $element->kurzbz) . ' ' . $element->bezeichnung;
return $name;
}
}
@@ -0,0 +1,14 @@
<?php
require_once APPPATH . 'libraries/treemenu/TreeMenuLib.php';
/**
* Description of StvMenuLib
*
* @author bambi
*/
class StvMenuLib extends TreeMenuLib
{
public function getNodes($params=array(), $includeSubMenu=false)
{
return [];
}
}
@@ -0,0 +1,108 @@
<?php
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Scripting/PHPClass.php to edit this template
*/
/**
* Description of InOutLib
*
* @author bambi
*/
class TreeMenuLib
{
protected $ci;
protected $children_config;
protected $params;
protected $includeSubMenu;
public function __construct($children_config)
{
$this->ci =& get_instance();
$this->children_config = $children_config;
$this->params = array();
$this->includeSubMenu = false;
foreach($this->children_config as $child_config)
{
$grandchildren_config = isset($child_config['children']) ? $child_config['children'] : [];
$this->ci->load->library($child_config['library'], $grandchildren_config, basename($child_config['library']));
}
}
public function init($params=array(), $includeSubMenu=false)
{
$this->params = $params;
$this->includeSubMenu = $includeSubMenu;
}
public function getNodes()
{
$data = $this->getData();
$nodes = array();
foreach($data as $element)
{
$node = array(
'name' => $this->getName($element),
'link' => $this->getLink($element),
'leaf' => $this->isLeaf()
);
if($this->includeSubMenu)
{
$node['children'] = $this->getSubMenu($element);
}
$nodes[] = $node;
};
return $nodes;
}
public function getSubMenu($element=null)
{
$nodes = array();
foreach($this->children_config as $childconfig)
{
$childlib = basename($childconfig['library']);
$this->ci->$childlib->init(
$this->getParamsForNextLevel($element),
$this->includeSubMenu
);
$childnodes = $this->ci->$childlib->getNodes();
$nodes = array_merge($nodes, $childnodes);
}
return $nodes;
}
protected function getData()
{
return array();
}
protected function getParamsForNextLevel($element=null)
{
return $this->params;
}
protected function getName($element)
{
return __METHOD__ . 'NOT IMPLEMENTED';
}
protected function getLink($element)
{
$link = $this->ci->uri->assoc_to_uri($this->getParamsForNextLevel($element));
return $link;
}
protected function isLeaf()
{
if(count($this->children_config) === 0) {
return true;
}
return false;
}
}
+13 -49
View File
@@ -286,60 +286,24 @@ class Pruefung_model extends DB_Model
$this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist'));
if (is_array($status))
{
if (in_array(null, $status))
{
//$status = array_filter($status);
//just filter out null
$status = array_filter($status, static function ($value)
{
return $value !== null;
});
$this->db->group_start();
// kein Antrag vorhanden ODER nur stornierte Anträge vorhanden
$this->db->or_where("
NOT EXISTS (
SELECT 1
FROM campus.tbl_studierendenantrag a2
WHERE a2.prestudent_id = ps.prestudent_id
AND a2.typ = " . $this->db->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG) . "
AND COALESCE(
campus.get_status_studierendenantrag(a2.studierendenantrag_id),
''
) <> 'Storniert')", null, false);
if (!empty($status))
{
$this->db->or_where_in('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status);
if (is_array($status)) {
if (in_array(null, $status)) {
$status = array_filter($status);
if (count($status)) {
$this->db->group_start();
$this->db->where_in('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status);
$this->db->or_where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', null);
$this->db->group_end();
} else {
$this->db->where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', null);
}
$this->db->group_end();
}
else
{
} else {
$this->db->where_in('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status);
}
}
// kein Antrag vorhanden ODER nur stornierte Anträge vorhanden
elseif ($status === null)
{
$this->db->where("
NOT EXISTS (
SELECT 1
FROM campus.tbl_studierendenantrag a2
WHERE a2.prestudent_id = ps.prestudent_id
AND a2.typ = " . $this->db->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG) . "
AND COALESCE(
campus.get_status_studierendenantrag(a2.studierendenantrag_id),
''
) <> 'Storniert'
)", null, false);
}
else
{
} else {
$this->db->where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status);
}
return $this->loadWhereCommitteeExamsFailed();
}
}
@@ -98,8 +98,7 @@ class Studierendenantrag_model extends DB_Model
Studierendenantragstatus_model::STATUS_OBJECTION_DENIED,
Studierendenantragstatus_model::STATUS_DEREGISTERED,
Studierendenantragstatus_model::STATUS_PAUSE,
Studierendenantragstatus_model::STATUS_REMINDERSENT,
Studierendenantragstatus_model::STATUS_TERMINATED
Studierendenantragstatus_model::STATUS_REMINDERSENT
]);
$this->db->or_group_start();
$this->db->where('s.studierendenantrag_statustyp_kurzbz', Studierendenantragstatus_model::STATUS_APPROVED);
@@ -16,7 +16,6 @@ class Studierendenantragstatus_model extends DB_Model
const STATUS_OBJECTION_DENIED = 'EinspruchAbgelehnt';
const STATUS_DEREGISTERED = 'Abgemeldet';
const STATUS_PAUSE = 'Pause';
const STATUS_TERMINATED = 'Storniert';
const INSERTVON_ABMELDUNGSTGL = "AbmeldungStgl";
const INSERTVON_DEREGISTERED = "Studienabbruch";
@@ -44,7 +44,6 @@ $this->load->view(
<studierendenantrag-leitung
:stg-a="<?= htmlspecialchars(json_encode(array_values($stgA))); ?>"
:stg-l="<?= htmlspecialchars(json_encode(array_values($stgL))); ?>"
:permission-terminate-antrag="<?= json_encode($permissionTerminateAntrag); ?>"
>
</studierendenantrag-leitung>
+136 -146
View File
@@ -71,157 +71,147 @@ if(defined('CIS4')){
</thead>
<tbody>
<?php foreach($array['antraege'] as $antrag){ ?>
<?php if (
!(
$antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG
&& $antrag->status == Studierendenantragstatus_model::STATUS_TERMINATED
<tr>
<td><?= $antrag->studierendenantrag_id; ?></td>
<td><?= $this->p->t('studierendenantrag', 'antrag_typ_' . $antrag->typ); ?></td>
<td>
<?=
(
$antrag->status == Studierendenantragstatus_model::STATUS_PAUSE
&& $antrag->status_insertvon == Studierendenantragstatus_model::INSERTVON_DEREGISTERED
)
) { ?>
? $this->p->t('studierendenantrag', 'status_stop')
: $antrag->status_bezeichnung;
?>
</td>
<td><?= $antrag->studiensemester_kurzbz; ?></td>
<td><?= (new DateTime($antrag->datum))->format('d.m.Y'); ?></td>
<td><?= $antrag->datum_wiedereinstieg ? (new DateTime($antrag->datum_wiedereinstieg))->format('d.m.Y') : ''; ?></td>
<td><!-- Button trigger modal -->
<?php if($antrag->grund){ ?>
<a href="#modalgrund<?= $antrag->studierendenantrag_id; ?>" data-bs-toggle="modal">
<?= $this->p->t('studierendenantrag', 'antrag_grund'); ?>
</a>
<tr>
<td><?= $antrag->studierendenantrag_id; ?></td>
<td><?= $this->p->t('studierendenantrag', 'antrag_typ_' . $antrag->typ); ?></td>
<td>
<?=
(
$antrag->status == Studierendenantragstatus_model::STATUS_PAUSE
&& $antrag->status_insertvon == Studierendenantragstatus_model::INSERTVON_DEREGISTERED
)
? $this->p->t('studierendenantrag', 'status_stop')
: $antrag->status_bezeichnung;
?>
</td>
<td><?= $antrag->studiensemester_kurzbz; ?></td>
<td><?= (new DateTime($antrag->datum))->format('d.m.Y'); ?></td>
<td><?= $antrag->datum_wiedereinstieg ? (new DateTime($antrag->datum_wiedereinstieg))->format('d.m.Y') : ''; ?></td>
<td><!-- Button trigger modal -->
<?php if($antrag->grund){ ?>
<a href="#modalgrund<?= $antrag->studierendenantrag_id; ?>" data-bs-toggle="modal">
<?= $this->p->t('studierendenantrag', 'antrag_grund'); ?>
</a>
<!-- Modal -->
<div
class="modal fade"
id="modalgrund<?= $antrag->studierendenantrag_id; ?>"
tabindex="-1"
aria-labelledby="modalgrundLabel<?= $antrag->studierendenantrag_id; ?>"
aria-hidden="true"
>
<div class="modal-dialog modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5
class="modal-title"
id="modalgrundLabel<?= $antrag->studierendenantrag_id; ?>"
>
<?= $this->p->t('studierendenantrag', 'antrag_grund'); ?>
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<textarea
class="form-control"
style="width: 100%; height: 250px;"
readonly
>
<?= $antrag->grund; ?>
</textarea>
</div>
</div>
<!-- Modal -->
<div
class="modal fade"
id="modalgrund<?= $antrag->studierendenantrag_id; ?>"
tabindex="-1"
aria-labelledby="modalgrundLabel<?= $antrag->studierendenantrag_id; ?>"
aria-hidden="true"
>
<div class="modal-dialog modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5
class="modal-title"
id="modalgrundLabel<?= $antrag->studierendenantrag_id; ?>"
>
<?= $this->p->t('studierendenantrag', 'antrag_grund'); ?>
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<textarea
class="form-control"
style="width: 100%; height: 250px;"
readonly
>
<?= $antrag->grund; ?>
</textarea>
</div>
</div>
<?php } ?>
</td>
<td>
<?php if($antrag->dms_id) {?>
<a
class="text-decoration-none"
href="<?= site_url('lehre/Antrag/Attachment/show/' . $antrag->dms_id) ?>"
target="_blank">
<i class="fa fa-paperclip" aria-hidden="true"></i> <?= $this->p->t('studierendenantrag', 'antrag_anhang'); ?>
</a>
<?php } ?>
</td>
<td>
<a
href="<?= site_url('lehre/Studierendenantrag/' .
strtolower($antrag->typ) .
'/' .
$antrag->prestudent_id .
'/' .
$antrag->studierendenantrag_id); ?>"
</div>
</div>
<?php } ?>
</td>
<td>
<?php if($antrag->dms_id) {?>
<a
class="text-decoration-none"
href="<?= site_url('lehre/Antrag/Attachment/show/' . $antrag->dms_id) ?>"
target="_blank">
<i class="fa fa-paperclip" aria-hidden="true"></i> <?= $this->p->t('studierendenantrag', 'antrag_anhang'); ?>
</a>
<?php } ?>
</td>
<td>
<a
href="<?= site_url('lehre/Studierendenantrag/' .
strtolower($antrag->typ) .
'/' .
$antrag->prestudent_id .
'/' .
$antrag->studierendenantrag_id); ?>"
>
<i class="fa-solid fa-pen" title="<?= $this->p->t('studierendenantrag', 'btn_edit'); ?>"></i>
</a>
<?php
$allowed = [];
switch ($antrag->typ) {
case Studierendenantrag_model::TYP_ABMELDUNG:
$allowed = [
Studierendenantragstatus_model::STATUS_APPROVED
];
break;
case Studierendenantrag_model::TYP_ABMELDUNG_STGL:
$allowed = [
Studierendenantragstatus_model::STATUS_OBJECTION_DENIED,
Studierendenantragstatus_model::STATUS_DEREGISTERED
];
break;
case Studierendenantrag_model::TYP_UNTERBRECHUNG:
$allowed = [
Studierendenantragstatus_model::STATUS_APPROVED,
Studierendenantragstatus_model::STATUS_REMINDERSENT
];
break;
case Studierendenantrag_model::TYP_WIEDERHOLUNG:
$allowed = [
Studierendenantragstatus_model::STATUS_DEREGISTERED
];
break;
}
if (in_array($antrag->status, $allowed)) { ?>
<a
class="ms-2"
target="_blank"
href="<?= base_url('cis/private/pdfExport.php?xml=Antrag' .
$antrag->typ .
'.xml.php&xsl=Antrag' .
$antrag->typ .
'&id=' .
$antrag->studierendenantrag_id .
'&uid=' .
getAuthUID()); ?>"
>
<i
class="fa-solid fa-download"
title="<?= $this->p->t('studierendenantrag', 'btn_download_antrag'); ?>"
>
<i class="fa-solid fa-pen" title="<?= $this->p->t('studierendenantrag', 'btn_edit'); ?>"></i>
</a>
<?php
$allowed = [];
switch ($antrag->typ) {
case Studierendenantrag_model::TYP_ABMELDUNG:
$allowed = [
Studierendenantragstatus_model::STATUS_APPROVED
];
break;
case Studierendenantrag_model::TYP_ABMELDUNG_STGL:
$allowed = [
Studierendenantragstatus_model::STATUS_OBJECTION_DENIED,
Studierendenantragstatus_model::STATUS_DEREGISTERED
];
break;
case Studierendenantrag_model::TYP_UNTERBRECHUNG:
$allowed = [
Studierendenantragstatus_model::STATUS_APPROVED,
Studierendenantragstatus_model::STATUS_REMINDERSENT
];
break;
case Studierendenantrag_model::TYP_WIEDERHOLUNG:
$allowed = [
Studierendenantragstatus_model::STATUS_DEREGISTERED
];
break;
}
if (in_array($antrag->status, $allowed)) { ?>
<a
class="ms-2"
target="_blank"
href="<?= base_url('cis/private/pdfExport.php?xml=Antrag' .
$antrag->typ .
'.xml.php&xsl=Antrag' .
$antrag->typ .
'&id=' .
$antrag->studierendenantrag_id .
'&uid=' .
getAuthUID()); ?>"
>
<i
class="fa-solid fa-download"
title="<?= $this->p->t('studierendenantrag', 'btn_download_antrag'); ?>"
>
</i>
</a>
<?php } ?>
<?php if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG
&& $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED
) { ?>
<a
class="ms-2"
href="#modallv<?= $antrag->studierendenantrag_id; ?>"
data-bs-toggle="modal"
>
<?= $this->p->t('studierendenantrag', 'btn_show_lvs'); ?>
</a>
<lv-popup
id="modallv<?= $antrag->studierendenantrag_id; ?>"
antrag-id = "<?= $antrag->studierendenantrag_id; ?>"
>
<?= $this->p->t('studierendenantrag', 'my_lvs'); ?>
</lv-popup>
<?php } ?>
</td>
</tr>
<?php } ?>
</i>
</a>
<?php } ?>
<?php if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG
&& $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED
) { ?>
<a
class="ms-2"
href="#modallv<?= $antrag->studierendenantrag_id; ?>"
data-bs-toggle="modal"
>
<?= $this->p->t('studierendenantrag', 'btn_show_lvs'); ?>
</a>
<lv-popup
id="modallv<?= $antrag->studierendenantrag_id; ?>"
antrag-id = "<?= $antrag->studierendenantrag_id; ?>"
>
<?= $this->p->t('studierendenantrag', 'my_lvs'); ?>
</lv-popup>
<?php } ?>
</td>
</tr>
<?php } ?>
</tbody>
</table>
+1 -8
View File
@@ -96,12 +96,5 @@ export default {
url: '/api/frontend/v1/studstatus/leitung/denyObjection',
params: antrag
};
},
terminate(antrag) {
return {
method: 'post',
url: '/api/frontend/v1/studstatus/leitung/terminateAntrag',
params: antrag
};
},
}
};
@@ -18,11 +18,7 @@ export default {
},
props: {
stgL: Array,
stgA: Array,
permissionTerminateAntrag: {
type: Boolean,
default: false
},
stgA: Array
},
data() {
return {
@@ -227,13 +223,6 @@ export default {
.then(this.showResults);
}
},
actionTerminate(evt){
var antraege = evt || this.selectedData;
this.$refs.loader.show();
this
._singleOrMultiApiCall(antraege, ApiStudstatusLeitung.terminate)
.then(this.showResults);
},
showResults(results) {
let fulfilled = results.filter(res => res.status == 'fulfilled');
this.$refs.loader.hide();
@@ -281,7 +270,6 @@ export default {
:stg-a="stgkzA"
:stg-l="stgkzL"
:filter="filter"
:permission-terminate-antrag="permissionTerminateAntrag"
v-model:columnData="columns"
v-model:selectedData="selectedData"
@action:approve="actionApprove"
@@ -292,8 +280,7 @@ export default {
@action:objectionApprove="actionObjectionApprove"
@action:cancel="actionCancel"
@action:pause="actionPause"
@action:unpause="actionUnpause"
@action:terminate="actionTerminate"
@action:unpause="actionUnpause"
@reload="reload"
>
</leitung-table>
@@ -16,11 +16,7 @@ export default {
columnData: Array,
stgL: Array,
stgA: Array,
filter: String,
permissionTerminateAntrag: {
type: Boolean,
default: false
},
filter: String
},
emits: [
'update:columnData',
@@ -33,8 +29,7 @@ export default {
'action:objectionApprove',
'action:cancel',
'action:pause',
'action:unpause',
'action:terminate'
'action:unpause'
],
data() {
return {
@@ -313,26 +308,6 @@ export default {
button.className = "btn btn-outline-secondary";
button.addEventListener('click', () => this.$emit('action:pause', [cell.getData()]));
container.append(button);
// Terminate
if(this.permissionTerminateAntrag){
button = document.createElement('button');
icon = document.createElement('i');
span = document.createElement('span');
icon.className = "fa-solid fa-xmark";
icon.setAttribute('aria-hidden', true);
icon.setAttribute('title', this.$p.t('studierendenantrag', 'btn_terminate'));
span.className = "fa-sr-only";
span.append(this.$p.t('studierendenantrag', 'btn_terminate'));
button.append(icon);
button.append(span);
button.className = "btn btn-outline-danger";
button.addEventListener('click', () => this.$emit('action:terminate', [cell.getData()]));
container.append(button);
}
}
let canUnpause = data.status == 'Pause' && !['AbmeldungStgl', 'Studienabbruch'].includes(data.status_insertvon);
@@ -362,26 +337,6 @@ export default {
button.className = "btn btn-outline-secondary";
button.addEventListener('click', () => this.$emit('action:unpause', [cell.getData()]));
container.append(button);
// Terminate: show buttion
if(this.permissionTerminateAntrag){
button = document.createElement('button');
icon = document.createElement('i');
span = document.createElement('span');
icon.className = "fa-solid fa-xmark";
icon.setAttribute('aria-hidden', true);
icon.setAttribute('title', this.$p.t('studierendenantrag', 'btn_terminate'));
span.className = "fa-sr-only";
span.append(this.$p.t('studierendenantrag', 'btn_terminate'));
button.append(icon);
button.append(span);
button.className = "btn btn-outline-danger";
button.addEventListener('click', () => this.$emit('action:terminate', [cell.getData()]));
container.append(button);
}
}
if (data.typ == 'AbmeldungStgl' && data.status == 'Genehmigt') {
-1
View File
@@ -94,7 +94,6 @@ require_once('dbupdate_3.4/71399_dashboard_update_widget_paths.php');
require_once('dbupdate_3.4/71645_studvw_messagetab_ladezeit.php');
require_once('dbupdate_3.4/71566_studienordnungsdokument_neuer_organisationseinheitstyp_programm.php');
require_once('dbupdate_3.4/70376_lohnguide.php');
require_once('dbupdate_3.4/77000_studstatus_stornierte_wiederholende.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
@@ -1,15 +0,0 @@
<?php
// neuen studierendenantrag_statustyp mit studierendenantrag_statustyp_kurzbz = 'Storniert' als Zeile hinzufügen
if($result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statustyp WHERE studierendenantrag_statustyp_kurzbz= 'Storniert';"))
{
if($db->db_num_rows($result) == 0)
{
$qry = "INSERT INTO campus.tbl_studierendenantrag_statustyp(studierendenantrag_statustyp_kurzbz, bezeichnung) VALUES ('Storniert', '{Storniert, Terminated}');";
if(!$db->db_query($qry))
echo '<strong>campus.tbl_studierendenantrag_statustyp: '.$db->db_last_error().'</strong><br>';
else
echo '<br>campus.tbl_studierendenantrag_statustyp: Zeile Storniert hinzugefuegt!<br>';
}
}
-60
View File
@@ -58177,66 +58177,6 @@ I have been informed that I am under no obligation to consent to the transmissio
)
),
// ### Phrases Dashboard Admin END
array(
'app' => 'core',
'category' => 'studierendenantrag',
'phrase' => 'status_terminated',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Storniert',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Terminated',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',
'phrase' => 'btn_terminate',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Stornieren',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Terminate',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',
'phrase' => 'error_not_terminated',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Id {id} ist bereits storniert',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Id {id} is already terminated',
'description' => '',
'insertvon' => 'system'
)
)
),
);