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/kadernictvidenisa_cz/api/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /volume1/web/kadernictvidenisa_cz/api/zakaznici.php
<?php
// ============================================
//  api/zakaznici.php  (admin only)
//  GET    /api/zakaznici           – seznam
//  GET    /api/zakaznici/{id}      – detail + rezervace
//  PUT    /api/zakaznici/{id}      – uložit poznámku/štítky
//  POST   /api/zakaznici/sync      – synchronizovat z rezervací
// ============================================

// auth.php je načten routerem (index.php)
admin_required();

$sub = $parts[1] ?? '';

// ---- Sync: vytvoří záznamy pro všechny zákazníky z rezervací ----
if ($method === 'POST' && $sub === 'sync') {
    $stmt = db()->query("
        SELECT DISTINCT email, jmeno, prijmeni, telefon
        FROM rezervace
        ORDER BY vytvoreno DESC
    ");
    $rows = $stmt->fetchAll();
    $count = 0;
    foreach ($rows as $r) {
        db()->prepare("
            INSERT INTO zakaznici (email, jmeno, prijmeni, telefon)
            VALUES (?, ?, ?, ?)
            ON DUPLICATE KEY UPDATE
                jmeno    = IF(jmeno = '', VALUES(jmeno), jmeno),
                prijmeni = IF(prijmeni = '', VALUES(prijmeni), prijmeni),
                telefon  = IF(telefon IS NULL, VALUES(telefon), telefon)
        ")->execute([$r['email'], $r['jmeno'], $r['prijmeni'], $r['telefon']]);
        $count++;
    }
    json_response(['ok' => true, 'synced' => $count]);
}

// ---- Seznam zákazníků ----
if ($method === 'GET' && !$id && $sub !== 'sync') {
    $search = sanitize($_GET['q'] ?? '');
    $where  = '';
    $params = [];

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

    $stmt = db()->prepare("
        SELECT z.*,
               COUNT(r.id)                                          AS pocet_rezervaci,
               MAX(r.datum)                                         AS posledni_navsteva,
               SUM(CASE WHEN r.stav != 'zrusena' THEN s.cena ELSE 0 END) AS celkem_utraceno
        FROM zakaznici z
        LEFT JOIN rezervace r ON r.email = z.email
        LEFT JOIN sluzby s    ON s.id    = r.sluzba_id
        {$where}
        GROUP BY z.id
        ORDER BY z.prijmeni, z.jmeno
    ");
    $stmt->execute($params);
    json_response(['ok' => true, 'data' => $stmt->fetchAll()]);
}

// ---- Detail zákazníka ----
if ($method === 'GET' && $id) {
    $stmt = db()->prepare("SELECT * FROM zakaznici WHERE id = ?");
    $stmt->execute([$id]);
    $zakaznik = $stmt->fetch();
    if (!$zakaznik) json_error('Zákazník nenalezen.', 404);

    // Historie rezervací
    $stmt2 = db()->prepare("
        SELECT r.id, r.datum, TIME_FORMAT(r.cas_od,'%H:%i') AS cas_od,
               TIME_FORMAT(r.cas_do,'%H:%i') AS cas_do,
               r.stav, r.poznamka, s.nazev AS sluzba,
               r.cena_upravena, r.hodnoceni,
               COALESCE(r.cena_upravena, s.cena) AS cena
        FROM rezervace r
        JOIN sluzby s ON s.id = r.sluzba_id
        WHERE r.email = ?
        ORDER BY r.datum DESC, r.cas_od DESC
    ");
    $stmt2->execute([$zakaznik['email']]);
    $rezervace = $stmt2->fetchAll();

    // Přidej doplňky ke každé rezervaci
    if (!empty($rezervace)) {
        $rez_ids = array_column($rezervace, 'id');
        $placeholders = implode(',', array_fill(0, count($rez_ids), '?'));
        $stmt_d = db()->prepare("SELECT * FROM rezervace_doplnky WHERE rezervace_id IN ($placeholders)");
        $stmt_d->execute($rez_ids);
        $vsechny_doplnky = $stmt_d->fetchAll();
        $doplnky_map = [];
        foreach ($vsechny_doplnky as $d) {
            $doplnky_map[$d['rezervace_id']][] = $d;
        }
        foreach ($rezervace as &$r) {
            $r['doplnky'] = $doplnky_map[$r['id']] ?? [];
        }
    }

    // Statistiky — počítat i doplňky
    $potvrzene = array_filter($rezervace, function($r) { return $r['stav'] !== 'zrusena'; });
    $celkem = array_sum(array_map(function($r) {
        $extra = array_sum(array_column($r['doplnky'] ?? [], 'cena'));
        return (float)$r['cena'] + $extra;
    }, $potvrzene));
    $navstevy  = count($potvrzene);

    // Průměrné hodnocení - jen z ohodnocených rezervací
    $hodnoceni_vals = array_filter(array_column($rezervace, 'hodnoceni'), function($h) { return $h !== null; });
    $prumer_hodnoceni = count($hodnoceni_vals) > 0 ? array_sum($hodnoceni_vals) / count($hodnoceni_vals) : null;

    json_response([
        'ok'        => true,
        'zakaznik'  => $zakaznik,
        'rezervace' => $rezervace,
        'stats'     => [
            'navstevy'          => $navstevy,
            'celkem_utraceno'   => $celkem,
            'posledni'          => $rezervace[0]['datum'] ?? null,
            'prumer_hodnoceni'  => $prumer_hodnoceni,
            'pocet_hodnoceni'   => count($hodnoceni_vals),
        ]
    ]);
}

// ---- Uložit poznámku / štítky ----
if ($method === 'PUT' && $id) {
    $poznamka = sanitize($input['poznamka'] ?? '');
    $stitky   = sanitize($input['stitky']   ?? '');
    $telefon  = sanitize($input['telefon']  ?? '');

    db()->prepare("
        UPDATE zakaznici SET poznamka = ?, stitky = ?, telefon = ? WHERE id = ?
    ")->execute([$poznamka, $stitky, $telefon, $id]);

    json_response(['ok' => true]);
}

if (($method === 'DELETE' || ($method === 'POST' && ($input['_method'] ?? '') === 'DELETE')) && $id) {
    db()->prepare("DELETE FROM zakaznici WHERE id = ?")->execute([$id]);
    json_response(['ok' => true]);
}

json_error('Metoda není podporována.', 405);

Youez - 2016 - github.com/yon3zu
LinuXploit