| Server IP : 193.86.120.172 / Your IP : 216.73.216.215 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/typy-pokoju.php
// CRUD typů pokojů (pouze admin a manažer)
// ============================================================
$user = auth_check();
$action = $_GET['action'] ?? '';
$input = json_decode(file_get_contents('php://input'), true) ?? [];
match ($action) {
'seznam' => tp_seznam(),
'detail' => tp_detail((int)($_GET['id'] ?? 0)),
'vytvorit' => tp_vytvorit($user, $input),
'upravit' => tp_upravit($user, (int)($_GET['id'] ?? 0), $input),
'smazat' => tp_smazat($user, (int)($_GET['id'] ?? 0)),
'poradi' => tp_poradi($user, $input),
default => api_response(false, null, 'Neznámá akce', 400),
};
// ------------------------------------------------------------
// SEZNAM — veřejně dostupné (pro rezervační formulář)
// ------------------------------------------------------------
function tp_seznam(): never {
$pouze_aktivni = isset($_GET['aktivni']);
$where = $pouze_aktivni ? 'WHERE aktivni = 1' : '';
$typy = db_rows(
"SELECT t.*,
COUNT(p.id) AS pocet_pokoju,
SUM(CASE WHEN p.aktivni = 1 THEN 1 ELSE 0 END) AS pocet_aktivnich
FROM typy_pokoju t
LEFT JOIN pokoje p ON p.typ_id = t.id
{$where}
GROUP BY t.id
ORDER BY t.poradi ASC, t.nazev ASC"
);
api_response(true, $typy);
}
// ------------------------------------------------------------
// DETAIL
// ------------------------------------------------------------
function tp_detail(int $id): never {
if (!$id) api_response(false, null, 'Chybí ID', 400);
$typ = db_row('SELECT * FROM typy_pokoju WHERE id = ?', [$id]);
if (!$typ) api_response(false, null, 'Typ pokoje nenalezen', 404);
// Přidat seznam pokojů tohoto typu
$pokoje = db_rows(
'SELECT id, cislo, nazev, aktivni, poradi FROM pokoje WHERE typ_id = ? ORDER BY poradi ASC, cislo ASC',
[$id]
);
api_response(true, ['typ' => $typ, 'pokoje' => $pokoje]);
}
// ------------------------------------------------------------
// VYTVOŘENÍ
// ------------------------------------------------------------
function tp_vytvorit(array $user, array $input): never {
auth_require_role($user, ['admin', 'manazer']);
[$nazev, $nazev_en, $nazev_de, $kapacita, $cena, $min_noci, $snidane, $popis, $popis_en, $popis_de, $poradi] = _tp_validuj($input);
$id = db_insert(
'INSERT INTO typy_pokoju (nazev, nazev_en, nazev_de, kapacita, cena_za_noc, min_pobyt_noci, snidane_dostupne, popis, popis_en, popis_de, poradi)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
[$nazev, $nazev_en, $nazev_de, $kapacita, $cena, $min_noci, $snidane, $popis, $popis_en, $popis_de, $poradi]
);
api_response(true, ['id' => $id]);
}
// ------------------------------------------------------------
// ÚPRAVA
// ------------------------------------------------------------
function tp_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 typy_pokoju WHERE id = ?', [$id])) {
api_response(false, null, 'Typ pokoje nenalezen', 404);
}
[$nazev, $nazev_en, $nazev_de, $kapacita, $cena, $min_noci, $snidane, $popis, $popis_en, $popis_de, $poradi] = _tp_validuj($input);
db_query(
'UPDATE typy_pokoju SET nazev=?, nazev_en=?, nazev_de=?, kapacita=?, cena_za_noc=?, min_pobyt_noci=?,
snidane_dostupne=?, popis=?, popis_en=?, popis_de=?, poradi=? WHERE id=?',
[$nazev, $nazev_en, $nazev_de, $kapacita, $cena, $min_noci, $snidane, $popis, $popis_en, $popis_de, $poradi, $id]
);
api_response(true, null);
}
// ------------------------------------------------------------
// SMAZÁNÍ
// ------------------------------------------------------------
function tp_smazat(array $user, int $id): never {
auth_require_role($user, ['admin', 'manazer']);
if (!$id) api_response(false, null, 'Chybí ID', 400);
// Nelze smazat pokud má přiřazené pokoje
$pocet = (int)db_val('SELECT COUNT(*) FROM pokoje WHERE typ_id = ?', [$id]);
if ($pocet > 0) {
api_response(false, null,
'Typ pokoje nelze smazat — má přiřazeno ' . $pocet . ' pokoj(ů). Nejprve smažte pokoje.', 409);
}
db_query('DELETE FROM typy_pokoju WHERE id = ?', [$id]);
api_response(true, null);
}
// ------------------------------------------------------------
// ZMĚNA POŘADÍ
// ------------------------------------------------------------
function tp_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 typy_pokoju SET poradi = ? WHERE id = ?', [(int)$p, (int)$id]);
}
api_response(true, null);
}
// ------------------------------------------------------------
// INTERNÍ — validace vstupu
// ------------------------------------------------------------
function _tp_validuj(array $input): array {
$nazev = trim($input['nazev'] ?? '');
$nazev_en = trim($input['nazev_en'] ?? '');
$nazev_de = trim($input['nazev_de'] ?? '');
$kapacita = (int)($input['kapacita'] ?? 2);
$cena = (float)($input['cena_za_noc'] ?? 0);
$min_noci = (int)($input['min_pobyt_noci'] ?? 1);
$snidane = isset($input['snidane_dostupne']) ? (bool)$input['snidane_dostupne'] : true;
$popis = trim($input['popis'] ?? '');
$popis_en = trim($input['popis_en'] ?? '');
$popis_de = trim($input['popis_de'] ?? '');
$poradi = (int)($input['poradi'] ?? 0);
if (!$nazev) api_response(false, null, 'Název typu pokoje je povinný.', 400);
if ($kapacita < 1 || $kapacita > 20) api_response(false, null, 'Kapacita musí být 1–20 osob.', 400);
if ($cena < 0) api_response(false, null, 'Cena nemůže být záporná.', 400);
if ($min_noci < 1) api_response(false, null, 'Minimální pobyt musí být alespoň 1 noc.', 400);
return [$nazev, $nazev_en, $nazev_de, $kapacita, $cena, $min_noci, $snidane ? 1 : 0, $popis ?: null, $popis_en ?: null, $popis_de ?: null, $poradi];
}