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/notifikace.php
<?php
// ============================================================
//  Hotel DEMO — api/notifikace.php
//  Polling endpoint — zobrazuje aktuální nevyřízené položky
//  (žluté = čeká na potvrzení, fialové = čeká na schválení)
// ============================================================
require_once __DIR__ . '/../includes/config.php';
require_once __DIR__ . '/../includes/db.php';

// Ověření session bez spuštění auth routeru
$token = $_COOKIE['session_token'] ?? $_SERVER['HTTP_X_SESSION_TOKEN'] ?? '';
if (!$token) api_response(false, null, 'Nepřihlášen', 401);
$user = db_row(
    'SELECT u.id, u.jmeno, u.prijmeni, u.role
     FROM uzivatel_session s
     JOIN uzivatele u ON u.id = s.uzivatel_id
     WHERE s.token = ? AND s.platnost_do > NOW() AND u.aktivni = 1',
    [$token]
);
if (!$user) api_response(false, null, 'Nepřihlášen', 401);

$action = $_GET['action'] ?? 'get';

match ($action) {
    'get'     => notif_seznam($user),
    default   => api_response(false, null, 'Neznámá akce', 404),
};

// ------------------------------------------------------------
//  Helper — formátuje datum "2026-06-25" na "25.6."
// ------------------------------------------------------------
function fmt_datum_kratky(string $datum): string {
    [$rok, $mes, $den] = explode('-', $datum);
    return (int)$den . '.' . (int)$mes . '.';
}

