| 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/hodnoceni.php
// Správa hodnocení hostů (1–5 hvězdiček)
// Veřejné uložení přes token (z e-mailu), přehled pro admina
// ============================================================
$action = $_GET['action'] ?? '';
$input = json_decode(file_get_contents('php://input'), true) ?? [];
match ($action) {
'ulozit' => hod_ulozit(), // veřejné — z odkazu v e-mailu
'seznam' => hod_seznam(), // admin/manažer + zaměstnanec s oprávněním
'agregat' => hod_agregat(), // veřejné — pro rezervační stránku
'smazat' => hod_smazat(), // admin/manažer
default => api_response(false, null, 'Neznámá akce', 400),
};
// ------------------------------------------------------------
// ULOŽENÍ HODNOCENÍ (veřejné — přes token z e-mailu)
// GET ?action=ulozit&token=...&h=5
// ------------------------------------------------------------
function hod_ulozit(): never {
$token = trim($_GET['token'] ?? '');
$hvezdicky = (int)($_GET['h'] ?? 0);
if (!$token) api_response(false, null, 'Neplatný odkaz.', 400);
if ($hvezdicky < 1 || $hvezdicky > 5) {
api_response(false, null, 'Hodnocení musí být 1–5 hvězdiček.', 400);
}
// Najít rezervaci podle tokenu
$rez = db_row(
"SELECT id, jmeno, datum_odjezdu, stav FROM rezervace WHERE token_zmena = ?",
[$token]
);
if (!$rez) api_response(false, null, 'Neplatný nebo expirovaný odkaz.', 404);
if ($rez['stav'] === 'zrusena') {
api_response(false, null, 'Hodnocení nelze odeslat pro zrušenou rezervaci.', 400);
}
if ($rez['datum_odjezdu'] > date('Y-m-d')) {
api_response(false, null, 'Hodnocení lze odeslat až po skončení pobytu.', 400);
}
// Již hodnoceno?
if (db_val('SELECT 1 FROM hodnoceni WHERE rezervace_id = ?', [$rez['id']])) {
api_response(false, null, 'Tato rezervace již byla hodnocena.', 409);
}
db_insert(
'INSERT INTO hodnoceni (rezervace_id, hvezdicky) VALUES (?, ?)',
[$rez['id'], $hvezdicky]
);
api_response(true, [
'hvezdicky' => $hvezdicky,
'jmeno' => $rez['jmeno'],
]);
}
// ------------------------------------------------------------
// SEZNAM HODNOCENÍ (admin panel)
// ------------------------------------------------------------
function hod_seznam(): never {
$user = auth_check();
// Zaměstnanec potřebuje oprávnění
if ($user['role'] === 'zamestnanec' && !auth_has_opravneni($user, 'hodnoceni')) {
api_response(false, null, 'Nemáte přístup k hodnocením.', 403);
}
$limit = min((int)($_GET['limit'] ?? 50), 200);
$offset = (int)($_GET['offset'] ?? 0);
$hvezd = (int)($_GET['hvezdicky'] ?? 0); // filtr dle počtu hvězdiček
$where = ['1=1'];
$params = [];
if ($hvezd >= 1 && $hvezd <= 5) {
$where[] = 'h.hvezdicky = ?';
$params[] = $hvezd;
}
$sql_where = implode(' AND ', $where);
$celkem = (int)db_val("SELECT COUNT(*) FROM hodnoceni h WHERE {$sql_where}", $params);
$hodnoceni = db_rows(
"SELECT h.id, h.hvezdicky, h.vytvoreno,
r.id AS rezervace_id, r.jmeno, r.prijmeni, r.email,
r.datum_prijezdu, r.datum_odjezdu,
p.cislo AS pokoj_cislo,
COALESCE(p.nazev, CONCAT('Pokoj ', p.cislo)) AS pokoj_nazev,
t.nazev AS typ_nazev
FROM hodnoceni h
JOIN rezervace r ON r.id = h.rezervace_id
JOIN pokoje p ON p.id = r.pokoj_id
JOIN typy_pokoju t ON t.id = p.typ_id
WHERE {$sql_where}
ORDER BY h.vytvoreno DESC
LIMIT {$limit} OFFSET {$offset}",
$params
);
// Agregát
$agg = db_row('SELECT ROUND(AVG(hvezdicky),1) AS prumer, COUNT(*) AS pocet FROM hodnoceni');
api_response(true, [
'hodnoceni' => $hodnoceni,
'celkem' => $celkem,
'prumer' => $agg['prumer'],
'limit' => $limit,
'offset' => $offset,
]);
}
// ------------------------------------------------------------
// AGREGÁT (veřejné — pro rezervační stránku)
// ------------------------------------------------------------
function hod_agregat(): never {
if (nastaveni('hodnoceni_verejne') !== '1') {
api_response(true, ['zobrazit' => false]);
}
$agg = db_row(
'SELECT ROUND(AVG(hvezdicky), 1) AS prumer, COUNT(*) AS pocet FROM hodnoceni'
);
api_response(true, [
'zobrazit' => true,
'prumer' => $agg['prumer'],
'pocet' => $agg['pocet'],
]);
}
// ------------------------------------------------------------
// SMAZÁNÍ (admin/manažer)
// ------------------------------------------------------------
function hod_smazat(): never {
$user = auth_check();
auth_require_role($user, ['admin', 'manazer']);
$id = (int)($_GET['id'] ?? 0);
if (!$id) api_response(false, null, 'Chybí ID', 400);
if (!db_val('SELECT 1 FROM hodnoceni WHERE id = ?', [$id])) {
api_response(false, null, 'Hodnocení nenalezeno', 404);
}
db_query('DELETE FROM hodnoceni WHERE id = ?', [$id]);
api_response(true, null);
}