| Server IP : 193.86.120.172 / Your IP : 216.73.216.67 Web Server : Apache/2.4.63 (Unix) System : Linux JServices 3.10.108 #86003 SMP Wed Oct 22 13:20:46 CST 2025 x86_64 User : kubec ( 1026) PHP Version : 8.2.28 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /volume1/web/hotel_jservices_cz/api/ |
Upload File : |
<?php
// ============================================================
// Hotel DEMO — api/doplnky.php
// CRUD doplňkových služeb (admin a manažer)
// Zaměstnanec doplňky pouze čte přes api/dostupnost.php
// ============================================================
$user = auth_check();
$action = $_GET['action'] ?? '';
$input = json_decode(file_get_contents('php://input'), true) ?? [];
match ($action) {
'seznam' => dp_seznam(),
'detail' => dp_detail((int)($_GET['id'] ?? 0)),
'vytvorit' => dp_vytvorit($user, $input),
'upravit' => dp_upravit($user, (int)($_GET['id'] ?? 0), $input),
'smazat' => dp_smazat($user, (int)($_GET['id'] ?? 0)),
'aktivovat' => dp_aktivovat($user, (int)($_GET['id'] ?? 0), true),
'deaktivovat' => dp_aktivovat($user, (int)($_GET['id'] ?? 0), false),
'poradi' => dp_poradi($user, $input),
default => api_response(false, null, 'Neznámá akce', 400),
};
// ------------------------------------------------------------
// SEZNAM
// ------------------------------------------------------------
function dp_seznam(): never {
$pouze_aktivni = isset($_GET['aktivni']);
$where = $pouze_aktivni ? 'WHERE aktivni = 1' : '';
$doplnky = db_rows(
"SELECT * FROM doplnky {$where} ORDER BY poradi ASC, nazev ASC"
);
api_response(true, $doplnky);
}
// ------------------------------------------------------------
// DETAIL
// ------------------------------------------------------------
function dp_detail(int $id): never {
if (!$id) api_response(false, null, 'Chybí ID', 400);
$doplnek = db_row('SELECT * FROM doplnky WHERE id = ?', [$id]);
if (!$doplnek) api_response(false, null, 'Doplněk nenalezen', 404);
// Kolik rezervací aktuálně používá tento doplněk
$pocet_pouziti = (int)db_val(
"SELECT COUNT(*) FROM rezervace_doplnky rd
JOIN rezervace r ON r.id = rd.rezervace_id
WHERE rd.doplnek_id = ? AND r.stav != 'zrusena' AND r.datum_odjezdu >= CURDATE()",
[$id]
);
api_response(true, ['doplnek' => $doplnek, 'pocet_aktivnich_rezervaci' => $pocet_pouziti]);
}
// ------------------------------------------------------------
// VYTVOŘENÍ
// ------------------------------------------------------------
function dp_vytvorit(array $user, array $input): never {
auth_require_role($user, ['admin', 'manazer']);
[$nazev, $nazev_en, $nazev_de, $cena, $typ, $kapacita, $poradi, $skupina] = _dp_validuj($input);
$id = db_insert(
'INSERT INTO doplnky (nazev, nazev_en, nazev_de, cena, typ_uctovani, kapacita, poradi, skupina)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
[$nazev, $nazev_en, $nazev_de, $cena, $typ, $kapacita, $poradi, $skupina]
);
api_response(true, ['id' => $id]);
}
// ------------------------------------------------------------
// ÚPRAVA
// ------------------------------------------------------------
function dp_upravit(array $user, int $id, array $input): never {
auth_require_role($user, ['admin', 'manazer']);
if (!$id) api_response(false, null, 'Chybí ID', 400);
if (!db_val('SELECT 1 FROM doplnky WHERE id = ?', [$id])) {
api_response(false, null, 'Doplněk nenalezen', 404);
}
[$nazev, $nazev_en, $nazev_de, $cena, $typ, $kapacita, $poradi, $skupina] = _dp_validuj($input);
db_query(
'UPDATE doplnky SET nazev=?, nazev_en=?, nazev_de=?, cena=?, typ_uctovani=?, kapacita=?, poradi=?, skupina=? WHERE id=?',
[$nazev, $nazev_en, $nazev_de, $cena, $typ, $kapacita, $poradi, $skupina, $id]
);
api_response(true, null);
}
// ------------------------------------------------------------
// SMAZÁNÍ
// ------------------------------------------------------------
function dp_smazat(array $user, int $id): never {
auth_require_role($user, ['admin', 'manazer']);
if (!$id) api_response(false, null, 'Chybí ID', 400);
// Nelze smazat pokud je použit v aktivních rezervacích
$pocet = (int)db_val(
"SELECT COUNT(*) FROM rezervace_doplnky rd
JOIN rezervace r ON r.id = rd.rezervace_id
WHERE rd.doplnek_id = ? AND r.stav != 'zrusena' AND r.datum_odjezdu >= CURDATE()",
[$id]
);
if ($pocet > 0) {
api_response(false, null,
'Doplněk nelze smazat — je použit v ' . $pocet . ' aktivní rezervaci/ích. ' .
'Nejprve jej deaktivujte.', 409);
}
db_query('DELETE FROM doplnky WHERE id = ?', [$id]);
api_response(true, null);
}
// ------------------------------------------------------------
// AKTIVACE / DEAKTIVACE
// ------------------------------------------------------------
function dp_aktivovat(array $user, int $id, bool $aktivni): never {
auth_require_role($user, ['admin', 'manazer']);
if (!$id) api_response(false, null, 'Chybí ID', 400);
if (!db_val('SELECT 1 FROM doplnky WHERE id = ?', [$id])) {
api_response(false, null, 'Doplněk nenalezen', 404);
}
db_query('UPDATE doplnky SET aktivni = ? WHERE id = ?', [$aktivni ? 1 : 0, $id]);
api_response(true, null);
}
// ------------------------------------------------------------
// ZMĚNA POŘADÍ
// ------------------------------------------------------------
function dp_poradi(array $user, array $input): never {
auth_require_role($user, ['admin', 'manazer']);
$poradi = $input['poradi'] ?? [];
if (!is_array($poradi)) api_response(false, null, 'Neplatná data', 400);
foreach ($poradi as $id => $p) {
db_query('UPDATE doplnky SET poradi = ? WHERE id = ?', [(int)$p, (int)$id]);
}
api_response(true, null);
}
// ------------------------------------------------------------
// INTERNÍ — validace
// ------------------------------------------------------------
function _dp_validuj(array $input): array {
$nazev = trim($input['nazev'] ?? '');
$nazev_en = trim($input['nazev_en'] ?? '');
$nazev_de = trim($input['nazev_de'] ?? '');
$cena = (float)($input['cena'] ?? 0);
$typ = $input['typ_uctovani'] ?? 'jednorazove';
$kapacita = isset($input['kapacita']) && $input['kapacita'] !== ''
? (int)$input['kapacita']
: null;
$poradi = (int)($input['poradi'] ?? 0);
$skupina = trim($input['skupina'] ?? '') ?: null;
if (!$nazev) api_response(false, null, 'Název doplňku je povinný.', 400);
if ($cena < 0) api_response(false, null, 'Cena nemůže být záporná.', 400);
if (!in_array($typ, ['jednorazove', 'za_noc', 'za_osobu_noc'], true)) {
api_response(false, null, 'Neplatný typ účtování.', 400);
}
if ($kapacita !== null && $kapacita < 0) {
api_response(false, null, 'Kapacita nemůže být záporná.', 400);
}
return [$nazev, $nazev_en, $nazev_de, $cena, $typ, $kapacita, $poradi, $skupina];
}