function notif_seznam(array $user): never {
    $je_manazer = in_array($user['role'], ['admin', 'manazer'], true);
    $notifikace = [];

    // 1. Rezervace čekající na potvrzení (žluté) — pro všechny role
    $cekajici = db_rows(
        "SELECT r.id, r.jmeno, r.prijmeni, r.vytvoreno,
                r.datum_prijezdu, r.datum_odjezdu,
                t.nazev AS typ_nazev
         FROM rezervace r
         JOIN pokoje p ON p.id = r.pokoj_id
         JOIN typy_pokoju t ON t.id = p.typ_id
         WHERE r.stav = 'ceka'
           AND r.cas_zadost_stav IS NULL
           AND r.pokoj_zadost_stav IS NULL
           AND (r.sleva_stav IS NULL OR r.sleva_stav NOT IN ('navrzena'))
         ORDER BY r.vytvoreno ASC
         LIMIT 30",
        []
    );
    foreach ($cekajici as $r) {
        $termin = fmt_datum_kratky($r['datum_prijezdu']) . ' – ' . fmt_datum_kratky($r['datum_odjezdu']);
        $notifikace[] = [
            'typ'          => 'ceka_potvrzeni',
            'ikona'        => '📥',
            'barva'        => '#d97706',
            'text'         => $r['jmeno'] . ' ' . $r['prijmeni'] . ' — ' . $r['typ_nazev'],
            'popis'        => 'Čeká na potvrzení · ' . $termin,
            'cas'          => $r['vytvoreno'],
            'rezervace_id' => (int)$r['id'],
        ];
    }

    // 2. Žádosti o schválení (fialové) — jen pro manažera/admina
    if ($je_manazer) {
        // Žádosti o čas
        $zadosti_cas = db_rows(
            "SELECT r.id, r.jmeno, r.prijmeni, r.cas_zadost_typ, r.cas_zadost_hodnota,
                    r.datum_prijezdu, r.datum_odjezdu, r.vytvoreno
             FROM rezervace r
             WHERE r.cas_zadost_stav = 'ceka'
             ORDER BY r.vytvoreno ASC LIMIT 20",
            []
        );
        foreach ($zadosti_cas as $r) {
            $typ_str = $r['cas_zadost_typ'] === 'checkin' ? 'check-in' : 'check-out';
            $termin  = fmt_datum_kratky($r['datum_prijezdu']) . ' – ' . fmt_datum_kratky($r['datum_odjezdu']);
            $notifikace[] = [
                'typ'          => 'zadost_cas',
                'ikona'        => '🕑',
                'barva'        => '#7c3aed',
                'text'         => $r['jmeno'] . ' ' . $r['prijmeni'],
                'popis'        => 'Žádost o ' . $typ_str . ' v ' . $r['cas_zadost_hodnota'] . ' · ' . $termin,
                'cas'          => $r['vytvoreno'],
                'rezervace_id' => (int)$r['id'],
            ];
        }

        // Žádosti o pokoj
        $zadosti_pokoj = db_rows(
            "SELECT r.id, r.jmeno, r.prijmeni,
                    r.datum_prijezdu, r.datum_odjezdu, r.vytvoreno
             FROM rezervace r
             WHERE r.pokoj_zadost_stav = 'ceka'
             ORDER BY r.vytvoreno ASC LIMIT 20",
            []
        );
        foreach ($zadosti_pokoj as $r) {
            $termin = fmt_datum_kratky($r['datum_prijezdu']) . ' – ' . fmt_datum_kratky($r['datum_odjezdu']);
            $notifikace[] = [
                'typ'          => 'zadost_pokoj',
                'ikona'        => '🔁',
                'barva'        => '#7c3aed',
                'text'         => $r['jmeno'] . ' ' . $r['prijmeni'],
                'popis'        => 'Žádost o změnu pokoje · ' . $termin,
                'cas'          => $r['vytvoreno'],
                'rezervace_id' => (int)$r['id'],
            ];
        }

        // Návrhy slevy
        $zadosti_sleva = db_rows(
            "SELECT r.id, r.jmeno, r.prijmeni, r.sleva_castka,
                    r.datum_prijezdu, r.datum_odjezdu, r.vytvoreno
             FROM rezervace r
             WHERE r.sleva_stav = 'navrzena'
             ORDER BY r.vytvoreno ASC LIMIT 20",
            []
        );
        foreach ($zadosti_sleva as $r) {
            $termin = fmt_datum_kratky($r['datum_prijezdu']) . ' – ' . fmt_datum_kratky($r['datum_odjezdu']);
            $notifikace[] = [
                'typ'          => 'zadost_sleva',
                'ikona'        => '💰',
                'barva'        => '#7c3aed',
                'text'         => $r['jmeno'] . ' ' . $r['prijmeni'],
                'popis'        => 'Návrh slevy ' . number_format((float)$r['sleva_castka'], 0, ',', ' ') . ' Kč · ' . $termin,
                'cas'          => $r['vytvoreno'],
                'rezervace_id' => (int)$r['id'],
            ];
        }

        // Rezervace s obecnou čekající žádostí (kombinace)
        $s_zadosti = db_rows(
            "SELECT r.id, r.jmeno, r.prijmeni,
                    r.datum_prijezdu, r.datum_odjezdu, r.vytvoreno
             FROM rezervace r
             WHERE r.stav = 'ceka'
               AND (r.cas_zadost_stav = 'ceka' OR r.pokoj_zadost_stav = 'ceka' OR r.sleva_stav = 'navrzena')
             ORDER BY r.vytvoreno ASC LIMIT 20",
            []
        );
        foreach ($s_zadosti as $r) {
            $uz_je = array_filter($notifikace, fn($n) => $n['rezervace_id'] === (int)$r['id']);
            if (!$uz_je) {
                $termin = fmt_datum_kratky($r['datum_prijezdu']) . ' – ' . fmt_datum_kratky($r['datum_odjezdu']);
                $notifikace[] = [
                    'typ'          => 'zadost',
                    'ikona'        => '⚠️',
                    'barva'        => '#7c3aed',
                    'text'         => $r['jmeno'] . ' ' . $r['prijmeni'],
                    'popis'        => 'Čeká na schválení · ' . $termin,
                    'cas'          => $r['vytvoreno'],
                    'rezervace_id' => (int)$r['id'],
                ];
            }
        }
    }

    // Seřadit dle času
    usort($notifikace, fn($a, $b) => strcmp($a['cas'], $b['cas']));

    api_response(true, [
        'notifikace'   => $notifikace,
        'pocet'        => count($notifikace),
    ]);
}

Youez - 2016 - github.com/yon3zu
LinuXploit