66 lines
3.4 KiB
PHP
66 lines
3.4 KiB
PHP
<?php
|
||
/**
|
||
* csat.php – Bewertungsseite für die Zufriedenheitsabfrage (Link aus der Mail).
|
||
* Ein Klick auf einen Stern in der Mail öffnet diese Seite mit vorgewählter Bewertung; gespeichert wird erst mit dem Knopf
|
||
* (so zählen automatische Link-Prüfungen von Mailprogrammen nicht als Bewertung).
|
||
*/
|
||
require_once __DIR__ . '/includes/bootstrap.php';
|
||
|
||
$pdo = get_db();
|
||
$token = (string) ($_GET['t'] ?? $_POST['t'] ?? '');
|
||
$row = csat_find_by_token($pdo, $token);
|
||
$rating = (int) ($_POST['rating'] ?? $_GET['r'] ?? 0);
|
||
$error = null;
|
||
$done = false;
|
||
|
||
if ($row && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
||
if (!rate_limit_check('csat', client_ip(), 30, 15)) {
|
||
$error = 'Zu viele Anfragen. Bitte versuchen Sie es später erneut.';
|
||
} else {
|
||
$res = csat_record($pdo, $token, $rating, (string) ($_POST['comment'] ?? ''));
|
||
if ($res['ok']) $done = true; else $error = $res['error'];
|
||
$row = csat_find_by_token($pdo, $token);
|
||
}
|
||
}
|
||
$already = $row && $row['answered_at'] !== null && !$done;
|
||
|
||
$pageTitle = 'Ihre Bewertung';
|
||
require __DIR__ . '/includes/header_customer.php';
|
||
?>
|
||
<div style="max-width:560px;margin:24px auto">
|
||
<?php if (!$row): ?>
|
||
<h1>Link nicht gültig</h1>
|
||
<p class="muted">Dieser Bewertungslink ist ungültig oder abgelaufen.</p>
|
||
<?php elseif ($done): ?>
|
||
<h1>Vielen Dank!</h1>
|
||
<p style="font-size:2rem;color:#f5b301;margin:8px 0"><?= e(csat_stars((int) $row['rating'])) ?></p>
|
||
<p>Ihre Bewertung für Ticket <strong>#<?= e($row['ticket_number']) ?></strong> ist bei uns angekommen.</p>
|
||
<?php elseif ($already): ?>
|
||
<h1>Bereits bewertet</h1>
|
||
<p class="muted">Sie haben Ticket #<?= e($row['ticket_number']) ?> schon bewertet. Vielen Dank!</p>
|
||
<?php else: ?>
|
||
<h1>Wie zufrieden waren Sie?</h1>
|
||
<p class="muted">Ticket <strong>#<?= e($row['ticket_number']) ?></strong> – <?= e($row['subject']) ?></p>
|
||
<?php if ($error): ?><div class="flash error"><?= e($error) ?></div><?php endif; ?>
|
||
<form method="post" class="card" style="padding:20px;margin-top:14px">
|
||
<input type="hidden" name="t" value="<?= e($token) ?>">
|
||
<div id="csat-stars" style="display:flex;gap:6px;flex-direction:row-reverse;justify-content:center;font-size:2.6rem;line-height:1">
|
||
<?php for ($i = 5; $i >= 1; $i--): ?>
|
||
<input type="radio" name="rating" id="r<?= $i ?>" value="<?= $i ?>" style="position:absolute;opacity:0;width:0;height:0" <?= $rating === $i ? 'checked' : '' ?> required>
|
||
<label for="r<?= $i ?>" title="<?= $i ?> von 5" class="csat-star" style="cursor:pointer;margin:0">★</label>
|
||
<?php endfor; ?>
|
||
</div>
|
||
<style>
|
||
.csat-star { color:#cbd5e1; transition:color .1s }
|
||
#csat-stars input:checked ~ .csat-star, #csat-stars .csat-star:hover, #csat-stars .csat-star:hover ~ .csat-star { color:#f5b301 }
|
||
#csat-stars input:focus-visible + .csat-star { outline:2px solid var(--primary,#0f6f6a); border-radius:4px }
|
||
</style>
|
||
<p class="muted" style="text-align:center;font-size:.8rem;margin:4px 0 14px">1 Stern = unzufrieden · 5 Sterne = sehr zufrieden</p>
|
||
<label for="comment">Möchten Sie uns noch etwas mitteilen? (optional)</label>
|
||
<textarea id="comment" name="comment" rows="4" maxlength="2000" placeholder="Was hat gut geklappt, was können wir besser machen?"></textarea>
|
||
<div class="btn-row"><button type="submit" class="btn">Bewertung absenden</button></div>
|
||
</form>
|
||
<?php endif; ?>
|
||
</div>
|
||
<?php require __DIR__ . '/includes/footer_customer.php'; ?>
|