Initial commit - clean and ready for Coolify

This commit is contained in:
noooviiieee
2026-06-11 10:16:53 +07:00
commit 19ebb84943
158 changed files with 9448 additions and 0 deletions
+183
View File
@@ -0,0 +1,183 @@
<?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;
}
?>