setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Koneksi Database Gagal: " . $e->getMessage() . "

PENTING UNTUK HOSTING:
1. Pastikan Anda sudah membuat database di menu MySQL Databases (cPanel).
2. Pastikan User ('$user') sudah ditambahkan ke Database ('$dbname').
3. Centang 'ALL PRIVILEGES' saat menambahkan user ke database."); } // ========================================== // 2. AUTO-SETUP TABEL & ADMIN DEFAULT // ========================================== $setupUsersTable = "CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, nik VARCHAR(20) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, role ENUM('admin', 'user') DEFAULT 'user', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"; $pdo->exec($setupUsersTable); $setupAcquisitionsTable = "CREATE TABLE IF NOT EXISTS acquisitions ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, driver_nik VARCHAR(20) NOT NULL, driver_name VARCHAR(100) NOT NULL, driver_phone VARCHAR(20) NOT NULL, payment_month VARCHAR(50) NOT NULL, proof_file VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE )"; $pdo->exec($setupAcquisitionsTable); $setupSettingsTable = "CREATE TABLE IF NOT EXISTS settings ( id INT AUTO_INCREMENT PRIMARY KEY, setting_key VARCHAR(50) NOT NULL UNIQUE, setting_value VARCHAR(255) NOT NULL )"; $pdo->exec($setupSettingsTable); $pdo->exec("INSERT IGNORE INTO settings (setting_key, setting_value) VALUES ('logo_gojek', ''), ('logo_bpjs', ''), ('login_wallpaper', ''), ('wallpaper_opacity', '0.4'), ('wallpaper_scale', '100'), ('wallpaper_pos_x', '50'), ('wallpaper_pos_y', '50') "); // Load Settings $app_settings = []; $stmt = $pdo->query("SELECT * FROM settings"); while ($row = $stmt->fetch()) { $app_settings[$row['setting_key']] = $row['setting_value']; } $logo_gojek = $app_settings['logo_gojek'] ?? ''; $logo_bpjs = $app_settings['logo_bpjs'] ?? ''; $login_wallpaper = $app_settings['login_wallpaper'] ?? ''; $wallpaper_opacity = $app_settings['wallpaper_opacity'] ?? '0.4'; $wallpaper_scale = $app_settings['wallpaper_scale'] ?? '100'; $wallpaper_pos_x = $app_settings['wallpaper_pos_x'] ?? '50'; $wallpaper_pos_y = $app_settings['wallpaper_pos_y'] ?? '50'; // Buat akun Admin default jika belum ada admin $stmt = $pdo->query("SELECT COUNT(*) FROM users WHERE role = 'admin'"); if ($stmt->fetchColumn() == 0) { $adminPass = password_hash('admin123', PASSWORD_DEFAULT); $pdo->exec("INSERT INTO users (name, nik, password, role) VALUES ('Administrator', '1234567890123456', '$adminPass', 'admin')"); } // ========================================== // 3. LOGIKA APLIKASI (ROUTING & ACTIONS) // ========================================== $error = ''; $success = ''; // Logout if (isset($_GET['action']) && $_GET['action'] == 'logout') { session_destroy(); header("Location: " . $_SERVER['PHP_SELF']); exit; } // Handle POST Requests if ($_SERVER['REQUEST_METHOD'] == 'POST') { $action = $_POST['action'] ?? ''; // -- Aksi Admin: Pengaturan Tampilan -- if ($action == 'update_settings' && isset($_SESSION['role']) && $_SESSION['role'] == 'admin') { $uploadDir = 'uploads/'; if (!is_dir($uploadDir)) mkdir($uploadDir, 0777, true); $allowedTypes = array('jpg', 'png', 'jpeg', 'gif', 'svg', 'webp'); if (!empty($_FILES['logo_gojek']['name'])) { $fileName = 'gojek_' . time() . '_' . basename($_FILES['logo_gojek']['name']); $targetFilePath = $uploadDir . $fileName; $fileType = pathinfo($targetFilePath, PATHINFO_EXTENSION); if (in_array(strtolower($fileType), $allowedTypes)) { move_uploaded_file($_FILES['logo_gojek']['tmp_name'], $targetFilePath); $pdo->prepare("UPDATE settings SET setting_value = ? WHERE setting_key = 'logo_gojek'")->execute([$targetFilePath]); $logo_gojek = $targetFilePath; } } if (!empty($_FILES['logo_bpjs']['name'])) { $fileName = 'bpjs_' . time() . '_' . basename($_FILES['logo_bpjs']['name']); $targetFilePath = $uploadDir . $fileName; $fileType = pathinfo($targetFilePath, PATHINFO_EXTENSION); if (in_array(strtolower($fileType), $allowedTypes)) { move_uploaded_file($_FILES['logo_bpjs']['tmp_name'], $targetFilePath); $pdo->prepare("UPDATE settings SET setting_value = ? WHERE setting_key = 'logo_bpjs'")->execute([$targetFilePath]); $logo_bpjs = $targetFilePath; } } if (!empty($_FILES['login_wallpaper']['name'])) { $fileName = 'bg_' . time() . '_' . basename($_FILES['login_wallpaper']['name']); $targetFilePath = $uploadDir . $fileName; $fileType = pathinfo($targetFilePath, PATHINFO_EXTENSION); if (in_array(strtolower($fileType), $allowedTypes)) { move_uploaded_file($_FILES['login_wallpaper']['tmp_name'], $targetFilePath); $pdo->prepare("UPDATE settings SET setting_value = ? WHERE setting_key = 'login_wallpaper'")->execute([$targetFilePath]); $login_wallpaper = $targetFilePath; } } if (isset($_POST['wallpaper_opacity'])) { $opacity = $_POST['wallpaper_opacity']; $pdo->prepare("UPDATE settings SET setting_value = ? WHERE setting_key = 'wallpaper_opacity'")->execute([$opacity]); $wallpaper_opacity = $opacity; } if (isset($_POST['wallpaper_scale'])) { $scale = $_POST['wallpaper_scale']; $pdo->prepare("UPDATE settings SET setting_value = ? WHERE setting_key = 'wallpaper_scale'")->execute([$scale]); $wallpaper_scale = $scale; } if (isset($_POST['wallpaper_pos_x'])) { $pos_x = $_POST['wallpaper_pos_x']; $pdo->prepare("UPDATE settings SET setting_value = ? WHERE setting_key = 'wallpaper_pos_x'")->execute([$pos_x]); $wallpaper_pos_x = $pos_x; } if (isset($_POST['wallpaper_pos_y'])) { $pos_y = $_POST['wallpaper_pos_y']; $pdo->prepare("UPDATE settings SET setting_value = ? WHERE setting_key = 'wallpaper_pos_y'")->execute([$pos_y]); $wallpaper_pos_y = $pos_y; } $success = "Pengaturan tampilan berhasil diperbarui!"; } // -- Aksi: Edit Akuisisi (Admin & User) -- if ($action == 'edit_acq' && isset($_SESSION['user_id'])) { $acq_id = $_POST['target_acq_id']; $nik = $_POST['edit_driver_nik']; $name = $_POST['edit_driver_name']; $phone = $_POST['edit_driver_phone']; $month = $_POST['edit_payment_month']; // Cek kepemilikan data (agar user tidak bisa edit data orang lain, tapi admin bisa edit semua) $stmt = $pdo->prepare("SELECT user_id FROM acquisitions WHERE id = ?"); $stmt->execute([$acq_id]); $acq = $stmt->fetch(); if ($acq && ($_SESSION['role'] == 'admin' || $acq['user_id'] == $_SESSION['user_id'])) { $uploadDir = 'uploads/'; if (!is_dir($uploadDir)) mkdir($uploadDir, 0777, true); // Jika ada file bukti yang diupload ulang if (!empty($_FILES['edit_proof_file']['name'])) { $fileName = time() . '_' . basename($_FILES['edit_proof_file']['name']); $targetFilePath = $uploadDir . $fileName; $fileType = pathinfo($targetFilePath, PATHINFO_EXTENSION); $allowedTypes = array('jpg', 'png', 'jpeg', 'pdf'); if (in_array(strtolower($fileType), $allowedTypes)) { if (move_uploaded_file($_FILES['edit_proof_file']['tmp_name'], $targetFilePath)) { $stmt = $pdo->prepare("UPDATE acquisitions SET driver_nik=?, driver_name=?, driver_phone=?, payment_month=?, proof_file=? WHERE id=?"); $stmt->execute([$nik, $name, $phone, $month, $targetFilePath, $acq_id]); $success = "Data akuisisi dan bukti terbaru berhasil diperbarui!"; } } else { $error = "Format file tidak diizinkan. Perubahan dibatalkan."; } } else { // Edit tanpa ubah file $stmt = $pdo->prepare("UPDATE acquisitions SET driver_nik=?, driver_name=?, driver_phone=?, payment_month=? WHERE id=?"); $stmt->execute([$nik, $name, $phone, $month, $acq_id]); $success = "Data akuisisi berhasil diperbarui!"; } } else { $error = "Gagal mengedit. Anda tidak memiliki akses ke data ini."; } } // -- Aksi: Hapus Akuisisi (Admin & User) -- if ($action == 'delete_acq' && isset($_SESSION['user_id'])) { $acq_id = $_POST['target_acq_id']; // Cek kepemilikan data $stmt = $pdo->prepare("SELECT user_id FROM acquisitions WHERE id = ?"); $stmt->execute([$acq_id]); $acq = $stmt->fetch(); if ($acq && ($_SESSION['role'] == 'admin' || $acq['user_id'] == $_SESSION['user_id'])) { $pdo->prepare("DELETE FROM acquisitions WHERE id = ?")->execute([$acq_id]); $success = "Data akuisisi berhasil dihapus secara permanen."; } else { $error = "Gagal menghapus. Anda tidak memiliki akses ke data ini."; } } // -- Aksi Admin: Edit Akun User -- if ($action == 'edit_user' && isset($_SESSION['role']) && $_SESSION['role'] == 'admin') { $target_id = $_POST['target_user_id']; $name = $_POST['edit_name']; $nik = $_POST['edit_nik']; if (!empty($_POST['edit_password'])) { $pass = password_hash($_POST['edit_password'], PASSWORD_DEFAULT); $stmt = $pdo->prepare("UPDATE users SET name = ?, nik = ?, password = ? WHERE id = ? AND role = 'user'"); $stmt->execute([$name, $nik, $pass, $target_id]); } else { $stmt = $pdo->prepare("UPDATE users SET name = ?, nik = ? WHERE id = ? AND role = 'user'"); $stmt->execute([$name, $nik, $target_id]); } $success = "Informasi akun user berhasil diperbarui."; } // -- Aksi Admin: Hapus Akun User -- if ($action == 'delete_user' && isset($_SESSION['role']) && $_SESSION['role'] == 'admin') { $target_id = $_POST['target_user_id']; // Data acquisitions akan otomatis terhapus karena relasi ON DELETE CASCADE $pdo->prepare("DELETE FROM users WHERE id = ? AND role = 'user'")->execute([$target_id]); $success = "Akun user dan seluruh data akuisisinya berhasil dihapus."; } // -- Aksi Auth & User -- if ($action == 'login') { $nik = $_POST['nik']; $password = $_POST['password']; $stmt = $pdo->prepare("SELECT * FROM users WHERE nik = ?"); $stmt->execute([$nik]); $user_data = $stmt->fetch(); if ($user_data && password_verify($password, $user_data['password'])) { $_SESSION['user_id'] = $user_data['id']; $_SESSION['role'] = $user_data['role']; $_SESSION['name'] = $user_data['name']; header("Location: " . $_SERVER['PHP_SELF']); exit; } else { $error = "NIK atau Password salah!"; } } if ($action == 'register') { $name = $_POST['name']; $nik = $_POST['nik']; $password = password_hash($_POST['password'], PASSWORD_DEFAULT); try { $stmt = $pdo->prepare("INSERT INTO users (name, nik, password, role) VALUES (?, ?, ?, 'user')"); $stmt->execute([$name, $nik, $password]); $success = "Registrasi berhasil! Silakan login."; } catch (PDOException $e) { $error = "Gagal mendaftar. NIK mungkin sudah terdaftar atau format salah."; } } if ($action == 'submit_acquisition' && isset($_SESSION['user_id'])) { $user_id = $_SESSION['user_id']; $driver_nik = $_POST['driver_nik']; $driver_name = $_POST['driver_name']; $driver_phone = $_POST['driver_phone']; $payment_month = $_POST['payment_month']; $uploadDir = 'uploads/'; if (!is_dir($uploadDir)) mkdir($uploadDir, 0777, true); $fileName = time() . '_' . basename($_FILES['proof_file']['name']); $targetFilePath = $uploadDir . $fileName; $fileType = pathinfo($targetFilePath, PATHINFO_EXTENSION); $allowedTypes = array('jpg', 'png', 'jpeg', 'pdf'); if (in_array(strtolower($fileType), $allowedTypes)) { if (move_uploaded_file($_FILES['proof_file']['tmp_name'], $targetFilePath)) { $stmt = $pdo->prepare("INSERT INTO acquisitions (user_id, driver_nik, driver_name, driver_phone, payment_month, proof_file) VALUES (?, ?, ?, ?, ?, ?)"); $stmt->execute([$user_id, $driver_nik, $driver_name, $driver_phone, $payment_month, $targetFilePath]); $success = "Data akuisisi berhasil disimpan!"; } else { $error = "Gagal mengupload file bukti bayar."; } } else { $error = "Format file tidak diizinkan. Hanya JPG, PNG, dan PDF."; } } } // Ambil data untuk Dashboard $totalAkuisisiUser = 0; $myAcquisitions = []; $allAcquisitions = []; $totalAllAcquisitions = 0; $topPerformers = []; $allUsers = []; if (isset($_SESSION['user_id'])) { if ($_SESSION['role'] == 'user') { $stmt = $pdo->prepare("SELECT * FROM acquisitions WHERE user_id = ? ORDER BY created_at DESC"); $stmt->execute([$_SESSION['user_id']]); $myAcquisitions = $stmt->fetchAll(); $totalAkuisisiUser = count($myAcquisitions); } else if ($_SESSION['role'] == 'admin') { // Data Semua Akuisisi $stmt = $pdo->query("SELECT a.*, u.name as agent_name FROM acquisitions a JOIN users u ON a.user_id = u.id ORDER BY a.created_at DESC"); $allAcquisitions = $stmt->fetchAll(PDO::FETCH_ASSOC); $totalAllAcquisitions = count($allAcquisitions); // Data Top Performer (Rekap per user) $stmt = $pdo->query("SELECT u.name, COUNT(a.id) as total FROM users u LEFT JOIN acquisitions a ON u.id = a.user_id WHERE u.role='user' GROUP BY u.id ORDER BY total DESC"); $topPerformers = $stmt->fetchAll(); // Data Semua User Agent $stmt = $pdo->query("SELECT * FROM users WHERE role = 'user' ORDER BY created_at DESC"); $allUsers = $stmt->fetchAll(); } } // Helper Routing UI $view = $_GET['view'] ?? 'login'; if (isset($_SESSION['user_id'])) { $view = ($_SESSION['role'] == 'admin') ? 'admin_dashboard' : 'user_dashboard'; } ?> Dashboard Perlindungan - BPJS Ketenagakerjaan Ekosistem Driver Online

