Add WebGIS source code

This commit is contained in:
ocabacaa
2026-06-11 23:48:02 +07:00
parent ce48dbcddc
commit b212ca27fd
37 changed files with 5764 additions and 0 deletions
+223
View File
@@ -0,0 +1,223 @@
<?php
session_start();
if(!isset($_SESSION['role'])){
header("Location: ../index.php");
exit;
}
if($_SESSION['role'] != 'cs'){
header("Location: ../index.php");
exit;
}
include '../config/koneksi.php';
$user_id = $_SESSION['id'];
$cs = mysqli_fetch_assoc(
mysqli_query(
$conn,
"SELECT * FROM cs_rumah_ibadah
WHERE user_id='$user_id'"
)
);
$cs_id = $cs['id'];
/* TOTAL */
$total = mysqli_num_rows(
mysqli_query($conn,
"SELECT * FROM bantuan
WHERE cs_id='$cs_id'")
);
/* PROSES */
$proses = mysqli_num_rows(
mysqli_query($conn,
"SELECT * FROM bantuan
WHERE cs_id='$cs_id'
AND status='proses'")
);
/* SELESAI */
$selesai = mysqli_num_rows(
mysqli_query($conn,
"SELECT * FROM bantuan
WHERE cs_id='$cs_id'
AND status='selesai'")
);
$persentase = 0;
if($total > 0){
$persentase = round(($selesai / $total) * 100);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Dashboard CS</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
</head>
<body class="bg-slate-100 min-h-screen">
<!-- NAVBAR -->
<nav class="bg-slate-800 text-white shadow">
<div class="max-w-7xl mx-auto px-4 py-4 flex flex-col md:flex-row justify-between items-center gap-3">
<h2 class="font-bold text-xl">
Dashboard CS
</h2>
<div class="flex flex-col sm:flex-row items-center gap-3">
<span>
Halo,
<?= htmlspecialchars($_SESSION['nama']) ?>
</span>
<a href="../logout.php" onclick="return confirm('Logout sekarang?')"
class="bg-red-500 hover:bg-red-600 px-4 py-2 rounded-lg transition">
Logout
</a>
</div>
</div>
</nav>
<!-- CONTENT -->
<div class="max-w-7xl mx-auto p-6">
<!-- HERO -->
<div class="bg-gradient-to-r from-emerald-600 to-teal-600 text-white rounded-3xl p-8 shadow-lg">
<h1 class="text-3xl font-bold">
Selamat Datang 👋
<?= htmlspecialchars($_SESSION['nama']) ?>
</h1>
<p class="mt-3 text-emerald-100">
Kelola tugas bantuan sosial yang telah diberikan oleh admin.
</p>
<div class="flex flex-col sm:flex-row gap-3 mt-6">
<a href="tugas.php"
class="bg-white text-emerald-600 font-semibold px-6 py-3 rounded-xl shadow hover:shadow-lg transition">
<i class="fa-solid fa-list-check mr-2"></i>
Lihat Tugas
</a>
</div>
</div>
<!-- CARDS -->
<div class="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-6 mt-8">
<!-- Total -->
<div class="bg-white rounded-2xl shadow p-6">
<i class="fa-solid fa-list text-4xl text-emerald-600"></i>
<p class="text-slate-500 mt-3">
Total Tugas
</p>
<h2 class="text-4xl font-bold">
<?= $total ?>
</h2>
</div>
<!-- Diproses -->
<div class="bg-white rounded-2xl shadow p-6">
<i class="fa-solid fa-spinner animate-spin text-4xl text-blue-500"></i>
<p class="text-slate-500 mt-3">
Diproses
</p>
<h2 class="text-4xl font-bold">
<?= $proses ?>
</h2>
</div>
<!-- Selesai -->
<div class="bg-white rounded-2xl shadow p-6">
<i class="fa-solid fa-circle-check text-4xl text-green-500"></i>
<p class="text-slate-500 mt-3">
Selesai
</p>
<h2 class="text-4xl font-bold">
<?= $selesai ?>
</h2>
</div>
</div>
<div class="bg-white rounded-2xl shadow p-6 mt-8">
<h3 class="font-semibold text-slate-700">
Progress Penyelesaian Bantuan
</h3>
<div class="w-full bg-slate-200 rounded-full h-4 mt-4">
<div class="bg-green-500 h-4 rounded-full" style="width: <?= $persentase ?>%">
</div>
</div>
<p class="mt-3 text-slate-500">
<?= $persentase ?>% tugas bantuan telah selesai disalurkan
</p>
</div>
</div>
</body>
</html>
+106
View File
@@ -0,0 +1,106 @@
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: #f8fafc;
font-family: 'Segoe UI', sans-serif;
}
.content {
padding: 30px;
}
/* CARD */
.card {
background: white;
border-radius: 16px;
padding: 25px;
box-shadow:
0 4px 20px rgba(0, 0, 0, .08);
transition: .3s;
}
.card:hover {
transform: translateY(-5px);
}
/* TABLE */
table {
width: 100%;
border-collapse: collapse;
background: white;
border-radius: 15px;
overflow: hidden;
box-shadow:
0 4px 20px rgba(0, 0, 0, .08);
}
th {
background: #2563eb;
color: white;
}
th,
td {
padding: 14px;
border-bottom: 1px solid #eee;
}
/* BUTTON */
.btn {
padding: 10px 16px;
border-radius: 10px;
text-decoration: none;
color: white;
display: inline-block;
}
.approve {
background: #16a34a;
}
.reject {
background: #dc2626;
}
.delete {
background: #64748b;
}
.warning {
background: #f59e0b;
}
/* INPUT */
input,
select,
textarea {
width: 100%;
padding: 12px;
border: 1px solid #ddd;
border-radius: 10px;
margin-top: 8px;
}
/* BOX */
.box {
background: white;
padding: 25px;
border-radius: 20px;
box-shadow:
0 4px 20px rgba(0, 0, 0, .08);
}
</style>
+158
View File
@@ -0,0 +1,158 @@
<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', 1);
include '../config/koneksi.php';
if(!isset($_SESSION['role'])){
header("Location: ../index.php");
exit;
}
if($_SESSION['role'] != 'cs'){
header("Location: ../index.php");
exit;
}
$user_id = $_SESSION['id'];
$cs_query = mysqli_query(
$conn,
"SELECT * FROM cs_rumah_ibadah
WHERE user_id='$user_id'"
);
if(!$cs_query){
die(mysqli_error($conn));
}
$cs = mysqli_fetch_assoc($cs_query);
if(!$cs){
die("Data CS tidak ditemukan");
}
$cs_id = $cs['id'];
if(!isset($_POST['id'])){
die("ID bantuan tidak ditemukan");
}
$id = intval($_POST['id']);
if(
!isset($_FILES['foto']) ||
$_FILES['foto']['error'] != 0
){
die("Silakan pilih foto");
}
$tmp = $_FILES['foto']['tmp_name'];
$nama_asli = $_FILES['foto']['name'];
$ext = strtolower(
pathinfo(
$nama_asli,
PATHINFO_EXTENSION
)
);
$allowed = [
'jpg',
'jpeg',
'png',
'webp'
];
if(!in_array($ext,$allowed)){
die("Format file tidak didukung");
}
if(getimagesize($tmp) === false){
die("File harus berupa gambar");
}
$foto =
time() . '_' .
preg_replace(
'/[^a-zA-Z0-9._-]/',
'',
basename($nama_asli)
);
$cek_query = mysqli_query(
$conn,
"SELECT *
FROM bantuan
WHERE id='$id'
AND cs_id='$cs_id'"
);
if(!$cek_query){
die(mysqli_error($conn));
}
$cek = mysqli_fetch_assoc($cek_query);
if(!$cek){
die("Akses ditolak");
}
if(!is_dir("../assets/uploads")){
mkdir("../assets/uploads",0777,true);
}
if(
!move_uploaded_file(
$tmp,
"../assets/uploads/".$foto
)
){
die("Upload foto gagal");
}
$update = mysqli_query(
$conn,
"UPDATE bantuan
SET
bukti_foto='$foto',
status='selesai'
WHERE id='$id'"
);
if(!$update){
die(mysqli_error($conn));
}
$data_query = mysqli_query(
$conn,
"SELECT laporan_id
FROM bantuan
WHERE id='$id'"
);
if(!$data_query){
die(mysqli_error($conn));
}
$data = mysqli_fetch_assoc($data_query);
if(!$data){
die("Data bantuan tidak ditemukan");
}
$laporan_id = $data['laporan_id'];
mysqli_query(
$conn,
"UPDATE laporan
SET status='selesai'
WHERE id='$laporan_id'"
);
header("Location: tugas.php");
exit;
?>
+249
View File
@@ -0,0 +1,249 @@
<?php
session_start();
if(!isset($_SESSION['role'])){
header("Location: ../index.php");
exit;
}
if($_SESSION['role'] != 'cs'){
header("Location: ../index.php");
exit;
}
include '../config/koneksi.php';
$user_id = $_SESSION['id'];
$cs = mysqli_fetch_assoc(
mysqli_query($conn,
"SELECT * FROM cs_rumah_ibadah
WHERE user_id='$user_id'")
);
$cs_id = $cs['id'];
$data = mysqli_query($conn,
"SELECT bantuan.*,
laporan.nama_warga,
laporan.alamat,
laporan.latitude,
laporan.longitude
FROM bantuan
JOIN laporan
ON bantuan.laporan_id = laporan.id
WHERE bantuan.cs_id='$cs_id'
ORDER BY bantuan.id DESC"
);
?>
<!DOCTYPE html>
<html>
<head>
<title>Tugas Bantuan</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-slate-100 min-h-screen">
<div class="max-w-7xl mx-auto p-6">
<!-- HEADER -->
<div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4 mb-6">
<div>
<h1 class="text-3xl font-bold text-slate-800">
Tugas Bantuan Saya
</h1>
<p class="text-slate-500 mt-2">
Daftar bantuan sosial yang harus disalurkan.
</p>
</div>
<a href="dashboard.php"
class="bg-slate-800 hover:bg-slate-900 text-white px-5 py-3 rounded-xl shadow transition">
← Dashboard
</a>
</div>
<!-- CARD -->
<div class="bg-white rounded-3xl shadow-lg overflow-hidden">
<div class="overflow-x-auto">
<table class="min-w-full">
<thead>
<tr class="bg-emerald-600 text-white">
<th class="px-4 py-4 text-left">No</th>
<th class="px-4 py-4 text-left">Nama Warga</th>
<th class="px-4 py-4 text-left">Alamat</th>
<th class="px-4 py-4 text-left">Lokasi</th>
<th class="px-4 py-4 text-left">Jenis Bantuan</th>
<th class="px-4 py-4 text-left">Status</th>
<th class="px-4 py-4 text-left">Aksi</th>
</tr>
</thead>
<tbody>
<?php
$no = 1;
if(mysqli_num_rows($data) == 0){
?>
<tr>
<td colspan="7" class="text-center py-10 text-slate-500">
Belum ada tugas bantuan
</td>
</tr>
<?php
}
while($row = mysqli_fetch_assoc($data)){
?>
<tr class="border-b hover:bg-slate-50 transition">
<td class="px-4 py-4">
<?= $no++ ?>
</td>
<td class="px-4 py-4 font-medium text-slate-800">
<?= htmlspecialchars($row['nama_warga']) ?>
</td>
<td class="px-4 py-4 text-slate-600">
<?= htmlspecialchars($row['alamat']) ?>
</td>
<td class="px-4 py-4">
<a target="_blank"
href="https://www.google.com/maps?q=<?= $row['latitude'] ?>,<?= $row['longitude'] ?>"
class="text-blue-600 hover:underline font-medium">
Lihat Lokasi
</a>
</td>
<td class="px-4 py-4">
<?= htmlspecialchars($row['jenis_bantuan']) ?>
</td>
<td class="px-4 py-4">
<?php if($row['status']=='proses'){ ?>
<span class="
bg-amber-500
text-white
px-3 py-1
rounded-full
text-sm">
Diproses
</span>
<?php } ?>
<?php if($row['status']=='selesai'){ ?>
<span class="
bg-green-600
text-white
px-3 py-1
rounded-full
text-sm">
Selesai
</span>
<?php } ?>
</td>
<td class="px-4 py-4">
<?php if($row['status']=='proses'){ ?>
<a href="upload_bukti.php?id=<?= $row['id'] ?>" class="
bg-emerald-600
hover:bg-emerald-700
text-white
px-4 py-2
rounded-lg
shadow
transition">
Upload Bukti
</a>
<?php } else { ?>
<span class="text-green-600 font-semibold">
✓ Selesai
</span>
<?php } ?>
</td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
+209
View File
@@ -0,0 +1,209 @@
<?php
session_start();
if(!isset($_SESSION['role'])){
header("Location: ../index.php");
exit;
}
if($_SESSION['role'] != 'cs'){
header("Location: ../index.php");
exit;
}
include '../config/koneksi.php';
$user_id = $_SESSION['id'];
$cs = mysqli_fetch_assoc(
mysqli_query(
$conn,
"SELECT * FROM cs_rumah_ibadah
WHERE user_id='$user_id'"
)
);
if(!$cs){
die("Data CS tidak ditemukan");
}
$cs_id = $cs['id'];
$id = intval($_GET['id']);
$data = mysqli_fetch_assoc(
mysqli_query($conn,
"SELECT bantuan.*,
laporan.nama_warga,
laporan.alamat
FROM bantuan
JOIN laporan
ON bantuan.laporan_id = laporan.id
WHERE bantuan.id='$id'
AND bantuan.cs_id='$cs_id'")
);
if(!$data){
die("Tugas tidak ditemukan");
}
?>
<!DOCTYPE html>
<!DOCTYPE html>
<html>
<head>
<title>Upload Bukti Bantuan</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
</head>
<body class="bg-gray-100 min-h-screen">
<div class="max-w-4xl mx-auto p-6">
<a href="tugas.php"
class="inline-flex items-center gap-2 px-4 py-2 bg-gray-700 hover:bg-gray-800 text-white rounded-xl mb-6 transition">
<i class="fas fa-arrow-left"></i>
Kembali
</a>
<div class="bg-white rounded-2xl shadow-lg overflow-hidden">
<div class="bg-green-600 text-white p-6">
<h1 class="text-2xl font-bold flex items-center gap-3">
<i class="fas fa-camera"></i>
Upload Bukti Bantuan
</h1>
<p class="mt-2 text-green-100">
Upload dokumentasi penyaluran bantuan kepada warga.
</p>
</div>
<div class="p-6">
<div class="grid md:grid-cols-2 gap-5 mb-6">
<div class="bg-gray-50 rounded-xl p-4">
<p class="text-gray-500 text-sm">
Nama Warga
</p>
<h3 class="font-semibold text-lg mt-1">
<?= htmlspecialchars($data['nama_warga']) ?>
</h3>
</div>
<div class="bg-gray-50 rounded-xl p-4">
<p class="text-gray-500 text-sm">
Alamat
</p>
<h3 class="font-medium mt-1">
<?= htmlspecialchars($data['alamat']) ?>
</h3>
</div>
</div>
<form action="proses_upload.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="id" value="<?= $data['id'] ?>">
<div class="mb-5">
<label class="block text-sm font-medium text-gray-700 mb-2">
Foto Bukti Bantuan
</label>
<input type="file" id="foto" name="foto" accept="image/*" required
class="w-full border rounded-xl p-3">
</div>
<div class="mb-6">
<img id="preview" class="hidden w-full max-w-md h-64 object-cover rounded-xl border shadow">
</div>
<button type="submit"
class="px-6 py-3 bg-green-600 hover:bg-green-700 text-white rounded-xl shadow transition">
<i class="fas fa-upload mr-2"></i>
Upload Bukti
</button>
</form>
</div>
</div>
</div>
<script>
document
.getElementById('foto')
.addEventListener('change', function(e) {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function(ev) {
const preview =
document.getElementById('preview');
preview.src = ev.target.result;
preview.classList.remove('hidden');
};
reader.readAsDataURL(file);
});
</script>
</body>
</html>