| 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/kadernictvidenisa_cz/ |
Upload File : |
<?php
require_once __DIR__ . '/includes/db.php';
require_once __DIR__ . '/includes/mailer.php';
$token = sanitize($_GET['token'] ?? '');
$error = '';
$rezervace = null;
$uspech = false;
if (strlen($token) !== 64) { $error = 'Neplatný odkaz.'; }
if (!$error) {
$stmt = db()->prepare("SELECT r.*, s.nazev AS sluzba_nazev, s.cena FROM rezervace r JOIN sluzby s ON s.id = r.sluzba_id WHERE r.token_zmena = ?");
$stmt->execute([$token]);
$rezervace = $stmt->fetch();
if (!$rezervace) { $error = 'Rezervace nenalezena.'; }
elseif ($rezervace['stav'] === 'zrusena') { $error = 'Tato rezervace byla již zrušena.'; }
}
if (!$error && !$uspech) {
$termin_ts = strtotime($rezervace['datum'] . ' ' . $rezervace['cas_od']);
$storno_hod = (int) nastaveni('rezervace_storno_hod', 24);
if ($termin_ts - time() < $storno_hod * 3600) {
$error = 'Rezervaci lze zrušit nejpozději ' . $storno_hod . ' hodin před termínem. Kontaktujte nás prosím telefonicky.';
}
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['akce']) && $_POST['akce'] === 'zrusit' && !$error) {
db()->prepare("UPDATE rezervace SET stav='zrusena', zruseno_kym='zakaznik' WHERE token_zmena=?")->execute([$token]);
// Smaž událost z Outlooku
if (!empty($rezervace['ms_event_id'])) {
try {
require_once __DIR__ . '/includes/calendar.php';
graph_zrus_udalost($rezervace['ms_event_id']);
} catch (Exception $e) {
error_log('[Zruseni] Calendar delete: ' . $e->getMessage());
}
}
$cena_fmt = ($rezervace['cena'] !== null ? number_format($rezervace['cena'], 0, ',', ' ') : 'Individuální');
$rez_mail = [
'jmeno' => $rezervace['jmeno'],
'prijmeni' => $rezervace['prijmeni'],
'email' => $rezervace['email'],
'telefon' => $rezervace['telefon'] ?? '',
'poznamka' => $rezervace['poznamka'] ?? '',
'datum' => $rezervace['datum'],
'cas_od' => substr($rezervace['cas_od'], 0, 5),
'cena' => $cena_fmt,
'token_zmena' => $token,
];
try { email_zruseni($rez_mail, $rezervace['sluzba_nazev'], 'zakaznik'); } catch (Exception $e) {}
try { email_notifikace_admin($rez_mail, $rezervace['sluzba_nazev'], 'zrusena'); } catch (Exception $e) {}
$uspech = true;
}
$salon_nazev = nastaveni('salon_nazev', 'Kadeřnictví Denisa');
?>
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Zrušení rezervace – <?= htmlspecialchars($salon_nazev) ?></title>
<style>
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:-apple-system,sans-serif;background:#f9fafb;color:#111827;min-height:100vh}
.page{max-width:480px;margin:0 auto;padding:2rem 1rem}
.logo{text-align:center;margin-bottom:1.5rem;font-size:20px;font-weight:700;color:#7c3aed}
.card{background:#fff;border:1px solid #e5e7eb;border-radius:16px;padding:1.5rem;margin-bottom:1rem}
h2{font-size:18px;font-weight:700;margin-bottom:6px}
.sub{font-size:13px;color:#6b7280;margin-bottom:1.25rem}
.info-row{display:flex;justify-content:space-between;font-size:13px;padding:6px 0;border-bottom:1px solid #f3e8ff}
.info-row:last-child{border-bottom:none;margin-bottom:1.25rem}
.info-label{color:#6b7280}
.info-val{font-weight:600}
.btn-cancel{width:100%;background:#991b1b;color:#fff;border:none;border-radius:999px;padding:13px;font-size:15px;font-weight:600;cursor:pointer;margin-bottom:10px}
.btn-cancel:hover{background:#7f1d1d}
.btn-back{display:block;width:100%;background:none;border:2px solid #e9d5ff;border-radius:999px;padding:11px;font-size:14px;color:#7c3aed;cursor:pointer;text-align:center;text-decoration:none}
.btn-back:hover{background:#faf5ff}
.alert{border-radius:10px;padding:12px 14px;font-size:13px;margin-bottom:1rem}
.alert.error{background:#fee2e2;color:#991b1b;border:1px solid #fca5a5}
.alert.success{background:#dcfce7;color:#166534;border:1px solid #86efac}
</style>
</head>
<body>
<div class="page">
<div class="logo">✂️ <?= htmlspecialchars($salon_nazev) ?></div>
<?php if ($uspech): ?>
<div class="card">
<div class="alert success">✅ Vaše rezervace byla úspěšně zrušena. Potvrzení jsme zaslali e-mailem.</div>
<a href="/" class="btn-back">← Nová rezervace</a>
</div>
<?php elseif ($error && empty($rezervace)): ?>
<div class="card">
<div class="alert error"><?= htmlspecialchars($error) ?></div>
<a href="/" class="btn-back">← Zpět na rezervace</a>
</div>
<?php else: ?>
<div class="card">
<h2>Zrušit rezervaci</h2>
<div class="sub">Opravdu chcete zrušit tento termín?</div>
<div class="info-row"><span class="info-label">Jméno</span><span class="info-val"><?= htmlspecialchars($rezervace['jmeno'] . ' ' . $rezervace['prijmeni']) ?></span></div>
<div class="info-row"><span class="info-label">Služba</span><span class="info-val"><?= htmlspecialchars($rezervace['sluzba_nazev']) ?></span></div>
<div class="info-row"><span class="info-label">Datum</span><span class="info-val"><?= htmlspecialchars($rezervace['datum']) ?></span></div>
<div class="info-row"><span class="info-label">Čas</span><span class="info-val"><?= substr($rezervace['cas_od'], 0, 5) ?></span></div>
<?php if ($error): ?>
<div class="alert error"><?= htmlspecialchars($error) ?></div>
<?php endif; ?>
<?php if (!$error): ?>
<form method="post" action="zruseni-rezervace.php?token=<?= urlencode($token) ?>">
<input type="hidden" name="akce" value="zrusit">
<button type="submit" class="btn-cancel">Ano, zrušit rezervaci</button>
</form>
<?php endif; ?>
<a href="https://kadernictvidenisa.cz" class="btn-back">Ne, ponechat termín</a>
</div>
<?php endif; ?>
</div>
</body>
</html>