Gagal

Berhasil

Logo BPJS
Logo Gojek

Dashboard Perlindungan

BPJS Ketenagakerjaan
Ekosistem Driver Online

Total Akuisisi Anda

Driver Terdaftar

Terus tingkatkan performa Anda untuk mencapai peringkat teratas!

Input Data Peserta Baru

Riwayat Akuisisi Saya

0): ?>
Tanggal Submit Nama Driver NIK Driver Durasi Bayar Aksi / Berkas

Belum ada data akuisisi

Ayo mulai catat hasil racing pertama Anda!

Total Nasional

Akuisisi Berhasil

Leaderboard Agent (Top Performer)

0): ?>

Driver

Belum ada data agent yang terekam.

Master Data Akuisisi

Rekapitulasi seluruh input data dari agent

0): ?>
Waktu Submit Nama Agent Calon Peserta (Driver) No WhatsApp Durasi Bayar Aksi / File

WIB

NIK:

Data Kosong

Belum ada satupun agen yang menginput data akuisisi.

Setting User (Agent)

Edit data agen atau hapus akun agent beserta seluruh datanya

0): ?>
Tgl Daftar Nama Agent NIK KTP Aksi / Setting
Belum ada user yang terdaftar.

Pengaturan Tampilan

Ubah logo partner dan wallpaper halaman login

Logo BPJS Ketenagakerjaan

Current BPJS Belum ada logo

Logo Gojek / Partner

Current Gojek Belum ada logo

Wallpaper Halaman Login

Pilih file untuk melihat preview