403Webshell
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/hotel_jservices_cz/api/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /volume1/web/hotel_jservices_cz/api/zakaznici.php
<?php
// ============================================================
//  Hotel DEMO — api/zakaznici.php
//  Kartotéka hostů — CRUD + statistiky + historie pobytů
//  Přístup: admin, manažer, zaměstnanec s oprávněním 'kartoteka'
// ============================================================

$user   = auth_check();
$action = $_GET['action'] ?? '';
$input  = json_decode(file_get_contents('php://input'), true) ?? [];

// Zaměstnanec potřebuje oprávnění kartoteka
if ($user['role'] === 'zamestnanec' && !auth_has_opravneni($user, 'kartoteka')) {
    api_response(false, null, 'Nemáte přístup ke kartotéce zákazníků.', 403);
}

match ($action) {
    'seznam'   => zak_seznam(),
    'detail'   => zak_detail((int)($_GET['id'] ?? 0)),
    'upravit'  => zak_upravit($user, (int)($_GET['id'] ?? 0), $input),
    'smazat'   => zak_smazat($user, (int)($_GET['id'] ?? 0)),
    default    => api_response(false, null, 'Neznámá akce', 400),
};

// ------------------------------------------------------------
//  SEZNAM
// ------------------------------------------------------------
function zak_seznam(): never {
    $search = trim($_GET['search'] ?? '');
    $limit  = min((int)($_GET['limit'] ?? 50), 200);
    $offset = (int)($_GET['offset'] ?? 0);

    $where  = ['1=1'];
    $params = [];

    if ($search) {
        $where[]  = '(z.jmeno LIKE ? OR z.prijmeni LIKE ? OR z.email LIKE ? OR z.telefon LIKE ?)';
        $s        = '%' . $search . '%';
        $params   = [$s, $s, $s, $s];
    }

    $sql_where = implode(' AND ', $where);

    $celkem = (int)db_val("SELECT COUNT(*) FROM zakaznici z WHERE {$sql_where}", $params);

    $zakaznici = db_rows(
        "SELECT z.*,
                COUNT(r.id)                              AS pocet_pobytu,
                MAX(r.datum_prijezdu)                    AS posledni_pobyt,
                ROUND(AVG(h.hvezdicky), 1)               AS prumerne_hodnoceni,
                SUM(COALESCE(r.cena_upravena, r.cena_zaklad
                    + COALESCE((
                        SELECT SUM(rd.cena_celkem) FROM rezervace_doplnky rd WHERE rd.rezervace_id = r.id
                    ), 0))) AS celkova_utrata
         FROM zakaznici z
         LEFT JOIN rezervace r ON r.email = z.email AND r.stav != 'zrusena'
         LEFT JOIN hodnoceni h ON h.rezervace_id = r.id
         WHERE {$sql_where}
         GROUP BY z.id
         ORDER BY z.prijmeni ASC, z.jmeno ASC
         LIMIT {$limit} OFFSET {$offset}",
        $params
    );

    api_response(true, [
        'zakaznici' => $zakaznici,
        'celkem'    => $celkem,
        'limit'     => $limit,
        'offset'    => $offset,
    ]);
}

// ------------------------------------------------------------
//  DETAIL + HISTORIE POBYTŮ
// ------------------------------------------------------------
function zak_detail(int $id): never {
    if (!$id) api_response(false, null, 'Chybí ID', 400);

    $zakaznik = db_row('SELECT * FROM zakaznici WHERE id = ?', [$id]);
    if (!$zakaznik) api_response(false, null, 'Zákazník nenalezen', 404);

    // Historie rezervací dle e-mailu
    $rezervace = db_rows(
        "SELECT r.id, r.datum_prijezdu, r.datum_odjezdu, r.pocet_noci,
                r.pocet_hostu, r.stav, r.cena_zaklad, r.cena_upravena, r.vytvoreno,
                p.cislo AS pokoj_cislo,
                COALESCE(p.nazev, CONCAT('Pokoj ', p.cislo)) AS pokoj_nazev,
                t.nazev AS typ_nazev,
                h.hvezdicky
         FROM rezervace r
         JOIN pokoje p ON p.id = r.pokoj_id
         JOIN typy_pokoju t ON t.id = p.typ_id
         LEFT JOIN hodnoceni h ON h.rezervace_id = r.id
         WHERE r.email = ?
         ORDER BY r.datum_prijezdu DESC",
        [$zakaznik['email']]
    );

    // Statistiky
    $stats = db_row(
        "SELECT COUNT(r.id)             AS pocet_pobytu,
                SUM(r.pocet_noci)       AS celkem_noci,
                ROUND(AVG(h.hvezdicky), 1) AS prumerne_hodnoceni,
                MIN(r.datum_prijezdu)   AS prvni_pobyt,
                MAX(r.datum_prijezdu)   AS posledni_pobyt
         FROM rezervace r
         LEFT JOIN hodnoceni h ON h.rezervace_id = r.id
         WHERE r.email = ? AND r.stav != 'zrusena'",
        [$zakaznik['email']]
    );

    api_response(true, [
        'zakaznik'  => $zakaznik,
        'rezervace' => $rezervace,
        'stats'     => $stats,
    ]);
}

// ------------------------------------------------------------
//  ÚPRAVA
// ------------------------------------------------------------
function zak_upravit(array $user, int $id, array $input): never {
    if ($user['role'] === 'zamestnanec') {
        api_response(false, null, 'Zaměstnanec nemůže editovat kartotéku.', 403);
    }
    if (!$id) api_response(false, null, 'Chybí ID', 400);

    $zakaznik = db_row('SELECT * FROM zakaznici WHERE id = ?', [$id]);
    if (!$zakaznik) api_response(false, null, 'Zákazník nenalezen', 404);

    $jmeno    = trim($input['jmeno']    ?? $zakaznik['jmeno']);
    $prijmeni = trim($input['prijmeni'] ?? $zakaznik['prijmeni']);
    $telefon  = trim($input['telefon']  ?? $zakaznik['telefon'] ?? '');
    $poznamka = trim($input['poznamka'] ?? $zakaznik['poznamka'] ?? '');

    if (!$jmeno || !$prijmeni) {
        api_response(false, null, 'Jméno a příjmení jsou povinné.', 400);
    }

    db_query(
        'UPDATE zakaznici SET jmeno=?, prijmeni=?, telefon=?, poznamka=? WHERE id=?',
        [$jmeno, $prijmeni, $telefon ?: null, $poznamka ?: null, $id]
    );

    api_response(true, null);
}

// ------------------------------------------------------------
//  SMAZÁNÍ (pouze admin/manažer)
// ------------------------------------------------------------
function zak_smazat(array $user, int $id): never {
    auth_require_role($user, ['admin', 'manazer']);
    if (!$id) api_response(false, null, 'Chybí ID', 400);
    if (!db_val('SELECT 1 FROM zakaznici WHERE id = ?', [$id])) {
        api_response(false, null, 'Zákazník nenalezen', 404);
    }

    db_query('DELETE FROM zakaznici WHERE id = ?', [$id]);
    api_response(true, null);
}

Youez - 2016 - github.com/yon3zu
LinuXploit