183 lines
6.5 KiB
PHP
183 lines
6.5 KiB
PHP
<?php
|
|
ob_start(); // ← ob_start PERTAMA, sebelum apapun
|
|
|
|
session_start();
|
|
error_reporting(0);
|
|
ini_set('display_errors', 0);
|
|
|
|
header('Content-Type: application/json'); // ← header setelah ob_start aman
|
|
|
|
if (!isset($_SESSION['user_id'])) {
|
|
ob_end_clean(); // ← sekarang ini valid karena ob_start sudah jalan
|
|
echo json_encode(["status" => "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;
|
|
}
|
|
?>
|