Merge branch 'merge_FHC4_C4' of github.com:FH-Complete/FHC-Core into merge_FHC4_C4

This commit is contained in:
ma0068
2025-01-30 11:07:17 +01:00
6 changed files with 319 additions and 72 deletions
+22 -16
View File
@@ -991,14 +991,17 @@ class DB_Model extends CI_Model
// Find and replace all the occurrences of the provided encrypted columns
// with the postgresql decryption function
$query = preg_replace(
'/\b' . $encryptedColumn . '\b/',
sprintf(
self::CRYPT_WHERE_TEMPLATE,
$encryptedColumn,
$decryptionPassword,
$definition[self::CRYPT_CAST]
),
$query = preg_replace_callback(
'/(?<! (as|AS) )\b(\w+\.)?(' . $encryptedColumn . ')\b/',
function($matches) use (&$decryptionPassword, &$definition) {
$aliased_column = $matches[2] . $matches[3];
return sprintf(
self::CRYPT_WHERE_TEMPLATE,
$aliased_column,
$decryptionPassword,
$definition[self::CRYPT_CAST]
);
},
$query
);
}
@@ -1106,14 +1109,17 @@ class DB_Model extends CI_Model
{
// Find and replace all the occurrences of the provided encrypted columns
// with the postgresql decryption function
$where = preg_replace(
'/\b' . $encryptedColumn . '\b/',
sprintf(
self::CRYPT_WHERE_TEMPLATE,
$encryptedColumn,
$decryptionPassword,
$definition[self::CRYPT_CAST]
),
$where = preg_replace_callback(
'/(?<! (as|AS) )\b(\w+\.)?(' . $encryptedColumn . ')\b/',
function($matches) use (&$decryptionPassword, &$definition) {
$aliased_column = $matches[2] . $matches[3];
return sprintf(
self::CRYPT_WHERE_TEMPLATE,
$aliased_column,
$decryptionPassword,
$definition[self::CRYPT_CAST]
);
},
$where
);
}
@@ -28,9 +28,12 @@ class GehaltsbestandteilLib
$this->GehaltsbestandteilModel = $this->CI->GehaltsbestandteilModel;
}
public function fetchGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false)
public function fetchGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null,
$includefuture=false, $withvalorisationhistory=true)
{
return $this->GehaltsbestandteilModel->getGehaltsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture);
return $this->GehaltsbestandteilModel->getGehaltsbestandteile(
$dienstverhaeltnis_id, $stichtag, $includefuture, $withvalorisationhistory
);
}
public function fetchGehaltsbestandteil($gehaltsbestandteil_id)
@@ -26,6 +26,8 @@ class VertragsbestandteilLib
{
const INCLUDE_FUTURE = true;
const DO_NOT_INCLUDE_FUTURE = false;
const WITH_VALORISATION_HISTORY = true;
const NOT_WITH_VALORISATION_HISTORY = false;
protected $CI;
/** @var Dienstverhaeltnis_model */
@@ -90,10 +92,15 @@ class VertragsbestandteilLib
return $dv;
}
public function fetchVertragsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false)
public function fetchVertragsbestandteile($dienstverhaeltnis_id, $stichtag=null,
$includefuture=false, $withvalorisationhistory=true)
{
$vbs = $this->VertragsbestandteilModel->getVertragsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture);
$gbs = $this->GehaltsbestandteilLib->fetchGehaltsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture);
$vbs = $this->VertragsbestandteilModel->getVertragsbestandteile(
$dienstverhaeltnis_id, $stichtag, $includefuture
);
$gbs = $this->GehaltsbestandteilLib->fetchGehaltsbestandteile(
$dienstverhaeltnis_id, $stichtag, $includefuture, $withvalorisationhistory
);
$gbsByVBid = array();
foreach( $gbs as $gb )
@@ -33,41 +33,84 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption
$datestring = $date->format("Y-m-d");
$qry = "
SELECT
gehaltsbestandteil_id,
gbt.von,
gbt.bis,
gbt.anmerkung,
gbt.dienstverhaeltnis_id,
gehaltstyp_kurzbz,
valorisierungssperre,
gbt.valorisierung,
grundbetrag as grund_betrag_decrypted,
betrag_valorisiert as betrag_val_decrypted,
gt.bezeichnung as gehaltstyp_bezeichnung,
vb.vertragsbestandteiltyp_kurzbz,
bf.funktion_kurzbz,
bf.oe_kurzbz,
fkt.beschreibung as fkt_beschreibung,
fb.bezeichnung as fb_bezeichnung,
org.bezeichnung as org_bezeichnung,
freitext.freitexttyp_kurzbz,
freitext.titel as freitext_titel
FROM hr.tbl_gehaltsbestandteil gbt LEFT JOIN hr.tbl_gehaltstyp gt using(gehaltstyp_kurzbz)
LEFT JOIN hr.tbl_vertragsbestandteil vb using(vertragsbestandteil_id)
LEFT JOIN hr.tbl_vertragsbestandteil_funktion vbf using(vertragsbestandteil_id)
LEFT JOIN public.tbl_benutzerfunktion bf using(benutzerfunktion_id)
LEFT JOIN public.tbl_funktion fkt using(funktion_kurzbz)
LEFT JOIN public.tbl_fachbereich fb using(fachbereich_kurzbz)
LEFT JOIN public.tbl_organisationseinheit org on (bf.oe_kurzbz=org.oe_kurzbz)
LEFT JOIN hr.tbl_vertragsbestandteil_freitext freitext on(vb.vertragsbestandteil_id=freitext.vertragsbestandteil_id)
WHERE gbt.dienstverhaeltnis_id=? AND
(gbt.von<=? and (gbt.bis is null OR gbt.bis>=?))
ORDER BY gt.sort
with gbt as (
select
gb.gehaltsbestandteil_id,
gb.von,
gb.bis,
gb.anmerkung,
gb.dienstverhaeltnis_id,
gb.gehaltstyp_kurzbz,
gb.valorisierungssperre,
gb.valorisierung,
gb.grundbetrag as grund_betrag_decrypted,
coalesce(vh.betrag_valorisiert, gb.grundbetrag) as betrag_val_decrypted,
gb.vertragsbestandteil_id
from
hr.tbl_gehaltsbestandteil gb
LEFT JOIN
hr.tbl_valorisierung_historie vh ON vh.gehaltsbestandteil_id = gb.gehaltsbestandteil_id AND vh.valorisierungsdatum = (
SELECT
vi.valorisierungsdatum
FROM
hr.tbl_valorisierung_instanz vi
JOIN
hr.tbl_dienstverhaeltnis d ON d.dienstverhaeltnis_id = ?
AND d.oe_kurzbz = vi.oe_kurzbz
WHERE
? >= valorisierungsdatum
ORDER BY
valorisierungsdatum DESC
LIMIT 1
)
where
dienstverhaeltnis_id = ?
and (
? BETWEEN COALESCE(von, '1970-01-01'::date) AND COALESCE(bis, '2170-01-01'::date)
)
)
select
gbt.gehaltsbestandteil_id,
gbt.von,
gbt.bis,
gbt.anmerkung,
gbt.dienstverhaeltnis_id,
gbt.gehaltstyp_kurzbz,
gbt.valorisierungssperre,
gbt.valorisierung,
gbt.grund_betrag_decrypted,
gbt.betrag_val_decrypted,
gt.bezeichnung as gehaltstyp_bezeichnung,
vb.vertragsbestandteiltyp_kurzbz,
bf.funktion_kurzbz,
bf.oe_kurzbz,
fkt.beschreibung as fkt_beschreibung,
fb.bezeichnung as fb_bezeichnung,
org.bezeichnung as org_bezeichnung,
freitext.freitexttyp_kurzbz,
freitext.titel as freitext_titel
from
gbt
LEFT JOIN
hr.tbl_gehaltstyp gt using(gehaltstyp_kurzbz)
LEFT JOIN
hr.tbl_vertragsbestandteil vb using(vertragsbestandteil_id)
LEFT JOIN
hr.tbl_vertragsbestandteil_funktion vbf using(vertragsbestandteil_id)
LEFT JOIN
public.tbl_benutzerfunktion bf using(benutzerfunktion_id)
LEFT JOIN
public.tbl_funktion fkt using(funktion_kurzbz)
LEFT JOIN
public.tbl_fachbereich fb using(fachbereich_kurzbz)
LEFT JOIN
public.tbl_organisationseinheit org on (bf.oe_kurzbz=org.oe_kurzbz)
LEFT JOIN
hr.tbl_vertragsbestandteil_freitext freitext on(vb.vertragsbestandteil_id=freitext.vertragsbestandteil_id)
";
return $this->execQuery($qry,
array($dienstverhaeltnis_id, $datestring, $datestring),
array($dienstverhaeltnis_id, $datestring, $dienstverhaeltnis_id, $datestring),
$this->getEncryptedColumns());
}
@@ -86,9 +129,38 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption
array($dienstverhaeltnis_id),
$this->getEncryptedColumns());
}
public function getGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false)
public function getGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null,
$includefuture=false, $withvalorisationhistory=true)
{
if( !is_null($stichtag) && (time() > strtotime($stichtag))
&& $withvalorisationhistory !== false )
{
$query = $this->getGehaltsbestandteileMitValorisierungsHistorie(
$dienstverhaeltnis_id, $stichtag, $includefuture
);
}
else
{
$query = $this->getGehaltsbestandteileOhneValorisierungsHistorie(
$dienstverhaeltnis_id, $stichtag, $includefuture
);
}
$gehaltsbestandteile = array();
if( null !== ($rows = getData($query)) )
{
foreach( $rows as $row ) {
$tmpgb = new Gehaltsbestandteil();
$tmpgb->hydrateByStdClass($row, true);
$gehaltsbestandteile[] = $tmpgb;
}
}
return $gehaltsbestandteile;
}
protected function getGehaltsbestandteileOhneValorisierungsHistorie($dienstverhaeltnis_id, $stichtag=null, $includefuture=false)
{
$stichtagclause = '';
if( !is_null($stichtag) )
@@ -111,24 +183,65 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption
{$stichtagclause}
EOSQL;
$query = $this->loadWhere(
$result = $this->loadWhere(
$where,
$this->getEncryptedColumns()
);
$gehaltsbestandteile = array();
if( null !== ($rows = getData($query)) )
{
foreach( $rows as $row ) {
$tmpgb = new Gehaltsbestandteil();
$tmpgb->hydrateByStdClass($row, true);
$gehaltsbestandteile[] = $tmpgb;
}
}
return $gehaltsbestandteile;
return $result;
}
protected function getGehaltsbestandteileMitValorisierungsHistorie($dienstverhaeltnis_id, $stichtag, $includefuture=false)
{
$date = strftime('%Y-%m-%d', strtotime($stichtag));
$includefuture_clause = ($includefuture)
? ' OR COALESCE(von, \'1970-01-01\'::date) > ' . $this->escape($date)
: '';
$sql = <<<EOSQL
SELECT
g.gehaltsbestandteil_id,
g.dienstverhaeltnis_id,
g.vertragsbestandteil_id,
g.gehaltstyp_kurzbz,
g.von,
g.bis,
g.anmerkung,
g.grundbetrag AS grundbetrag,
COALESCE(vh.betrag_valorisiert, g.grundbetrag) AS betrag_valorisiert,
g.valorisierungssperre,
g.insertamum,
g.insertvon,
g.updateamum,
g.updatevon,
g.valorisierung,
g.auszahlungen
FROM
hr.tbl_gehaltsbestandteil g
LEFT JOIN
hr.tbl_valorisierung_historie vh ON vh.gehaltsbestandteil_id = g.gehaltsbestandteil_id AND vh.valorisierungsdatum = (
SELECT
vi.valorisierungsdatum
FROM
hr.tbl_valorisierung_instanz vi
JOIN
hr.tbl_dienstverhaeltnis d ON d.dienstverhaeltnis_id = {$this->escape($dienstverhaeltnis_id)}
AND d.oe_kurzbz = vi.oe_kurzbz
WHERE
{$this->escape($date)} >= valorisierungsdatum
ORDER BY
valorisierungsdatum DESC
LIMIT 1
)
WHERE
g.dienstverhaeltnis_id = {$this->escape($dienstverhaeltnis_id)}
AND (
{$this->escape($date)} BETWEEN COALESCE(von, '1970-01-01'::date) AND COALESCE(bis, '2170-01-01'::date)
{$includefuture_clause}
)
EOSQL;
$result = $this->execReadOnlyQuery($sql, array(), $this->getEncryptedColumns());
return $result;
}
public function getGehaltsbestandteil($id)
{
+8 -3
View File
@@ -68,6 +68,7 @@ require_once('dbupdate_3.4/33683_digitale_anwesenheitsliste_und_entschuldigungsm
require_once('dbupdate_3.4/40717_lv_faktor.php');
require_once('dbupdate_3.4/48526_pep_tagging.php');
require_once('dbupdate_3.4/41950_perm_gehaelter.php');
require_once('dbupdate_3.4/53903_valorisierung.php');
require_once('dbupdate_3.4/25999_locale_update.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
@@ -207,11 +208,15 @@ $tabellen=array(
"hr.tbl_karenztyp" => array("karenztyp_kurzbz","bezeichnung"),
"hr.tbl_teilzeittyp" => array("teilzeittyp_kurzbz","bezeichnung","aktiv"),
"hr.tbl_gehaltsbestandteil" => array("gehaltsbestandteil_id","dienstverhaeltnis_id","vertragsbestandteil_id","gehaltstyp_kurzbz","von","bis","anmerkung","grundbetrag","betrag_valorisiert","valorisierungssperre","insertamum", "insertvon","updateamum","updatevon","valorisierung","auszahlungen"),
"hr.tbl_gehaltshistorie" => array("gehaltshistorie_id", "datum","betrag","gehaltsbestandteil_id","mitarbeiter_uid"),
"hr.tbl_gehaltshistorie" => array("gehaltshistorie_id", "datum","betrag","gehaltsbestandteil_id","mitarbeiter_uid","gehaltsbestandteil_von","gehaltsbestandteil_bis"),
"hr.tbl_gehaltstyp" => array("gehaltstyp_kurzbz","bezeichnung","valorisierung","sort","aktiv"),
"hr.tbl_frist" => array("frist_id","mitarbeiter_uid","ereignis_kurzbz","bezeichnung","datum","status_kurzbz","parameter","insertvon","insertamum","updatevon","updateamum"),
"hr.tbl_frist_ereignis" => array("ereignis_kurzbz","bezeichnung","manuell"),
"hr.tbl_frist_status" => array("status_kurzbz", "bezeichnung"),
"hr.tbl_frist_ereignis" => array("ereignis_kurzbz","bezeichnung","manuell","sort"),
"hr.tbl_frist_status" => array("status_kurzbz", "bezeichnung","sort"),
"hr.tbl_valorisierung_historie" => array("valorisierung_historie_id", "gehaltsbestandteil_id", "valorisierungsdatum", "betrag_valorisiert", "insertvon", "insertamum"),
"hr.tbl_valorisierung_instanz" => array("updateamum", "oe_kurzbz", "valorisierungsdatum", "valorisierung_kurzbz", "beschreibung", "ausgewaehlt", "updatevon", "valorisierung_instanz_id"),
"hr.tbl_valorisierung_instanz_methode" => array("valorisierung_instanz_id", "valorisierung_methode_kurzbz", "beschreibung", "valorisierung_methode_parameter"),
"hr.tbl_valorisierung_methode" => array("beschreibung", "valorisierung_methode_kurzbz"),
"lehre.tbl_abschlussbeurteilung" => array("abschlussbeurteilung_kurzbz","bezeichnung","bezeichnung_english","sort"),
"lehre.tbl_abschlusspruefung" => array("abschlusspruefung_id","student_uid","vorsitz","pruefer1","pruefer2","pruefer3","abschlussbeurteilung_kurzbz","akadgrad_id","pruefungstyp_kurzbz","datum","uhrzeit","sponsion","anmerkung","updateamum","updatevon","insertamum","insertvon","ext_id","note","protokoll","endezeit","pruefungsantritt_kurzbz","freigabedatum"),
"lehre.tbl_abschlusspruefung_antritt" => array("pruefungsantritt_kurzbz","bezeichnung","bezeichnung_english","sort"),
+113
View File
@@ -0,0 +1,113 @@
<?php
if (! defined('DB_NAME')) exit('No direct script access allowed');
if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_valorisierung_methode' AND table_schema='hr'"))
{
if ($db->db_num_rows($result) == 0)
{
$qry = "
CREATE TABLE IF NOT EXISTS hr.tbl_valorisierung_methode (
valorisierung_methode_kurzbz character varying(32) NOT NULL,
beschreibung character varying NOT NULL,
CONSTRAINT tbl_valorisierung_methode_pkey PRIMARY KEY (valorisierung_methode_kurzbz)
);
GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_valorisierung_methode TO vilesci;
INSERT INTO hr.tbl_valorisierung_methode (valorisierung_methode_kurzbz, beschreibung) VALUES
('ValorisierungProzent', 'Valorisierung um einen Prozentsatz'),
('ValorisierungFixBetrag', 'Valorisierung um einen fixen Betrag'),
('ValorisierungGestaffelt', 'mehrere Stufen mit unterschiedlichen Prozentwerten')
ON CONFLICT(valorisierung_methode_kurzbz) DO NOTHING;
";
if (! $db->db_query($qry))
echo '<strong>Valorisierung: ' . $db->db_last_error() . '</strong><br>';
else
echo 'hr.tbl_valorisierung_methode wurde neu erstellt<br>';
}
}
if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_valorisierung_instanz' AND table_schema='hr'"))
{
if ($db->db_num_rows($result) == 0)
{
$qry = "
CREATE TABLE IF NOT EXISTS hr.tbl_valorisierung_instanz (
valorisierung_instanz_id serial NOT NULL,
oe_kurzbz character varying(32),
valorisierungsdatum date NOT NULL,
valorisierung_kurzbz character varying(128) NOT NULL,
beschreibung text,
ausgewaehlt boolean DEFAULT false NOT NULL,
updatevon character varying(32),
updateamum timestamp without time zone,
CONSTRAINT tbl_valorisierung_instanz_pkey PRIMARY KEY (valorisierung_instanz_id),
CONSTRAINT tbl_valorisierung_instanz_fk1 FOREIGN KEY (oe_kurzbz) REFERENCES public.tbl_organisationseinheit(oe_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT,
UNIQUE(valorisierung_kurzbz)
);
CREATE UNIQUE INDEX IF NOT EXISTS tbl_valorisierung_instanz_unique_idx ON hr.tbl_valorisierung_instanz (ausgewaehlt, valorisierungsdatum, oe_kurzbz) WHERE (ausgewaehlt = TRUE);
GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_valorisierung_instanz TO vilesci;
GRANT SELECT,UPDATE ON SEQUENCE hr.tbl_valorisierung_instanz_valorisierung_instanz_id_seq TO vilesci;
";
if (! $db->db_query($qry))
echo '<strong>Valorisierung: ' . $db->db_last_error() . '</strong><br>';
else
echo 'hr.tbl_valorisierung_instanz wurde neu erstellt<br>';
}
}
if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_valorisierung_instanz_methode' AND table_schema='hr'"))
{
if ($db->db_num_rows($result) == 0)
{
$qry = "
CREATE TABLE IF NOT EXISTS hr.tbl_valorisierung_instanz_methode (
valorisierung_instanz_id integer NOT NULL,
valorisierung_methode_kurzbz character varying(32) NOT NULL,
beschreibung text,
valorisierung_methode_parameter jsonb NOT NULL,
CONSTRAINT tbl_valorisierung_instanz_methode_pkey PRIMARY KEY (valorisierung_instanz_id, valorisierung_methode_kurzbz),
CONSTRAINT tbl_valorisierung_instanz_methode_fk1 FOREIGN KEY (valorisierung_instanz_id) REFERENCES hr.tbl_valorisierung_instanz(valorisierung_instanz_id) ON UPDATE CASCADE ON DELETE RESTRICT,
CONSTRAINT tbl_valorisierung_instanz_methode_fk2 FOREIGN KEY (valorisierung_methode_kurzbz) REFERENCES hr.tbl_valorisierung_methode(valorisierung_methode_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT
);
GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_valorisierung_instanz_methode TO vilesci;
";
if (! $db->db_query($qry))
echo '<strong>Valorisierung: ' . $db->db_last_error() . '</strong><br>';
else
echo 'hr.tbl_valorisierung_instanz_methode wurde neu erstellt<br>';
}
}
if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_valorisierung_historie' AND table_schema='hr'"))
{
if ($db->db_num_rows($result) == 0)
{
$qry = "
CREATE TABLE IF NOT EXISTS hr.tbl_valorisierung_historie (
valorisierung_historie_id serial NOT NULL,
gehaltsbestandteil_id integer NOT NULL,
valorisierungsdatum date NOT NULL,
betrag_valorisiert bytea NOT NULL,
insertvon character varying(32),
insertamum timestamp without time zone DEFAULT now(),
CONSTRAINT tbl_valorisierung_historie_pkey PRIMARY KEY (valorisierung_historie_id)
);
GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_valorisierung_historie TO vilesci;
GRANT SELECT,UPDATE ON SEQUENCE hr.tbl_valorisierung_historie_valorisierung_historie_id_seq TO vilesci;
";
if (! $db->db_query($qry))
echo '<strong>Valorisierung: ' . $db->db_last_error() . '</strong><br>';
else
echo 'hr.tbl_valorisierung_historie wurde neu erstellt<br>';
}
}