first commit

This commit is contained in:
2026-06-11 21:18:48 +07:00
parent 14ef9997c2
commit 2747d616c7
45 changed files with 7381 additions and 0 deletions
+17
View File
@@ -0,0 +1,17 @@
<?php
// php/check_auth.php
require_once 'koneksi.php';
if (session_status() === PHP_SESSION_NONE) { session_start(); }
header('Content-Type: application/json');
if (empty($_SESSION['user_id'])) {
echo json_encode(['loggedIn' => false]);
} else {
echo json_encode([
'loggedIn' => true,
'nama' => $_SESSION['user_nama'] ?? '',
'role' => $_SESSION['user_role'] ?? ''
]);
}
?>
+46
View File
@@ -0,0 +1,46 @@
<?php
// php/create_anggota.php
require_once 'koneksi.php';
header('Content-Type: text/plain');
$kemiskinanId = intval($_POST['kemiskinan_id'] ?? 0);
$nama = trim($_POST['nama'] ?? '');
$tanggalLahir = trim($_POST['tanggal_lahir'] ?? '');
$jenisKelamin = trim($_POST['jenis_kelamin'] ?? 'laki_laki');
$hubungan = trim($_POST['hubungan_keluarga'] ?? 'anak');
$statusHidup = trim($_POST['status_hidup'] ?? 'hidup');
$pendidikan = trim($_POST['pendidikan'] ?? 'belum_sekolah');
$catatan = trim($_POST['catatan_khusus'] ?? '');
if (!$kemiskinanId || !$nama) {
http_response_code(400); echo 'Data tidak lengkap.'; exit;
}
// Validasi enum
$validJK = ['laki_laki','perempuan'];
$validHub = ['kepala_keluarga','istri','anak','orang_tua','saudara','lainnya'];
$validStatus = ['hidup','meninggal','pindah','menikah_keluar'];
$validPendid = ['belum_sekolah','paud','sd','smp','sma','kuliah','pesantren','pelatihan','bekerja','tidak_sekolah'];
if (!in_array($jenisKelamin, $validJK)) $jenisKelamin = 'laki_laki';
if (!in_array($hubungan, $validHub)) $hubungan = 'anak';
if (!in_array($statusHidup, $validStatus)) $statusHidup = 'hidup';
if (!in_array($pendidikan, $validPendid)) $pendidikan = 'belum_sekolah';
// Validasi tanggal
$tgl = (!empty($tanggalLahir) && strtotime($tanggalLahir)) ? $tanggalLahir : null;
$stmt = $conn->prepare(
"INSERT INTO anggota_keluarga (kemiskinan_id, nama, tanggal_lahir, jenis_kelamin, hubungan_keluarga, status_hidup, pendidikan, catatan_khusus)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
);
if (!$stmt) { http_response_code(500); echo 'Gagal prepare.'; exit; }
$stmt->bind_param('isssssss', $kemiskinanId, $nama, $tgl, $jenisKelamin, $hubungan, $statusHidup, $pendidikan, $catatan);
if ($stmt->execute()) {
echo 'success';
} else {
http_response_code(500); echo 'Gagal menyimpan: ' . $stmt->error;
}
$stmt->close();
?>
+47
View File
@@ -0,0 +1,47 @@
<?php
// php/create_bantuan.php — simpan histori bantuan
require_once 'koneksi.php';
header('Content-Type: text/plain');
$kemiskinanId = intval($_POST['kemiskinan_id'] ?? 0);
$masjidId = !empty($_POST['masjid_id']) ? intval($_POST['masjid_id']) : null;
$jenisBantuan = trim($_POST['jenis_bantuan'] ?? 'lainnya');
$deskripsi = trim($_POST['deskripsi_bantuan'] ?? '');
$jumlahBantuan = !empty($_POST['jumlah_bantuan']) ? floatval($_POST['jumlah_bantuan']) : null;
$satuan = trim($_POST['satuan'] ?? '');
$tanggal = trim($_POST['tanggal_bantuan'] ?? date('Y-m-d'));
$periodeBerikutnya = !empty($_POST['periode_berikutnya']) ? trim($_POST['periode_berikutnya']) : null;
$statusPenyaluran = trim($_POST['status_penyaluran'] ?? 'belum');
$dicatatOleh = trim($_POST['dicatat_oleh'] ?? '');
if (!$kemiskinanId || !$deskripsi) {
http_response_code(400); echo 'Data tidak lengkap.'; exit;
}
$validJenis = ['sembako','uang','pendidikan','kesehatan','pakaian','pelatihan','lainnya'];
$validStatus = ['tersalur','belum','batal'];
if (!in_array($jenisBantuan, $validJenis)) $jenisBantuan = 'lainnya';
if (!in_array($statusPenyaluran, $validStatus)) $statusPenyaluran = 'belum';
if (!strtotime($tanggal)) $tanggal = date('Y-m-d');
if ($periodeBerikutnya && !strtotime($periodeBerikutnya)) $periodeBerikutnya = null;
$esc = fn($v) => mysqli_real_escape_string($conn, (string)$v);
$mjId = $masjidId ? intval($masjidId) : 'NULL';
$jml = $jumlahBantuan !== null ? floatval($jumlahBantuan) : 'NULL';
$prd = $periodeBerikutnya ? "'" . $esc($periodeBerikutnya) . "'" : 'NULL';
$sql = "INSERT INTO histori_bantuan
(kemiskinan_id, masjid_id, jenis_bantuan, deskripsi_bantuan, jumlah_bantuan, satuan, tanggal_bantuan, periode_berikutnya, status_penyaluran, dicatat_oleh)
VALUES (
{$kemiskinanId}, {$mjId},
'{$esc($jenisBantuan)}', '{$esc($deskripsi)}',
{$jml}, '{$esc($satuan)}', '{$esc($tanggal)}',
{$prd}, '{$esc($statusPenyaluran)}', '{$esc($dicatatOleh)}'
)";
if (mysqli_query($conn, $sql)) {
echo 'success';
} else {
http_response_code(500); echo 'Gagal: ' . mysqli_error($conn);
}
?>
+47
View File
@@ -0,0 +1,47 @@
<?php
// php/create_kemiskinan.php
include 'koneksi.php';
$namaKepalaKeluarga = trim($_POST['nama_kepala_keluarga'] ?? '');
$jumlahKkRaw = $_POST['jumlah_kk'] ?? null;
$jumlahKk = filter_var($jumlahKkRaw, FILTER_VALIDATE_INT);
$alamat = trim($_POST['alamat'] ?? '');
$statusKeluarga = $_POST['status_keluarga'] ?? 'aktif';
$latitudeRaw = $_POST['lat'] ?? null;
$longitudeRaw = $_POST['lng'] ?? null;
$latitude = is_numeric($latitudeRaw) ? (float) $latitudeRaw : null;
$longitude = is_numeric($longitudeRaw) ? (float) $longitudeRaw : null;
$validStatus = ['aktif', 'meninggal', 'pindah', 'sudah_mampu'];
if (!in_array($statusKeluarga, $validStatus)) { $statusKeluarga = 'aktif'; }
if ($namaKepalaKeluarga === '' || $alamat === '' || $jumlahKk === false || $jumlahKk === null || $jumlahKk < 1 || $latitude === null || $longitude === null) {
http_response_code(400);
exit('error');
}
$statement = null;
try {
$statement = mysqli_prepare(
$conn,
"INSERT INTO kemiskinan (nama_kepala_keluarga, jumlah_kk, alamat, latitude, longitude, status_keluarga) VALUES (?, ?, ?, ?, ?, ?)"
);
mysqli_stmt_bind_param($statement, "sisdds", $namaKepalaKeluarga, $jumlahKk, $alamat, $latitude, $longitude, $statusKeluarga);
if (mysqli_stmt_execute($statement)) {
echo 'success';
} else {
http_response_code(500);
echo 'error';
}
} catch (mysqli_sql_exception $exception) {
http_response_code(500);
echo 'error: ' . $exception->getMessage();
}
if ($statement) {
mysqli_stmt_close($statement);
}
?>
+27
View File
@@ -0,0 +1,27 @@
<?php
// php/create_laporan.php — PUBLIK, tidak butuh login
require_once 'koneksi.php';
header('Content-Type: text/plain');
$kemiskinanId = !empty($_POST['kemiskinan_id']) ? intval($_POST['kemiskinan_id']) : null;
$namaPelapor = trim($_POST['nama_pelapor'] ?? '');
$nomorWa = trim($_POST['nomor_wa'] ?? '');
$kategori = trim($_POST['kategori'] ?? 'lainnya');
$deskripsi = trim($_POST['deskripsi'] ?? '');
if (!$namaPelapor || !$deskripsi) {
http_response_code(400); echo 'Nama pelapor dan deskripsi wajib diisi.'; exit;
}
$validKategori = ['sakit','kematian','kelahiran','pernikahan','pindah','darurat_ekonomi','lainnya'];
if (!in_array($kategori, $validKategori)) $kategori = 'lainnya';
$esc = fn($v) => mysqli_real_escape_string($conn, (string)$v);
$kemId = $kemiskinanId ? intval($kemiskinanId) : 'NULL';
$sql = "INSERT INTO laporan_kondisi (kemiskinan_id, nama_pelapor, nomor_wa, kategori, deskripsi)
VALUES ({$kemId}, '{$esc($namaPelapor)}', '{$esc($nomorWa)}', '{$esc($kategori)}', '{$esc($deskripsi)}')";
if (mysqli_query($conn, $sql)) { echo 'success'; }
else { http_response_code(500); echo 'Gagal: ' . mysqli_error($conn); }
?>
+39
View File
@@ -0,0 +1,39 @@
<?php
// php/create_masjid.php — tambah rumah ibadah
include 'koneksi.php';
$namaIbadah = trim($_POST['nama_masjid'] ?? '');
$picIbadah = trim($_POST['pic_masjid'] ?? '');
$alamat = trim($_POST['alamat'] ?? '');
$latitudeRaw = $_POST['lat'] ?? null;
$longitudeRaw= $_POST['lng'] ?? null;
$radiusRaw = $_POST['radius'] ?? 500;
$jenisIbadah = trim($_POST['jenis_ibadah'] ?? 'masjid');
$latitude = is_numeric($latitudeRaw) ? (float) $latitudeRaw : null;
$longitude = is_numeric($longitudeRaw) ? (float) $longitudeRaw : null;
$radius = is_numeric($radiusRaw) ? (float) $radiusRaw : null;
$validJenis = ['masjid','gereja','vihara','pura','klenteng','kapel','lainnya'];
if (!in_array($jenisIbadah, $validJenis)) { $jenisIbadah = 'lainnya'; }
if ($namaIbadah === '' || $picIbadah === '' || $alamat === '' || $latitude === null || $longitude === null || $radius === null || $radius < 100 || $radius > 5000) {
http_response_code(400);
exit('error: data tidak lengkap');
}
$stmt = $conn->prepare(
"INSERT INTO masjid (nama_masjid, pic_masjid, alamat, latitude, longitude, radius, jenis_ibadah)
VALUES (?, ?, ?, ?, ?, ?, ?)"
);
if (!$stmt) { http_response_code(500); echo 'Gagal prepare: ' . $conn->error; exit; }
$stmt->bind_param('sssddis', $namaIbadah, $picIbadah, $alamat, $latitude, $longitude, $radius, $jenisIbadah);
if ($stmt->execute()) {
echo 'success';
} else {
http_response_code(500);
echo 'error: ' . $stmt->error;
}
$stmt->close();
?>
+14
View File
@@ -0,0 +1,14 @@
<?php
// php/delete_anggota.php
require_once 'koneksi.php';
header('Content-Type: text/plain');
$id = intval($_POST['id'] ?? 0);
if (!$id) { http_response_code(400); echo 'ID tidak valid.'; exit; }
$stmt = $conn->prepare("DELETE FROM anggota_keluarga WHERE id=?");
$stmt->bind_param('i', $id);
if ($stmt->execute()) { echo 'success'; }
else { http_response_code(500); echo 'Gagal: ' . $stmt->error; }
$stmt->close();
?>
+9
View File
@@ -0,0 +1,9 @@
<?php
// php/delete_bantuan.php
require_once 'koneksi.php';
header('Content-Type: text/plain');
$id = intval($_POST['id'] ?? 0);
if (!$id) { http_response_code(400); echo 'ID tidak valid.'; exit; }
if (mysqli_query($conn, "DELETE FROM histori_bantuan WHERE id={$id}")) { echo 'success'; }
else { http_response_code(500); echo mysqli_error($conn); }
?>
+28
View File
@@ -0,0 +1,28 @@
<?php
include 'koneksi.php';
$idRaw = $_POST['id'] ?? null;
$id = filter_var($idRaw, FILTER_VALIDATE_INT);
if ($id === false || $id === null || $id <= 0) {
http_response_code(400);
exit('error');
}
$statement = mysqli_prepare($conn, "DELETE FROM kemiskinan WHERE id = ?");
mysqli_stmt_bind_param($statement, "i", $id);
try {
if (mysqli_stmt_execute($statement)) {
echo 'success';
} else {
http_response_code(500);
echo 'error';
}
} catch (mysqli_sql_exception $exception) {
http_response_code(500);
echo 'error: ' . $exception->getMessage();
}
mysqli_stmt_close($statement);
?>
+28
View File
@@ -0,0 +1,28 @@
<?php
include 'koneksi.php';
$idRaw = $_POST['id'] ?? null;
$id = filter_var($idRaw, FILTER_VALIDATE_INT);
if ($id === false || $id === null || $id <= 0) {
http_response_code(400);
exit('error');
}
$statement = mysqli_prepare($conn, "DELETE FROM masjid WHERE id = ?");
mysqli_stmt_bind_param($statement, "i", $id);
try {
if (mysqli_stmt_execute($statement)) {
echo 'success';
} else {
http_response_code(500);
echo 'error';
}
} catch (mysqli_sql_exception $exception) {
http_response_code(500);
echo 'error: ' . $exception->getMessage();
}
mysqli_stmt_close($statement);
?>
+67
View File
@@ -0,0 +1,67 @@
<?php
error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE & ~E_WARNING);
include 'koneksi.php';
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="Data_Keluarga_Prasejahtera_GeoPoverty.csv"');
$output = fopen('php://output', 'w');
// Header CSV
fputcsv($output, [
'ID',
'Nama Kepala Keluarga',
'Alamat',
'Latitude',
'Longitude',
'Status Keluarga',
'Jumlah Jiwa',
'Daftar Anggota Keluarga (Nama - Hubungan - Pendidikan)',
'Total Bantuan Diterima (Kali)',
'Riwayat Bantuan (Detail)',
'Laporan Darurat / Kondisi',
'Tanggal Didata',
'Terakhir Diubah'
]);
$query = "
SELECT
k.id, k.nama_kepala_keluarga, k.alamat, k.latitude, k.longitude, k.status_keluarga, k.jumlah_kk, k.created_at, k.updated_at,
(SELECT GROUP_CONCAT(CONCAT(nama, ' (', hubungan_keluarga, ' - ', pendidikan, ')') SEPARATOR ' | ') FROM anggota_keluarga WHERE kemiskinan_id = k.id) as rincian_anggota,
(SELECT COUNT(id) FROM histori_bantuan WHERE kemiskinan_id = k.id AND status_penyaluran = 'tersalur') as total_bantuan,
(SELECT GROUP_CONCAT(CONCAT(tanggal_bantuan, ': ', jenis_bantuan, ' - ', deskripsi_bantuan) SEPARATOR ' | ') FROM histori_bantuan WHERE kemiskinan_id = k.id AND status_penyaluran = 'tersalur') as riwayat_bantuan,
(SELECT GROUP_CONCAT(CONCAT(DATE(created_at), ': ', kategori, ' - ', deskripsi) SEPARATOR ' | ') FROM laporan_kondisi WHERE kemiskinan_id = k.id) as laporan_darurat
FROM kemiskinan k
ORDER BY k.id DESC
";
$result = mysqli_query($conn, $query);
if ($result) {
while ($row = mysqli_fetch_assoc($result)) {
// Clean status label
$status = ucfirst(str_replace('_', ' ', $row['status_keluarga']));
if ($row['status_keluarga'] == 'sudah_mampu') $status = 'Sudah Mampu';
fputcsv($output, [
$row['id'],
$row['nama_kepala_keluarga'],
$row['alamat'],
$row['latitude'],
$row['longitude'],
$status,
$row['jumlah_kk'],
$row['rincian_anggota'] ? $row['rincian_anggota'] : 'Belum didata',
$row['total_bantuan'] . ' kali',
$row['riwayat_bantuan'] ? $row['riwayat_bantuan'] : 'Tidak ada catatan bantuan',
$row['laporan_darurat'] ? $row['laporan_darurat'] : 'Tidak ada laporan',
$row['created_at'],
$row['updated_at']
]);
}
}
fclose($output);
exit();
?>
+206
View File
@@ -0,0 +1,206 @@
<?php
$conn = mysqli_connect("127.0.0.1", "root", "", "webgis_kemiskinan");
if (!$conn) {
die("Koneksi gagal: " . mysqli_connect_error());
}
mysqli_set_charset($conn, "utf8mb4");
// Helper: tambah kolom hanya jika belum ada
function addColumnIfNotExists($conn, $table, $column, $definition)
{
$db = mysqli_select_db($conn, 'webgis_kemiskinan') ? 'webgis_kemiskinan' : '';
$check = mysqli_query(
$conn,
"SELECT COUNT(*) as cnt FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '$table' AND COLUMN_NAME = '$column'"
);
if ($check) {
$row = mysqli_fetch_assoc($check);
if ((int) $row['cnt'] === 0) {
mysqli_query($conn, "ALTER TABLE `$table` ADD COLUMN `$column` $definition");
}
}
}
$bootstrapQueries = [
// ── Tabel: kemiskinan
"CREATE TABLE IF NOT EXISTS kemiskinan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_kepala_keluarga VARCHAR(255) NOT NULL,
jumlah_kk INT NOT NULL,
alamat TEXT NOT NULL,
latitude DECIMAL(10,8) NOT NULL,
longitude DECIMAL(11,8) NOT NULL,
status_keluarga ENUM('aktif','meninggal','pindah','sudah_mampu') NOT NULL DEFAULT 'aktif',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// ── Tabel: masjid (rumah ibadah)
"CREATE TABLE IF NOT EXISTS masjid (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_masjid VARCHAR(255) NOT NULL,
pic_masjid VARCHAR(255) NOT NULL,
alamat TEXT NOT NULL,
latitude DECIMAL(10,8) NOT NULL,
longitude DECIMAL(11,8) NOT NULL,
radius INT NOT NULL DEFAULT 500,
jenis_ibadah ENUM('masjid','gereja','vihara','pura','klenteng','kapel','lainnya') NOT NULL DEFAULT 'masjid',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// ── Tabel: pengguna (login multi-role)
"CREATE TABLE IF NOT EXISTS pengguna (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
nama_lengkap VARCHAR(255) NOT NULL,
role ENUM('pengurus_masjid','pimpinan_daerah') NOT NULL DEFAULT 'pengurus_masjid',
masjid_id INT NULL,
aktif TINYINT(1) NOT NULL DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// ── Tabel: anggota_keluarga (individu per KK)
"CREATE TABLE IF NOT EXISTS anggota_keluarga (
id INT AUTO_INCREMENT PRIMARY KEY,
kemiskinan_id INT NOT NULL,
nama VARCHAR(255) NOT NULL,
tanggal_lahir DATE NULL,
jenis_kelamin ENUM('laki_laki','perempuan') NOT NULL DEFAULT 'laki_laki',
hubungan_keluarga ENUM('kepala_keluarga','istri','anak','orang_tua','saudara','lainnya') NOT NULL DEFAULT 'anak',
status_hidup ENUM('hidup','meninggal','pindah','menikah_keluar') NOT NULL DEFAULT 'hidup',
pendidikan ENUM('belum_sekolah','paud','sd','smp','sma','kuliah','pesantren','pelatihan','bekerja','tidak_sekolah') NOT NULL DEFAULT 'belum_sekolah',
catatan_khusus TEXT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (kemiskinan_id) REFERENCES kemiskinan(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// ── Tabel: histori_bantuan
"CREATE TABLE IF NOT EXISTS histori_bantuan (
id INT AUTO_INCREMENT PRIMARY KEY,
kemiskinan_id INT NOT NULL,
masjid_id INT NULL,
jenis_bantuan ENUM('sembako','uang','pendidikan','kesehatan','pakaian','pelatihan','lainnya') NOT NULL DEFAULT 'lainnya',
deskripsi_bantuan TEXT NOT NULL,
jumlah_bantuan DECIMAL(10,2) NULL,
satuan VARCHAR(50) NULL COMMENT 'e.g. karung, kg, Rp, bulan',
tanggal_bantuan DATE NOT NULL,
periode_berikutnya DATE NULL COMMENT 'Untuk bantuan berkala',
status_penyaluran ENUM('tersalur','belum','batal') NOT NULL DEFAULT 'belum',
dicatat_oleh VARCHAR(255) NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (kemiskinan_id) REFERENCES kemiskinan(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// ── Tabel: laporan_kondisi (dari warga)
"CREATE TABLE IF NOT EXISTS laporan_kondisi (
id INT AUTO_INCREMENT PRIMARY KEY,
kemiskinan_id INT NULL,
nama_pelapor VARCHAR(255) NOT NULL,
nomor_wa VARCHAR(20) NULL,
kategori ENUM('sakit','kematian','kelahiran','pernikahan','pindah','darurat_ekonomi','lainnya') NOT NULL DEFAULT 'lainnya',
deskripsi TEXT NOT NULL,
status_laporan ENUM('menunggu','diproses','selesai','ditolak') NOT NULL DEFAULT 'menunggu',
ditangani_oleh VARCHAR(255) NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// ── Tabel: pesan_komunikasi
"CREATE TABLE IF NOT EXISTS pesan_komunikasi (
id INT AUTO_INCREMENT PRIMARY KEY,
pengirim_id INT NOT NULL,
penerima_id INT NULL COMMENT 'NULL = broadcast ke semua',
judul VARCHAR(255) NOT NULL,
isi TEXT NOT NULL,
jenis ENUM('permintaan_bantuan','koordinasi','pengumuman') NOT NULL DEFAULT 'koordinasi',
status ENUM('baru','dibaca','diarsip') NOT NULL DEFAULT 'baru',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"
];
foreach ($bootstrapQueries as $query) {
mysqli_query($conn, $query);
}
// ── Migrasi aman: tambah kolom baru ke tabel yang sudah ada
addColumnIfNotExists(
$conn,
'kemiskinan',
'status_keluarga',
"ENUM('aktif','meninggal','pindah','sudah_mampu') NOT NULL DEFAULT 'aktif'"
);
addColumnIfNotExists(
$conn,
'kemiskinan',
'updated_at',
"TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
);
addColumnIfNotExists(
$conn,
'masjid',
'jenis_ibadah',
"ENUM('masjid','gereja','vihara','pura','klenteng','kapel','lainnya') NOT NULL DEFAULT 'masjid'"
);
// ── Seed akun default jika tabel pengguna masih kosong
$checkUser = mysqli_query($conn, "SELECT COUNT(*) as total FROM pengguna");
if ($checkUser) {
$row = mysqli_fetch_assoc($checkUser);
if ((int) $row['total'] === 0) {
$defaultUsers = [
['pengurus1', password_hash('password', PASSWORD_DEFAULT), 'Pengurus Masjid Al-Ikhlas', 'pengurus_masjid'],
['pimpinan1', password_hash('password', PASSWORD_DEFAULT), 'Kepala Dinas Sosial', 'pimpinan_daerah'],
];
$stmt = mysqli_prepare($conn, "INSERT INTO pengguna (username, password_hash, nama_lengkap, role) VALUES (?, ?, ?, ?)");
if ($stmt) {
foreach ($defaultUsers as $u) {
mysqli_stmt_bind_param($stmt, 'ssss', $u[0], $u[1], $u[2], $u[3]);
mysqli_stmt_execute($stmt);
}
mysqli_stmt_close($stmt);
}
}
}
// ── Helper: cek autentikasi (panggil di endpoint yang butuh login)
function requireAuth($requiredRole = null)
{
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
if (empty($_SESSION['user_id'])) {
http_response_code(401);
header('Content-Type: application/json');
echo json_encode(['error' => 'Tidak terautentikasi. Silakan login.']);
exit;
}
if ($requiredRole && $_SESSION['user_role'] !== $requiredRole) {
http_response_code(403);
header('Content-Type: application/json');
echo json_encode(['error' => 'Akses ditolak. Role tidak sesuai.']);
exit;
}
}
function isLoggedIn()
{
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
return !empty($_SESSION['user_id']);
}
function currentRole()
{
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
return $_SESSION['user_role'] ?? null;
}
?>
+45
View File
@@ -0,0 +1,45 @@
<?php
// php/login.php
require_once 'koneksi.php';
if (session_status() === PHP_SESSION_NONE) { session_start(); }
header('Content-Type: application/json');
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['error' => 'Method not allowed']);
exit;
}
$username = trim($_POST['username'] ?? '');
$password = trim($_POST['password'] ?? '');
if (!$username || !$password) {
http_response_code(400);
echo json_encode(['error' => 'Username dan password wajib diisi.']);
exit;
}
$stmt = $conn->prepare("SELECT id, password_hash, nama_lengkap, role FROM pengguna WHERE username = ? AND aktif = 1 LIMIT 1");
$stmt->bind_param('s', $username);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();
$stmt->close();
if (!$user || !password_verify($password, $user['password_hash'])) {
http_response_code(401);
echo json_encode(['error' => 'Username atau password salah.']);
exit;
}
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_nama'] = $user['nama_lengkap'];
$_SESSION['user_role'] = $user['role'];
echo json_encode([
'success' => true,
'nama' => $user['nama_lengkap'],
'role' => $user['role']
]);
?>
+7
View File
@@ -0,0 +1,7 @@
<?php
// php/logout.php
if (session_status() === PHP_SESSION_NONE) { session_start(); }
session_destroy();
header('Content-Type: application/json');
echo json_encode(['success' => true]);
?>
+29
View File
@@ -0,0 +1,29 @@
<?php
// php/read_anggota.php
require_once 'koneksi.php';
header('Content-Type: application/json; charset=utf-8');
$kemiskinanId = intval($_GET['kemiskinan_id'] ?? 0);
if (!$kemiskinanId) {
echo json_encode([]); exit;
}
$stmt = $conn->prepare(
"SELECT *,
TIMESTAMPDIFF(YEAR, tanggal_lahir, CURDATE()) AS umur,
DATE_FORMAT(updated_at, '%Y-%m-%d %H:%i') AS updated_at_fmt,
DATE_FORMAT(tanggal_lahir, '%d/%m/%Y') AS tgl_lahir_fmt
FROM anggota_keluarga
WHERE kemiskinan_id = ?
ORDER BY hubungan_keluarga, nama"
);
$stmt->bind_param('i', $kemiskinanId);
$stmt->execute();
$result = $stmt->get_result();
$data = [];
while ($row = $result->fetch_assoc()) {
$data[] = $row;
}
$stmt->close();
echo json_encode($data);
?>
+28
View File
@@ -0,0 +1,28 @@
<?php
// php/read_bantuan.php
require_once 'koneksi.php';
header('Content-Type: application/json; charset=utf-8');
$kemiskinanId = intval($_GET['kemiskinan_id'] ?? 0);
if (!$kemiskinanId) { echo json_encode([]); exit; }
$esc = fn($v) => mysqli_real_escape_string($conn, (string)$v);
$sql = "SELECT hb.*, m.nama_masjid,
DATE_FORMAT(hb.tanggal_bantuan, '%d/%m/%Y') AS tanggal_fmt,
DATE_FORMAT(hb.periode_berikutnya, '%d/%m/%Y') AS periode_fmt,
CASE WHEN hb.periode_berikutnya IS NOT NULL AND hb.periode_berikutnya <= CURDATE() AND hb.status_penyaluran = 'belum' THEN 1 ELSE 0 END AS jatuh_tempo
FROM histori_bantuan hb
LEFT JOIN masjid m ON hb.masjid_id = m.id
WHERE hb.kemiskinan_id = {$kemiskinanId}
ORDER BY hb.tanggal_bantuan DESC";
$result = mysqli_query($conn, $sql);
$data = [];
if ($result) {
while ($row = mysqli_fetch_assoc($result)) {
$data[] = $row;
}
}
echo json_encode($data);
?>
+18
View File
@@ -0,0 +1,18 @@
<?php
// php/read_kemiskinan.php
include 'koneksi.php';
header('Content-Type: application/json; charset=utf-8');
$query = "SELECT *, DATE_FORMAT(updated_at, '%Y-%m-%d %H:%i:%s') as updated_at_fmt FROM kemiskinan ORDER BY updated_at DESC, id DESC";
$result = mysqli_query($conn, $query);
$data = [];
if ($result) {
while ($row = mysqli_fetch_assoc($result)) {
$data[] = $row;
}
}
echo json_encode($data);
?>
+36
View File
@@ -0,0 +1,36 @@
<?php
// php/read_laporan.php
require_once 'koneksi.php';
header('Content-Type: application/json; charset=utf-8');
$statusFilter = trim($_GET['status'] ?? '');
$kemiskinanIdRaw = isset($_GET['kemiskinan_id']) ? intval($_GET['kemiskinan_id']) : 0;
$validStatus = ['menunggu','diproses','selesai','ditolak'];
$conditions = [];
if ($kemiskinanIdRaw > 0) {
$conditions[] = "lk.kemiskinan_id = {$kemiskinanIdRaw}";
}
if (in_array($statusFilter, $validStatus)) {
$esc = mysqli_real_escape_string($conn, $statusFilter);
$conditions[] = "lk.status_laporan = '{$esc}'";
}
$where = count($conditions) ? 'WHERE ' . implode(' AND ', $conditions) : '';
$sql = "SELECT lk.*, k.nama_kepala_keluarga, k.alamat AS alamat_kk,
DATE_FORMAT(lk.created_at, '%d/%m/%Y %H:%i') AS created_fmt
FROM laporan_kondisi lk
LEFT JOIN kemiskinan k ON lk.kemiskinan_id = k.id
{$where}
ORDER BY lk.created_at DESC
LIMIT 200";
$result = mysqli_query($conn, $sql);
$data = [];
if ($result) {
while ($row = mysqli_fetch_assoc($result)) { $data[] = $row; }
}
echo json_encode($data);
?>
+17
View File
@@ -0,0 +1,17 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json; charset=utf-8');
$query = "SELECT * FROM masjid ORDER BY id DESC";
$result = mysqli_query($conn, $query);
$data = [];
if ($result) {
while ($row = mysqli_fetch_assoc($result)) {
$data[] = $row;
}
}
echo json_encode($data);
?>
+34
View File
@@ -0,0 +1,34 @@
<?php
// php/read_pesan.php
require_once 'koneksi.php';
if (session_status() === PHP_SESSION_NONE) { session_start(); }
header('Content-Type: application/json; charset=utf-8');
$userId = intval($_SESSION['user_id'] ?? 0);
if (!$userId) {
echo json_encode([]); exit;
}
// Ambil pesan broadcast + pesan yang ditujukan ke user ini
$sql = "SELECT pm.*,
p.nama_lengkap AS nama_pengirim, p.role AS role_pengirim,
DATE_FORMAT(pm.created_at, '%d/%m/%Y %H:%i') AS created_fmt
FROM pesan_komunikasi pm
JOIN pengguna p ON pm.pengirim_id = p.id
WHERE pm.penerima_id IS NULL OR pm.penerima_id = {$userId}
ORDER BY pm.created_at DESC
LIMIT 100";
$result = mysqli_query($conn, $sql);
$data = [];
if ($result) {
while ($row = mysqli_fetch_assoc($result)) { $data[] = $row; }
}
// Mark as read — semua pesan yang belum dibaca oleh user ini
$markSql = "UPDATE pesan_komunikasi SET status='dibaca'
WHERE status='baru' AND (penerima_id = {$userId} OR penerima_id IS NULL) AND pengirim_id != {$userId}";
mysqli_query($conn, $markSql);
echo json_encode($data);
?>
+27
View File
@@ -0,0 +1,27 @@
<?php
// php/send_pesan.php
require_once 'koneksi.php';
if (session_status() === PHP_SESSION_NONE) { session_start(); }
header('Content-Type: text/plain');
$pengirimId = intval($_SESSION['user_id'] ?? 0);
if (!$pengirimId) { http_response_code(401); echo 'Tidak terautentikasi.'; exit; }
$penerimaId = !empty($_POST['penerima_id']) ? intval($_POST['penerima_id']) : null;
$judul = trim($_POST['judul'] ?? '');
$isi = trim($_POST['isi'] ?? '');
$jenis = trim($_POST['jenis'] ?? 'koordinasi');
if (!$judul || !$isi) { http_response_code(400); echo 'Judul dan isi wajib diisi.'; exit; }
$validJenis = ['permintaan_bantuan','koordinasi','pengumuman'];
if (!in_array($jenis, $validJenis)) $jenis = 'koordinasi';
$esc = fn($v) => mysqli_real_escape_string($conn, (string)$v);
$penerima = $penerimaId ? intval($penerimaId) : 'NULL';
$sql = "INSERT INTO pesan_komunikasi (pengirim_id, penerima_id, judul, isi, jenis)
VALUES ({$pengirimId}, {$penerima}, '{$esc($judul)}', '{$esc($isi)}', '{$esc($jenis)}')";
if (mysqli_query($conn, $sql)) { echo 'success'; }
else { http_response_code(500); echo mysqli_error($conn); }
?>
+49
View File
@@ -0,0 +1,49 @@
<?php
// php/update_anggota.php
require_once 'koneksi.php';
header('Content-Type: text/plain');
$id = intval($_POST['id'] ?? 0);
$nama = trim($_POST['nama'] ?? '');
$tanggalLahir = trim($_POST['tanggal_lahir'] ?? '');
$jenisKelamin = trim($_POST['jenis_kelamin'] ?? 'laki_laki');
$hubungan = trim($_POST['hubungan_keluarga'] ?? 'anak');
$statusHidup = trim($_POST['status_hidup'] ?? 'hidup');
$pendidikan = trim($_POST['pendidikan'] ?? 'belum_sekolah');
$catatan = trim($_POST['catatan_khusus'] ?? '');
if (!$id || !$nama) {
http_response_code(400); echo 'Data tidak lengkap.'; exit;
}
$validJK = ['laki_laki','perempuan'];
$validHub = ['kepala_keluarga','istri','anak','orang_tua','saudara','lainnya'];
$validStatus = ['hidup','meninggal','pindah','menikah_keluar'];
$validPendid = ['belum_sekolah','paud','sd','smp','sma','kuliah','pesantren','pelatihan','bekerja','tidak_sekolah'];
if (!in_array($jenisKelamin, $validJK)) $jenisKelamin = 'laki_laki';
if (!in_array($hubungan, $validHub)) $hubungan = 'anak';
if (!in_array($statusHidup, $validStatus)) $statusHidup = 'hidup';
if (!in_array($pendidikan, $validPendid)) $pendidikan = 'belum_sekolah';
// Validasi tanggal — null jika kosong/tidak valid
$tgl = (!empty($tanggalLahir) && strtotime($tanggalLahir)) ? $tanggalLahir : null;
// 8 kolom: nama(s) tgl(s) jk(s) hub(s) status(s) pendidikan(s) catatan(s) id(i)
$stmt = $conn->prepare(
"UPDATE anggota_keluarga
SET nama=?, tanggal_lahir=?, jenis_kelamin=?, hubungan_keluarga=?,
status_hidup=?, pendidikan=?, catatan_khusus=?
WHERE id=?"
);
if (!$stmt) { http_response_code(500); echo 'Gagal prepare: ' . $conn->error; exit; }
$stmt->bind_param('sssssssi', $nama, $tgl, $jenisKelamin, $hubungan, $statusHidup, $pendidikan, $catatan, $id);
if ($stmt->execute()) {
echo 'success';
} else {
http_response_code(500); echo 'Gagal: ' . $stmt->error;
}
$stmt->close();
?>
+17
View File
@@ -0,0 +1,17 @@
<?php
// php/update_bantuan_status.php
require_once 'koneksi.php';
header('Content-Type: text/plain');
$id = intval($_POST['id'] ?? 0);
$status = trim($_POST['status_penyaluran'] ?? '');
$valid = ['tersalur','belum','batal'];
if (!$id || !in_array($status, $valid)) {
http_response_code(400); echo 'Data tidak valid.'; exit;
}
$sql = "UPDATE histori_bantuan SET status_penyaluran='" . mysqli_real_escape_string($conn, $status) . "' WHERE id={$id}";
if (mysqli_query($conn, $sql)) { echo 'success'; }
else { http_response_code(500); echo 'Gagal: ' . mysqli_error($conn); }
?>
+38
View File
@@ -0,0 +1,38 @@
<?php
// php/update_kemiskinan.php
require_once 'koneksi.php';
header('Content-Type: text/plain');
$id = isset($_POST['id']) ? intval($_POST['id']) : 0;
$nama = isset($_POST['nama_kepala_keluarga']) ? trim($_POST['nama_kepala_keluarga']) : '';
$jml = isset($_POST['jumlah_kk']) ? intval($_POST['jumlah_kk']) : 0;
$alamat = isset($_POST['alamat']) ? trim($_POST['alamat']) : '';
$status = isset($_POST['status_keluarga']) ? trim($_POST['status_keluarga']) : 'aktif';
$validStatus = ['aktif', 'meninggal', 'pindah', 'sudah_mampu'];
if (!in_array($status, $validStatus)) { $status = 'aktif'; }
if (!$id || !$nama || $jml < 1 || !$alamat) {
http_response_code(400);
echo 'Data tidak lengkap atau tidak valid.';
exit;
}
$stmt = $conn->prepare("UPDATE kemiskinan SET nama_kepala_keluarga=?, jumlah_kk=?, alamat=?, status_keluarga=? WHERE id=?");
if (!$stmt) {
http_response_code(500);
echo 'Gagal menyiapkan query.';
exit;
}
$stmt->bind_param('sissi', $nama, $jml, $alamat, $status, $id);
if ($stmt->execute()) {
echo 'success';
} else {
http_response_code(500);
echo 'Gagal memperbarui data: ' . $stmt->error;
}
$stmt->close();
$conn->close();
?>
+20
View File
@@ -0,0 +1,20 @@
<?php
// php/update_laporan_status.php
require_once 'koneksi.php';
header('Content-Type: text/plain');
$id = intval($_POST['id'] ?? 0);
$status = trim($_POST['status_laporan'] ?? '');
$ditanganiOleh = trim($_POST['ditangani_oleh'] ?? '');
$valid = ['menunggu','diproses','selesai','ditolak'];
if (!$id || !in_array($status, $valid)) {
http_response_code(400); echo 'Data tidak valid.'; exit;
}
$esc = fn($v) => mysqli_real_escape_string($conn, (string)$v);
$sql = "UPDATE laporan_kondisi SET status_laporan='{$esc($status)}', ditangani_oleh='{$esc($ditanganiOleh)}' WHERE id={$id}";
if (mysqli_query($conn, $sql)) { echo 'success'; }
else { http_response_code(500); echo mysqli_error($conn); }
?>
+36
View File
@@ -0,0 +1,36 @@
<?php
// php/update_masjid.php — perbarui rumah ibadah
require_once 'koneksi.php';
header('Content-Type: text/plain');
$id = isset($_POST['id']) ? intval($_POST['id']) : 0;
$nama = isset($_POST['nama_masjid']) ? trim($_POST['nama_masjid']) : '';
$pic = isset($_POST['pic_masjid']) ? trim($_POST['pic_masjid']) : '';
$alamat = isset($_POST['alamat']) ? trim($_POST['alamat']) : '';
$jenisIbadah = isset($_POST['jenis_ibadah'])? trim($_POST['jenis_ibadah']) : 'masjid';
$validJenis = ['masjid','gereja','vihara','pura','klenteng','kapel','lainnya'];
if (!in_array($jenisIbadah, $validJenis)) { $jenisIbadah = 'lainnya'; }
if (!$id || !$nama || !$pic || !$alamat) {
http_response_code(400);
echo 'Data tidak lengkap.';
exit;
}
$stmt = $conn->prepare("UPDATE masjid SET nama_masjid=?, pic_masjid=?, alamat=?, jenis_ibadah=? WHERE id=?");
if (!$stmt) {
http_response_code(500);
echo 'Gagal menyiapkan query.';
exit;
}
$stmt->bind_param('ssssi', $nama, $pic, $alamat, $jenisIbadah, $id);
if ($stmt->execute()) {
echo 'success';
} else {
http_response_code(500);
echo 'Gagal memperbarui data: ' . $stmt->error;
}
$stmt->close();
?>
+30
View File
@@ -0,0 +1,30 @@
<?php
include 'koneksi.php';
$idRaw = $_POST['id'] ?? null;
$radiusRaw = $_POST['radius'] ?? null;
$id = filter_var($idRaw, FILTER_VALIDATE_INT);
$radius = is_numeric($radiusRaw) ? (float) $radiusRaw : null;
if ($id === false || $id === null || $id <= 0 || $radius === null || $radius < 100 || $radius > 5000) {
http_response_code(400);
exit('error');
}
$statement = mysqli_prepare($conn, "UPDATE masjid SET radius = ? WHERE id = ?");
mysqli_stmt_bind_param($statement, "di", $radius, $id);
try {
if (mysqli_stmt_execute($statement)) {
echo 'success';
} else {
http_response_code(500);
echo 'error';
}
} catch (mysqli_sql_exception $exception) {
http_response_code(500);
echo 'error: ' . $exception->getMessage();
}
mysqli_stmt_close($statement);
?>
+24
View File
@@ -0,0 +1,24 @@
<?php
include 'koneksi.php';
include 'check_auth.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$id = isset($_POST['id']) ? intval($_POST['id']) : 0;
$status = isset($_POST['status']) ? $_POST['status'] : 'dibaca';
if ($id <= 0) {
http_response_code(400);
die("Invalid ID");
}
$stmt = $conn->prepare("UPDATE pesan_komunikasi SET status = ? WHERE id = ?");
$stmt->bind_param("si", $status, $id);
if ($stmt->execute()) {
echo "Success";
} else {
http_response_code(500);
echo "Error: " . $conn->error;
}
}
?>