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/hodnoceni.php
<?php
// ============================================================
//  Hotel DEMO — api/hodnoceni.php
//  Správa hodnocení hostů (1–5 hvězdiček)
//  Veřejné uložení přes token (z e-mailu), přehled pro admina
// ============================================================

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

match ($action) {
    'ulozit'   => hod_ulozit(),      // veřejné — z odkazu v e-mailu
    'seznam'   => hod_seznam(),      // admin/manažer + zaměstnanec s oprávněním
    'agregat'  => hod_agregat(),     // veřejné — pro rezervační stránku
    'smazat'   => hod_smazat(),      // admin/manažer
    default    => api_response(false, null, 'Neznámá akce', 400),
};

// ------------------------------------------------------------
//  ULOŽENÍ HODNOCENÍ (veřejné — přes token z e-mailu)
//  GET ?action=ulozit&token=...&h=5
// ------------------------------------------------------------
function hod_ulozit(): never {
    $token     = trim($_GET['token'] ?? '');
    $hvezdicky = (int)($_GET['h'] ?? 0);

    if (!$token) api_response(false, null, 'Neplatný odkaz.', 400);
    if ($hvezdicky < 1 || $hvezdicky > 5) {
        api_response(false, null, 'Hodnocení musí být 1–5 hvězdiček.', 400);
    }

    // Najít rezervaci podle tokenu
    $rez = db_row(
        "SELECT id, jmeno, datum_odjezdu, stav FROM rezervace WHERE token_zmena = ?",
        [$token]
    );

    if (!$rez) api_response(false, null, 'Neplatný nebo expirovaný odkaz.', 404);
    if ($rez['stav'] === 'zrusena') {
        api_response(false, null, 'Hodnocení nelze odeslat pro zrušenou rezervaci.', 400);
    }
    if ($rez['datum_odjezdu'] > date('Y-m-d')) {
        api_response(false, null, 'Hodnocení lze odeslat až po skončení pobytu.', 400);
    }

    // Již hodnoceno?
    if (db_val('SELECT 1 FROM hodnoceni WHERE rezervace_id = ?', [$rez['id']])) {
        api_response(false, null, 'Tato rezervace již byla hodnocena.', 409);
    }

    db_insert(
        'INSERT INTO hodnoceni (rezervace_id, hvezdicky) VALUES (?, ?)',
        [$rez['id'], $hvezdicky]
    );

    api_response(true, [
        'hvezdicky' => $hvezdicky,
        'jmeno'     => $rez['jmeno'],
    ]);
}

// ------------------------------------------------------------
//  SEZNAM HODNOCENÍ (admin panel)
// ------------------------------------------------------------
function hod_seznam(): never {
    $user = auth_check();

    // Zaměstnanec potřebuje oprávnění
    if ($user['role'] === 'zamestnanec' && !auth_has_opravneni($user, 'hodnoceni')) {
        api_response(false, null, 'Nemáte přístup k hodnocením.', 403);
    }

    $limit  = min((int)($_GET['limit'] ?? 50), 200);
    $offset = (int)($_GET['offset'] ?? 0);
    $hvezd  = (int)($_GET['hvezdicky'] ?? 0); // filtr dle počtu hvězdiček

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

    if ($hvezd >= 1 && $hvezd <= 5) {
        $where[]  = 'h.hvezdicky = ?';
        $params[] = $hvezd;
    }

    $sql_where = implode(' AND ', $where);
    $celkem    = (int)db_val("SELECT COUNT(*) FROM hodnoceni h WHERE {$sql_where}", $params);

    $hodnoceni = db_rows(
        "SELECT h.id, h.hvezdicky, h.vytvoreno,
                r.id AS rezervace_id, r.jmeno, r.prijmeni, r.email,
                r.datum_prijezdu, r.datum_odjezdu,
                p.cislo AS pokoj_cislo,
                COALESCE(p.nazev, CONCAT('Pokoj ', p.cislo)) AS pokoj_nazev,
                t.nazev AS typ_nazev
         FROM hodnoceni h
         JOIN rezervace r ON r.id = h.rezervace_id
         JOIN pokoje p ON p.id = r.pokoj_id
         JOIN typy_pokoju t ON t.id = p.typ_id
         WHERE {$sql_where}
         ORDER BY h.vytvoreno DESC
         LIMIT {$limit} OFFSET {$offset}",
        $params
    );

    // Agregát
    $agg = db_row('SELECT ROUND(AVG(hvezdicky),1) AS prumer, COUNT(*) AS pocet FROM hodnoceni');

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

// ------------------------------------------------------------
//  AGREGÁT (veřejné — pro rezervační stránku)
// ------------------------------------------------------------
function hod_agregat(): never {
    if (nastaveni('hodnoceni_verejne') !== '1') {
        api_response(true, ['zobrazit' => false]);
    }

    $agg = db_row(
        'SELECT ROUND(AVG(hvezdicky), 1) AS prumer, COUNT(*) AS pocet FROM hodnoceni'
    );

    api_response(true, [
        'zobrazit' => true,
        'prumer'   => $agg['prumer'],
        'pocet'    => $agg['pocet'],
    ]);
}

// ------------------------------------------------------------
//  SMAZÁNÍ (admin/manažer)
// ------------------------------------------------------------
function hod_smazat(): never {
    $user = auth_check();
    auth_require_role($user, ['admin', 'manazer']);

    $id = (int)($_GET['id'] ?? 0);
    if (!$id) api_response(false, null, 'Chybí ID', 400);
    if (!db_val('SELECT 1 FROM hodnoceni WHERE id = ?', [$id])) {
        api_response(false, null, 'Hodnocení nenalezeno', 404);
    }

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

Youez - 2016 - github.com/yon3zu
LinuXploit