| 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/hotellesnizatisi_cz/new/ |
Upload File : |
<?php
require_once __DIR__ . '/includes/auth.php';
$user = require_role(['admin', 'manazer']);
require_once __DIR__ . '/includes/layout.php';
$id = isset($_GET['id']) ? (int)$_GET['id'] : null;
$u = [
'jmeno' => '', 'prijmeni' => '', 'email' => '', 'uzivatelske_jmeno' => '',
'role' => 'zamestnanec', 'aktivni' => 1,
];
$vybranaOpravneni = [];
if ($id) {
$stmt = db()->prepare('SELECT * FROM uzivatele WHERE id = ?');
$stmt->execute([$id]);
$row = $stmt->fetch();
if (!$row) {
set_flash('error', 'Uživatel nebyl nalezen.');
header('Location: uzivatele.php');
exit;
}
if ($user['role'] === 'manazer' && $row['role'] !== 'zamestnanec') {
http_response_code(403);
die('Nemáte oprávnění upravovat tento účet.');
}
$u = $row;
if ($u['role'] === 'zamestnanec') {
$vybranaOpravneni = ziskej_opravneni_zamestnance($id);
}
}
$errors = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$jmeno = trim($_POST['jmeno'] ?? '');
$prijmeni = trim($_POST['prijmeni'] ?? '');
$email = trim($_POST['email'] ?? '');
$uzivatelskeJmeno = trim($_POST['uzivatelske_jmeno'] ?? '');
$aktivni = isset($_POST['aktivni']) ? 1 : 0;
if ($user['role'] === 'manazer') {
$role = 'zamestnanec';
} else {
$role = in_array($_POST['role'] ?? '', ['admin', 'manazer', 'zamestnanec'], true) ? $_POST['role'] : 'zamestnanec';
}
$vybranaOpravneni = array_values(array_intersect(
$_POST['opravneni'] ?? [],
DELEGOVATELNE_SEKCE
));
if ($jmeno === '' || $prijmeni === '' || $uzivatelskeJmeno === '') {
$errors[] = 'Vyplňte jméno, příjmení a uživatelské jméno.';
}
if (!$errors) {
try {
if ($id) {
db()->prepare('
UPDATE uzivatele SET jmeno=?, prijmeni=?, email=?, uzivatelske_jmeno=?, role=?, aktivni=?
WHERE id=?
')->execute([$jmeno, $prijmeni, $email ?: null, $uzivatelskeJmeno, $role, $aktivni, $id]);
$cilovyId = $id;
set_flash('success', 'Uživatel byl uložen.');
} else {
$tempPassword = generate_temp_password();
$hash = password_hash($tempPassword, PASSWORD_DEFAULT);
db()->prepare('
INSERT INTO uzivatele (jmeno, prijmeni, email, uzivatelske_jmeno, heslo_hash, role, aktivni, vyzaduje_zmenu_hesla)
VALUES (?,?,?,?,?,?,?,1)
')->execute([$jmeno, $prijmeni, $email ?: null, $uzivatelskeJmeno, $hash, $role, $aktivni]);
$cilovyId = (int) db()->lastInsertId();
set_flash('success', 'Uživatel „' . $uzivatelskeJmeno . '“ byl vytvořen. Dočasné heslo: ' . $tempPassword . ' — uložte si ho, znovu se nezobrazí. Předejte ho uživateli, při prvním přihlášení si nastaví vlastní.');
}
// Oprávnění po sekcích — ukládáme jen pro roli zaměstnanec,
// u admin/manažer tabulka uzivatele_opravneni nemá smysl (mají přístup vždy).
db()->prepare('DELETE FROM uzivatele_opravneni WHERE uzivatel_id = ?')->execute([$cilovyId]);
if ($role === 'zamestnanec' && $vybranaOpravneni) {
$insertOpravneni = db()->prepare('INSERT INTO uzivatele_opravneni (uzivatel_id, sekce) VALUES (?, ?)');
foreach ($vybranaOpravneni as $sekce) {
$insertOpravneni->execute([$cilovyId, $sekce]);
}
}
header('Location: uzivatele.php');
exit;
} catch (PDOException $e) {
$errors[] = ($e->getCode() === '23000')
? 'Uživatelské jméno „' . $uzivatelskeJmeno . '“ už existuje, zvolte jiné.'
: 'Nastala chyba při ukládání.';
}
}
}
admin_layout_start('uzivatele', $id ? 'Upravit uživatele' : 'Přidat uživatele', '', $user);
foreach ($errors as $err) {
echo '<div class="flash flash-error">' . htmlspecialchars($err) . '</div>';
}
?>
<form method="post" class="card" style="padding:26px 28px;max-width:560px;">
<div class="field-row">
<div class="field"><label for="jmeno">Jméno</label><input type="text" id="jmeno" name="jmeno" value="<?= htmlspecialchars($u['jmeno']) ?>"></div>
<div class="field"><label for="prijmeni">Příjmení</label><input type="text" id="prijmeni" name="prijmeni" value="<?= htmlspecialchars($u['prijmeni']) ?>"></div>
</div>
<div class="field">
<label for="uzivatelske_jmeno">Uživatelské jméno</label>
<input type="text" id="uzivatelske_jmeno" name="uzivatelske_jmeno" value="<?= htmlspecialchars($u['uzivatelske_jmeno']) ?>">
</div>
<div class="field">
<label for="email">E-mail (nepovinné)</label>
<input type="email" id="email" name="email" value="<?= htmlspecialchars($u['email'] ?? '') ?>">
</div>
<?php if ($user['role'] === 'admin'): ?>
<div class="field">
<label for="role">Role</label>
<select id="role" name="role" onchange="document.getElementById('opravneniBox').style.display = this.value === 'zamestnanec' ? 'block' : 'none';">
<option value="zamestnanec" <?= $u['role'] === 'zamestnanec' ? 'selected' : '' ?>>Zaměstnanec</option>
<option value="manazer" <?= $u['role'] === 'manazer' ? 'selected' : '' ?>>Manažer</option>
<option value="admin" <?= $u['role'] === 'admin' ? 'selected' : '' ?>>Admin</option>
</select>
</div>
<?php else: ?>
<input type="hidden" name="role" value="zamestnanec">
<p style="font-size:.78rem;color:var(--ink-soft);margin-bottom:16px;">Jako manažer můžete zakládat jen účty s rolí Zaměstnanec.</p>
<?php endif; ?>
<div id="opravneniBox" style="<?= $u['role'] === 'zamestnanec' ? '' : 'display:none;' ?>margin-bottom:18px;">
<label style="display:block;margin-bottom:8px;">Přístup k sekcím</label>
<p style="font-size:.78rem;color:var(--ink-soft);margin-bottom:10px;">Zaškrtněte, ke kterým sekcím má tento zaměstnanec přístup. Nastavení a Uživatelé nejsou delegovatelné.</p>
<div style="display:flex;flex-direction:column;gap:8px;">
<?php foreach (DELEGOVATELNE_SEKCE as $sekce): ?>
<label style="display:flex;align-items:center;gap:8px;font-size:.88rem;font-weight:400;">
<input type="checkbox" name="opravneni[]" value="<?= htmlspecialchars($sekce) ?>" <?= in_array($sekce, $vybranaOpravneni, true) ? 'checked' : '' ?>>
<?= htmlspecialchars(SEKCE_NAZEV[$sekce]) ?>
</label>
<?php endforeach; ?>
</div>
</div>
<div class="toggle-row">
<label for="aktivni">Účet aktivní</label>
<input type="checkbox" id="aktivni" name="aktivni" <?= $u['aktivni'] ? 'checked' : '' ?>>
<label class="switch" for="aktivni"></label>
</div>
<?php if (!$id): ?>
<p style="font-size:.78rem;color:var(--ink-soft);margin-top:14px;">Po uložení se vygeneruje dočasné heslo a zobrazí se jednorázově — předejte ho uživateli, při prvním přihlášení si nastaví vlastní.</p>
<?php endif; ?>
<div style="display:flex;gap:10px;margin-top:24px;">
<button type="submit" class="btn btn-primary">Uložit</button>
<a href="uzivatele.php" class="btn btn-secondary">Zrušit</a>
</div>
</form>
<?php admin_layout_end(); ?>