mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-10-12 15:04:04 +00:00
Compare commits
30
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ea8e7c965f | ||
|
|
9f6a1cbb8c | ||
|
|
5d76fcb049 | ||
|
|
4ba2869632 | ||
|
|
293bb77179 | ||
|
|
3fe10d715d | ||
|
|
36064afbba | ||
|
|
f3d031ab16 | ||
|
|
3d8c4fa4d0 | ||
|
|
272014bd78 | ||
|
|
76a8e00edf | ||
|
|
c8533d576b | ||
|
|
ce62713790 | ||
|
|
34761db664 | ||
|
|
c7131ed775 | ||
|
|
b57e1984a8 | ||
|
|
c8c7d1566c | ||
|
|
4b62f0f864 | ||
|
|
9d4218bf38 | ||
|
|
67f30c7765 | ||
|
|
5fff45e302 | ||
|
|
5df31a7fbc | ||
|
|
5f34a6d38a | ||
|
|
84452b7121 | ||
|
|
d40040efd8 | ||
|
|
25ebb7ad93 | ||
|
|
34a7588016 | ||
|
|
07fc9838fc | ||
|
|
848cd2233e | ||
|
|
708563a3db |
@@ -101,6 +101,9 @@ class Widget extends FHCAPI_Controller
|
||||
$tmpsetup = json_decode($widget->setup);
|
||||
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
||||
$widget->setup = $tmpsetup;
|
||||
$widget->permitted = empty($widget->berechtigung_kurzbz)
|
||||
|| $this->permissionlib->isBerechtigt($widget->berechtigung_kurzbz);
|
||||
|
||||
return $widget;
|
||||
}, $widgets);
|
||||
|
||||
|
||||
@@ -28,7 +28,8 @@ class Studiensemester extends FHCAPI_Controller
|
||||
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
|
||||
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED,
|
||||
'current' => self::PERM_LOGGED,
|
||||
'set' => self::PERM_LOGGED
|
||||
'set' => self::PERM_LOGGED,
|
||||
'getContainingOrNearestByDateRange' => self::PERM_LOGGED,
|
||||
)
|
||||
);
|
||||
// Load model StudiensemesterModel
|
||||
@@ -203,4 +204,15 @@ class Studiensemester extends FHCAPI_Controller
|
||||
|
||||
$this->terminateWithSuccess(true);
|
||||
}
|
||||
|
||||
public function getContainingOrNearestByDateRange()
|
||||
{
|
||||
$from = $this->input->get("from");
|
||||
$to = $this->input->get("to");
|
||||
|
||||
$result = $this->StudiensemesterModel->getContainingOrNearestByDateRange($from, $to);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class DummyPermissions extends Auth_Controller
|
||||
{
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(
|
||||
array(
|
||||
'permissionToMainRole' => 'dummymainpermission:r',
|
||||
'permissionToBasicRole' => 'dummybasicpermission:r',
|
||||
'permissionToUser' => 'dummyuserpermission:r',
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
public function permissionToMainRole() { echo __METHOD__; }
|
||||
//
|
||||
public function permissionToBasicRole() { echo __METHOD__; }
|
||||
//
|
||||
public function permissionToUser() { echo __METHOD__; }
|
||||
}
|
||||
|
||||
@@ -292,13 +292,29 @@ class Studiensemester_model extends DB_Model
|
||||
COALESCE(
|
||||
(SELECT studiensemester_kurzbz FROM semester_interval_startdate),
|
||||
(SELECT studiensemester_kurzbz FROM nearest_semester_interval_startdate)
|
||||
) AS studiensemester_kurzbz
|
||||
) AS studiensemester_kurzbz,
|
||||
COALESCE(
|
||||
(SELECT start FROM semester_interval_startdate),
|
||||
(SELECT start FROM nearest_semester_interval_startdate)
|
||||
) as start,
|
||||
COALESCE(
|
||||
(SELECT ende FROM semester_interval_startdate),
|
||||
(SELECT ende FROM nearest_semester_interval_startdate)
|
||||
) as ende
|
||||
UNION
|
||||
SELECT
|
||||
COALESCE(
|
||||
(SELECT studiensemester_kurzbz FROM semester_interval_enddate),
|
||||
(SELECT studiensemester_kurzbz FROM nearest_semester_interval_enddate)
|
||||
) AS studiensemester_kurzbz
|
||||
) AS studiensemester_kurzbz,
|
||||
COALESCE(
|
||||
(SELECT start FROM semester_interval_enddate),
|
||||
(SELECT start FROM nearest_semester_interval_enddate)
|
||||
) as start,
|
||||
COALESCE(
|
||||
(SELECT ende FROM semester_interval_enddate),
|
||||
(SELECT ende FROM nearest_semester_interval_enddate)
|
||||
) as ende
|
||||
|
||||
EOSQL;
|
||||
|
||||
|
||||
@@ -410,13 +410,16 @@ EOSQL;
|
||||
UNION
|
||||
Berechtigung ueber Rolle
|
||||
UNION
|
||||
Berechtigung ueber Rolle in roles
|
||||
UNION
|
||||
Berechtigung ueber Funktion
|
||||
UNION
|
||||
Berechtigung ueber Funktion Mitarbeiter
|
||||
UNION
|
||||
Berechtigung ueber Funktion Student
|
||||
*/
|
||||
$qry = "SELECT
|
||||
$qry = " -- Direkte Berechtigungszuordnung
|
||||
SELECT
|
||||
benutzerberechtigung_id, tbl_benutzerrolle.uid, tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1,
|
||||
tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start,
|
||||
@@ -428,6 +431,7 @@ EOSQL;
|
||||
|
||||
UNION
|
||||
|
||||
-- Berechtigung ueber Rolle
|
||||
SELECT
|
||||
benutzerberechtigung_id, tbl_benutzerrolle.uid, tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_benutzerrolle.rolle_kurzbz, tbl_berechtigung.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_rolleberechtigung.art art1,
|
||||
@@ -442,20 +446,24 @@ EOSQL;
|
||||
|
||||
UNION
|
||||
|
||||
-- Berechtigung ueber Rollen in Rollen
|
||||
SELECT
|
||||
benutzerberechtigung_id, tbl_benutzerfunktion.uid, tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1,
|
||||
tbl_benutzerfunktion.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start,
|
||||
benutzerberechtigung_id, tbl_benutzerrolle.uid, tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_rolle_rolle.basic_rolle_kurzbz, tbl_berechtigung.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_rolleberechtigung.art art1,
|
||||
tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start,
|
||||
tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon,
|
||||
tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung
|
||||
FROM
|
||||
system.tbl_benutzerrolle JOIN public.tbl_benutzerfunktion USING(funktion_kurzbz)
|
||||
WHERE tbl_benutzerfunktion.uid=".$this->db_add_param($uid)."
|
||||
AND (tbl_benutzerfunktion.datum_von IS NULL OR tbl_benutzerfunktion.datum_von<=now())
|
||||
AND (tbl_benutzerfunktion.datum_bis IS NULL OR tbl_benutzerfunktion.datum_bis>=now())
|
||||
system.tbl_benutzerrolle
|
||||
JOIN system.tbl_rolle USING(rolle_kurzbz)
|
||||
JOIN system.tbl_rolle_rolle ON system.tbl_rolle_rolle.main_rolle_kurzbz = system.tbl_rolle.rolle_kurzbz
|
||||
JOIN system.tbl_rolleberechtigung ON system.tbl_rolleberechtigung.rolle_kurzbz = system.tbl_rolle_rolle.basic_rolle_kurzbz
|
||||
JOIN system.tbl_berechtigung ON(tbl_rolleberechtigung.berechtigung_kurzbz=tbl_berechtigung.berechtigung_kurzbz)
|
||||
WHERE uid=".$this->db_add_param($uid)."
|
||||
|
||||
UNION
|
||||
|
||||
-- Berechtigung ueber Funktion
|
||||
SELECT
|
||||
benutzerberechtigung_id, tbl_benutzerfunktion.uid, tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_benutzerrolle.rolle_kurzbz, tbl_rolleberechtigung.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_rolleberechtigung.art art1,
|
||||
@@ -472,6 +480,7 @@ EOSQL;
|
||||
|
||||
UNION
|
||||
|
||||
-- Berechtigung ueber Funktion Mitarbeiter
|
||||
SELECT
|
||||
benutzerberechtigung_id, '', tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1,
|
||||
@@ -486,6 +495,7 @@ EOSQL;
|
||||
|
||||
UNION
|
||||
|
||||
-- Berechtigung ueber Funktion Student
|
||||
SELECT
|
||||
benutzerberechtigung_id, '', tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1,
|
||||
|
||||
@@ -387,5 +387,117 @@ class berechtigung extends basis_db
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sucht nach rollen
|
||||
* @param string $searchItem Suchbegriff
|
||||
* @return boolean
|
||||
*/
|
||||
public function searchRollen($rolle, $searchItem)
|
||||
{
|
||||
$this->result=array();
|
||||
$qry = 'SELECT * FROM system.tbl_rolle WHERE
|
||||
(
|
||||
LOWER(rolle_kurzbz) LIKE LOWER(\'%'.$this->db_escape(($searchItem)).'%\')
|
||||
OR
|
||||
LOWER(beschreibung) LIKE LOWER(\'%'.$this->db_escape(($searchItem)).'%\')
|
||||
OR
|
||||
LOWER(lange_beschreibung) LIKE LOWER(\'%'.$this->db_escape(($searchItem)).'%\')
|
||||
) AND rolle_kurzbz NOT IN (SELECT basic_rolle_kurzbz FROM system.tbl_rolle_rolle WHERE main_rolle_kurzbz = \''.$this->db_escape(($rolle)).'\')';
|
||||
|
||||
$qry .= ' ORDER BY rolle_kurzbz';
|
||||
|
||||
if ($this->db_query($qry))
|
||||
{
|
||||
while ($row = $this->db_fetch_object())
|
||||
{
|
||||
$obj = new stdClass();
|
||||
|
||||
$obj->rolle_kurzbz = $row->rolle_kurzbz;
|
||||
$obj->beschreibung = $row->beschreibung;
|
||||
$obj->lange_beschreibung = $row->lange_beschreibung;
|
||||
|
||||
$this->result[] = $obj;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->errormsg = 'Fehler beim Laden der Berechtigungen';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function getRollenRollen($rolle_kurzbz)
|
||||
{
|
||||
$qry = 'SELECT r.*
|
||||
FROM system.tbl_rolle r
|
||||
JOIN system.tbl_rolle_rolle rr ON (rr.basic_rolle_kurzbz = r.rolle_kurzbz)
|
||||
WHERE rr.main_rolle_kurzbz = \''.$this->db_escape(($rolle_kurzbz)).'\'
|
||||
ORDER BY r.rolle_kurzbz';
|
||||
|
||||
if($this->db_query($qry))
|
||||
{
|
||||
while($row = $this->db_fetch_object())
|
||||
{
|
||||
$obj = new stdClass();
|
||||
|
||||
$obj->rolle_kurzbz = $row->rolle_kurzbz;
|
||||
$obj->beschreibung = $row->beschreibung;
|
||||
$obj->lange_beschreibung = $row->lange_beschreibung;
|
||||
|
||||
$this->result[] = $obj;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->errormsg = 'Datensatz konnte nicht geladen werden';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function saveRolleRolle($main_rolle, $basic_rolle, $uid)
|
||||
{
|
||||
// Upsert
|
||||
$qry = 'INSERT INTO system.tbl_rolle_rolle (main_rolle_kurzbz, basic_rolle_kurzbz, insertvon)
|
||||
VALUES (\''.$this->db_escape(($main_rolle)).'\', \''.$this->db_escape(($basic_rolle)).'\', \''.$this->db_escape(($uid)).'\')
|
||||
ON CONFLICT (main_rolle_kurzbz, basic_rolle_kurzbz) DO NOTHING';
|
||||
if ($this->db_query($qry))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->errormsg = 'Fehler beim Speichern: '.$this->db_last_error();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function deleteRolleRolle($main_rolle_kurzbz, $basic_rolle_kurzbz)
|
||||
{
|
||||
$qry = 'DELETE FROM system.tbl_rolle_rolle
|
||||
WHERE main_rolle_kurzbz = '.$this->db_add_param($main_rolle_kurzbz).'
|
||||
AND basic_rolle_kurzbz = '.$this->db_add_param($basic_rolle_kurzbz);
|
||||
|
||||
if ($this->db_query($qry))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->errormsg = 'Fehler beim Löschen der Rolle:'.$this->db_last_error();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
?>
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
* Manuela Thamer <[email protected]>
|
||||
*/
|
||||
require_once(dirname(__FILE__).'/basis_db.class.php');
|
||||
require_once(dirname(__FILE__).'/mitarbeiter.class.php');
|
||||
|
||||
class entwicklungsteam extends basis_db
|
||||
{
|
||||
@@ -43,7 +44,6 @@ class entwicklungsteam extends basis_db
|
||||
public $ext_id;
|
||||
|
||||
public $besqual;
|
||||
public $studiengang_kz_old;
|
||||
|
||||
/**
|
||||
* Konstruktor
|
||||
@@ -74,7 +74,7 @@ class entwicklungsteam extends basis_db
|
||||
$qry = "SELECT * FROM bis.tbl_entwicklungsteam JOIN bis.tbl_besqual USING(besqualcode)
|
||||
WHERE entwicklungsteam_id=".$this->db_add_param($entwicklungsteam_id);
|
||||
|
||||
$qry.=";";
|
||||
$qry.=";";
|
||||
|
||||
if($this->db_query($qry))
|
||||
{
|
||||
@@ -147,6 +147,11 @@ class entwicklungsteam extends basis_db
|
||||
$this->errormsg = 'Es muss ein Mitarbeiter angegeben werden';
|
||||
return false;
|
||||
}
|
||||
if(!$this->checkIfExistingUid($this->mitarbeiter_uid))
|
||||
{
|
||||
$this->errormsg = 'Bitte einen Eintrag aus dem Dropdown Personensuche auswählen!';
|
||||
return false;
|
||||
}
|
||||
if($this->studiengang_kz=='')
|
||||
{
|
||||
$this->errormsg = 'Es muss ein Studiengang angegeben werden';
|
||||
@@ -162,6 +167,26 @@ class entwicklungsteam extends basis_db
|
||||
$this->errormsg = 'Endedatum darf nicht vor Anfangsdatum liegen';
|
||||
return false;
|
||||
}
|
||||
|
||||
if($this->beginn != '')
|
||||
{
|
||||
$beginnParts = explode('-', $this->beginn);
|
||||
if (!checkdate((int)$beginnParts[1], (int)$beginnParts[2], (int)$beginnParts[0])) {
|
||||
$this->errormsg = 'Anfangsdatum ist ungültig';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if($this->ende != '')
|
||||
{
|
||||
$endeParts = explode('-', $this->ende);
|
||||
if (!checkdate((int)$endeParts[1], (int)$endeParts[2], (int)$endeParts[0]))
|
||||
{
|
||||
$this->errormsg = 'Endedatum ist ungültig';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -183,30 +208,28 @@ class entwicklungsteam extends basis_db
|
||||
//Neuen Datensatz anlegen
|
||||
$qry = "INSERT INTO bis.tbl_entwicklungsteam (mitarbeiter_uid, studiengang_kz, besqualcode, beginn, ende,
|
||||
updateamum, updatevon, insertamum, insertvon) VALUES (".
|
||||
$this->db_add_param($this->mitarbeiter_uid).', '.
|
||||
$this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '.
|
||||
$this->db_add_param($this->besqualcode, FHC_INTEGER).', '.
|
||||
$this->db_add_param($this->beginn).', '.
|
||||
$this->db_add_param($this->ende).', '.
|
||||
$this->db_add_param($this->updateamum).', '.
|
||||
$this->db_add_param($this->updatevon).', '.
|
||||
$this->db_add_param($this->insertamum).', '.
|
||||
$this->db_add_param($this->insertvon).');';
|
||||
$this->db_add_param($this->mitarbeiter_uid).', '.
|
||||
$this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '.
|
||||
$this->db_add_param($this->besqualcode, FHC_INTEGER).', '.
|
||||
$this->db_add_param($this->beginn).', '.
|
||||
$this->db_add_param($this->ende).', '.
|
||||
$this->db_add_param($this->updateamum).', '.
|
||||
$this->db_add_param($this->updatevon).', '.
|
||||
$this->db_add_param($this->insertamum).', '.
|
||||
$this->db_add_param($this->insertvon).');';
|
||||
}
|
||||
else
|
||||
{
|
||||
if($this->studiengang_kz_old=='')
|
||||
$this->studiengang_kz_old = $this->studiengang_kz;
|
||||
|
||||
//Bestehenden Datensatz aktualisieren
|
||||
$qry= "UPDATE bis.tbl_entwicklungsteam SET".
|
||||
" besqualcode=".$this->db_add_param($this->besqualcode, FHC_INTEGER).",".
|
||||
" beginn=".$this->db_add_param($this->beginn).",".
|
||||
" studiengang_kz=".$this->db_add_param($this->studiengang_kz, FHC_INTEGER).",".
|
||||
" ende=".$this->db_add_param($this->ende).",".
|
||||
" updateamum=".$this->db_add_param($this->updateamum).",".
|
||||
" updatevon=".$this->db_add_param($this->updatevon).
|
||||
" WHERE entwicklungsteam_id=".$this->db_add_param($this->entwicklungsteam_id).";";
|
||||
" besqualcode=".$this->db_add_param($this->besqualcode, FHC_INTEGER).",".
|
||||
" beginn=".$this->db_add_param($this->beginn).",".
|
||||
" studiengang_kz=".$this->db_add_param($this->studiengang_kz, FHC_INTEGER).",".
|
||||
" ende=".$this->db_add_param($this->ende).",".
|
||||
" mitarbeiter_uid=".$this->db_add_param($this->mitarbeiter_uid).",".
|
||||
" updateamum=".$this->db_add_param($this->updateamum).",".
|
||||
" updatevon=".$this->db_add_param($this->updatevon).
|
||||
" WHERE entwicklungsteam_id=".$this->db_add_param($this->entwicklungsteam_id).";";
|
||||
}
|
||||
|
||||
if($this->db_query($qry))
|
||||
@@ -234,7 +257,7 @@ class entwicklungsteam extends basis_db
|
||||
if($studiengang_kz!=null)
|
||||
$qry.=" AND studiengang_kz=".$this->db_add_param($studiengang_kz);
|
||||
|
||||
$qry.=";";
|
||||
$qry.=";";
|
||||
|
||||
if($this->db_query($qry))
|
||||
{
|
||||
@@ -316,7 +339,7 @@ class entwicklungsteam extends basis_db
|
||||
|
||||
if ($sort != null)
|
||||
{
|
||||
$qry .= " ORDER BY ".$sort;
|
||||
$qry .= " ORDER BY ".$sort;
|
||||
}
|
||||
|
||||
$qry .= ";";
|
||||
@@ -364,7 +387,7 @@ class entwicklungsteam extends basis_db
|
||||
$bismeldung_jahr = $datetime->format('Y');
|
||||
|
||||
//laden des Datensatzes
|
||||
$qry = "SELECT tbl_entwicklungsteam.*, tbl_besqual.*, tbl_studiengang.studiengang_kz, tbl_studiengang.melderelevant
|
||||
$qry = "SELECT tbl_entwicklungsteam.*, tbl_besqual.*, tbl_studiengang.studiengang_kz, tbl_studiengang.melderelevant
|
||||
FROM bis.tbl_entwicklungsteam
|
||||
JOIN bis.tbl_besqual USING(besqualcode)
|
||||
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||
@@ -375,7 +398,7 @@ class entwicklungsteam extends basis_db
|
||||
if($studiengang_kz!=null)
|
||||
$qry.=" AND studiengang_kz=".$this->db_add_param($studiengang_kz);
|
||||
|
||||
$qry.=";";
|
||||
$qry.=";";
|
||||
|
||||
if($this->db_query($qry))
|
||||
{
|
||||
@@ -407,5 +430,20 @@ class entwicklungsteam extends basis_db
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Überprüft, ob die übergebene Uid in der Tabelle tbl_mitarbeiter vorhanden ist
|
||||
* @param String $uid UID des Mitarbeiters
|
||||
* @return true wenn vorhanden, false wenn nicht
|
||||
*/
|
||||
private function checkIfExistingUid($uid)
|
||||
{
|
||||
$mitarbeiter = new mitarbeiter();
|
||||
|
||||
if(!$mitarbeiter->checkIfExistingUid($uid))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -1995,5 +1995,23 @@ class mitarbeiter extends benutzer
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prueft ob eine existierende ma_uid übergeben wurde
|
||||
* @param String $mitarbeiter_uid mitarbeiter_uid
|
||||
* @return bool True wenn mitarbeiter_uid vorhanden sonst false.
|
||||
*/
|
||||
public function checkIfExistingUid($mitarbeiter_uid)
|
||||
{
|
||||
$qry = "Select 1 from public.tbl_mitarbeiter where mitarbeiter_uid =".$this->db_add_param($mitarbeiter_uid);
|
||||
|
||||
if ($result = $this->db_query($qry))
|
||||
{
|
||||
if ($this->db_num_rows($result) > 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
+17
-1
@@ -853,4 +853,20 @@ html {
|
||||
border: 1px solid rgba(0, 0, 0, 0.15);
|
||||
border-radius: 0.5rem;
|
||||
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
}
|
||||
|
||||
.cis-main-menu {
|
||||
max-width: 100vw;
|
||||
}
|
||||
|
||||
.cis-main-menu ul {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.cis-main-menu ul li {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@@ -44,5 +44,15 @@ export default {
|
||||
studiensemester_kurzbz
|
||||
}
|
||||
};
|
||||
}
|
||||
},
|
||||
getContainingOrNearestByDateRange(from, to) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/organisation/studiensemester/getContainingOrNearestByDateRange',
|
||||
params: {
|
||||
from,
|
||||
to,
|
||||
}
|
||||
};
|
||||
},
|
||||
};
|
||||
@@ -1,6 +1,7 @@
|
||||
import FhcCalendar from "../../Calendar/LvPlan.js";
|
||||
|
||||
import ApiLvPlan from '../../../api/factory/lvPlan.js';
|
||||
import ApiStudienSemester from '../../../api/factory/studiensemester.js';
|
||||
import ApiAuthinfo from '../../../api/factory/authinfo.js';
|
||||
|
||||
export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week";
|
||||
@@ -16,13 +17,12 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
studiensemester_kurzbz: null,
|
||||
studiensemester_start: null,
|
||||
studiensemester_ende: null,
|
||||
uid: null,
|
||||
isMitarbeiter: false,
|
||||
isStudent: false,
|
||||
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
||||
startSemester: null,
|
||||
endSemester: null,
|
||||
};
|
||||
},
|
||||
inject: ["isMobile"],
|
||||
@@ -48,9 +48,12 @@ export default {
|
||||
return this.propsViewData?.mode;
|
||||
},
|
||||
downloadLinks() {
|
||||
if (!this.studiensemester_start || !this.studiensemester_ende || !this.uid)
|
||||
return false;
|
||||
const startDate = this.startSemester?.start;
|
||||
const endDate = this.endSemester ? this.endSemester.ende : this.startSemester?.ende;
|
||||
|
||||
if (!startDate || !endDate || !this.uid)
|
||||
return false;
|
||||
|
||||
let type = false;
|
||||
type = this.isStudent ? 'student' : type;
|
||||
type = this.isMitarbeiter ? 'lektor' : type;
|
||||
@@ -61,10 +64,10 @@ export default {
|
||||
|
||||
const opts = { zone: this.timezone };
|
||||
const start = luxon.DateTime
|
||||
.fromISO(this.studiensemester_start, opts)
|
||||
.fromISO(startDate, opts)
|
||||
.toUnixInteger();
|
||||
const ende = luxon.DateTime
|
||||
.fromISO(this.studiensemester_ende, opts)
|
||||
.fromISO(endDate, opts)
|
||||
.toUnixInteger();
|
||||
|
||||
const download_link = FHC_JS_DATA_STORAGE_OBJECT.app_root
|
||||
@@ -109,16 +112,21 @@ export default {
|
||||
}
|
||||
});
|
||||
},
|
||||
updateRange(rangeInterval) {
|
||||
this.$api
|
||||
.call(ApiLvPlan.studiensemesterDateInterval(
|
||||
rangeInterval.end.startOf('week').toISODate()
|
||||
))
|
||||
.then(res => {
|
||||
this.studiensemester_kurzbz = res.data.studiensemester_kurzbz;
|
||||
this.studiensemester_start = res.data.start;
|
||||
this.studiensemester_ende = res.data.ende;
|
||||
});
|
||||
async updateRange(rangeInterval) {
|
||||
const semesterResponse = await this.$api.call(
|
||||
ApiStudienSemester.getContainingOrNearestByDateRange(
|
||||
rangeInterval.s.toISO().slice(0, 10),
|
||||
rangeInterval.e.toISO().slice(0, 10),
|
||||
),
|
||||
);
|
||||
this.startSemester =
|
||||
semesterResponse.data.length
|
||||
? semesterResponse.data[0]
|
||||
: null;
|
||||
this.endSemester =
|
||||
semesterResponse.data.length > 1
|
||||
? semesterResponse.data[1]
|
||||
: null;
|
||||
},
|
||||
getPromiseFunc(start, end) {
|
||||
return [
|
||||
@@ -142,8 +150,11 @@ export default {
|
||||
<div class="cis-lvplan-personal d-flex flex-column h-100">
|
||||
<h2>
|
||||
{{ $p.t('lehre/stundenplan') }}
|
||||
<span v-if="studiensemester_kurzbz" class="ps-3">
|
||||
{{ studiensemester_kurzbz }}
|
||||
<span v-if="startSemester?.studiensemester_kurzbz">
|
||||
{{ startSemester.studiensemester_kurzbz }}
|
||||
<span v-if="endSemester?.studiensemester_kurzbz">
|
||||
{{ "- " + endSemester.studiensemester_kurzbz }}
|
||||
</span>
|
||||
</span>
|
||||
</h2>
|
||||
<hr>
|
||||
|
||||
@@ -5,6 +5,7 @@ import FhcCalendar from "../../Calendar/LvPlan.js";
|
||||
import ApiLvPlan from "../.././../api/factory/lvPlan.js";
|
||||
import ApiOtherLvPlan from "../.././../api/factory/otherLvPlan.js";
|
||||
import ApiAuthinfo from "../../../api/factory/authinfo.js";
|
||||
import ApiStudienSemester from '../../../api/factory/studiensemester.js';
|
||||
|
||||
export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week";
|
||||
export const DEFAULT_MODE_LVPLAN_MOBILE = "List";
|
||||
@@ -22,9 +23,6 @@ export default {
|
||||
data() {
|
||||
return {
|
||||
localProps: {},
|
||||
studiensemester_kurzbz: null,
|
||||
studiensemester_start: null,
|
||||
studiensemester_ende: null,
|
||||
isOtherPersonMitarbeiter: false,
|
||||
isOtherPersonStudent: false,
|
||||
currentStgBezeichnung: null,
|
||||
@@ -36,6 +34,8 @@ export default {
|
||||
photo: "",
|
||||
},
|
||||
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
||||
startSemester: null,
|
||||
endSemester: null,
|
||||
};
|
||||
},
|
||||
inject: ["isMobile"],
|
||||
@@ -67,11 +67,10 @@ export default {
|
||||
// do not show download links in otherLvPlan Mode
|
||||
return false;
|
||||
|
||||
if (
|
||||
!this.studiensemester_start ||
|
||||
!this.studiensemester_ende ||
|
||||
!this.propsViewData.otherUid
|
||||
)
|
||||
const startDate = this.startSemester?.start;
|
||||
const endDate = this.endSemester ? this.endSemester.ende : this.startSemester?.ende;
|
||||
|
||||
if (!startDate || !endDate || !this.uid)
|
||||
return false;
|
||||
|
||||
const type = this.isOtherPersonStudent
|
||||
@@ -84,11 +83,11 @@ export default {
|
||||
|
||||
const opts = { zone: this.timezone };
|
||||
const start = luxon.DateTime.fromISO(
|
||||
this.studiensemester_start,
|
||||
startDate,
|
||||
opts,
|
||||
).toUnixInteger();
|
||||
const ende = luxon.DateTime.fromISO(
|
||||
this.studiensemester_ende,
|
||||
endDate,
|
||||
opts,
|
||||
).toUnixInteger();
|
||||
|
||||
@@ -166,19 +165,21 @@ export default {
|
||||
},
|
||||
});
|
||||
},
|
||||
updateRange(rangeInterval) {
|
||||
this.$api
|
||||
.call(
|
||||
ApiLvPlan.studiensemesterDateInterval(
|
||||
rangeInterval.end.startOf("week").toISODate(),
|
||||
),
|
||||
)
|
||||
.then((res) => {
|
||||
this.studiensemester_kurzbz =
|
||||
res.data.studiensemester_kurzbz;
|
||||
this.studiensemester_start = res.data.start;
|
||||
this.studiensemester_ende = res.data.ende;
|
||||
});
|
||||
async updateRange(rangeInterval) {
|
||||
const semesterResponse = await this.$api.call(
|
||||
ApiStudienSemester.getContainingOrNearestByDateRange(
|
||||
rangeInterval.s.toISO().slice(0, 10),
|
||||
rangeInterval.e.toISO().slice(0, 10),
|
||||
),
|
||||
);
|
||||
this.startSemester =
|
||||
semesterResponse.data.length
|
||||
? semesterResponse.data[0]
|
||||
: null;
|
||||
this.endSemester =
|
||||
semesterResponse.data.length > 1
|
||||
? semesterResponse.data[1]
|
||||
: null;
|
||||
},
|
||||
getPromiseFunc(start, end) {
|
||||
return [
|
||||
@@ -250,8 +251,14 @@ export default {
|
||||
<div class="d-flex flex-column h-100">
|
||||
<h2>
|
||||
<div class="d-flex flex-row justify-content-between align-items-center">
|
||||
<span>
|
||||
{{ $p.t('lehre/stundenplan') + (studiensemester_kurzbz ? " " + studiensemester_kurzbz : "") }}
|
||||
<span>
|
||||
{{ $p.t('lehre/stundenplan') }}
|
||||
<span v-if="startSemester?.studiensemester_kurzbz">
|
||||
{{ startSemester.studiensemester_kurzbz }}
|
||||
<span v-if="endSemester?.studiensemester_kurzbz">
|
||||
{{ "- " + endSemester.studiensemester_kurzbz }}
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
<div @click="this.$router.push({name: 'ProfilView', params: {uid: propsViewData.otherUid}})" type="button" class="d-flex flex-row align-items-center gap-3">
|
||||
<span v-if="otherPersonData.fullNameWithTitle?.length">
|
||||
|
||||
@@ -186,7 +186,7 @@ export default {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav id="nav-main" class="offcanvas offcanvas-start" tabindex="-1" aria-labelledby="nav-main-btn" data-bs-backdrop="false">
|
||||
<nav id="nav-main" class="cis-main-menu offcanvas offcanvas-start" tabindex="-1" aria-labelledby="nav-main-btn" data-bs-backdrop="false">
|
||||
<div id="nav-main-sticky">
|
||||
<div class="d-flex flex-row h-100">
|
||||
<div class="offcanvas-body p-0">
|
||||
|
||||
@@ -162,6 +162,7 @@ export default {
|
||||
<div class="btn-group w-100">
|
||||
<a :target="target"
|
||||
:href="(entry.menu_open && hasFullLink) ? entry.url : null"
|
||||
draggable="false"
|
||||
@click="toggleCollapse"
|
||||
:class="{
|
||||
'btn btn-default rounded-0 text-start': true,
|
||||
@@ -180,12 +181,15 @@ export default {
|
||||
</div>
|
||||
<ul ref="children"
|
||||
class="nav w-100 collapse">
|
||||
<cis-menu-entry :highestMatchingUrlCount="highestMatchingUrlCount" :activeContent="activeContent" v-for="child in entry.childs" :key="child" :entry="child" :level="level + 1"/>
|
||||
<li>
|
||||
<cis-menu-entry :highestMatchingUrlCount="highestMatchingUrlCount" :activeContent="activeContent" v-for="child in entry.childs" :key="child" :entry="child" :level="level + 1"/>
|
||||
</li>
|
||||
</ul>
|
||||
</template>
|
||||
<a v-else
|
||||
:href="entry.url"
|
||||
:target="target"
|
||||
draggable="false"
|
||||
:class="{
|
||||
'btn btn-default rounded-0 w-100 text-start': true,
|
||||
['btn-level-' + level]: true,
|
||||
|
||||
@@ -2,15 +2,16 @@ export default {
|
||||
props: {
|
||||
data: {
|
||||
type: String,
|
||||
}
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {}
|
||||
return {};
|
||||
},
|
||||
template: /*html*/`
|
||||
template: /*html*/ `
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<span >{{$p.t('profil','fhAusweisStatus',[data])}}</span>
|
||||
<span v-if="data">{{$p.t('profil','fhAusweisStatus',[data])}}</span>
|
||||
<span v-else>{{$p.t('profil','fhAusweisStatusNichtAusgegeben')}}</span>
|
||||
</div>
|
||||
</div>`,
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import BsModal from "../Bootstrap/Modal.js";
|
||||
import HeightTransition from "../Tranistion/HeightTransition.js";
|
||||
import MissingPermissionWidget from "../DashboardWidget/MissingPermission.js";
|
||||
|
||||
import { enableDragDropTouch } from "../../../../vendor/drag-drop-touch-js/dragdroptouch/dist/drag-drop-touch.esm.min.js";
|
||||
|
||||
@@ -112,6 +113,12 @@ export default {
|
||||
isPinned() {
|
||||
return this.place?.pinned ? true : false;
|
||||
},
|
||||
permitted() {
|
||||
// widgets without a linked permission (or before the template loaded)
|
||||
// are considered permitted; the backend sets permitted === false only
|
||||
// when the user is missing the widget's required permission
|
||||
return this.widgetTemplate?.permitted !== false;
|
||||
},
|
||||
ready() {
|
||||
return this.component && this.arguments !== null;
|
||||
}
|
||||
@@ -169,7 +176,11 @@ export default {
|
||||
&& this.widgetTemplate.widget_id
|
||||
&& this.widgetTemplate.arguments
|
||||
) {
|
||||
let component = (await import(this.widgetTemplate.setup.file)).default;
|
||||
// render the "missing permission" screen instead of the actual
|
||||
// widget when the user does not hold the widget's linked permission
|
||||
let component = this.permitted
|
||||
? (await import(this.widgetTemplate.setup.file)).default
|
||||
: MissingPermissionWidget;
|
||||
this.$options.components["widget" + this.widgetTemplate.widget_id] = component;
|
||||
this.component = "widget" + this.widgetTemplate.widget_id;
|
||||
this.arguments = { ...this.widgetTemplate.arguments, ...this.config };
|
||||
@@ -269,7 +280,7 @@ export default {
|
||||
</template>
|
||||
<!-- widget link -->
|
||||
<a
|
||||
v-if="widgetTemplate.setup.cis4link"
|
||||
v-if="widgetTemplate.setup.cis4link && permitted"
|
||||
:href="getWidgetC4Link(widgetTemplate)"
|
||||
class="col-auto ms-auto"
|
||||
:aria-label="$p.t('dashboard/widget_link')"
|
||||
|
||||
@@ -14,10 +14,14 @@ export default {
|
||||
callbacks: {}
|
||||
}),
|
||||
computed: {
|
||||
// filter widgets away the user has no permissions for
|
||||
availableWidgets() {
|
||||
return (this.widgets || []).filter(widget => widget.permitted !== false);
|
||||
},
|
||||
hasAnyWidgets() {
|
||||
if (!this.widgets)
|
||||
return false;
|
||||
if (!this.widgets.length && !this.hiddenWidgets?.length)
|
||||
if (!this.availableWidgets.length && !this.hiddenWidgets?.length)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
@@ -54,7 +58,7 @@ export default {
|
||||
<template v-slot:default>
|
||||
<template v-if="widgets && hiddenWidgets">
|
||||
<div
|
||||
v-if="!widgets.length && !hiddenWidgets.length"
|
||||
v-if="!availableWidgets.length && !hiddenWidgets.length"
|
||||
class="row g-2"
|
||||
>
|
||||
<div>{{ $p.t('dashboard/noWidgetsAvailable') }}</div>
|
||||
@@ -74,16 +78,17 @@ export default {
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="widgets.length"
|
||||
v-if="availableWidgets.length"
|
||||
class="row g-2"
|
||||
>
|
||||
<div
|
||||
v-for="widget in widgets"
|
||||
<template
|
||||
v-for="widget in availableWidgets"
|
||||
:key="widget.widget_id"
|
||||
class="widget-icon-container col-sm-6 col-md-4 col-lg-3 col-xl-2"
|
||||
>
|
||||
<widget-icon @select="pick" :widget="widget"></widget-icon>
|
||||
</div>
|
||||
<div v-if="widget.permitted" class="widget-icon-container col-sm-6 col-md-4 col-lg-3 col-xl-2">
|
||||
<widget-icon @select="pick" :widget="widget"></widget-icon>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
import AbstractWidget from './Abstract.js';
|
||||
|
||||
/**
|
||||
* Fallback screen rendered in place of a widget when the current user is missing
|
||||
* the permission (berechtigung_kurzbz) linked to that widget. Used for widgets
|
||||
* that are already on a user's dashboard but whose required permission the user
|
||||
* no longer holds.
|
||||
*/
|
||||
export default {
|
||||
mixins: [
|
||||
AbstractWidget
|
||||
],
|
||||
created() {
|
||||
this.$emit('setConfig', false);
|
||||
},
|
||||
template: /*html*/`
|
||||
<div class="dashboard-widget-missing-permission d-flex flex-column justify-content-center align-items-center text-center h-100 p-3 text-body-secondary">
|
||||
<i class="fa-solid fa-lock fa-2x mb-2" aria-hidden="true"></i>
|
||||
<p class="mb-0">{{ $p.t('dashboard/widget_missing_permission') }}</p>
|
||||
</div>`
|
||||
}
|
||||
@@ -95,6 +95,7 @@ require_once('dbupdate_3.4/75469_le_optional_4_projektarbeit.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/75888_reihungstest_mehrfachdurchfuehrung.php');
|
||||
require_once('dbupdate_3.4/63132_Berechtigungssystem_Rollen_in_Rollen.php');
|
||||
require_once('dbupdate_3.4/76150_perm_other_lv_plan.php');
|
||||
require_once('dbupdate_3.4/68957_dashboard_bookmark_neue_Spalte_sort.php');
|
||||
require_once('dbupdate_3.4/68530_Dashboard_Cleanup.php');
|
||||
@@ -103,7 +104,7 @@ require_once('dbupdate_3.4/76160_lvv_favorites.php');
|
||||
require_once('dbupdate_3.4/77080_tabulator_presets_table.php');
|
||||
require_once('dbupdate_3.4/78292_gehaltsanpassungtyp.php');
|
||||
require_once('dbupdate_3.4/54225_reihungstest_ablauf_fuer_quereinsteiger.php');
|
||||
|
||||
require_once('dbupdate_3.4/77757_widgets_berechtigungen.php');
|
||||
|
||||
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
|
||||
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
|
||||
@@ -447,7 +448,7 @@ $tabellen=array(
|
||||
"system.tbl_jobtypes" => array("type", "description"),
|
||||
"system.tbl_phrase" => array("phrase_id","app","phrase","insertamum","insertvon","category"),
|
||||
"system.tbl_phrasentext" => array("phrasentext_id","phrase_id","sprache","orgeinheit_kurzbz","orgform_kurzbz","text","description","insertamum","insertvon"),
|
||||
"system.tbl_rolle" => array("rolle_kurzbz","beschreibung"),
|
||||
"system.tbl_rolle" => array("rolle_kurzbz","beschreibung","lange_beschreibung"),
|
||||
"system.tbl_rolleberechtigung" => array("berechtigung_kurzbz","rolle_kurzbz","art","anmerkung","insertamum","insertvon"),
|
||||
"system.tbl_verarbeitungstaetigkeit" => array("taetigkeit_kurzbz", "bezeichnung", "bezeichnung_mehrsprachig","aktiv"),
|
||||
"system.tbl_webservicelog" => array("webservicelog_id","webservicetyp_kurzbz","request_id","beschreibung","request_data","execute_time","execute_user"),
|
||||
|
||||
@@ -0,0 +1,198 @@
|
||||
<?php
|
||||
|
||||
// Add column lange_beschreibung to system.tbl_rolle
|
||||
if (!$result = @$db->db_query('SELECT "lange_beschreibung" FROM "system"."tbl_rolle" LIMIT 1'))
|
||||
{
|
||||
$qry = 'ALTER TABLE "system"."tbl_rolle" ADD "lange_beschreibung" TEXT NULL;';
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_rolle: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>Added column lange_beschreibung to table system.tbl_rolle';
|
||||
}
|
||||
|
||||
// Creates table system.tbl_rolle_rolle if it doesn't exist and grants privileges
|
||||
if (!$result = @$db->db_query('SELECT 1 FROM system.tbl_rolle_rolle LIMIT 1'))
|
||||
{
|
||||
$qry = 'CREATE TABLE system.tbl_rolle_rolle (
|
||||
main_rolle_kurzbz VARCHAR(32) NOT NULL,
|
||||
basic_rolle_kurzbz VARCHAR(32) NOT NULL,
|
||||
insertamum TIMESTAMP NOT NULL DEFAULT NOW() ,
|
||||
insertvon VARCHAR(32) NOT NULL
|
||||
);';
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_rolle_rolle: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>system.tbl_rolle_rolle table created';
|
||||
|
||||
$qry = 'COMMENT ON TABLE system.tbl_rolle_rolle IS \'Table to save the connections between permission roles.\';
|
||||
COMMENT ON COLUMN system.tbl_rolle_rolle.main_rolle_kurzbz IS \'Main role\';
|
||||
COMMENT ON COLUMN system.tbl_rolle_rolle.basic_rolle_kurzbz IS \'Basic role\';
|
||||
COMMENT ON COLUMN system.tbl_rolle_rolle.insertamum IS \'Insert date\';
|
||||
COMMENT ON COLUMN system.tbl_rolle_rolle.insertvon IS \'Insert by\';';
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_rolle_rolle: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>system.tbl_rolle_rolle table commented';
|
||||
|
||||
$qry = 'ALTER TABLE system.tbl_rolle_rolle ADD CONSTRAINT pk_tbl_rolle_rolle PRIMARY KEY (main_rolle_kurzbz, basic_rolle_kurzbz);';
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_rolle_rolle: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>system.tbl_rolle_rolle primary key pk_tbl_rolle_rolle added';
|
||||
|
||||
$qry = 'ALTER TABLE system.tbl_rolle_rolle
|
||||
ADD CONSTRAINT fk_tbl_rolle_rolle_main_tbl_rolle
|
||||
FOREIGN KEY (main_rolle_kurzbz)
|
||||
REFERENCES system.tbl_rolle (rolle_kurzbz)
|
||||
ON DELETE RESTRICT ON UPDATE CASCADE;';
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_rolle_rolle: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>system.tbl_rolle_rolle foreign key fk_tbl_rolle_rolle_main_tbl_rolle added';
|
||||
|
||||
$qry = 'ALTER TABLE system.tbl_rolle_rolle
|
||||
ADD CONSTRAINT fk_tbl_rolle_rolle_basic_tbl_rolle
|
||||
FOREIGN KEY (basic_rolle_kurzbz)
|
||||
REFERENCES system.tbl_rolle (rolle_kurzbz)
|
||||
ON DELETE RESTRICT ON UPDATE CASCADE;';
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_rolle_rolle: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>system.tbl_rolle_rolle foreign key fk_tbl_rolle_rolle_basic_tbl_rolle added';
|
||||
|
||||
$qry = 'GRANT SELECT ON TABLE system.tbl_rolle_rolle TO web;';
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_rolle_rolle: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>Granted privileges to <strong>web</strong> on system.tbl_rolle_rolle';
|
||||
|
||||
$qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE system.tbl_rolle_rolle TO vilesci;';
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_rolle_rolle: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>Granted privileges to <strong>vilesci</strong> on system.tbl_rolle_rolle';
|
||||
}
|
||||
|
||||
// Get the view definition for the vw_berechtigung_nichtrekursiv view
|
||||
if ($result = $db->db_query("SELECT view_definition FROM information_schema.views WHERE table_schema='system' AND table_name='vw_berechtigung_nichtrekursiv'"))
|
||||
{
|
||||
// If exists (at this point should!)
|
||||
if ($row = $db->db_fetch_object($result))
|
||||
{
|
||||
// If the definition does _not_ contain the system.tbl_rolle_rolle table
|
||||
if (!mb_stristr($row->view_definition, 'system.tbl_rolle_rolle'))
|
||||
{
|
||||
$qry = "
|
||||
CREATE OR REPLACE VIEW system.vw_berechtigung_nichtrekursiv AS
|
||||
SELECT
|
||||
uid, berechtigung_kurzbz,
|
||||
-- art zusammenfassung und nur die nehmen die gleich sind
|
||||
CASE WHEN length(art)>length(art1) THEN art1 ELSE art END as art,
|
||||
oe_kurzbz, kostenstelle_id
|
||||
FROM
|
||||
(
|
||||
-- Normal
|
||||
SELECT
|
||||
benutzerberechtigung_id, tbl_benutzerrolle.uid, tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1,
|
||||
tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start,
|
||||
tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon,
|
||||
tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung
|
||||
FROM
|
||||
system.tbl_benutzerrolle JOIN system.tbl_berechtigung USING(berechtigung_kurzbz)
|
||||
|
||||
-- Rollen
|
||||
UNION
|
||||
SELECT
|
||||
benutzerberechtigung_id, tbl_benutzerrolle.uid, tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_benutzerrolle.rolle_kurzbz, tbl_berechtigung.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_rolleberechtigung.art art1,
|
||||
tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start,
|
||||
tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon,
|
||||
tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung
|
||||
FROM
|
||||
system.tbl_benutzerrolle JOIN system.tbl_rolle USING(rolle_kurzbz)
|
||||
JOIN system.tbl_rolleberechtigung USING(rolle_kurzbz)
|
||||
JOIN system.tbl_berechtigung ON(tbl_rolleberechtigung.berechtigung_kurzbz=tbl_berechtigung.berechtigung_kurzbz)
|
||||
|
||||
-- Rollen in Rollen
|
||||
UNION
|
||||
SELECT
|
||||
benutzerberechtigung_id, tbl_benutzerrolle.uid, tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_benutzerrolle.rolle_kurzbz, tbl_berechtigung.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_rolleberechtigung.art art1,
|
||||
tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start,
|
||||
tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon,
|
||||
tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung
|
||||
FROM
|
||||
system.tbl_benutzerrolle
|
||||
JOIN system.tbl_rolle USING(rolle_kurzbz)
|
||||
JOIN system.tbl_rolle_rolle ON system.tbl_rolle_rolle.main_rolle_kurzbz = system.tbl_rolle.rolle_kurzbz
|
||||
JOIN system.tbl_rolleberechtigung ON system.tbl_rolleberechtigung.rolle_kurzbz = system.tbl_rolle_rolle.basic_rolle_kurzbz
|
||||
JOIN system.tbl_berechtigung ON(tbl_rolleberechtigung.berechtigung_kurzbz=tbl_berechtigung.berechtigung_kurzbz)
|
||||
|
||||
-- Funktionen
|
||||
UNION
|
||||
SELECT
|
||||
benutzerberechtigung_id, tbl_benutzerfunktion.uid, tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1,
|
||||
tbl_benutzerfunktion.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start,
|
||||
tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon,
|
||||
tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung
|
||||
FROM
|
||||
system.tbl_benutzerrolle JOIN public.tbl_benutzerfunktion USING(funktion_kurzbz)
|
||||
WHERE
|
||||
(tbl_benutzerfunktion.datum_von IS NULL OR tbl_benutzerfunktion.datum_von<=now())
|
||||
AND (tbl_benutzerfunktion.datum_bis IS NULL OR tbl_benutzerfunktion.datum_bis>=now())
|
||||
|
||||
-- Funktion Mitarbeiter
|
||||
UNION
|
||||
SELECT
|
||||
benutzerberechtigung_id, vw_mitarbeiter.uid, tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1,
|
||||
tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start,
|
||||
tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon,
|
||||
tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung
|
||||
FROM
|
||||
system.tbl_benutzerrolle, campus.vw_mitarbeiter
|
||||
WHERE
|
||||
tbl_benutzerrolle.funktion_kurzbz='Mitarbeiter' and vw_mitarbeiter.aktiv
|
||||
|
||||
|
||||
-- Funktion Student
|
||||
UNION
|
||||
SELECT
|
||||
benutzerberechtigung_id, vw_student.uid, tbl_benutzerrolle.funktion_kurzbz,
|
||||
tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1,
|
||||
tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start,
|
||||
tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon,
|
||||
tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung
|
||||
FROM
|
||||
system.tbl_benutzerrolle, campus.vw_student
|
||||
WHERE
|
||||
tbl_benutzerrolle.funktion_kurzbz='Student' and vw_student.aktiv
|
||||
) as a
|
||||
JOIN public.tbl_benutzer USING(uid)
|
||||
WHERE
|
||||
-- Datumsgrenzen beruecksichtigen
|
||||
tbl_benutzer.aktiv = true
|
||||
AND (a.start<=now() OR a.start is null)
|
||||
AND (a.ende>=now() OR a.ende is null)
|
||||
|
||||
-- Neagtiv Rechte entfernen
|
||||
AND not negativ
|
||||
AND NOT EXISTS(SELECT
|
||||
1
|
||||
FROM
|
||||
system.tbl_benutzerrolle JOIN system.tbl_berechtigung USING(berechtigung_kurzbz) WHERE uid=a.uid AND berechtigung_kurzbz=a.berechtigung_kurzbz AND negativ);
|
||||
|
||||
GRANT SELECT ON system.vw_berechtigung_nichtrekursiv TO web;
|
||||
GRANT SELECT ON system.vw_berechtigung_nichtrekursiv TO vilesci;
|
||||
";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>system.vw_berechtigung_nichtrekursiv:'.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>system.vw_berechtigung_nichtrekursiv angepasst damit nur aktive Benutzer beruecksichtigt werden';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
/* Copyright (C) 2026 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 2 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, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Beschreibung:
|
||||
* Dashboard Widgets: Verknüpfung einer (einzelnen) Berechtigung pro Widget.
|
||||
* Neue Spalte dashboard.tbl_widget.berechtigung_kurzbz mit FK auf
|
||||
* system.tbl_berechtigung. Ist die Spalte NULL, erfordert das Widget keine
|
||||
* gesonderte Berechtigung. Benutzer denen die verknüpfte Berechtigung fehlt,
|
||||
* bekommen das Widget nicht mehr zur Auswahl angezeigt bzw. sehen (falls bereits
|
||||
* am Dashboard) einen "Fehlende Berechtigung"-Screen.
|
||||
*/
|
||||
if (! defined('DB_NAME')) exit('No direct script access allowed');
|
||||
|
||||
// Add column dashboard.tbl_widget.berechtigung_kurzbz (FK => system.tbl_berechtigung)
|
||||
if ($result = @$db->db_query("
|
||||
SELECT 1
|
||||
FROM information_schema.columns
|
||||
WHERE table_schema = 'dashboard'
|
||||
AND table_name = 'tbl_widget'
|
||||
AND column_name = 'berechtigung_kurzbz';"))
|
||||
{
|
||||
if ($db->db_num_rows($result) == 0)
|
||||
{
|
||||
$qry = "
|
||||
ALTER TABLE dashboard.tbl_widget
|
||||
ADD COLUMN berechtigung_kurzbz VARCHAR(32) NULL;
|
||||
|
||||
ALTER TABLE dashboard.tbl_widget
|
||||
ADD CONSTRAINT tbl_widget_berechtigung_fk
|
||||
FOREIGN KEY (berechtigung_kurzbz)
|
||||
REFERENCES system.tbl_berechtigung (berechtigung_kurzbz)
|
||||
ON UPDATE CASCADE ON DELETE SET NULL;";
|
||||
|
||||
if (!$db->db_query($qry))
|
||||
{
|
||||
echo '<strong>dashboard.tbl_widget: '.$db->db_last_error().'</strong><br>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo 'dashboard.tbl_widget: Spalte berechtigung_kurzbz (FK system.tbl_berechtigung) hinzugefuegt<br>';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -29443,6 +29443,26 @@ array(
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'profil',
|
||||
'phrase' => 'fhAusweisStatusNichtAusgegeben',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Der FH Ausweis wurde noch nicht ausgegeben.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'The FH ID card has not been issued yet.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'profil',
|
||||
@@ -49600,6 +49620,26 @@ array(
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_missing_permission',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Ihnen fehlt die erforderliche Berechtigung, um dieses Widget anzuzeigen.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'You do not have the permission required to display this widget.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
// CIS4 phrases from legacy code end
|
||||
// FHC4 Phrases Abschlusspruefung
|
||||
array(
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
INSERT INTO lehre.tbl_projektarbeit
|
||||
(projektarbeit_id, projekttyp_kurzbz, titel, lehreinheit_id, student_uid, firma_id, note, punkte, beginn, ende, faktor, freigegeben, gesperrtbis, stundensatz, themenbereich, anmerkung, updateamum, updatevon, insertamum, insertvon, ext_id, gesamtstunden, titel_english, sprache, seitenanzahl, abgabedatum, kontrollschlagwoerter, schlagwoerter, schlagwoerter_en, abstract, abstract_en, "final") VALUES
|
||||
(1, 'Bachelor', 'Auswirkung der Sonneneinstrahlung auf die Gesundheit', 46111, 's46b413', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true),
|
||||
(2, 'Bachelor', 'Neue Unterrichtsmethoden mit KI', 46111, 's46b414', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true),
|
||||
(3, 'Bachelor', 'Betrugsbekämpfung bei Anwesenheitskontrolle', 46111, 's46b415', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true),
|
||||
(4, 'Bachelor', 'Neuronale Netze', 46111, 's46b416', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true)
|
||||
(projektarbeit_id, projekttyp_kurzbz, titel, lehreinheit_id, student_uid, firma_id, note, punkte, beginn, ende, faktor, freigegeben, gesperrtbis, stundensatz, themenbereich, anmerkung, updateamum, updatevon, insertamum, insertvon, ext_id, gesamtstunden, titel_english, sprache, seitenanzahl, abgabedatum, kontrollschlagwoerter, schlagwoerter, schlagwoerter_en, abstract, abstract_en, "final", lehrveranstaltung_id, studiensemester_kurzbz) VALUES
|
||||
(1, 'Bachelor', 'Auswirkung der Sonneneinstrahlung auf die Gesundheit', 46111, 's46b413', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)),
|
||||
(2, 'Bachelor', 'Neue Unterrichtsmethoden mit KI', 46111, 's46b414', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)),
|
||||
(3, 'Bachelor', 'Betrugsbekämpfung bei Anwesenheitskontrolle', 46111, 's46b415', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)),
|
||||
(4, 'Bachelor', 'Neuronale Netze', 46111, 's46b416', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1))
|
||||
;
|
||||
|
||||
INSERT INTO lehre.tbl_projektbetreuer
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
-- Create the dummy main role
|
||||
INSERT INTO system.tbl_rolle (rolle_kurzbz, beschreibung, lange_beschreibung)
|
||||
VALUES ('dummymainrole', 'Main dummy role', 'This is the main dummy role');
|
||||
|
||||
-- Create the dummy basic role
|
||||
INSERT INTO system.tbl_rolle (rolle_kurzbz, beschreibung, lange_beschreibung)
|
||||
VALUES ('dummybasicrole', 'Basic dummy role', 'This is the basic dummy role');
|
||||
|
||||
-- Link the basic dummy role to the main dummy role
|
||||
INSERT INTO system.tbl_rolle_rolle (main_rolle_kurzbz, basic_rolle_kurzbz, insertvon)
|
||||
VALUES ('dummymainrole', 'dummybasicrole', 'seeders');
|
||||
|
||||
-- Create the dummy main permission
|
||||
INSERT INTO system.tbl_berechtigung (berechtigung_kurzbz, beschreibung)
|
||||
VALUES ('dummymainpermission', 'Main dummy permission');
|
||||
|
||||
-- Create the dummy basic permission
|
||||
INSERT INTO system.tbl_berechtigung (berechtigung_kurzbz, beschreibung)
|
||||
VALUES ('dummybasicpermission', 'Basic dummy permission');
|
||||
|
||||
-- Create the dummy user permission
|
||||
INSERT INTO system.tbl_berechtigung (berechtigung_kurzbz, beschreibung)
|
||||
VALUES ('dummyuserpermission', 'User dummy permission');
|
||||
|
||||
-- Link the main dummy permission to the main dummy role
|
||||
INSERT INTO system.tbl_rolleberechtigung (berechtigung_kurzbz, rolle_kurzbz, art, insertvon)
|
||||
VALUES ('dummymainpermission', 'dummymainrole', 'suid', 'seeders');
|
||||
|
||||
-- Link the basic dummy permission to the basic dummy role
|
||||
INSERT INTO system.tbl_rolleberechtigung (berechtigung_kurzbz, rolle_kurzbz, art, insertvon)
|
||||
VALUES ('dummybasicpermission', 'dummybasicrole', 'suid', 'seeders');
|
||||
|
||||
-- Link the user dummy permission to the user
|
||||
INSERT INTO system.tbl_benutzerrolle (rolle_kurzbz, berechtigung_kurzbz, uid, art, insertvon)
|
||||
VALUES (NULL, 'dummyuserpermission', 'demoadmin', 'suid', 'seeders');
|
||||
|
||||
-- Link the main dummy role to the user
|
||||
INSERT INTO system.tbl_benutzerrolle (rolle_kurzbz, berechtigung_kurzbz, uid, art, insertvon)
|
||||
VALUES ('dummymainrole', NULL, 'demoadmin', 'suid', 'seeders');
|
||||
|
||||
@@ -1,143 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Verifies that properties are declared correctly.
|
||||
*
|
||||
* NOTE: It simply overrides the method processMemberVar of the Standards\PSR2\Sniffs\Classes\PropertyDeclarationSniff class
|
||||
*
|
||||
*/
|
||||
|
||||
namespace PHP_CodeSniffer\Standards\FHComplete\Sniffs\Classes;
|
||||
|
||||
use PHP_CodeSniffer\Files\File;
|
||||
use PHP_CodeSniffer\Sniffs\AbstractVariableSniff;
|
||||
use PHP_CodeSniffer\Util\Tokens;
|
||||
use PHP_CodeSniffer\Standards\PSR2\Sniffs\Classes\PropertyDeclarationSniff;
|
||||
|
||||
class FHCPropertyDeclarationSniff extends PropertyDeclarationSniff
|
||||
{
|
||||
/**
|
||||
* Processes the function tokens within the class.
|
||||
*
|
||||
* NOTE: it does not check if the property name starts with an underscore "_"
|
||||
*
|
||||
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found.
|
||||
* @param int $stackPtr The position where the token was found.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function processMemberVar(File $phpcsFile, $stackPtr)
|
||||
{
|
||||
$tokens = $phpcsFile->getTokens();
|
||||
|
||||
// Detect multiple properties defined at the same time. Throw an error
|
||||
// for this, but also only process the first property in the list so we don't
|
||||
// repeat errors.
|
||||
$find = Tokens::$scopeModifiers;
|
||||
$find[] = T_VARIABLE;
|
||||
$find[] = T_VAR;
|
||||
$find[] = T_SEMICOLON;
|
||||
$find[] = T_OPEN_CURLY_BRACKET;
|
||||
|
||||
$prev = $phpcsFile->findPrevious($find, ($stackPtr - 1));
|
||||
if ($tokens[$prev]['code'] === T_VARIABLE) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($tokens[$prev]['code'] === T_VAR) {
|
||||
$error = 'The var keyword must not be used to declare a property';
|
||||
$phpcsFile->addError($error, $stackPtr, 'VarUsed');
|
||||
}
|
||||
|
||||
$next = $phpcsFile->findNext([T_VARIABLE, T_SEMICOLON], ($stackPtr + 1));
|
||||
if ($next !== false && $tokens[$next]['code'] === T_VARIABLE) {
|
||||
$error = 'There must not be more than one property declared per statement';
|
||||
$phpcsFile->addError($error, $stackPtr, 'Multiple');
|
||||
}
|
||||
|
||||
try {
|
||||
$propertyInfo = $phpcsFile->getMemberProperties($stackPtr);
|
||||
if (empty($propertyInfo) === true) {
|
||||
return;
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// Turns out not to be a property after all.
|
||||
return;
|
||||
}
|
||||
|
||||
if ($propertyInfo['type'] !== '') {
|
||||
$typeToken = $propertyInfo['type_end_token'];
|
||||
$error = 'There must be 1 space after the property type declaration; %s found';
|
||||
if ($tokens[($typeToken + 1)]['code'] !== T_WHITESPACE) {
|
||||
$data = ['0'];
|
||||
$fix = $phpcsFile->addFixableError($error, $typeToken, 'SpacingAfterType', $data);
|
||||
if ($fix === true) {
|
||||
$phpcsFile->fixer->addContent($typeToken, ' ');
|
||||
}
|
||||
} else if ($tokens[($typeToken + 1)]['content'] !== ' ') {
|
||||
$next = $phpcsFile->findNext(T_WHITESPACE, ($typeToken + 1), null, true);
|
||||
if ($tokens[$next]['line'] !== $tokens[$typeToken]['line']) {
|
||||
$found = 'newline';
|
||||
} else {
|
||||
$found = $tokens[($typeToken + 1)]['length'];
|
||||
}
|
||||
|
||||
$data = [$found];
|
||||
|
||||
$nextNonWs = $phpcsFile->findNext(Tokens::$emptyTokens, ($typeToken + 1), null, true);
|
||||
if ($nextNonWs !== $next) {
|
||||
$phpcsFile->addError($error, $typeToken, 'SpacingAfterType', $data);
|
||||
} else {
|
||||
$fix = $phpcsFile->addFixableError($error, $typeToken, 'SpacingAfterType', $data);
|
||||
if ($fix === true) {
|
||||
if ($found === 'newline') {
|
||||
$phpcsFile->fixer->beginChangeset();
|
||||
for ($x = ($typeToken + 1); $x < $next; $x++) {
|
||||
$phpcsFile->fixer->replaceToken($x, '');
|
||||
}
|
||||
|
||||
$phpcsFile->fixer->addContent($typeToken, ' ');
|
||||
$phpcsFile->fixer->endChangeset();
|
||||
} else {
|
||||
$phpcsFile->fixer->replaceToken(($typeToken + 1), ' ');
|
||||
}
|
||||
}
|
||||
}
|
||||
}//end if
|
||||
}//end if
|
||||
|
||||
if ($propertyInfo['scope_specified'] === false) {
|
||||
$error = 'Visibility must be declared on property "%s"';
|
||||
$data = [$tokens[$stackPtr]['content']];
|
||||
$phpcsFile->addError($error, $stackPtr, 'ScopeMissing', $data);
|
||||
}
|
||||
|
||||
if ($propertyInfo['scope_specified'] === true && $propertyInfo['is_static'] === true) {
|
||||
$scopePtr = $phpcsFile->findPrevious(Tokens::$scopeModifiers, ($stackPtr - 1));
|
||||
$staticPtr = $phpcsFile->findPrevious(T_STATIC, ($stackPtr - 1));
|
||||
if ($scopePtr < $staticPtr) {
|
||||
return;
|
||||
}
|
||||
|
||||
$error = 'The static declaration must come after the visibility declaration';
|
||||
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'StaticBeforeVisibility');
|
||||
if ($fix === true) {
|
||||
$phpcsFile->fixer->beginChangeset();
|
||||
|
||||
for ($i = ($scopePtr + 1); $scopePtr < $stackPtr; $i++) {
|
||||
if ($tokens[$i]['code'] !== T_WHITESPACE) {
|
||||
break;
|
||||
}
|
||||
|
||||
$phpcsFile->fixer->replaceToken($i, '');
|
||||
}
|
||||
|
||||
$phpcsFile->fixer->replaceToken($scopePtr, '');
|
||||
$phpcsFile->fixer->addContentBefore($staticPtr, $propertyInfo['scope'].' ');
|
||||
|
||||
$phpcsFile->fixer->endChangeset();
|
||||
}
|
||||
}//end if
|
||||
|
||||
}//end processMemberVar()
|
||||
}//end class
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Ensures classes are in camel caps, and the first letter is capitalised.
|
||||
*
|
||||
* NOTE:
|
||||
* - it simply overrides the method process of the Standards\Squiz\Sniffs\Classes\ValidClassNameSniff class
|
||||
* - it contains a new implementation of PHP_CodeSniffer\Util\Common::isCamelCaps
|
||||
*
|
||||
*/
|
||||
|
||||
namespace PHP_CodeSniffer\Standards\FHComplete\Sniffs\Classes;
|
||||
|
||||
use PHP_CodeSniffer\Files\File;
|
||||
use PHP_CodeSniffer\Sniffs\Sniff;
|
||||
use PHP_CodeSniffer\Util\Common;
|
||||
use PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes\ValidClassNameSniff;
|
||||
|
||||
class FHCValidClassNameSniff extends ValidClassNameSniff
|
||||
{
|
||||
/**
|
||||
* Processes this test, when one of its tokens is encountered.
|
||||
*
|
||||
* NOTE: it does not check if the class name contains an underscore "_"
|
||||
*
|
||||
* @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being processed.
|
||||
* @param int $stackPtr The position of the current token in the
|
||||
* stack passed in $tokens.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function process(File $phpcsFile, $stackPtr)
|
||||
{
|
||||
$tokens = $phpcsFile->getTokens();
|
||||
|
||||
if (isset($tokens[$stackPtr]['scope_opener']) === false) {
|
||||
$error = 'Possible parse error: %s missing opening or closing brace';
|
||||
$data = [$tokens[$stackPtr]['content']];
|
||||
$phpcsFile->addWarning($error, $stackPtr, 'MissingBrace', $data);
|
||||
return;
|
||||
}
|
||||
|
||||
// Determine the name of the class or interface. Note that we cannot
|
||||
// simply look for the first T_STRING because a class name
|
||||
// starting with the number will be multiple tokens.
|
||||
$opener = $tokens[$stackPtr]['scope_opener'];
|
||||
$nameStart = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), $opener, true);
|
||||
$nameEnd = $phpcsFile->findNext(T_WHITESPACE, $nameStart, $opener);
|
||||
if ($nameEnd === false) {
|
||||
$name = $tokens[$nameStart]['content'];
|
||||
} else {
|
||||
$name = trim($phpcsFile->getTokensAsString($nameStart, ($nameEnd - $nameStart)));
|
||||
}
|
||||
|
||||
// Check for PascalCase format.
|
||||
$valid = $this->isCamelCaps($name);
|
||||
if ($valid === false) {
|
||||
$type = ucfirst($tokens[$stackPtr]['content']);
|
||||
$error = '%s name "%s" is not in PascalCase format';
|
||||
$data = [
|
||||
$type,
|
||||
$name,
|
||||
];
|
||||
$phpcsFile->addError($error, $stackPtr, 'NotCamelCaps', $data);
|
||||
$phpcsFile->recordMetric($stackPtr, 'PascalCase class name', 'no');
|
||||
} else {
|
||||
$phpcsFile->recordMetric($stackPtr, 'PascalCase class name', 'yes');
|
||||
}
|
||||
|
||||
}//end process()
|
||||
|
||||
/**
|
||||
* Returns true if the specified string is in the camel caps format.
|
||||
*
|
||||
* NOTE:
|
||||
* - it does not allow the string to start with an underscore "_"
|
||||
* - it does allow that the string contains an underscore "_"
|
||||
* - the string must starts with a capitol letter
|
||||
*
|
||||
* @param string $string The string the verify.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
private function isCamelCaps($string)
|
||||
{
|
||||
$legalFirstChar = '[A-Z]';
|
||||
|
||||
if (preg_match("/^$legalFirstChar/", $string) === 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check that the name only contains legal characters.
|
||||
$legalChars = 'a-zA-Z0-9_';
|
||||
if (preg_match("|[^$legalChars]|", substr($string, 1)) > 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}//end isCamelCaps()
|
||||
}//end class
|
||||
|
||||
@@ -1,154 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Verifies that control statements conform to their coding standards.
|
||||
*
|
||||
* NOTE: It simply overrides the method process of the PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\ControlSignatureSniff class
|
||||
*
|
||||
*/
|
||||
|
||||
namespace PHP_CodeSniffer\Standards\FHComplete\Sniffs\ControlStructures;
|
||||
|
||||
use PHP_CodeSniffer\Files\File;
|
||||
use PHP_CodeSniffer\Sniffs\Sniff;
|
||||
use PHP_CodeSniffer\Util\Tokens;
|
||||
use PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures\ControlSignatureSniff;
|
||||
|
||||
class FHCControlSignatureSniff extends ControlSignatureSniff
|
||||
{
|
||||
/**
|
||||
* Processes this test, when one of its tokens is encountered.
|
||||
*
|
||||
* NOTE:
|
||||
* - Does not force to have whitespaces after the brackets
|
||||
* - Allows to have a bracket at newline after a control structure, ex:
|
||||
*
|
||||
* if (condition)
|
||||
* {
|
||||
*
|
||||
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
|
||||
* @param int $stackPtr The position of the current token in the
|
||||
* stack passed in $tokens.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function process(File $phpcsFile, $stackPtr)
|
||||
{
|
||||
$tokens = $phpcsFile->getTokens();
|
||||
|
||||
$nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true);
|
||||
if ($nextNonEmpty === false) {
|
||||
return;
|
||||
}
|
||||
|
||||
$isAlternative = false;
|
||||
if (isset($tokens[$stackPtr]['scope_opener']) === true
|
||||
&& $tokens[$tokens[$stackPtr]['scope_opener']]['code'] === T_COLON
|
||||
) {
|
||||
$isAlternative = true;
|
||||
}
|
||||
|
||||
// Single newline after opening brace.
|
||||
if (isset($tokens[$stackPtr]['scope_opener']) === true) {
|
||||
$opener = $tokens[$stackPtr]['scope_opener'];
|
||||
for ($next = ($opener + 1); $next < $phpcsFile->numTokens; $next++) {
|
||||
$code = $tokens[$next]['code'];
|
||||
|
||||
if ($code === T_WHITESPACE
|
||||
|| ($code === T_INLINE_HTML
|
||||
&& trim($tokens[$next]['content']) === '')
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip all empty tokens on the same line as the opener.
|
||||
if ($tokens[$next]['line'] === $tokens[$opener]['line']
|
||||
&& (isset(Tokens::$emptyTokens[$code]) === true
|
||||
|| $code === T_CLOSE_TAG)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// We found the first bit of a code, or a comment on the
|
||||
// following line.
|
||||
break;
|
||||
}//end for
|
||||
|
||||
if ($tokens[$next]['line'] === $tokens[$opener]['line']) {
|
||||
$error = 'Newline required after opening brace';
|
||||
$fix = $phpcsFile->addFixableError($error, $opener, 'NewlineAfterOpenBrace');
|
||||
if ($fix === true) {
|
||||
$phpcsFile->fixer->beginChangeset();
|
||||
for ($i = ($opener + 1); $i < $next; $i++) {
|
||||
if (trim($tokens[$i]['content']) !== '') {
|
||||
break;
|
||||
}
|
||||
|
||||
// Remove whitespace.
|
||||
$phpcsFile->fixer->replaceToken($i, '');
|
||||
}
|
||||
|
||||
$phpcsFile->fixer->addContent($opener, $phpcsFile->eolChar);
|
||||
$phpcsFile->fixer->endChangeset();
|
||||
}
|
||||
}//end if
|
||||
} else if ($tokens[$stackPtr]['code'] === T_WHILE) {
|
||||
// Zero spaces after parenthesis closer, but only if followed by a semicolon.
|
||||
$closer = $tokens[$stackPtr]['parenthesis_closer'];
|
||||
$nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($closer + 1), null, true);
|
||||
if ($nextNonEmpty !== false && $tokens[$nextNonEmpty]['code'] === T_SEMICOLON) {
|
||||
$found = 0;
|
||||
if ($tokens[($closer + 1)]['code'] === T_WHITESPACE) {
|
||||
if (strpos($tokens[($closer + 1)]['content'], $phpcsFile->eolChar) !== false) {
|
||||
$found = 'newline';
|
||||
} else {
|
||||
$found = $tokens[($closer + 1)]['length'];
|
||||
}
|
||||
}
|
||||
|
||||
if ($found !== 0) {
|
||||
$error = 'Expected 0 spaces before semicolon; %s found';
|
||||
$data = [$found];
|
||||
$fix = $phpcsFile->addFixableError($error, $closer, 'SpaceBeforeSemicolon', $data);
|
||||
if ($fix === true) {
|
||||
$phpcsFile->fixer->replaceToken(($closer + 1), '');
|
||||
}
|
||||
}
|
||||
}
|
||||
}//end if
|
||||
|
||||
// Only want to check multi-keyword structures from here on.
|
||||
if ($tokens[$stackPtr]['code'] === T_WHILE) {
|
||||
if (isset($tokens[$stackPtr]['scope_closer']) !== false) {
|
||||
return;
|
||||
}
|
||||
|
||||
$closer = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true);
|
||||
if ($closer === false
|
||||
|| $tokens[$closer]['code'] !== T_CLOSE_CURLY_BRACKET
|
||||
|| $tokens[$tokens[$closer]['scope_condition']]['code'] !== T_DO
|
||||
) {
|
||||
return;
|
||||
}
|
||||
} else if ($tokens[$stackPtr]['code'] === T_ELSE
|
||||
|| $tokens[$stackPtr]['code'] === T_ELSEIF
|
||||
|| $tokens[$stackPtr]['code'] === T_CATCH
|
||||
|| $tokens[$stackPtr]['code'] === T_FINALLY
|
||||
) {
|
||||
if (isset($tokens[$stackPtr]['scope_opener']) === true
|
||||
&& $tokens[$tokens[$stackPtr]['scope_opener']]['code'] === T_COLON
|
||||
) {
|
||||
// Special case for alternate syntax, where this token is actually
|
||||
// the closer for the previous block, so there is no spacing to check.
|
||||
return;
|
||||
}
|
||||
|
||||
$closer = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true);
|
||||
if ($closer === false || $tokens[$closer]['code'] !== T_CLOSE_CURLY_BRACKET) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}//end if
|
||||
}//end process()
|
||||
}//end class
|
||||
|
||||
@@ -1,129 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Checks that the method declaration is correct.
|
||||
*
|
||||
* NOTE: It simply overrides the method processTokenWithinScope of the Standards\PSR2\Sniffs\Methods\MethodDeclarationSniff class
|
||||
*
|
||||
*/
|
||||
|
||||
namespace PHP_CodeSniffer\Standards\FHComplete\Sniffs\Methods;
|
||||
|
||||
use PHP_CodeSniffer\Files\File;
|
||||
use PHP_CodeSniffer\Sniffs\AbstractScopeSniff;
|
||||
use PHP_CodeSniffer\Util\Tokens;
|
||||
use PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods\MethodDeclarationSniff;
|
||||
|
||||
class FHCMethodDeclarationSniff extends MethodDeclarationSniff
|
||||
{
|
||||
/**
|
||||
* Processes the function tokens within the class.
|
||||
*
|
||||
* NOTE: it does not check if the method name starts with an underscore "_"
|
||||
*
|
||||
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file where this token was found.
|
||||
* @param int $stackPtr The position where the token was found.
|
||||
* @param int $currScope The current scope opener token.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope)
|
||||
{
|
||||
$tokens = $phpcsFile->getTokens();
|
||||
|
||||
// Determine if this is a function which needs to be examined.
|
||||
$conditions = $tokens[$stackPtr]['conditions'];
|
||||
end($conditions);
|
||||
$deepestScope = key($conditions);
|
||||
if ($deepestScope !== $currScope) {
|
||||
return;
|
||||
}
|
||||
|
||||
$methodName = $phpcsFile->getDeclarationName($stackPtr);
|
||||
if ($methodName === null) {
|
||||
// Ignore closures.
|
||||
return;
|
||||
}
|
||||
|
||||
$visibility = 0;
|
||||
$static = 0;
|
||||
$abstract = 0;
|
||||
$final = 0;
|
||||
|
||||
$find = (Tokens::$methodPrefixes + Tokens::$emptyTokens);
|
||||
$prev = $phpcsFile->findPrevious($find, ($stackPtr - 1), null, true);
|
||||
|
||||
$prefix = $stackPtr;
|
||||
while (($prefix = $phpcsFile->findPrevious(Tokens::$methodPrefixes, ($prefix - 1), $prev)) !== false) {
|
||||
switch ($tokens[$prefix]['code']) {
|
||||
case T_STATIC:
|
||||
$static = $prefix;
|
||||
break;
|
||||
case T_ABSTRACT:
|
||||
$abstract = $prefix;
|
||||
break;
|
||||
case T_FINAL:
|
||||
$final = $prefix;
|
||||
break;
|
||||
default:
|
||||
$visibility = $prefix;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$fixes = [];
|
||||
|
||||
if ($visibility !== 0 && $final > $visibility) {
|
||||
$error = 'The final declaration must precede the visibility declaration';
|
||||
$fix = $phpcsFile->addFixableError($error, $final, 'FinalAfterVisibility');
|
||||
if ($fix === true) {
|
||||
$fixes[$final] = '';
|
||||
$fixes[($final + 1)] = '';
|
||||
if (isset($fixes[$visibility]) === true) {
|
||||
$fixes[$visibility] = 'final '.$fixes[$visibility];
|
||||
} else {
|
||||
$fixes[$visibility] = 'final '.$tokens[$visibility]['content'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($visibility !== 0 && $abstract > $visibility) {
|
||||
$error = 'The abstract declaration must precede the visibility declaration';
|
||||
$fix = $phpcsFile->addFixableError($error, $abstract, 'AbstractAfterVisibility');
|
||||
if ($fix === true) {
|
||||
$fixes[$abstract] = '';
|
||||
$fixes[($abstract + 1)] = '';
|
||||
if (isset($fixes[$visibility]) === true) {
|
||||
$fixes[$visibility] = 'abstract '.$fixes[$visibility];
|
||||
} else {
|
||||
$fixes[$visibility] = 'abstract '.$tokens[$visibility]['content'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($static !== 0 && $static < $visibility) {
|
||||
$error = 'The static declaration must come after the visibility declaration';
|
||||
$fix = $phpcsFile->addFixableError($error, $static, 'StaticBeforeVisibility');
|
||||
if ($fix === true) {
|
||||
$fixes[$static] = '';
|
||||
$fixes[($static + 1)] = '';
|
||||
if (isset($fixes[$visibility]) === true) {
|
||||
$fixes[$visibility] .= ' static';
|
||||
} else {
|
||||
$fixes[$visibility] = $tokens[$visibility]['content'].' static';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Batch all the fixes together to reduce the possibility of conflicts.
|
||||
if (empty($fixes) === false) {
|
||||
$phpcsFile->fixer->beginChangeset();
|
||||
foreach ($fixes as $stackPtr => $content) {
|
||||
$phpcsFile->fixer->replaceToken($stackPtr, $content);
|
||||
}
|
||||
|
||||
$phpcsFile->fixer->endChangeset();
|
||||
}
|
||||
|
||||
}//end processTokenWithinScope()
|
||||
}//end class
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<ruleset name="FHComplete">
|
||||
<description>FHComplete's coding standard</description>
|
||||
|
||||
<!-- Ignored directories -->
|
||||
<exclude-pattern>\.git</exclude-pattern>
|
||||
<exclude-pattern>vendor</exclude-pattern>
|
||||
<exclude-pattern>tests</exclude-pattern>
|
||||
<exclude-pattern>application/controllers/api/v1</exclude-pattern>
|
||||
<exclude-pattern>application/extensions</exclude-pattern>
|
||||
<exclude-pattern>addons</exclude-pattern>
|
||||
|
||||
<!-- This ruleset is based mainly on the PSR2 standard ruleset, exluding the following rules: -->
|
||||
<rule ref="PSR2">
|
||||
<!-- Forces the use of namespaces -->
|
||||
<exclude name="PSR1.Classes.ClassDeclaration" />
|
||||
<!-- Forbids the use of underscores at the beginning of properties name -->
|
||||
<exclude name="PSR2.Classes.PropertyDeclaration" />
|
||||
<!-- Forbids the use of classes name that contain underscores -->
|
||||
<exclude name="Squiz.Classes.ValidClassName" />
|
||||
<!-- Forbids the use inline control structure (ex. an if statement on one line) -->
|
||||
<exclude name="Generic.ControlStructures.InlineControlStructure" />
|
||||
<!-- Forces to have the bracket on the same line of the statement -->
|
||||
<exclude name="Squiz.ControlStructures.ControlSignature" />
|
||||
<!-- Forces to have in a single file only a class declaration, an if statement outside the class is forbidden -->
|
||||
<exclude name="PSR1.Files.SideEffects" />
|
||||
<!-- Forbids to have an empty line at the end of the file -->
|
||||
<exclude name="PSR2.Files.EndFileNewline" />
|
||||
<!-- Forbids the use of underscores at the beginning of methods name -->
|
||||
<exclude name="PSR2.Methods.MethodDeclaration" />
|
||||
<!-- Forbids the use of tabs -->
|
||||
<exclude name="Generic.WhiteSpace.DisallowTabIndent" />
|
||||
</rule>
|
||||
|
||||
<!-- Do not prompt any warning about the line length -->
|
||||
<!-- Prompt an error if the line length is more than 150 -->
|
||||
<rule ref="Generic.Files.LineLength">
|
||||
<properties>
|
||||
<property name="lineLimit" value="9999"/>
|
||||
<property name="absoluteLineLimit" value="150"/>
|
||||
</properties>
|
||||
<exclude-pattern>application/phrases/</exclude-pattern>
|
||||
</rule>
|
||||
|
||||
<!-- No white spaces are allowed in array declaration between brackets -->
|
||||
<rule ref="Squiz.Arrays.ArrayBracketSpacing"/>
|
||||
|
||||
<!-- Ensures all class keywords are lowercase -->
|
||||
<rule ref="Squiz.Classes.LowercaseClassKeywords"/>
|
||||
|
||||
<!-- Forbids the use of TODO in the comments -->
|
||||
<rule ref="Generic.Commenting.Todo"/>
|
||||
<!-- Tests that the stars in a doc comment align correctly -->
|
||||
<rule ref="Squiz.Commenting.DocCommentAlignment"/>
|
||||
|
||||
<!-- Ensures the file ends with a newline character -->
|
||||
<rule ref="Generic.Files.EndFileNewline"/>
|
||||
|
||||
<!-- Ensures there is no space after cast tokens -->
|
||||
<rule ref="Generic.Formatting.NoSpaceAfterCast"/>
|
||||
|
||||
<!-- Ensures logical operators 'and' and 'or' are not used -->
|
||||
<rule ref="Squiz.Operators.ValidLogicalOperators"/>
|
||||
|
||||
<!-- Ensure cast statements don't contain whitespace -->
|
||||
<rule ref="Squiz.WhiteSpace.CastSpacing"/>
|
||||
<!-- Verifies that operators have valid spacing surrounding them -->
|
||||
<rule ref="Squiz.WhiteSpace.LogicalOperatorSpacing"/>
|
||||
<!-- Checks that control structures are defined and indented correctly -->
|
||||
<!-- The listed tokens are ignored: comment, doc comment open tag, php close tag -->
|
||||
<rule ref="Generic.WhiteSpace.ScopeIndent">
|
||||
<properties>
|
||||
<property name="ignoreIndentationTokens" type="array">
|
||||
<element value="T_COMMENT"/>
|
||||
<element value="T_DOC_COMMENT_OPEN_TAG"/>
|
||||
<element value="T_CLOSE_TAG"/>
|
||||
</property>
|
||||
</properties>
|
||||
</rule>
|
||||
<!-- Ensure there is no whitespace before a semicolon -->
|
||||
<rule ref="Squiz.WhiteSpace.SemicolonSpacing"/>
|
||||
|
||||
<!-- All rules in ./Sniffs are included automatically -->
|
||||
<!-- FHComplete sniffs:
|
||||
- Classes/FHCPropertyDeclarationSniff: class properties checks, it does not check if the property name starts with an underscore "_"
|
||||
- Classes/FHCValidClassNameSniff: class names checks, it does not check if the class name contains an underscore "_"
|
||||
- ControlStructures/FHCControlSignatureSniff:
|
||||
- Does not force to have whitespaces after the brackets
|
||||
- Allows to have a bracket at newline after a control structure
|
||||
- Methods/FHCMethodDeclarationSniff: it does not check if the method name starts with an underscore "_"
|
||||
-->
|
||||
</ruleset>
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
BASE_URL=https://demo.dev.technikum-wien.at/demoanon
|
||||
USER_NAME=testUser
|
||||
USER_PASSWORD=testPassword
|
||||
LOGIN_AS_USER=testUser
|
||||
@@ -4,4 +4,4 @@ node_modules
|
||||
!.env.example
|
||||
/cypress/videos
|
||||
/cypress/screenshots
|
||||
/results
|
||||
/results
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
const { defineConfig } = require("cypress");
|
||||
require("dotenv").config();
|
||||
|
||||
module.exports = defineConfig({
|
||||
allowCypressEnv: true,
|
||||
|
||||
e2e: {
|
||||
baseUrl: process.env.BASE_URL || "http://localhost:8080",
|
||||
defaultCommandTimeout: 20000,
|
||||
pageLoadTimeout: 20000,
|
||||
retries: {
|
||||
runMode: 1,
|
||||
openMode: 1
|
||||
}
|
||||
},
|
||||
env: {
|
||||
adminusername: process.env.USER_NAME || "2",
|
||||
adminpassword: process.env.USER_PASSWORD || "2",
|
||||
loginAsUser: process.env.LOGIN_AS_USER || process.env.USER_NAME || "demoadmin"
|
||||
}
|
||||
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
import { rolesinrolesApi } from "../../../../support/api/rolesinrolesApi";
|
||||
|
||||
describe("Roles in roles checks", () => {
|
||||
|
||||
beforeEach(() => {
|
||||
cy.login();
|
||||
});
|
||||
|
||||
it("checks permission agains the main role", () => {
|
||||
rolesinrolesApi.permissionToMainRole();
|
||||
});
|
||||
it("checks permission agains the basic role", () => {
|
||||
rolesinrolesApi.permissionToBasicRole();
|
||||
});
|
||||
it("checks permission agains the single permission", () => {
|
||||
rolesinrolesApi.permissionToUser();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"name": "Using fixtures to represent data",
|
||||
"email": "[email protected]",
|
||||
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
const DummyPermissionsAPI = "/index.ci.php/system/DummyPermissions/";
|
||||
|
||||
export const rolesinrolesApi = {
|
||||
permissionToMainRole: () => {
|
||||
cy
|
||||
.request({
|
||||
method: 'GET',
|
||||
url: DummyPermissionsAPI + "permissionToMainRole",
|
||||
})
|
||||
.then((response) => {
|
||||
expect(response.status).to.eq(200);
|
||||
expect(response.body).to.equals("DummyPermissions::permissionToMainRole");
|
||||
})
|
||||
},
|
||||
permissionToBasicRole: () => {
|
||||
|
||||
cy
|
||||
.request({
|
||||
method: 'GET',
|
||||
url: DummyPermissionsAPI + "permissionToBasicRole",
|
||||
})
|
||||
.then((response) => {
|
||||
expect(response.status).to.eq(200);
|
||||
expect(response.body).to.equals("DummyPermissions::permissionToBasicRole");
|
||||
})
|
||||
},
|
||||
permissionToUser: () => {
|
||||
cy
|
||||
.request({
|
||||
method: 'GET',
|
||||
url: DummyPermissionsAPI + "permissionToUser",
|
||||
})
|
||||
.then((response) => {
|
||||
expect(response.status).to.eq(200);
|
||||
expect(response.body).to.equals("DummyPermissions::permissionToUser");
|
||||
})
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
// ***********************************************
|
||||
// This example commands.js shows you how to
|
||||
// create various custom commands and overwrite
|
||||
// existing commands.
|
||||
//
|
||||
// For more comprehensive examples of custom
|
||||
// commands please read more here:
|
||||
// https://on.cypress.io/custom-commands
|
||||
// ***********************************************
|
||||
//
|
||||
//
|
||||
// -- This is a parent command --
|
||||
// Cypress.Commands.add('login', (email, password) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a child command --
|
||||
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a dual command --
|
||||
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This will overwrite an existing command --
|
||||
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
||||
|
||||
require("@4tw/cypress-drag-drop");
|
||||
require("cypress-real-events")
|
||||
|
||||
Cypress.Commands.add("login", () => {
|
||||
const { adminusername, adminpassword, loginAsUser } = Cypress.env();
|
||||
const userToImpersonate = loginAsUser || adminusername;
|
||||
const auth = {
|
||||
username: adminusername,
|
||||
password: adminpassword,
|
||||
};
|
||||
|
||||
cy.session(
|
||||
["ci-login", adminusername, userToImpersonate],
|
||||
() => {
|
||||
cy.request({
|
||||
url: "/index.ci.php",
|
||||
method: "GET",
|
||||
auth,
|
||||
body: {
|
||||
searchstr: userToImpersonate,
|
||||
types: ["employee"],
|
||||
},
|
||||
}).its("status").should("eq", 200);
|
||||
},
|
||||
{
|
||||
cacheAcrossSpecs: true,
|
||||
validate() {
|
||||
cy.request({
|
||||
url: "/index.ci.php",
|
||||
auth,
|
||||
}).its("status").should("eq", 200);
|
||||
},
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
// ***********************************************************
|
||||
// This example support/e2e.js is processed and
|
||||
// loaded automatically before your test files.
|
||||
//
|
||||
// This is a great place to put global configuration and
|
||||
// behavior that modifies Cypress.
|
||||
//
|
||||
// You can change the location of this file or turn off
|
||||
// automatically serving support files with the
|
||||
// 'supportFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/configuration
|
||||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import './commands'
|
||||
Generated
+2078
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"devDependencies": {
|
||||
"@4tw/cypress-drag-drop": "^2.3.1",
|
||||
"cypress": "^15.11.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"cypress-real-events": "^1.15.0",
|
||||
"dotenv": "^17.4.2",
|
||||
"moment": "^2.30.1"
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<ruleset name="Strictly necessary PHPMD rule set"
|
||||
xmlns="http://pmd.sf.net/ruleset/1.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
|
||||
xsi:noNamespaceSchemaLocation=" http://pmd.sf.net/ruleset_xml_schema.xsd">
|
||||
|
||||
<description>
|
||||
Performs the DevelopmentCodeFragment check before the code can be merged into the main branch and then deployed to production
|
||||
</description>
|
||||
|
||||
<!-- Ignored directories -->
|
||||
<exclude-pattern>\.git</exclude-pattern>
|
||||
<exclude-pattern>vendor</exclude-pattern>
|
||||
<exclude-pattern>tests</exclude-pattern>
|
||||
<exclude-pattern>application/controllers/api/v1</exclude-pattern>
|
||||
<exclude-pattern>application/extensions</exclude-pattern>
|
||||
<exclude-pattern>addons</exclude-pattern>
|
||||
|
||||
<!-- Import the DevelopmentCodeFragment rule from the design rule set -->
|
||||
<rule ref="rulesets/design.xml/DevelopmentCodeFragment" />
|
||||
</ruleset>
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<ruleset name="Strictly necessary PHPMD rule set"
|
||||
xmlns="http://pmd.sf.net/ruleset/1.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
|
||||
xsi:noNamespaceSchemaLocation=" http://pmd.sf.net/ruleset_xml_schema.xsd">
|
||||
|
||||
<description>
|
||||
Performs the strictly necessary checks before the code can be merged into the main branch and then deployed to production
|
||||
</description>
|
||||
|
||||
<!-- Ignored directories -->
|
||||
<exclude-pattern>\.git</exclude-pattern>
|
||||
<exclude-pattern>vendor</exclude-pattern>
|
||||
<exclude-pattern>tests</exclude-pattern>
|
||||
<exclude-pattern>application/controllers/api/v1</exclude-pattern>
|
||||
<exclude-pattern>application/extensions</exclude-pattern>
|
||||
<exclude-pattern>addons</exclude-pattern>
|
||||
|
||||
<!-- Import the clean code rule set -->
|
||||
<rule ref="rulesets/cleancode.xml">
|
||||
<!-- Exclude the ElseExpression rule -->
|
||||
<exclude name="ElseExpression" />
|
||||
</rule>
|
||||
<!-- Import the entire unused code rule set -->
|
||||
<rule ref="rulesets/unusedcode.xml" />
|
||||
<!-- Import the DevelopmentCodeFragment rule from the design rule set -->
|
||||
<rule ref="rulesets/design.xml/DevelopmentCodeFragment" />
|
||||
</ruleset>
|
||||
|
||||
@@ -148,4 +148,31 @@ if (isset($_REQUEST['autocomplete']) && $_REQUEST['autocomplete'] == 'kostenstel
|
||||
exit();
|
||||
}
|
||||
|
||||
if (isset($_REQUEST['autocomplete']) && $_REQUEST['autocomplete'] == 'rollen')
|
||||
{
|
||||
$rolle = trim((isset($_REQUEST['rolle']) ? $_REQUEST['rolle'] : ''));
|
||||
if (is_null($rolle) || $rolle == '')
|
||||
exit();
|
||||
|
||||
$search = trim((isset($_REQUEST['term']) ? $_REQUEST['term'] : ''));
|
||||
if (is_null($search) || $search == '')
|
||||
exit();
|
||||
|
||||
$berechtigung = new berechtigung();
|
||||
|
||||
if ($berechtigung->searchRollen($rolle, $search))
|
||||
{
|
||||
$result_obj = array();
|
||||
foreach ($berechtigung->result as $row)
|
||||
{
|
||||
$item['rolle_kurzbz'] = html_entity_decode($row->rolle_kurzbz);
|
||||
$item['beschreibung'] = html_entity_decode($row->beschreibung);
|
||||
$item['lange_beschreibung'] = html_entity_decode($row->lange_beschreibung);
|
||||
$result_obj[] = $item;
|
||||
}
|
||||
echo json_encode($result_obj);
|
||||
}
|
||||
exit();
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
@@ -722,6 +722,11 @@ $vergleich = filter_input(INPUT_GET, 'vergleich');
|
||||
Berechtigungen zuordnen
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="<?php echo APP_ROOT; ?>/vilesci/stammdaten/rollen.php?rolle_kurzbz=<?php echo $rolle->rolle_kurzbz ?>">
|
||||
Rollen hinzufügen
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<form method="POST" style="display: none">
|
||||
<input type="text" placeholder="Name der Kopie" maxlength="32" size="35" name="copy_name" value=""/>
|
||||
|
||||
@@ -0,0 +1,260 @@
|
||||
<?php
|
||||
/* Copyright (C) 2009 Technikum-Wien
|
||||
*
|
||||
* 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 2 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, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Authors: Christian Paminger < [email protected] >
|
||||
* Andreas Oesterreicher < [email protected] >
|
||||
* Rudolf Hangl < [email protected] >
|
||||
* Gerald Simane-Sequens < [email protected] >
|
||||
*/
|
||||
require_once('../../config/vilesci.config.inc.php');
|
||||
require_once('../../include/functions.inc.php');
|
||||
require_once('../../include/berechtigung.class.php');
|
||||
require_once('../../include/benutzerberechtigung.class.php');
|
||||
|
||||
$user = get_uid();
|
||||
|
||||
$rechte = new benutzerberechtigung();
|
||||
$rechte->getBerechtigungen($user);
|
||||
|
||||
if (!$rechte->isBerechtigt('basis/berechtigung'))
|
||||
die($rechte->errormsg);
|
||||
|
||||
$rolle_kurzbz = filter_input(INPUT_GET, 'rolle_kurzbz');
|
||||
$delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN);
|
||||
$save = filter_input(INPUT_GET, 'save');
|
||||
?>
|
||||
<html>
|
||||
<head>
|
||||
<title>Rollen Rollen Uebersicht</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<link rel="stylesheet" href="../../skin/vilesci.css" type="text/css">
|
||||
<link href="../../skin/jquery-ui-1.9.2.custom.min.css" rel="stylesheet" type="text/css">
|
||||
<?php
|
||||
include('../../include/meta/jquery.php');
|
||||
include('../../include/meta/jquery-tablesorter.php');
|
||||
?>
|
||||
<script type="text/javascript" src="../../vendor/components/jqueryui/jquery-ui.min.js"></script>
|
||||
<script type="text/javascript" src="../../include/js/jquery.ui.datepicker.translation.js"></script>
|
||||
<script language="Javascript">
|
||||
$(document).ready(function()
|
||||
{
|
||||
$("#t1").tablesorter(
|
||||
{
|
||||
sortList: [[0,0]],
|
||||
widgets: ["zebra", "filter", "stickyHeaders"],
|
||||
headers: {3:{filter:false, sorter:false}},
|
||||
widgetOptions : {filter_saveFilters : true}
|
||||
});
|
||||
|
||||
$('.resetsaved').click(function()
|
||||
{
|
||||
$(".tablesorter").trigger("filterReset");
|
||||
return false;
|
||||
});
|
||||
$("textarea").keyup(function()
|
||||
{
|
||||
$(this).siblings("span").text((256 - $(this).val().length));
|
||||
});
|
||||
|
||||
// Breite des Autocompletes korrigieren um das Springen zu verhindern
|
||||
$.extend($.ui.autocomplete.prototype.options, {
|
||||
open: function(event, ui) {
|
||||
$(this).autocomplete("widget").css({
|
||||
"width": ($(".ui-menu-item").width()+ 20 + "px"),
|
||||
"padding-left": "5px"
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$(".rolle_autocomplete").autocomplete({
|
||||
source: "benutzerberechtigung_autocomplete.php?autocomplete=rollen&rolle=<?php echo $rolle_kurzbz; ?>",
|
||||
minLength:2,
|
||||
response: function(event, ui)
|
||||
{
|
||||
//Value und Label fuer die Anzeige setzen
|
||||
for(i in ui.content)
|
||||
{
|
||||
ui.content[i].value=ui.content[i].rolle_kurzbz;
|
||||
ui.content[i].label=ui.content[i].rolle_kurzbz+" - "+ui.content[i].beschreibung;
|
||||
}
|
||||
},
|
||||
select: function(event, ui)
|
||||
{
|
||||
//Ausgewaehlte Ressource zuweisen und Textfeld wieder leeren
|
||||
$(this).val(ui.item.rolle_kurzbz);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
function validateNewData()
|
||||
{
|
||||
if($('#rolle_neu_autocomplete').val() == '')
|
||||
{
|
||||
alert('Rolle darf nicht leer sein')
|
||||
return false;
|
||||
}
|
||||
else
|
||||
return true;
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
button
|
||||
{
|
||||
line-height: 9pt;
|
||||
}
|
||||
table.tablesorter tr:hover td
|
||||
{
|
||||
/*pointer-events: none !important;*/
|
||||
}
|
||||
table.tablesorter tr.odd:hover td
|
||||
{
|
||||
background-color: #d3d3d3 !important;
|
||||
}
|
||||
table.tablesorter tr.even:hover td
|
||||
{
|
||||
background-color: #efefef !important;
|
||||
}
|
||||
table.tablesorter tr.odd:hover td.difference
|
||||
{
|
||||
background-color: #b2b2b2 !important;
|
||||
/*border-top: 1px solid #aaa;*/
|
||||
/*border-bottom: 1px solid #aaa;*/
|
||||
}
|
||||
table.tablesorter tr.even:hover td.difference
|
||||
{
|
||||
background-color: #b2b2b2 !important;
|
||||
/*border-top: 1px solid #aaa;*/
|
||||
/*border-bottom: 1px solid #aaa;*/
|
||||
}
|
||||
.difference
|
||||
{
|
||||
background-color: #b2b2b2 !important;
|
||||
border-top: 1px solid #aaa;
|
||||
border-bottom: 1px solid #aaa;
|
||||
}
|
||||
/*.difference:hover*/
|
||||
/*{*/
|
||||
/* background-color: #b2b2b2 !important;*/
|
||||
/* border-top: 1px solid #aaa;*/
|
||||
/* border-bottom: 1px solid #aaa;*/
|
||||
/*}*/
|
||||
.tablesorter
|
||||
{
|
||||
border-collapse: collapse !important;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body class="background_main">
|
||||
|
||||
<?php
|
||||
if (isset($rolle_kurzbz))
|
||||
{
|
||||
echo '<h2>Rollen der Rolle "'.$rolle_kurzbz.'"</h2>';
|
||||
|
||||
if (isset($save))
|
||||
{
|
||||
$add_rolle_kurzbz = filter_input(INPUT_GET, 'add_rolle_kurzbz');
|
||||
if (isset($rolle_kurzbz) && isset($add_rolle_kurzbz))
|
||||
{
|
||||
$berechtigung = new berechtigung();
|
||||
|
||||
if ($berechtigung->saveRolleRolle($rolle_kurzbz, $add_rolle_kurzbz, $user))
|
||||
{
|
||||
echo '<b>Zuteilung gespeichert</b>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo '<b>Fehler beim Speichern der Zuteilung: </b>'.$berechtigung->errormsg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($delete))
|
||||
{
|
||||
$delete_rolle_kurzbz = filter_input(INPUT_GET, 'delete_rolle_kurzbz');
|
||||
if (isset($rolle_kurzbz) && isset($delete_rolle_kurzbz))
|
||||
{
|
||||
$berechtigung = new berechtigung();
|
||||
|
||||
if ($berechtigung->deleteRolleRolle($rolle_kurzbz, $delete_rolle_kurzbz))
|
||||
{
|
||||
echo '<b>Rolle '.$delete_rolle_kurzbz.' gelöscht!</b>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo '<b>Fehler beim Löschen: </b>'.$berechtigung->errormsg;
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
<a href="<?php echo APP_ROOT; ?>/vilesci/stammdaten/berechtigungrolle.php">
|
||||
Zurück zur Rollen Übersicht
|
||||
</a>
|
||||
<br><br>
|
||||
<?php
|
||||
$berechtigung = new berechtigung();
|
||||
$berechtigung->getBerechtigungen();
|
||||
?>
|
||||
<form action="<?php echo basename(__FILE__) ?>" method="GET">
|
||||
<div style="vertical-align: top">
|
||||
<input type="text"
|
||||
value=""
|
||||
placeholder="Neue Rolle"
|
||||
id="rolle_neu_autocomplete"
|
||||
class="rolle_autocomplete"
|
||||
name="add_rolle_kurzbz"
|
||||
style="width: 300px">
|
||||
<input type="hidden" name="rolle_kurzbz" value="<?php echo $rolle_kurzbz ?>">
|
||||
<input type="submit" name="save" value="Hinzufügen" onclick="return validateNewData()">
|
||||
</div>
|
||||
</form>
|
||||
<button type="button" class="resetsaved" title="Reset Filter">Reset Filter</button>
|
||||
<table id="t1" class="tablesorter">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Kurzbz</th>
|
||||
<th>Beschreibung</th>
|
||||
<th>Lange Beschreibung</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$berechtigungen = new berechtigung();
|
||||
$berechtigungen->getRollenRollen($rolle_kurzbz);
|
||||
|
||||
foreach($berechtigungen->result as $rolle): ?>
|
||||
<tr>
|
||||
<td><?php echo $rolle->rolle_kurzbz ?></td>
|
||||
<td><?php echo $rolle->beschreibung ?></td>
|
||||
<td><?php echo $rolle->lange_beschreibung ?></td>
|
||||
<td>
|
||||
<a href="<?php echo basename(__FILE__) ?>?delete=1&rolle_kurzbz=<?php echo $rolle_kurzbz ?>&delete_rolle_kurzbz=<?php echo $rolle->rolle_kurzbz ?>">
|
||||
Rolle entfernen
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user