Compare commits

..

1 Commits

Author SHA1 Message Date
Harald Bamberger 862bdd94d7 add endpoints getRoomsWithEmployeesAssigned and getEmployeesWithRoomAssigned 2026-05-12 11:22:57 +02:00
5 changed files with 174 additions and 23 deletions
@@ -36,7 +36,9 @@ class Ort extends FHCAPI_Controller
'ContentID' => self::PERM_LOGGED,
'getOrtKurzbzContent' => self::PERM_LOGGED,
'getRooms' => self::PERM_LOGGED,
'getTypes' => self::PERM_LOGGED
'getTypes' => self::PERM_LOGGED,
'getRoomsWithEmployeesAssigned' => 'basis/ort:r',
'getEmployeesWithRoomAssigned' => 'basis/ort:r'
]);
$this->load->model('ressource/Ort_model', 'OrtModel');
@@ -174,5 +176,42 @@ class Ort extends FHCAPI_Controller
$this->terminateWithSuccess($content);
}
public function getRoomsWithEmployeesAssigned($ort_kurzbz=null)
{
$res = $this->OrtModel->getRoomsWithEmployeesAssigned($ort_kurzbz);
if (isError($res))
{
$this->terminateWithError(getError($res));
}
$data = hasData($res) ? getData($res) : [];
$this->json_decode_db_res($data);
$this->terminateWithSuccess($data);
}
public function getEmployeesWithRoomAssigned($mitarbeiter_uid=null)
{
$res = $this->OrtModel->getEmployeesWithRoomAssigned($mitarbeiter_uid);
if (isError($res))
{
$this->terminateWithError(getError($res));
}
$data = hasData($res) ? getData($res) : [];
$this->json_decode_db_res($data);
$this->terminateWithSuccess($data);
}
protected function json_decode_db_res(&$data)
{
array_walk($data, function($item, $key) {
isset($item->employees) && $item->employees = json_decode($item->employees);
isset($item->employee) && $item->employee = json_decode($item->employee);
isset($item->room) && $item->room = json_decode($item->room);
});
}
}
@@ -40,9 +40,7 @@ abstract class AbstractBestandteil implements IValidation
if( is_bool($new_value) && ($old_value !== $new_value) ) {
$this->modifiedcolumns[$columnname] = $columnname;
} else if(is_null($old_value) xor is_null($new_value)) {
$this->modifiedcolumns[$columnname] = $columnname;
} else if($old_value != $new_value) {
} else if($old_value != $new_value) {
$this->modifiedcolumns[$columnname] = $columnname;
}
}
@@ -137,25 +137,19 @@ EOTXT;
return parent::__toString() . $txt;
}
public function validate()
/* public function validate()
{
$value = $this->vordienstzeit;
if ($value === null || $value === '') {
$result = null; // allow null value
} else {
$result = filter_var($value, FILTER_VALIDATE_INT, [
'options' => [
'min_range' => 0,
'max_range' => 100
]
]);
if ($result === false) {
$this->validationerrors[] = 'Vordienstjahre muss eine ganze Zahl (0 bis 100) enthalten oder leer sein.';
}
if( !(filter_var($this->tage, FILTER_VALIDATE_INT,
array(
'options' => array(
'min_range' => 1,
'max_range' => 50
)
)
)) ) {
$this->validationerrors[] = 'Urlaubsanspruch muss eine Tagesanzahl im Bereich 1 bis 50 sein.';
}
return parent::validate();
}
} */
}
+120
View File
@@ -32,4 +32,124 @@ class Ort_model extends DB_Model
}
public function getRoomsWithEmployeesAssigned($ort_kurzbz=null)
{
$ort_kurzbz_clause = is_null($ort_kurzbz)
? ''
: 'and r.ort_kurzbz = ' . $this->escape($ort_kurzbz);
$sql = <<<EOSQL
{$this->roomEmployeesCTEs()}
select
r.rauminfo as room,
mir.ma_count as employee_count,
mir.mas_in_room as employees
from
roominfo r
join
mas_in_room mir on r.ort_kurzbz = mir.ort_kurzbz
where
1=1
{$ort_kurzbz_clause}
order by
mir.ma_count DESC
EOSQL;
return $this->execReadOnlyQuery($sql);
}
public function getEmployeesWithRoomAssigned($mitarbeiter_uid=null)
{
$mtarbeiter_uid_clause = is_null($mitarbeiter_uid)
? ''
: 'and aer.mitarbeiter_uid = ' . $this->escape($mitarbeiter_uid);
$sql = <<<EOSQL
{$this->roomEmployeesCTEs()}
select
m.mainfo as employee,
r.rauminfo as room
from
active_employee_room aer
join
roominfo r on aer.ort_kurzbz = r.ort_kurzbz
join
mainfo m on aer.mitarbeiter_uid = m.mitarbeiter_uid
where
1=1
{$mtarbeiter_uid_clause}
EOSQL;
return $this->execReadOnlyQuery($sql);
}
protected function roomEmployeesCTEs()
{
return <<<EOCTES
with active_employee_room as (
select
tm.mitarbeiter_uid,
tm.ort_kurzbz,
td.vertragsart_kurzbz
from
public.tbl_mitarbeiter tm
join
hr.tbl_dienstverhaeltnis td
on
td.mitarbeiter_uid = tm.mitarbeiter_uid
and NOW() between COALESCE(td.von, '1970-01-01') and coalesce(td.bis, '2170-12-31')
and td.mitarbeiter_uid not like '_Dummy%'
),
roominfo as (
select
o.ort_kurzbz,
json_build_object(
'ort_kurzbz', o.ort_kurzbz,
'bezeichnung', o.bezeichnung,
'planbezeichnung', o.planbezeichnung,
'max_person', o.max_person,
'aktiv', o.aktiv
) as rauminfo
from
public.tbl_ort o
),
mainfo as (
select
tm.mitarbeiter_uid,
tm.ort_kurzbz,
json_build_object(
'mitarbeiter_uid', tm.mitarbeiter_uid,
'vorname', tp.vorname,
'nachname', tp.nachname,
'vertragsart_kurzbz', td.vertragsart_kurzbz
) as mainfo
from
public.tbl_mitarbeiter tm
join
public.tbl_benutzer b on b.uid = tm.mitarbeiter_uid and b.aktiv = true
join
public.tbl_person tp on tp.person_id = b.person_id
join
hr.tbl_dienstverhaeltnis td
on
td.mitarbeiter_uid = tm.mitarbeiter_uid
and NOW() between COALESCE(td.von, '1970-01-01') and coalesce(td.bis, '2170-12-31')
and td.mitarbeiter_uid not like '_Dummy%'
),
mas_in_room as (
select
m.ort_kurzbz,
count(m.mitarbeiter_uid) as ma_count,
json_agg(m.mainfo) as mas_in_room
from
mainfo m
group by
m.ort_kurzbz
order by
ma_count desc
)
EOCTES;
}
}
+2 -2
View File
@@ -264,8 +264,8 @@ CREATE TABLE IF NOT EXISTS hr.tbl_vertragsbestandteil_lohnguide (
stellenbezeichnung varchar(255),
fachrichtung_kurzbz character varying(32) NOT NULL,
modellstelle_kurzbz character varying(32) NOT NULL,
kommentar_person text,
kommentar_modellstelle text,
kommentar_person varchar(255),
kommentar_modellstelle varchar(255),
CONSTRAINT tbl_vertragsbestandteil_lohnguide_pk PRIMARY KEY (vertragsbestandteil_id),
CONSTRAINT tbl_vertragsbestandteil_fk FOREIGN KEY (vertragsbestandteil_id) REFERENCES hr.tbl_vertragsbestandteil (vertragsbestandteil_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT tbl_vertragsbestandteil_lohnguide_fachrichtung_fk FOREIGN KEY (fachrichtung_kurzbz) REFERENCES hr.tbl_lohnguide_fachrichtung (fachrichtung_kurzbz) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,