| 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/zakaznici.php (admin only)
// GET /api/zakaznici – seznam
// GET /api/zakaznici/{id} – detail + rezervace
// PUT /api/zakaznici/{id} – uložit poznámku/štítky
// POST /api/zakaznici/sync – synchronizovat z rezervací
// ============================================
// auth.php je načten routerem (index.php)
admin_required();
$sub = $parts[1] ?? '';
// ---- Sync: vytvoří záznamy pro všechny zákazníky z rezervací ----
if ($method === 'POST' && $sub === 'sync') {
$stmt = db()->query("
SELECT DISTINCT email, jmeno, prijmeni, telefon
FROM rezervace
ORDER BY vytvoreno DESC
");
$rows = $stmt->fetchAll();
$count = 0;
foreach ($rows as $r) {
db()->prepare("
INSERT INTO zakaznici (email, jmeno, prijmeni, telefon)
VALUES (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
jmeno = IF(jmeno = '', VALUES(jmeno), jmeno),
prijmeni = IF(prijmeni = '', VALUES(prijmeni), prijmeni),
telefon = IF(telefon IS NULL, VALUES(telefon), telefon)
")->execute([$r['email'], $r['jmeno'], $r['prijmeni'], $r['telefon']]);
$count++;
}
json_response(['ok' => true, 'synced' => $count]);
}
// ---- Seznam zákazníků ----
if ($method === 'GET' && !$id && $sub !== 'sync') {
$search = sanitize($_GET['q'] ?? '');
$where = '';
$params = [];
if ($search) {
$where = "WHERE z.jmeno LIKE ? OR z.prijmeni LIKE ? OR z.email LIKE ? OR z.telefon LIKE ?";
$like = '%' . $search . '%';
$params = [$like, $like, $like, $like];
}
$stmt = db()->prepare("
SELECT z.*,
COUNT(r.id) AS pocet_rezervaci,
MAX(r.datum) AS posledni_navsteva,
SUM(CASE WHEN r.stav != 'zrusena' THEN s.cena ELSE 0 END) AS celkem_utraceno
FROM zakaznici z
LEFT JOIN rezervace r ON r.email = z.email
LEFT JOIN sluzby s ON s.id = r.sluzba_id
{$where}
GROUP BY z.id
ORDER BY z.prijmeni, z.jmeno
");
$stmt->execute($params);
json_response(['ok' => true, 'data' => $stmt->fetchAll()]);
}
// ---- Detail zákazníka ----
if ($method === 'GET' && $id) {
$stmt = db()->prepare("SELECT * FROM zakaznici WHERE id = ?");
$stmt->execute([$id]);
$zakaznik = $stmt->fetch();
if (!$zakaznik) json_error('Zákazník nenalezen.', 404);
// Historie rezervací
$stmt2 = db()->prepare("
SELECT r.id, r.datum, TIME_FORMAT(r.cas_od,'%H:%i') AS cas_od,
TIME_FORMAT(r.cas_do,'%H:%i') AS cas_do,
r.stav, r.poznamka, s.nazev AS sluzba,
r.cena_upravena, r.hodnoceni,
COALESCE(r.cena_upravena, s.cena) AS cena
FROM rezervace r
JOIN sluzby s ON s.id = r.sluzba_id
WHERE r.email = ?
ORDER BY r.datum DESC, r.cas_od DESC
");
$stmt2->execute([$zakaznik['email']]);
$rezervace = $stmt2->fetchAll();
// Přidej doplňky ke každé rezervaci
if (!empty($rezervace)) {
$rez_ids = array_column($rezervace, 'id');
$placeholders = implode(',', array_fill(0, count($rez_ids), '?'));
$stmt_d = db()->prepare("SELECT * FROM rezervace_doplnky WHERE rezervace_id IN ($placeholders)");
$stmt_d->execute($rez_ids);
$vsechny_doplnky = $stmt_d->fetchAll();
$doplnky_map = [];
foreach ($vsechny_doplnky as $d) {
$doplnky_map[$d['rezervace_id']][] = $d;
}
foreach ($rezervace as &$r) {
$r['doplnky'] = $doplnky_map[$r['id']] ?? [];
}
}
// Statistiky — počítat i doplňky
$potvrzene = array_filter($rezervace, function($r) { return $r['stav'] !== 'zrusena'; });
$celkem = array_sum(array_map(function($r) {
$extra = array_sum(array_column($r['doplnky'] ?? [], 'cena'));
return (float)$r['cena'] + $extra;
}, $potvrzene));
$navstevy = count($potvrzene);
// Průměrné hodnocení - jen z ohodnocených rezervací
$hodnoceni_vals = array_filter(array_column($rezervace, 'hodnoceni'), function($h) { return $h !== null; });
$prumer_hodnoceni = count($hodnoceni_vals) > 0 ? array_sum($hodnoceni_vals) / count($hodnoceni_vals) : null;
json_response([
'ok' => true,
'zakaznik' => $zakaznik,
'rezervace' => $rezervace,
'stats' => [
'navstevy' => $navstevy,
'celkem_utraceno' => $celkem,
'posledni' => $rezervace[0]['datum'] ?? null,
'prumer_hodnoceni' => $prumer_hodnoceni,
'pocet_hodnoceni' => count($hodnoceni_vals),
]
]);
}
// ---- Uložit poznámku / štítky ----
if ($method === 'PUT' && $id) {
$poznamka = sanitize($input['poznamka'] ?? '');
$stitky = sanitize($input['stitky'] ?? '');
$telefon = sanitize($input['telefon'] ?? '');
db()->prepare("
UPDATE zakaznici SET poznamka = ?, stitky = ?, telefon = ? WHERE id = ?
")->execute([$poznamka, $stitky, $telefon, $id]);
json_response(['ok' => true]);
}
if (($method === 'DELETE' || ($method === 'POST' && ($input['_method'] ?? '') === 'DELETE')) && $id) {
db()->prepare("DELETE FROM zakaznici WHERE id = ?")->execute([$id]);
json_response(['ok' => true]);
}
json_error('Metoda není podporována.', 405);