| 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/zakaznici.php
// Kartotéka hostů — CRUD + statistiky + historie pobytů
// Přístup: admin, manažer, zaměstnanec s oprávněním 'kartoteka'
// ============================================================
$user = auth_check();
$action = $_GET['action'] ?? '';
$input = json_decode(file_get_contents('php://input'), true) ?? [];
// Zaměstnanec potřebuje oprávnění kartoteka
if ($user['role'] === 'zamestnanec' && !auth_has_opravneni($user, 'kartoteka')) {
api_response(false, null, 'Nemáte přístup ke kartotéce zákazníků.', 403);
}
match ($action) {
'seznam' => zak_seznam(),
'detail' => zak_detail((int)($_GET['id'] ?? 0)),
'upravit' => zak_upravit($user, (int)($_GET['id'] ?? 0), $input),
'smazat' => zak_smazat($user, (int)($_GET['id'] ?? 0)),
default => api_response(false, null, 'Neznámá akce', 400),
};
// ------------------------------------------------------------
// SEZNAM
// ------------------------------------------------------------
function zak_seznam(): never {
$search = trim($_GET['search'] ?? '');
$limit = min((int)($_GET['limit'] ?? 50), 200);
$offset = (int)($_GET['offset'] ?? 0);
$where = ['1=1'];
$params = [];
if ($search) {
$where[] = '(z.jmeno LIKE ? OR z.prijmeni LIKE ? OR z.email LIKE ? OR z.telefon LIKE ?)';
$s = '%' . $search . '%';
$params = [$s, $s, $s, $s];
}
$sql_where = implode(' AND ', $where);
$celkem = (int)db_val("SELECT COUNT(*) FROM zakaznici z WHERE {$sql_where}", $params);
$zakaznici = db_rows(
"SELECT z.*,
COUNT(r.id) AS pocet_pobytu,
MAX(r.datum_prijezdu) AS posledni_pobyt,
ROUND(AVG(h.hvezdicky), 1) AS prumerne_hodnoceni,
SUM(COALESCE(r.cena_upravena, r.cena_zaklad
+ COALESCE((
SELECT SUM(rd.cena_celkem) FROM rezervace_doplnky rd WHERE rd.rezervace_id = r.id
), 0))) AS celkova_utrata
FROM zakaznici z
LEFT JOIN rezervace r ON r.email = z.email AND r.stav != 'zrusena'
LEFT JOIN hodnoceni h ON h.rezervace_id = r.id
WHERE {$sql_where}
GROUP BY z.id
ORDER BY z.prijmeni ASC, z.jmeno ASC
LIMIT {$limit} OFFSET {$offset}",
$params
);
api_response(true, [
'zakaznici' => $zakaznici,
'celkem' => $celkem,
'limit' => $limit,
'offset' => $offset,
]);
}
// ------------------------------------------------------------
// DETAIL + HISTORIE POBYTŮ
// ------------------------------------------------------------
function zak_detail(int $id): never {
if (!$id) api_response(false, null, 'Chybí ID', 400);
$zakaznik = db_row('SELECT * FROM zakaznici WHERE id = ?', [$id]);
if (!$zakaznik) api_response(false, null, 'Zákazník nenalezen', 404);
// Historie rezervací dle e-mailu
$rezervace = db_rows(
"SELECT r.id, r.datum_prijezdu, r.datum_odjezdu, r.pocet_noci,
r.pocet_hostu, r.stav, r.cena_zaklad, r.cena_upravena, r.vytvoreno,
p.cislo AS pokoj_cislo,
COALESCE(p.nazev, CONCAT('Pokoj ', p.cislo)) AS pokoj_nazev,
t.nazev AS typ_nazev,
h.hvezdicky
FROM rezervace r
JOIN pokoje p ON p.id = r.pokoj_id
JOIN typy_pokoju t ON t.id = p.typ_id
LEFT JOIN hodnoceni h ON h.rezervace_id = r.id
WHERE r.email = ?
ORDER BY r.datum_prijezdu DESC",
[$zakaznik['email']]
);
// Statistiky
$stats = db_row(
"SELECT COUNT(r.id) AS pocet_pobytu,
SUM(r.pocet_noci) AS celkem_noci,
ROUND(AVG(h.hvezdicky), 1) AS prumerne_hodnoceni,
MIN(r.datum_prijezdu) AS prvni_pobyt,
MAX(r.datum_prijezdu) AS posledni_pobyt
FROM rezervace r
LEFT JOIN hodnoceni h ON h.rezervace_id = r.id
WHERE r.email = ? AND r.stav != 'zrusena'",
[$zakaznik['email']]
);
api_response(true, [
'zakaznik' => $zakaznik,
'rezervace' => $rezervace,
'stats' => $stats,
]);
}
// ------------------------------------------------------------
// ÚPRAVA
// ------------------------------------------------------------
function zak_upravit(array $user, int $id, array $input): never {
if ($user['role'] === 'zamestnanec') {
api_response(false, null, 'Zaměstnanec nemůže editovat kartotéku.', 403);
}
if (!$id) api_response(false, null, 'Chybí ID', 400);
$zakaznik = db_row('SELECT * FROM zakaznici WHERE id = ?', [$id]);
if (!$zakaznik) api_response(false, null, 'Zákazník nenalezen', 404);
$jmeno = trim($input['jmeno'] ?? $zakaznik['jmeno']);
$prijmeni = trim($input['prijmeni'] ?? $zakaznik['prijmeni']);
$telefon = trim($input['telefon'] ?? $zakaznik['telefon'] ?? '');
$poznamka = trim($input['poznamka'] ?? $zakaznik['poznamka'] ?? '');
if (!$jmeno || !$prijmeni) {
api_response(false, null, 'Jméno a příjmení jsou povinné.', 400);
}
db_query(
'UPDATE zakaznici SET jmeno=?, prijmeni=?, telefon=?, poznamka=? WHERE id=?',
[$jmeno, $prijmeni, $telefon ?: null, $poznamka ?: null, $id]
);
api_response(true, null);
}
// ------------------------------------------------------------
// SMAZÁNÍ (pouze admin/manažer)
// ------------------------------------------------------------
function zak_smazat(array $user, int $id): never {
auth_require_role($user, ['admin', 'manazer']);
if (!$id) api_response(false, null, 'Chybí ID', 400);
if (!db_val('SELECT 1 FROM zakaznici WHERE id = ?', [$id])) {
api_response(false, null, 'Zákazník nenalezen', 404);
}
db_query('DELETE FROM zakaznici WHERE id = ?', [$id]);
api_response(true, null);
}