"error", "pesan" => "Akses ditolak. Silakan login."]); exit; } // KONEKSI DATABASE STANDAR PDO $host = 'localhost'; $dbname = 'webgis_baru'; $username = 'root'; $password = ''; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die(json_encode(["error" => "Koneksi Gagal: " . $e->getMessage()])); } // POST request dari form donasi tidak membawa ?aksi=, default ke 'simpan' $aksi = $_GET['aksi'] ?? ($_SERVER['REQUEST_METHOD'] === 'POST' ? 'simpan' : 'tampil'); // 0. CREATE: SIMPAN DONASI BARU DARI WARGA if ($aksi == 'simpan') { $metode = $_POST['metode'] ?? ''; $nominal = intval($_POST['nominal'] ?? 0); $nama = trim($_POST['nama'] ?? 'Anonim'); $pesan = trim($_POST['pesan'] ?? ''); $ibadahId = intval($_POST['ibadah_id'] ?? 0); $jenisDonasi = trim($_POST['jenis_donasi'] ?? 'Uang Tunai'); $deskripsiBarang = trim($_POST['deskripsi_barang'] ?? ''); // Validasi minimal if (empty($metode)) { echo json_encode(["status" => "error", "pesan" => "Metode pembayaran wajib diisi."]); exit; } if ($jenisDonasi === 'Uang Tunai') { if ($nominal < 10000) { echo json_encode(["status" => "error", "pesan" => "Nominal minimal Rp 10.000."]); exit; } } else { // Donasi barang — metode tidak wajib, deskripsi wajib if (empty($deskripsiBarang)) { echo json_encode(["status" => "error", "pesan" => "Deskripsi barang wajib diisi."]); exit; } } // Upload bukti (opsional untuk donasi barang) $buktiPath = ''; if (isset($_FILES['bukti']) && $_FILES['bukti']['error'] === UPLOAD_ERR_OK) { $uploadDir = 'uploads/bukti_donasi/'; if (!is_dir($uploadDir)) mkdir($uploadDir, 0755, true); $ext = strtolower(pathinfo($_FILES['bukti']['name'], PATHINFO_EXTENSION)); $allowed = ['jpg', 'jpeg', 'png', 'webp', 'pdf']; if (!in_array($ext, $allowed)) { echo json_encode(["status" => "error", "pesan" => "Format file tidak didukung."]); exit; } $namaFile = 'donasi_' . time() . '_' . uniqid() . '.' . $ext; move_uploaded_file($_FILES['bukti']['tmp_name'], $uploadDir . $namaFile); $buktiPath = $uploadDir . $namaFile; } // Untuk donasi barang, simpan deskripsi di kolom pesan_dukungan $pesanFinal = $jenisDonasi !== 'Uang Tunai' ? "[BARANG] $deskripsiBarang" . ($pesan ? " | Pesan: $pesan" : '') : $pesan; // Ibadah ID 0 artinya umum, simpan sebagai NULL $ibadahIdFinal = $ibadahId > 0 ? $ibadahId : null; $stmt = $pdo->prepare(" INSERT INTO donasi_digital (metode_pembayaran, nominal, nama_donatur, pesan_dukungan, ibadah_id, bukti_transfer, status, created_at, jenis_donasi, deskripsi_barang) VALUES (?, ?, ?, ?, ?, ?, 'pending', NOW(), ?, ?) "); if ($stmt->execute([$metode, $nominal, $nama, $pesanFinal, $ibadahIdFinal, $buktiPath, $jenisDonasi, $deskripsiBarang])) { echo json_encode(["status" => "sukses", "pesan" => "Donasi berhasil dikirim."]); } else { echo json_encode(["status" => "error", "pesan" => "Gagal menyimpan ke database."]); } exit; } // 1. READ: TAMPILKAN LOG DONASI KE DASHBOARD if ($aksi == 'tampil') { $stmt = $pdo->query(" SELECT d.*, r.nama_tempat AS disalurkan_ke FROM donasi_digital d LEFT JOIN rumah_ibadah r ON d.ibadah_id = r.id ORDER BY d.id DESC "); $donasi = $stmt->fetchAll(PDO::FETCH_ASSOC); // TRANSFORMAST DATA: Menerjemahkan bahasa Database ke bahasa UI Dashboard foreach ($donasi as &$d) { $status_db = strtolower($d['status'] ?? ''); if ($status_db == 'pending') { $d['status'] = 'Menunggu'; } elseif ($status_db == 'berhasil') { $d['status'] = 'Dikonfirmasi'; } elseif ($status_db == 'ditolak' || $status_db == 'gagal') { $d['status'] = 'Ditolak'; } // Gunakan jenis_donasi dari database (bisa 'Uang Tunai', 'Sembako', 'Pakaian', dll.) $jenis = !empty($d['jenis_donasi']) ? $d['jenis_donasi'] : 'Uang Tunai'; $d['jenis_donasi'] = $jenis; // Untuk donasi uang: tampilkan nominal + metode pembayaran // Untuk donasi barang: tampilkan deskripsi barang if ($jenis === 'Uang Tunai') { $d['nilai'] = number_format((float)$d['nominal'], 0, ',', '.'); $d['keterangan'] = $d['pesan_dukungan'] . ($d['metode_pembayaran'] ? " (" . $d['metode_pembayaran'] . ")" : ""); } else { // Donasi barang: nilai diisi deskripsi barang, bukan nominal $deskripsi = !empty($d['deskripsi_barang']) ? $d['deskripsi_barang'] : ''; $d['nilai'] = $deskripsi ?: ($d['pesan_dukungan'] ?: '—'); $d['keterangan'] = $d['pesan_dukungan']; } $d['tanggal'] = date('Y-m-d', strtotime($d['created_at'])); $d['kontak'] = "Bukti: " . $d['bukti_transfer']; if (empty($d['disalurkan_ke'])) { $d['disalurkan_ke'] = 'Umum'; } } echo json_encode($donasi); exit; // 2. UPDATE: KONFIRMASI / TOLAK DONASI } elseif ($aksi == 'update_status') { $id = intval($_POST['id'] ?? 0); $status_ui = $_POST['status'] ?? 'Menunggu'; // PENERJEMAH KE DATABASE: Mengubah bahasa UI kembali ke bahasa Database $status_db = 'pending'; if ($status_ui == 'Dikonfirmasi') { $status_db = 'berhasil'; } elseif ($status_ui == 'Ditolak') { $status_db = 'gagal'; // enum DB: 'gagal', bukan 'ditolak' } $stmt = $pdo->prepare("UPDATE donasi_digital SET status = ? WHERE id = ?"); if ($stmt->execute([$status_db, $id])) { echo "Sukses"; } else { echo "Gagal memperbarui status"; } exit; // 3. DELETE: HAPUS LOG DONASI } elseif ($aksi == 'hapus') { $id = intval($_POST['id'] ?? 0); $stmt = $pdo->prepare("DELETE FROM donasi_digital WHERE id = ?"); if ($stmt->execute([$id])) { echo "Sukses"; } else { echo "Gagal menghapus data"; } exit; } ?>