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';
}
?>
= $totalAkuisisiUser ?>
Driver Terdaftar
Terus tingkatkan performa Anda untuk mencapai peringkat teratas!