mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 12:19:28 +00:00
258 lines
6.5 KiB
PHP
258 lines
6.5 KiB
PHP
<?php
|
|
use vertragsbestandteil\VertragsbestandteilFactory;
|
|
/**
|
|
* Description of Vertragsbestandteil_model
|
|
*
|
|
* @author bambi
|
|
*/
|
|
class Vertragsbestandteil_model extends DB_Model
|
|
{
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
$this->dbTable = 'hr.tbl_vertragsbestandteil';
|
|
$this->pk = 'vertragsbestandteil_id';
|
|
}
|
|
|
|
protected function getVertragsbestandteilSQL()
|
|
{
|
|
$sapInstalled = $this->_checkIfSAPSyncTableExists();
|
|
|
|
$oe_kurzbz_sap = $sapInstalled ? 'sap.oe_kurzbz_sap' : 'NULL AS oe_kurzbz_sap';
|
|
$sap_join = $sapInstalled ? 'LEFT JOIN sync.tbl_sap_organisationsstruktur sap USING(oe_kurzbz)' : '';
|
|
|
|
$sql = <<<EOSQL
|
|
SELECT
|
|
v.*,
|
|
bf.funktion_kurzbz, bf.uid AS mitarbeiter_uid,
|
|
funktion.beschreibung AS funktion_bezeichnung,
|
|
oe.oe_kurzbz, oe.bezeichnung AS oe_bezeichnung, {$oe_kurzbz_sap},
|
|
oet.organisationseinheittyp_kurzbz AS oe_typ_kurzbz, oet.bezeichnung AS oe_typ_bezeichnung,
|
|
ft.freitexttyp_kurzbz, ft.titel, ft.anmerkung,
|
|
f.benutzerfunktion_id,
|
|
k.karenztyp_kurzbz, k.geplanter_geburtstermin, k.tatsaechlicher_geburtstermin,
|
|
kf.arbeitgeber_frist, kf.arbeitnehmer_frist,
|
|
s.wochenstunden, s.teilzeittyp_kurzbz,
|
|
u.tage,
|
|
z.zeitaufzeichnung, z.azgrelevant, z.homeoffice,
|
|
lg.stellenbezeichnung, lg.vordienstzeit, lg.fachrichtung_kurzbz, lg.modellstelle_kurzbz, lg.kommentar_person, lg.kommentar_modellstelle,
|
|
kv.verwendungsgruppe_kurzbz, kv.kv_jahre, kv.kommentar
|
|
FROM
|
|
hr.tbl_vertragsbestandteil v
|
|
LEFT JOIN
|
|
hr.tbl_vertragsbestandteil_freitext ft USING(vertragsbestandteil_id)
|
|
LEFT JOIN
|
|
hr.tbl_vertragsbestandteil_funktion f USING(vertragsbestandteil_id)
|
|
LEFT JOIN
|
|
public.tbl_benutzerfunktion bf USING(benutzerfunktion_id)
|
|
LEFT JOIN
|
|
public.tbl_funktion funktion USING(funktion_kurzbz)
|
|
LEFT JOIN
|
|
public.tbl_organisationseinheit oe USING(oe_kurzbz)
|
|
LEFT JOIN
|
|
public.tbl_organisationseinheittyp oet USING(organisationseinheittyp_kurzbz)
|
|
{$sap_join}
|
|
LEFT JOIN
|
|
hr.tbl_vertragsbestandteil_karenz k USING(vertragsbestandteil_id)
|
|
LEFT JOIN
|
|
hr.tbl_vertragsbestandteil_kuendigungsfrist kf USING(vertragsbestandteil_id)
|
|
LEFT JOIN
|
|
hr.tbl_vertragsbestandteil_stunden s USING(vertragsbestandteil_id)
|
|
LEFT JOIN
|
|
hr.tbl_vertragsbestandteil_urlaubsanspruch u USING(vertragsbestandteil_id)
|
|
LEFT JOIN
|
|
hr.tbl_vertragsbestandteil_zeitaufzeichnung z USING(vertragsbestandteil_id)
|
|
LEFT JOIN
|
|
hr.tbl_vertragsbestandteil_lohnguide lg USING(vertragsbestandteil_id)
|
|
LEFT JOIN
|
|
hr.tbl_vertragsbestandteil_kollektivvertrag kv USING(vertragsbestandteil_id)
|
|
EOSQL;
|
|
return $sql;
|
|
}
|
|
|
|
public function getVertragsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false)
|
|
{
|
|
$stichtagclause = '';
|
|
if( !is_null($stichtag) )
|
|
{
|
|
$date = strftime('%Y-%m-%d', strtotime($stichtag));
|
|
$stichtagclause = 'AND (' . $this->escape($date)
|
|
. ' BETWEEN COALESCE(v.von, \'1970-01-01\'::date)'
|
|
. ' AND COALESCE(v.bis, \'2170-01-01\'::date)';
|
|
if( $includefuture )
|
|
{
|
|
$stichtagclause .= ' OR COALESCE(v.von, \'1970-01-01\'::date) > '
|
|
. $this->escape($date);
|
|
}
|
|
$stichtagclause .= ')';
|
|
}
|
|
|
|
$sql = <<<EOSQL
|
|
{$this->getVertragsbestandteilSQL()}
|
|
WHERE
|
|
v.dienstverhaeltnis_id = {$this->escape($dienstverhaeltnis_id)}
|
|
{$stichtagclause}
|
|
;
|
|
EOSQL;
|
|
|
|
// echo $sql . "\n\n";
|
|
$query = $this->execReadOnlyQuery($sql); // TODO add decryption
|
|
$data = getData($query);
|
|
|
|
if ($data == null)
|
|
{
|
|
return array();
|
|
}
|
|
|
|
$vertragsbestandteile = array();
|
|
foreach( $data as $row ) {
|
|
try
|
|
{
|
|
$vertragsbestandteile[] = VertragsbestandteilFactory::getVertragsbestandteil($row, true);
|
|
}
|
|
catch (Exception $ex)
|
|
{
|
|
echo $ex->getMessage() . "\n";
|
|
}
|
|
}
|
|
|
|
$dummy = json_encode($vertragsbestandteile);
|
|
return $vertragsbestandteile;
|
|
}
|
|
|
|
|
|
public function getVertragsbestandteil($id)
|
|
{
|
|
|
|
$sql = <<<EOSQL
|
|
{$this->getVertragsbestandteilSQL()}
|
|
WHERE
|
|
v.vertragsbestandteil_id = {$this->escape($id)}
|
|
;
|
|
EOSQL;
|
|
|
|
$query = $this->execReadOnlyQuery($sql);
|
|
|
|
$vertragsbestandteil = null;
|
|
|
|
if( hasData($query) )
|
|
{
|
|
$data = getData($query)[0];
|
|
try
|
|
{
|
|
$vertragsbestandteil = VertragsbestandteilFactory::getVertragsbestandteil($data, true); // TODO add decryption
|
|
}
|
|
catch (Exception $ex)
|
|
{
|
|
echo $ex->getMessage() . "\n";
|
|
}
|
|
}
|
|
|
|
return $vertragsbestandteil;
|
|
|
|
}
|
|
|
|
public function countOverlappingVBsOfSameType(vertragsbestandteil\Vertragsbestandteil $vb)
|
|
{
|
|
$notselfclause = (intval($vb->getVertragsbestandteil_id()) > 0)
|
|
? 'AND v.vertragsbestandteil_id <> ' . $this->escape($vb->getVertragsbestandteil_id())
|
|
: '';
|
|
$sql = <<<EOSQL
|
|
SELECT
|
|
count(*) AS overlappingvbs
|
|
FROM
|
|
hr.tbl_vertragsbestandteil v
|
|
WHERE
|
|
v.dienstverhaeltnis_id = ?
|
|
AND
|
|
v.vertragsbestandteiltyp_kurzbz = ?
|
|
AND
|
|
COALESCE(?::date, '2170-12-31'::date) >= COALESCE(v.von, '1970-01-01'::date)
|
|
AND
|
|
?::date <= COALESCE(v.bis, '2170-12-31')
|
|
{$notselfclause}
|
|
EOSQL;
|
|
$ret = $this->execReadOnlyQuery($sql, array(
|
|
$vb->getDienstverhaeltnis_id(),
|
|
$vb->getVertragsbestandteiltyp_kurzbz(),
|
|
$vb->getBis(),
|
|
$vb->getVon()
|
|
));
|
|
|
|
if( null === ($vbcount = getData($ret)) ) {
|
|
throw new Exception('failed to fetch overlappingvbs count');
|
|
}
|
|
|
|
return $vbcount[0]->overlappingvbs;
|
|
}
|
|
|
|
public function getLastVertragsbestanteilStundenBeforeAltersteilzeit($dienstverhaeltnis_id)
|
|
{
|
|
$sql = <<<EOATZSQL
|
|
select
|
|
*
|
|
from
|
|
hr.tbl_vertragsbestandteil vb
|
|
join
|
|
hr.tbl_vertragsbestandteil_stunden vbs USING(vertragsbestandteil_id)
|
|
where
|
|
vb.dienstverhaeltnis_id = ?
|
|
and (
|
|
vbs.teilzeittyp_kurzbz != 'altersteilzeit'
|
|
or
|
|
vbs.teilzeittyp_kurzbz is NULL
|
|
)
|
|
order by
|
|
vb.bis desc
|
|
limit 1
|
|
EOATZSQL;
|
|
$query = $this->execReadOnlyQuery($sql, array($dienstverhaeltnis_id));
|
|
$data = getData($query);
|
|
|
|
if ($data == null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
$vertragsbestandteil = null;
|
|
try
|
|
{
|
|
$vertragsbestandteil = VertragsbestandteilFactory::getVertragsbestandteil($data[0], true);
|
|
}
|
|
catch (Exception $ex)
|
|
{
|
|
echo $ex->getMessage() . "\n";
|
|
}
|
|
return $vertragsbestandteil;
|
|
}
|
|
|
|
/**
|
|
* Checks if sap sync table exists.
|
|
* @return bool
|
|
*/
|
|
private function _checkIfSAPSyncTableExists()
|
|
{
|
|
$params = array(
|
|
DB_NAME,
|
|
'sync',
|
|
'tbl_sap_organisationsstruktur'
|
|
);
|
|
|
|
$sql = "SELECT
|
|
1 AS exists
|
|
FROM
|
|
information_schema.tables
|
|
WHERE
|
|
table_catalog = ? AND
|
|
table_schema = ? AND
|
|
table_name = ?";
|
|
|
|
$res = $this->execReadOnlyQuery($sql, $params);
|
|
|
|
return hasData($res);
|
|
}
|
|
}
|