| 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/api/ |
Upload File : |
<?php
// ============================================
// api/ics.php
// GET /api/ics?token=...
// Vygeneruje .ics soubor pro rezervaci
// ============================================
$token = sanitize($_GET['token'] ?? '');
if (strlen($token) !== 64) {
http_response_code(400);
echo 'Neplatný token.';
exit;
}
$stmt = db()->prepare("
SELECT r.*, s.nazev AS sluzba_nazev, s.trvani_min
FROM rezervace r
JOIN sluzby s ON s.id = r.sluzba_id
WHERE r.token_zmena = ? AND r.stav != 'zrusena'
");
$stmt->execute([$token]);
$rez = $stmt->fetch();
if (!$rez) {
http_response_code(404);
echo 'Rezervace nenalezena.';
exit;
}
$salon = salon_nazev();
$adresa = nastaveni('salon_adresa', '');
$telefon = nastaveni('salon_telefon', '');
// Formát datumu pro ICS: YYYYMMDDTHHMMSS
$datum = str_replace('-', '', $rez['datum']);
$cas_od = str_replace(':', '', substr($rez['cas_od'], 0, 5)) . '00';
$cas_do = str_replace(':', '', substr($rez['cas_do'], 0, 5)) . '00';
$dtstart = $datum . 'T' . $cas_od;
$dtend = $datum . 'T' . $cas_do;
$dtstamp = gmdate('Ymd\THis\Z');
$uid = md5($rez['id'] . $rez['token_zmena']) . '@kadernictvi';
$summary = $rez['sluzba_nazev'] . ' – ' . $salon;
$datum_fmt = date('j. n. Y', strtotime($rez['datum']));
$description = 'Rezervace: ' . $rez['sluzba_nazev'] . '\n'
. 'Datum: ' . $datum_fmt . '\n'
. 'Čas: ' . substr($rez['cas_od'], 0, 5) . ' – ' . substr($rez['cas_do'], 0, 5) . '\n'
. ($telefon ? 'Telefon: ' . $telefon : '');
$ics = "BEGIN:VCALENDAR\r\n"
. "VERSION:2.0\r\n"
. "PRODID:-//Kadernictvi//Rezervace//CS\r\n"
. "CALSCALE:GREGORIAN\r\n"
. "METHOD:REQUEST\r\n"
. "BEGIN:VEVENT\r\n"
. "UID:{$uid}\r\n"
. "DTSTAMP:{$dtstamp}\r\n"
. "DTSTART;TZID=Europe/Prague:{$dtstart}\r\n"
. "DTEND;TZID=Europe/Prague:{$dtend}\r\n"
. "SUMMARY:" . ics_escape($summary) . "\r\n"
. "DESCRIPTION:" . ics_escape($description) . "\r\n"
. ($adresa ? "LOCATION:" . ics_escape($adresa) . "\r\n" : "")
. "STATUS:CONFIRMED\r\n"
. "BEGIN:VALARM\r\n"
. "TRIGGER:-PT60M\r\n"
. "ACTION:DISPLAY\r\n"
. "DESCRIPTION:Připomínka: " . ics_escape($summary) . "\r\n"
. "END:VALARM\r\n"
. "END:VEVENT\r\n"
. "END:VCALENDAR\r\n";
$filename = 'rezervace-' . $rez['datum'] . '-' . str_replace(':', '', substr($rez['cas_od'], 0, 5)) . '.ics';
header('Content-Type: text/calendar; charset=utf-8');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Cache-Control: no-cache, no-store');
echo $ics;
exit;
function ics_escape(string $text): string {
$text = str_replace(['\\', ';', ','], ['\\\\', '\;', '\,'], $text);
return $text;
}