| 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/kadernictvidenisa_cz/api/ |
Upload File : |
<?php
// ============================================
// api/admin.php
// Blokace termínů + statistiky (admin only)
// ============================================
// auth.php je načten routerem (index.php)
admin_required();
$sub = $parts[1] ?? '';
$sub_id = isset($parts[2]) && is_numeric($parts[2]) ? (int)$parts[2] : null;
// ---- Blokace termínů ----
if ($sub === 'blokovane') {
if ($method === 'GET') {
$stmt = db()->query("SELECT * FROM blokovane_terminy ORDER BY datum_od");
json_response(['ok' => true, 'data' => $stmt->fetchAll()]);
}
if ($method === 'POST') {
$datum_od = sanitize($input['datum_od'] ?? '');
$datum_do = sanitize($input['datum_do'] ?? $datum_od);
$duvod = sanitize($input['duvod'] ?? '');
if (!valid_date($datum_od) || !valid_date($datum_do)) json_error('Neplatné datum.');
if ($datum_do < $datum_od) json_error('Datum do musí být >= datum od.');
db()->prepare("INSERT INTO blokovane_terminy (datum_od, datum_do, duvod) VALUES (?,?,?)")
->execute([$datum_od, $datum_do, $duvod]);
json_response(['ok' => true, 'id' => db()->lastInsertId()], 201);
}
if ($method === 'DELETE' && $sub_id) {
db()->prepare("DELETE FROM blokovane_terminy WHERE id = ?")->execute([$sub_id]);
json_response(['ok' => true]);
}
}
// ---- Statistiky ----
if ($sub === 'statistiky') {
$rok = (int)($_GET['rok'] ?? date('Y'));
$mesic = (int)($_GET['mesic'] ?? date('n'));
$datum_od = sprintf('%04d-%02d-01', $rok, $mesic);
$datum_do = date('Y-m-t', strtotime($datum_od));
// Celkové tržby a počty za měsíc
$stmt = db()->prepare("
SELECT
COUNT(*) AS celkem,
SUM(CASE WHEN stav != 'zrusena' THEN 1 ELSE 0 END) AS potvrzene,
SUM(CASE WHEN stav = 'zrusena' THEN 1 ELSE 0 END) AS zrusene,
SUM(CASE WHEN stav != 'zrusena' THEN s.cena ELSE 0 END) AS trzby
FROM rezervace r
JOIN sluzby s ON s.id = r.sluzba_id
WHERE r.datum BETWEEN ? AND ?
");
$stmt->execute([$datum_od, $datum_do]);
$souhrn = $stmt->fetch();
// Obsazenost: potvrzené / (všechny pracovní dny v měsíci * dostupné sloty)
$pracovni_dni = 0;
$ts = strtotime($datum_od);
while ($ts <= strtotime($datum_do)) {
$dow = (int)date('N', $ts);
if ($dow !== 7) $pracovni_dni++; // neděle = 7
$ts = strtotime('+1 day', $ts);
}
$celkem_slotu = $pracovni_dni * ((PRACOVNI_DO - PRACOVNI_OD) / SLOT_MINUT);
$obsazenost = $celkem_slotu > 0
? round($souhrn['potvrzene'] / $celkem_slotu * 100)
: 0;
// Nejpopulárnější služby
$stmt = db()->prepare("
SELECT s.nazev, COUNT(*) AS pocet, SUM(s.cena) AS trzby
FROM rezervace r
JOIN sluzby s ON s.id = r.sluzba_id
WHERE r.datum BETWEEN ? AND ? AND r.stav != 'zrusena'
GROUP BY r.sluzba_id
ORDER BY pocet DESC
LIMIT 6
");
$stmt->execute([$datum_od, $datum_do]);
$sluzby_stat = $stmt->fetchAll();
// Tržby po dnech (pro graf)
$stmt = db()->prepare("
SELECT r.datum, SUM(s.cena) AS trzby, COUNT(*) AS pocet
FROM rezervace r
JOIN sluzby s ON s.id = r.sluzba_id
WHERE r.datum BETWEEN ? AND ? AND r.stav != 'zrusena'
GROUP BY r.datum
ORDER BY r.datum
");
$stmt->execute([$datum_od, $datum_do]);
$po_dnech = $stmt->fetchAll();
json_response([
'ok' => true,
'souhrn' => $souhrn,
'obsazenost' => $obsazenost,
'sluzby' => $sluzby_stat,
'po_dnech' => $po_dnech,
]);
}
json_error('Neznámý admin endpoint.', 404);