| 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/notifikace.php
// Polling endpoint — zobrazuje aktuální nevyřízené položky
// (žluté = čeká na potvrzení, fialové = čeká na schválení)
// ============================================================
require_once __DIR__ . '/../includes/config.php';
require_once __DIR__ . '/../includes/db.php';
// Ověření session bez spuštění auth routeru
$token = $_COOKIE['session_token'] ?? $_SERVER['HTTP_X_SESSION_TOKEN'] ?? '';
if (!$token) api_response(false, null, 'Nepřihlášen', 401);
$user = db_row(
'SELECT u.id, u.jmeno, u.prijmeni, u.role
FROM uzivatel_session s
JOIN uzivatele u ON u.id = s.uzivatel_id
WHERE s.token = ? AND s.platnost_do > NOW() AND u.aktivni = 1',
[$token]
);
if (!$user) api_response(false, null, 'Nepřihlášen', 401);
$action = $_GET['action'] ?? 'get';
match ($action) {
'get' => notif_seznam($user),
default => api_response(false, null, 'Neznámá akce', 404),
};
// ------------------------------------------------------------
// Helper — formátuje datum "2026-06-25" na "25.6."
// ------------------------------------------------------------
function fmt_datum_kratky(string $datum): string {
[$rok, $mes, $den] = explode('-', $datum);
return (int)$den . '.' . (int)$mes . '.';
}
function notif_seznam(array $user): never {
$je_manazer = in_array($user['role'], ['admin', 'manazer'], true);
$notifikace = [];
// 1. Rezervace čekající na potvrzení (žluté) — pro všechny role
$cekajici = db_rows(
"SELECT r.id, r.jmeno, r.prijmeni, r.vytvoreno,
r.datum_prijezdu, r.datum_odjezdu,
t.nazev AS typ_nazev
FROM rezervace r
JOIN pokoje p ON p.id = r.pokoj_id
JOIN typy_pokoju t ON t.id = p.typ_id
WHERE r.stav = 'ceka'
AND r.cas_zadost_stav IS NULL
AND r.pokoj_zadost_stav IS NULL
AND (r.sleva_stav IS NULL OR r.sleva_stav NOT IN ('navrzena'))
ORDER BY r.vytvoreno ASC
LIMIT 30",
[]
);
foreach ($cekajici as $r) {
$termin = fmt_datum_kratky($r['datum_prijezdu']) . ' – ' . fmt_datum_kratky($r['datum_odjezdu']);
$notifikace[] = [
'typ' => 'ceka_potvrzeni',
'ikona' => '📥',
'barva' => '#d97706',
'text' => $r['jmeno'] . ' ' . $r['prijmeni'] . ' — ' . $r['typ_nazev'],
'popis' => 'Čeká na potvrzení · ' . $termin,
'cas' => $r['vytvoreno'],
'rezervace_id' => (int)$r['id'],
];
}
// 2. Žádosti o schválení (fialové) — jen pro manažera/admina
if ($je_manazer) {
// Žádosti o čas
$zadosti_cas = db_rows(
"SELECT r.id, r.jmeno, r.prijmeni, r.cas_zadost_typ, r.cas_zadost_hodnota,
r.datum_prijezdu, r.datum_odjezdu, r.vytvoreno
FROM rezervace r
WHERE r.cas_zadost_stav = 'ceka'
ORDER BY r.vytvoreno ASC LIMIT 20",
[]
);
foreach ($zadosti_cas as $r) {
$typ_str = $r['cas_zadost_typ'] === 'checkin' ? 'check-in' : 'check-out';
$termin = fmt_datum_kratky($r['datum_prijezdu']) . ' – ' . fmt_datum_kratky($r['datum_odjezdu']);
$notifikace[] = [
'typ' => 'zadost_cas',
'ikona' => '🕑',
'barva' => '#7c3aed',
'text' => $r['jmeno'] . ' ' . $r['prijmeni'],
'popis' => 'Žádost o ' . $typ_str . ' v ' . $r['cas_zadost_hodnota'] . ' · ' . $termin,
'cas' => $r['vytvoreno'],
'rezervace_id' => (int)$r['id'],
];
}
// Žádosti o pokoj
$zadosti_pokoj = db_rows(
"SELECT r.id, r.jmeno, r.prijmeni,
r.datum_prijezdu, r.datum_odjezdu, r.vytvoreno
FROM rezervace r
WHERE r.pokoj_zadost_stav = 'ceka'
ORDER BY r.vytvoreno ASC LIMIT 20",
[]
);
foreach ($zadosti_pokoj as $r) {
$termin = fmt_datum_kratky($r['datum_prijezdu']) . ' – ' . fmt_datum_kratky($r['datum_odjezdu']);
$notifikace[] = [
'typ' => 'zadost_pokoj',
'ikona' => '🔁',
'barva' => '#7c3aed',
'text' => $r['jmeno'] . ' ' . $r['prijmeni'],
'popis' => 'Žádost o změnu pokoje · ' . $termin,
'cas' => $r['vytvoreno'],
'rezervace_id' => (int)$r['id'],
];
}
// Návrhy slevy
$zadosti_sleva = db_rows(
"SELECT r.id, r.jmeno, r.prijmeni, r.sleva_castka,
r.datum_prijezdu, r.datum_odjezdu, r.vytvoreno
FROM rezervace r
WHERE r.sleva_stav = 'navrzena'
ORDER BY r.vytvoreno ASC LIMIT 20",
[]
);
foreach ($zadosti_sleva as $r) {
$termin = fmt_datum_kratky($r['datum_prijezdu']) . ' – ' . fmt_datum_kratky($r['datum_odjezdu']);
$notifikace[] = [
'typ' => 'zadost_sleva',
'ikona' => '💰',
'barva' => '#7c3aed',
'text' => $r['jmeno'] . ' ' . $r['prijmeni'],
'popis' => 'Návrh slevy ' . number_format((float)$r['sleva_castka'], 0, ',', ' ') . ' Kč · ' . $termin,
'cas' => $r['vytvoreno'],
'rezervace_id' => (int)$r['id'],
];
}
// Rezervace s obecnou čekající žádostí (kombinace)
$s_zadosti = db_rows(
"SELECT r.id, r.jmeno, r.prijmeni,
r.datum_prijezdu, r.datum_odjezdu, r.vytvoreno
FROM rezervace r
WHERE r.stav = 'ceka'
AND (r.cas_zadost_stav = 'ceka' OR r.pokoj_zadost_stav = 'ceka' OR r.sleva_stav = 'navrzena')
ORDER BY r.vytvoreno ASC LIMIT 20",
[]
);
foreach ($s_zadosti as $r) {
$uz_je = array_filter($notifikace, fn($n) => $n['rezervace_id'] === (int)$r['id']);
if (!$uz_je) {
$termin = fmt_datum_kratky($r['datum_prijezdu']) . ' – ' . fmt_datum_kratky($r['datum_odjezdu']);
$notifikace[] = [
'typ' => 'zadost',
'ikona' => '⚠️',
'barva' => '#7c3aed',
'text' => $r['jmeno'] . ' ' . $r['prijmeni'],
'popis' => 'Čeká na schválení · ' . $termin,
'cas' => $r['vytvoreno'],
'rezervace_id' => (int)$r['id'],
];
}
}
}
// Seřadit dle času
usort($notifikace, fn($a, $b) => strcmp($a['cas'], $b['cas']));
api_response(true, [
'notifikace' => $notifikace,
'pocet' => count($notifikace),
]);
}