Compare commits
13 Commits
main
...
7bf7787c6f
| Author | SHA1 | Date | |
|---|---|---|---|
| 7bf7787c6f | |||
| 564869b110 | |||
| 1579da0dbb | |||
| 858435acfe | |||
| 3b10745f49 | |||
| 8269494306 | |||
| cfa09f6837 | |||
| 19cc3244de | |||
| 51451824ba | |||
| 2d2d3604e0 | |||
| f44ca2bd62 | |||
| b337288d01 | |||
| 05dd3f2a67 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -13,6 +13,7 @@ Thumbs.db
|
||||
# Dependencies (if any in future)
|
||||
node_modules/
|
||||
vendor/
|
||||
!plugins/vendor/
|
||||
|
||||
# Uploads
|
||||
foto/
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
<?php
|
||||
$selected_id = isset($_GET['selected_id']) ? (int)$_GET['selected_id'] : 0;
|
||||
?>
|
||||
<div class="card card-primary">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">
|
||||
@@ -6,37 +9,40 @@
|
||||
<form action="" method="post" enctype="multipart/form-data">
|
||||
<div class="card-body">
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">NIK</label>
|
||||
<div class="col-sm-6">
|
||||
<input type="text" class="form-control" id="nik" name="nik" placeholder="NIK" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Nama</label>
|
||||
<div class="col-sm-6">
|
||||
<input type="text" class="form-control" id="nama_datang" name="nama_datang" placeholder="Nama Pendatang" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Jenis Kelain</label>
|
||||
<div class="col-sm-3">
|
||||
<select name="jekel" id="jekel" class="form-control">
|
||||
<option>- Pilih -</option>
|
||||
<option>LK</option>
|
||||
<option>PR</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Tgl Datang</label>
|
||||
<div class="col-sm-3">
|
||||
<input type="date" class="form-control" id="tgl_datang" name="tgl_datang" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Pendatang</label>
|
||||
<div class="col-sm-6">
|
||||
<select name="id_pend" id="id_pend" class="form-control select2bs4" required>
|
||||
<option value="" <?php echo ($selected_id == 0) ? 'selected="selected"' : ''; ?>>- Pilih Penduduk -</option>
|
||||
<?php
|
||||
// ambil data dari database
|
||||
$query = "select * from tb_pdd where status='Ada'";
|
||||
$hasil = mysqli_query($koneksi, $query);
|
||||
while ($row = mysqli_fetch_array($hasil)) {
|
||||
?>
|
||||
<option value="<?php echo $row['id_pend'] ?>" <?php echo ($row['id_pend'] == $selected_id) ? 'selected="selected"' : ''; ?>>
|
||||
<?php echo $row['nik'] ?>
|
||||
-
|
||||
<?php echo $row['nama'] ?>
|
||||
</option>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<a href="?page=add-pend&return_to=add-datang" class="btn btn-outline-primary btn-sm">
|
||||
<i class="fa fa-plus"></i> Tambah Penduduk Baru
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Tgl Datang</label>
|
||||
<div class="col-sm-3">
|
||||
<input type="date" class="form-control" id="tgl_datang" name="tgl_datang" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Pelapor</label>
|
||||
@@ -50,9 +56,9 @@
|
||||
while ($row = mysqli_fetch_array($hasil)) {
|
||||
?>
|
||||
<option value="<?php echo $row['id_pend'] ?>">
|
||||
<?php echo $row['nik'] ?>
|
||||
<?php echo htmlspecialchars($row['nik'], ENT_QUOTES); ?>
|
||||
-
|
||||
<?php echo $row['nama'] ?>
|
||||
<?php echo htmlspecialchars($row['nama'], ENT_QUOTES); ?>
|
||||
</option>
|
||||
<?php
|
||||
}
|
||||
@@ -71,51 +77,51 @@
|
||||
|
||||
<?php
|
||||
|
||||
if (isset ($_POST['Simpan'])){
|
||||
//mulai proses simpan data
|
||||
$sql_simpan = "INSERT INTO tb_datang (nik, nama_datang, jekel, tgl_datang, pelapor) VALUES (
|
||||
'".$_POST['nik']."',
|
||||
'".$_POST['nama_datang']."',
|
||||
'".$_POST['jekel']."',
|
||||
'".$_POST['tgl_datang']."',
|
||||
'".$_POST['pelapor']."')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
|
||||
// Otomatis tambah ke Data Penduduk
|
||||
// Ambil data alamat dari pelapor
|
||||
$id_pelapor = $_POST['pelapor'];
|
||||
$sql_pelapor = "SELECT desa, rt, rw FROM tb_pdd WHERE id_pend='$id_pelapor'";
|
||||
$q_pelapor = mysqli_query($koneksi, $sql_pelapor);
|
||||
$d_pelapor = mysqli_fetch_array($q_pelapor);
|
||||
$desa = $d_pelapor['desa'];
|
||||
$rt = $d_pelapor['rt'];
|
||||
$rw = $d_pelapor['rw'];
|
||||
|
||||
$sql_pdd = "INSERT INTO tb_pdd (nik, nama, tempat_lh, tgl_lh, jekel, desa, rt, rw, agama, kawin, pekerjaan, status) VALUES (
|
||||
'".$_POST['nik']."',
|
||||
'".$_POST['nama_datang']."',
|
||||
'-',
|
||||
'0000-00-00',
|
||||
'".$_POST['jekel']."',
|
||||
'$desa', '$rt', '$rw',
|
||||
'-', '-', '-', 'Ada')";
|
||||
$query_pdd = mysqli_query($koneksi, $sql_pdd);
|
||||
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_simpan && $query_pdd) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=data-datang';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-datang';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
if (isset ($_POST['Simpan'])){
|
||||
//mulai proses simpan data
|
||||
|
||||
// Sanitize Input to prevent SQL Injection & Syntax Errors
|
||||
$id_pend = (int)$_POST['id_pend']; // Cast to integer for safety
|
||||
$tgl_datang = mysqli_real_escape_string($koneksi, trim($_POST['tgl_datang']));
|
||||
$pelapor = (int)$_POST['pelapor']; // Cast to integer for safety
|
||||
|
||||
// Ambil data penduduk yang dipilih
|
||||
$sql_pend = "SELECT nik, nama, jekel FROM tb_pdd WHERE id_pend='$id_pend'";
|
||||
$q_pend = mysqli_query($koneksi, $sql_pend);
|
||||
$d_pend = mysqli_fetch_array($q_pend);
|
||||
|
||||
if (!$d_pend) {
|
||||
die("Data penduduk tidak ditemukan. Silakan pilih penduduk yang valid.");
|
||||
}
|
||||
|
||||
$nik = mysqli_real_escape_string($koneksi, trim($d_pend['nik']));
|
||||
$nama_datang = mysqli_real_escape_string($koneksi, trim($d_pend['nama']));
|
||||
$jekel = mysqli_real_escape_string($koneksi, trim($d_pend['jekel']));
|
||||
|
||||
$sql_simpan = "INSERT INTO tb_datang (id_pend, nik, nama_datang, jekel, tgl_datang, pelapor) VALUES (
|
||||
'$id_pend',
|
||||
'$nik',
|
||||
'$nama_datang',
|
||||
'$jekel',
|
||||
'$tgl_datang',
|
||||
'$pelapor')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_simpan) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=data-datang';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-datang';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
//selesai proses simpan data
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<th>No</th>
|
||||
<th>NIK</th>
|
||||
<th>Nama</th>
|
||||
<th>Jekel</th>
|
||||
<th>Jenis Kelamin</th>
|
||||
<th>Tanggal</th>
|
||||
<th>Pelapor</th>
|
||||
<th>Aksi</th>
|
||||
@@ -43,7 +43,15 @@
|
||||
<?php echo $data['nama_datang']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['jekel']; ?>
|
||||
<?php
|
||||
if ($data['jekel'] == 'LK') {
|
||||
echo 'LAKI-LAKI';
|
||||
} elseif ($data['jekel'] == 'PR') {
|
||||
echo 'PEREMPUAN';
|
||||
} else {
|
||||
echo $data['jekel'];
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['tgl_datang']; ?>
|
||||
@@ -56,10 +64,10 @@
|
||||
class="btn btn-success btn-sm">
|
||||
<i class="fa fa-edit"></i>
|
||||
</a>
|
||||
<a href="?page=del-datang&kode=<?php echo $data['id_datang']; ?>" onclick="return confirm('Apakah anda yakin hapus data ini ?')"
|
||||
<a href="?page=del-datang&kode=<?php echo $data['id_datang']; ?>" onclick="confirmDelete(event)"
|
||||
title="Hapus" class="btn btn-danger btn-sm">
|
||||
<i class="fa fa-trash"></i>
|
||||
</>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -68,7 +76,26 @@
|
||||
?>
|
||||
</tbody>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
<script>
|
||||
function confirmDelete(event) {
|
||||
event.preventDefault();
|
||||
Swal.fire({
|
||||
title: 'Konfirmasi Hapus',
|
||||
text: 'Apakah Anda yakin ingin menghapus data ini?',
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#d33',
|
||||
cancelButtonColor: '#3085d6',
|
||||
confirmButtonText: 'Ya, Hapus',
|
||||
cancelButtonText: 'Batal'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
window.location.href = event.currentTarget.href;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -1,11 +1,14 @@
|
||||
<?php
|
||||
|
||||
if(isset($_GET['kode'])){
|
||||
$sql_cek = "SELECT d.id_datang, d.nik, d.nama_datang, d.jekel, d.tgl_datang, p.id_pend, p.nama from
|
||||
tb_datang d inner join tb_pdd p on d.pelapor=p.id_pend WHERE id_datang='".$_GET['kode']."'";
|
||||
$query_cek = mysqli_query($koneksi, $sql_cek);
|
||||
$data_cek = mysqli_fetch_array($query_cek,MYSQLI_BOTH);
|
||||
}
|
||||
if(isset($_GET['kode'])){
|
||||
$sql_cek = "SELECT d.id_datang, d.id_pend, d.nik, d.nama_datang, d.jekel, d.tgl_datang, p.id_pend as id_pelapor, p.nama as nama_pelapor, pd.tgl_lh
|
||||
FROM tb_datang d
|
||||
INNER JOIN tb_pdd p ON d.pelapor=p.id_pend
|
||||
LEFT JOIN tb_pdd pd ON d.id_pend=pd.id_pend
|
||||
WHERE d.id_datang='".$_GET['kode']."'";
|
||||
$query_cek = mysqli_query($koneksi, $sql_cek);
|
||||
$data_cek = mysqli_fetch_array($query_cek,MYSQLI_BOTH);
|
||||
}
|
||||
?>
|
||||
|
||||
<div class="card card-success">
|
||||
@@ -24,43 +27,51 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">NIK</label>
|
||||
<div class="col-sm-6">
|
||||
<input type="text" class="form-control" id="nik" name="nik" value="<?php echo $data_cek['nik']; ?>"
|
||||
required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Nama</label>
|
||||
<div class="col-sm-6">
|
||||
<input type="text" class="form-control" id="nama_datang" name="nama_datang" value="<?php echo $data_cek['nama_datang']; ?>"
|
||||
required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Jenis Kelamin</label>
|
||||
<input type="hidden" id="id_pend" name="id_pend" value="<?php echo isset($data_cek['id_pend']) ? $data_cek['id_pend'] : ''; ?>">
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">NIK</label>
|
||||
<div class="col-sm-6">
|
||||
<input type="text" class="form-control" value="<?php echo htmlspecialchars($data_cek['nik'], ENT_QUOTES); ?>" readonly>
|
||||
<input type="hidden" name="nik" value="<?php echo htmlspecialchars($data_cek['nik'], ENT_QUOTES); ?>">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Nama</label>
|
||||
<div class="col-sm-6">
|
||||
<input type="text" class="form-control" value="<?php echo htmlspecialchars($data_cek['nama_datang'], ENT_QUOTES); ?>" readonly>
|
||||
<input type="hidden" name="nama_datang" value="<?php echo htmlspecialchars($data_cek['nama_datang'], ENT_QUOTES); ?>">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Jenis Kelamin</label>
|
||||
<div class="col-sm-3">
|
||||
<input type="text" class="form-control" value="<?php
|
||||
$display_jekel = $data_cek['jekel'];
|
||||
if ($display_jekel == 'LK') {
|
||||
$display_jekel = 'LAKI-LAKI';
|
||||
} elseif ($display_jekel == 'PR') {
|
||||
$display_jekel = 'PEREMPUAN';
|
||||
}
|
||||
echo htmlspecialchars($display_jekel, ENT_QUOTES);
|
||||
?>" readonly>
|
||||
<input type="hidden" name="jekel" value="<?php echo htmlspecialchars($data_cek['jekel'], ENT_QUOTES); ?>">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Tgl Lahir</label>
|
||||
<div class="col-sm-3">
|
||||
<input type="text" class="form-control" value="<?php echo htmlspecialchars(isset($data_cek['tgl_lh']) ? $data_cek['tgl_lh'] : '-', ENT_QUOTES); ?>" readonly>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Tgl Datang</label>
|
||||
<div class="col-sm-3">
|
||||
<select name="jekel" id="jekel" class="form-control">
|
||||
<option value="">-- Pilih jekel --</option>
|
||||
<?php
|
||||
//menhecek data yg dipilih sebelumnya
|
||||
if ($data_cek['jekel'] == "LK") echo "<option value='LK' selected>LK</option>";
|
||||
else echo "<option value='LK'>LK</option>";
|
||||
|
||||
if ($data_cek['jekel'] == "PR") echo "<option value='PR' selected>PR</option>";
|
||||
else echo "<option value='PR'>PR</option>";
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Tgl Datang</label>
|
||||
<div class="col-sm-3">
|
||||
<input type="date" class="form-control" id="tgl_datang" name="tgl_datang" value="<?php echo $data_cek['tgl_datang']; ?>"
|
||||
<input type="date" class="form-control" id="tgl_datang" name="tgl_datang" value="<?php echo htmlspecialchars($data_cek['tgl_datang'], ENT_QUOTES); ?>"
|
||||
required>
|
||||
</div>
|
||||
</div>
|
||||
@@ -72,15 +83,14 @@
|
||||
<option selected="">- Pilih -</option>
|
||||
<?php
|
||||
// ambil data dari database
|
||||
$query = "select * from tb_pdd";
|
||||
$query = "select * from tb_pdd where status='Ada'";
|
||||
$hasil = mysqli_query($koneksi, $query);
|
||||
while ($row = mysqli_fetch_array($hasil)) {
|
||||
?>
|
||||
<option value="<?php echo $row['id_pend'] ?>" <?=$data_cek[
|
||||
'id_pend']==$row[ 'id_pend'] ? "selected" : null ?>>
|
||||
<?php echo $row['nik'] ?>
|
||||
<option value="<?php echo $row['id_pend'] ?>" <?=$data_cek['id_pelapor']==$row['id_pend'] ? "selected" : null ?>>
|
||||
<?php echo htmlspecialchars($row['nik'], ENT_QUOTES); ?>
|
||||
-
|
||||
<?php echo $row['nama'] ?>
|
||||
<?php echo htmlspecialchars($row['nama'], ENT_QUOTES); ?>
|
||||
</option>
|
||||
<?php
|
||||
}
|
||||
@@ -98,31 +108,44 @@
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
|
||||
if (isset ($_POST['Ubah'])){
|
||||
$sql_ubah = "UPDATE tb_datang SET
|
||||
nik='".$_POST['nik']."',
|
||||
nama_datang='".$_POST['nama_datang']."',
|
||||
jekel='".$_POST['jekel']."',
|
||||
tgl_datang='".$_POST['tgl_datang']."',
|
||||
pelapor='".$_POST['pelapor']."'
|
||||
WHERE id_datang='".$_POST['id_datang']."'";
|
||||
$query_ubah = mysqli_query($koneksi, $sql_ubah);
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_ubah) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Ubah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value)
|
||||
{window.location = 'index.php?page=data-datang';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Ubah Data Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value)
|
||||
{window.location = 'index.php?page=data-datang';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
<?php
|
||||
|
||||
if (isset ($_POST['Ubah'])){
|
||||
// Sanitize Input to prevent SQL Injection & Syntax Errors
|
||||
$id_datang = (int)$_POST['id_datang'];
|
||||
$nik = mysqli_real_escape_string($koneksi, trim($_POST['nik']));
|
||||
$nama_datang = mysqli_real_escape_string($koneksi, trim($_POST['nama_datang']));
|
||||
$jekel = mysqli_real_escape_string($koneksi, trim($_POST['jekel']));
|
||||
|
||||
$tgl_datang = mysqli_real_escape_string($koneksi, trim($_POST['tgl_datang']));
|
||||
$pelapor = (int)$_POST['pelapor'];
|
||||
|
||||
// Update tb_datang table
|
||||
$sql_ubah = "UPDATE tb_datang SET
|
||||
nik='$nik',
|
||||
nama_datang='$nama_datang',
|
||||
jekel='$jekel',
|
||||
tgl_datang='$tgl_datang',
|
||||
pelapor='$pelapor'
|
||||
WHERE id_datang='$id_datang'";
|
||||
$query_ubah = mysqli_query($koneksi, $sql_ubah);
|
||||
|
||||
|
||||
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_ubah) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Ubah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value)
|
||||
{window.location = 'index.php?page=data-datang';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Ubah Data Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value)
|
||||
{window.location = 'index.php?page=data-datang';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Kpl Keluarga</label>
|
||||
<label class="col-sm-2 col-form-label">Kepala Keluarga</label>
|
||||
<div class="col-sm-6">
|
||||
<input type="text" class="form-control" id="kepala" name="kepala" placeholder="Kpl Keluarga" required>
|
||||
<input type="text" class="form-control" id="kepala" name="kepala" placeholder="Kepala Keluarga" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -46,10 +46,10 @@
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">RT/RW</label>
|
||||
<div class="col-sm-3">
|
||||
<input type="text" class="form-control" id="rt" name="rt" placeholder="RT" required>
|
||||
<input type="text" class="form-control" id="rt" name="rt" placeholder="RT" value="000" required>
|
||||
</div>
|
||||
<div class="col-sm-3">
|
||||
<input type="text" class="form-control" id="rw" name="rw" placeholder="RW" required>
|
||||
<input type="text" class="form-control" id="rw" name="rw" placeholder="RW" value="000" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -238,27 +238,28 @@ window.addEventListener('load', function() {
|
||||
}
|
||||
|
||||
//mulai proses simpan data
|
||||
$no_kk = $_POST['no_kk'];
|
||||
$cek_kk = mysqli_query($koneksi, "SELECT * FROM tb_kk WHERE no_kk='$no_kk'");
|
||||
if(mysqli_num_rows($cek_kk) > 0){
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Gagal',text: 'No KK sudah terdaftar dalam sistem!',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-kartu';
|
||||
}
|
||||
})</script>";
|
||||
return;
|
||||
}
|
||||
|
||||
// Sanitize Inputs
|
||||
$no_kk = mysqli_real_escape_string($koneksi, $_POST['no_kk']);
|
||||
$kepala = mysqli_real_escape_string($koneksi, $_POST['kepala']);
|
||||
$desa = mysqli_real_escape_string($koneksi, $_POST['desa']);
|
||||
$rt = mysqli_real_escape_string($koneksi, $_POST['rt']);
|
||||
$rw = mysqli_real_escape_string($koneksi, $_POST['rw']);
|
||||
$kec = mysqli_real_escape_string($koneksi, $_POST['kec']);
|
||||
$kab = mysqli_real_escape_string($koneksi, $_POST['kab']);
|
||||
$prov = mysqli_real_escape_string($koneksi, $_POST['prov']);
|
||||
$no_kk_raw = trim($_POST['no_kk']);
|
||||
$no_kk_clean = mysqli_real_escape_string($koneksi, $no_kk_raw);
|
||||
$cek_kk = mysqli_query($koneksi, "SELECT * FROM tb_kk WHERE no_kk='$no_kk_clean'");
|
||||
if(mysqli_num_rows($cek_kk) > 0){
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Gagal',text: 'No KK sudah terdaftar dalam sistem!',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-kartu';
|
||||
}
|
||||
})</script>";
|
||||
return;
|
||||
}
|
||||
|
||||
// Sanitize Inputs
|
||||
$no_kk = $no_kk_clean;
|
||||
$kepala = mysqli_real_escape_string($koneksi, trim($_POST['kepala']));
|
||||
$desa = mysqli_real_escape_string($koneksi, trim($_POST['desa']));
|
||||
$rt = mysqli_real_escape_string($koneksi, trim($_POST['rt']));
|
||||
$rw = mysqli_real_escape_string($koneksi, trim($_POST['rw']));
|
||||
$kec = mysqli_real_escape_string($koneksi, trim($_POST['kec']));
|
||||
$kab = mysqli_real_escape_string($koneksi, trim($_POST['kab']));
|
||||
$prov = mysqli_real_escape_string($koneksi, trim($_POST['prov']));
|
||||
|
||||
$sql_simpan = "INSERT INTO tb_kk (no_kk, kepala, desa, rt, rw, kec, kab, prov, foto_kk) VALUES (
|
||||
'$no_kk',
|
||||
@@ -272,43 +273,67 @@ window.addEventListener('load', function() {
|
||||
'$nama_file')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
|
||||
// Process Auto-Linking Members
|
||||
$linked_count = 0;
|
||||
$failed_count = 0;
|
||||
|
||||
if ($query_simpan && !empty($_POST['anggota_json'])) {
|
||||
$id_kk_baru = mysqli_insert_id($koneksi);
|
||||
$anggota_list = json_decode($_POST['anggota_json'], true);
|
||||
|
||||
if (is_array($anggota_list)) {
|
||||
foreach ($anggota_list as $mem) {
|
||||
$nik_mem = mysqli_real_escape_string($koneksi, $mem['nik']);
|
||||
$hub_mem = mysqli_real_escape_string($koneksi, $mem['hubungan']);
|
||||
|
||||
// Search Resident by NIK
|
||||
$sql_cek_pend = "SELECT id_pend FROM tb_pdd WHERE nik='$nik_mem'";
|
||||
$q_cek_pend = mysqli_query($koneksi, $sql_cek_pend);
|
||||
if ($row_pend = mysqli_fetch_assoc($q_cek_pend)) {
|
||||
$id_pend_found = $row_pend['id_pend'];
|
||||
|
||||
// Insert into tb_anggota
|
||||
$sql_add_ang = "INSERT INTO tb_anggota (id_kk, id_pend, hubungan) VALUES ('$id_kk_baru', '$id_pend_found', '$hub_mem')";
|
||||
mysqli_query($koneksi, $sql_add_ang);
|
||||
$linked_count++;
|
||||
} else {
|
||||
$failed_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Process Auto-Linking Members
|
||||
$linked_count = 0;
|
||||
$failed_count = 0;
|
||||
$failed_members = []; // Store failed members for detailed feedback
|
||||
|
||||
if ($query_simpan && !empty($_POST['anggota_json'])) {
|
||||
$id_kk_baru = mysqli_insert_id($koneksi);
|
||||
$anggota_list = json_decode($_POST['anggota_json'], true);
|
||||
|
||||
if (is_array($anggota_list)) {
|
||||
foreach ($anggota_list as $mem) {
|
||||
$nik_mem = mysqli_real_escape_string($koneksi, $mem['nik']);
|
||||
$nama_mem = isset($mem['nama']) ? mysqli_real_escape_string($koneksi, $mem['nama']) : '';
|
||||
$hub_mem = mysqli_real_escape_string($koneksi, $mem['hubungan']);
|
||||
|
||||
// Search Resident by NIK
|
||||
$sql_cek_pend = "SELECT id_pend FROM tb_pdd WHERE nik='$nik_mem'";
|
||||
$q_cek_pend = mysqli_query($koneksi, $sql_cek_pend);
|
||||
if ($row_pend = mysqli_fetch_assoc($q_cek_pend)) {
|
||||
$id_pend_found = $row_pend['id_pend'];
|
||||
|
||||
// Insert into tb_anggota
|
||||
$sql_add_ang = "INSERT INTO tb_anggota (id_kk, id_pend, hubungan) VALUES ('$id_kk_baru', '$id_pend_found', '$hub_mem')";
|
||||
mysqli_query($koneksi, $sql_add_ang);
|
||||
$linked_count++;
|
||||
} else {
|
||||
$failed_count++;
|
||||
$failed_members[] = ['nik' => $nik_mem, 'nama' => $nama_mem, 'hubungan' => $hub_mem];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_simpan) {
|
||||
$msg_add = "";
|
||||
if($linked_count > 0 || $failed_count > 0) {
|
||||
$msg_add = "<br>Anggota Terhubung: <b>$linked_count</b><br>Tidak Ditemukan: <b>$failed_count</b>";
|
||||
}
|
||||
if ($query_simpan) {
|
||||
$msg_add = "";
|
||||
if($linked_count > 0 || $failed_count > 0) {
|
||||
$msg_add = "<br>Anggota Terhubung: <b>$linked_count</b><br>Tidak Ditemukan: <b>$failed_count</b>";
|
||||
// Add detailed failed members list if any
|
||||
if (!empty($failed_members)) {
|
||||
$msg_add .= "<br><br><b>Detail Anggota Tidak Ditemukan:</b><br>";
|
||||
$msg_add .= "<div style='max-height: 150px; overflow-y: auto; background: #f8f9fa; border: 1px solid #ddd; padding: 5px; font-size: 0.9rem;'>";
|
||||
foreach ($failed_members as $fm) {
|
||||
$url_params = http_build_query([
|
||||
'nik' => $fm['nik'],
|
||||
'nama' => $fm['nama'],
|
||||
'desa' => $desa,
|
||||
'rt' => $rt,
|
||||
'rw' => $rw,
|
||||
'kecamatan' => $kec,
|
||||
'kabupaten' => $kab,
|
||||
'provinsi' => $prov
|
||||
]);
|
||||
$add_link = "<a href='index.php?page=add-pend&$url_params' class='btn btn-xs btn-outline-primary ml-2'>Tambah</a>";
|
||||
$msg_add .= "• <b>" . htmlspecialchars($fm['nik']) . "</b> - " . htmlspecialchars($fm['nama']) . " (" . htmlspecialchars($fm['hubungan']) . ") $add_link<br>";
|
||||
}
|
||||
$msg_add .= "</div>";
|
||||
$msg_add .= "<small class='text-muted'>Tambahkan data penduduk yang belum terdaftar melalui menu <a href='index.php?page=add-pend'>Tambah Penduduk</a>.</small>";
|
||||
}
|
||||
}
|
||||
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',html: 'Data KK disimpan.$msg_add',icon: 'success',confirmButtonText: 'OK'
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
<tr>
|
||||
<th>NIK</th>
|
||||
<th>Nama</th>
|
||||
<th>Jekel</th>
|
||||
<th>Jenis Kelamin</th>
|
||||
<th>Hub Keluarga</th>
|
||||
<th>Aksi</th>
|
||||
</tr>
|
||||
@@ -119,13 +119,21 @@
|
||||
<?php echo $data['nama']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['jekel']; ?>
|
||||
<?php
|
||||
if ($data['jekel'] == 'LK') {
|
||||
echo 'LAKI-LAKI';
|
||||
} elseif ($data['jekel'] == 'PR') {
|
||||
echo 'PEREMPUAN';
|
||||
} else {
|
||||
echo $data['jekel'];
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['hubungan']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<a href="?page=del-anggota&kode=<?php echo $data['id_anggota']; ?>" onclick="return confirm('Apakah anda yakin hapus data ini ?')"
|
||||
<a href="?page=del-anggota&kode=<?php echo $data['id_anggota']; ?>" onclick="confirmDelete(event)"
|
||||
title="Hapus" class="btn btn-danger btn-sm">
|
||||
<i class="fa fa-trash"></i>
|
||||
</a>
|
||||
@@ -135,11 +143,30 @@
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</tbody>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</tbody>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
function confirmDelete(event) {
|
||||
event.preventDefault();
|
||||
Swal.fire({
|
||||
title: 'Konfirmasi Hapus',
|
||||
text: 'Apakah Anda yakin ingin menghapus data ini?',
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#d33',
|
||||
cancelButtonColor: '#3085d6',
|
||||
confirmButtonText: 'Ya, Hapus',
|
||||
cancelButtonText: 'Batal'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
window.location.href = event.currentTarget.href;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<a href="?page=data-kartu" title="Kembali" class="btn btn-warning">Kembali</a>
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
<th>No</th>
|
||||
<th>NIK</th>
|
||||
<th>Nama</th>
|
||||
<th>Jekel</th>
|
||||
<th>Jenis Kelamin</th>
|
||||
<th>Hub Keluarga</th>
|
||||
<th>Status</th>
|
||||
</tr>
|
||||
@@ -85,7 +85,15 @@
|
||||
<?php echo $data['nama']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['jekel']; ?>
|
||||
<?php
|
||||
if ($data['jekel'] == 'LK') {
|
||||
echo 'LAKI-LAKI';
|
||||
} elseif ($data['jekel'] == 'PR') {
|
||||
echo 'PEREMPUAN';
|
||||
} else {
|
||||
echo $data['jekel'];
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['hubungan']; ?>
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Kpl Keluarga</label>
|
||||
<label class="col-sm-2 col-form-label">Kepala Keluarga</label>
|
||||
<div class="col-sm-6">
|
||||
<input type="text" class="form-control" id="kepala" name="kepala" value="<?php echo $data_cek['kepala']; ?>"
|
||||
required>
|
||||
|
||||
@@ -27,16 +27,16 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Jenis Kelain</label>
|
||||
<div class="col-sm-3">
|
||||
<select name="jekel" id="jekel" class="form-control">
|
||||
<option>- Pilih -</option>
|
||||
<option>LK</option>
|
||||
<option>PR</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Jenis Kelamin</label>
|
||||
<div class="col-sm-3">
|
||||
<select name="jekel" id="jekel" class="form-control">
|
||||
<option>- Pilih -</option>
|
||||
<option>LK</option>
|
||||
<option>PR</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Keluarga</label>
|
||||
@@ -69,62 +69,69 @@
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
|
||||
if (isset ($_POST['Simpan'])){
|
||||
//mulai proses simpan data
|
||||
$sql_simpan = "INSERT INTO tb_lahir (nama, tgl_lh, jekel, id_kk) VALUES (
|
||||
'".$_POST['nama']."',
|
||||
'".$_POST['tgl_lh']."',
|
||||
'".$_POST['jekel']."',
|
||||
'".$_POST['id_kk']."')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
|
||||
// Otomatis tambah ke Data Penduduk
|
||||
// Ambil data alamat dari KK
|
||||
$id_kk = $_POST['id_kk'];
|
||||
$sql_kk = "SELECT desa, rt, rw FROM tb_kk WHERE id_kk='$id_kk'";
|
||||
$q_kk = mysqli_query($koneksi, $sql_kk);
|
||||
$d_kk = mysqli_fetch_array($q_kk);
|
||||
$desa = $d_kk['desa'];
|
||||
$rt = $d_kk['rt'];
|
||||
$rw = $d_kk['rw'];
|
||||
|
||||
$sql_pdd = "INSERT INTO tb_pdd (nik, nama, tempat_lh, tgl_lh, jekel, desa, rt, rw, agama, kawin, pekerjaan, status) VALUES (
|
||||
'".$_POST['nik']."',
|
||||
'".$_POST['nama']."',
|
||||
'-',
|
||||
'".$_POST['tgl_lh']."',
|
||||
'".$_POST['jekel']."',
|
||||
'$desa', '$rt', '$rw',
|
||||
'-', 'Belum', 'Belum/Tidak Bekerja', 'Ada')";
|
||||
$query_pdd = mysqli_query($koneksi, $sql_pdd);
|
||||
|
||||
// Ambil ID Penduduk yang baru dibuat
|
||||
$id_pend_baru = mysqli_insert_id($koneksi);
|
||||
|
||||
// Masukkan ke Anggota KK
|
||||
$sql_anggota = "INSERT INTO tb_anggota (id_kk, id_pend, hubungan) VALUES (
|
||||
'$id_kk',
|
||||
'$id_pend_baru',
|
||||
'Anak')";
|
||||
$query_anggota = mysqli_query($koneksi, $sql_anggota);
|
||||
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_simpan && $query_pdd && $query_anggota) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=data-lahir';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-lahir';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
//selesai proses simpan data
|
||||
<?php
|
||||
|
||||
if (isset ($_POST['Simpan'])){
|
||||
//mulai proses simpan data
|
||||
|
||||
// Sanitize Input to prevent SQL Injection & Syntax Errors
|
||||
$nik = mysqli_real_escape_string($koneksi, trim($_POST['nik']));
|
||||
$nama = mysqli_real_escape_string($koneksi, trim($_POST['nama']));
|
||||
$tgl_lh = mysqli_real_escape_string($koneksi, trim($_POST['tgl_lh']));
|
||||
$jekel = mysqli_real_escape_string($koneksi, trim($_POST['jekel']));
|
||||
$id_kk = (int)$_POST['id_kk']; // Cast to integer for safety
|
||||
|
||||
$sql_simpan = "INSERT INTO tb_lahir (nama, tgl_lh, jekel, id_kk) VALUES (
|
||||
'$nama',
|
||||
'$tgl_lh',
|
||||
'$jekel',
|
||||
'$id_kk')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
|
||||
// Otomatis tambah ke Data Penduduk
|
||||
// Ambil data alamat dari KK
|
||||
$sql_kk = "SELECT desa, rt, rw FROM tb_kk WHERE id_kk='$id_kk'";
|
||||
$q_kk = mysqli_query($koneksi, $sql_kk);
|
||||
$d_kk = mysqli_fetch_array($q_kk);
|
||||
$desa = $d_kk['desa'];
|
||||
$rt = $d_kk['rt'];
|
||||
$rw = $d_kk['rw'];
|
||||
|
||||
$sql_pdd = "INSERT INTO tb_pdd (nik, nama, tempat_lh, tgl_lh, jekel, desa, rt, rw, agama, kawin, pekerjaan, status) VALUES (
|
||||
'$nik',
|
||||
'$nama',
|
||||
'-',
|
||||
'$tgl_lh',
|
||||
'$jekel',
|
||||
'$desa', '$rt', '$rw',
|
||||
'-', 'Belum', 'Belum/Tidak Bekerja', 'Ada')";
|
||||
$query_pdd = mysqli_query($koneksi, $sql_pdd);
|
||||
|
||||
// Ambil ID Penduduk yang baru dibuat
|
||||
$id_pend_baru = mysqli_insert_id($koneksi);
|
||||
|
||||
// Masukkan ke Anggota KK
|
||||
$sql_anggota = "INSERT INTO tb_anggota (id_kk, id_pend, hubungan) VALUES (
|
||||
'$id_kk',
|
||||
'$id_pend_baru',
|
||||
'Anak')";
|
||||
$query_anggota = mysqli_query($koneksi, $sql_anggota);
|
||||
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_simpan && $query_pdd && $query_anggota) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=data-lahir';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-lahir';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
//selesai proses simpan data
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<th>No</th>
|
||||
<th>Nama</th>
|
||||
<th>Tgl Lahir</th>
|
||||
<th>Jekel</th>
|
||||
<th>Jenis Kelamin</th>
|
||||
<th>Keluarga</th>
|
||||
<th>Aksi</th>
|
||||
</tr>
|
||||
@@ -42,7 +42,15 @@
|
||||
<?php echo $data['tgl_lh']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['jekel']; ?>
|
||||
<?php
|
||||
if ($data['jekel'] == 'LK') {
|
||||
echo 'LAKI-LAKI';
|
||||
} elseif ($data['jekel'] == 'PR') {
|
||||
echo 'PEREMPUAN';
|
||||
} else {
|
||||
echo $data['jekel'];
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['no_kk']; ?>-
|
||||
@@ -53,10 +61,10 @@
|
||||
class="btn btn-success btn-sm">
|
||||
<i class="fa fa-edit"></i>
|
||||
</a>
|
||||
<a href="?page=del-lahir&kode=<?php echo $data['id_lahir']; ?>" onclick="return confirm('Apakah anda yakin hapus data ini ?')"
|
||||
<a href="?page=del-lahir&kode=<?php echo $data['id_lahir']; ?>" onclick="confirmDelete(event)"
|
||||
title="Hapus" class="btn btn-danger btn-sm">
|
||||
<i class="fa fa-trash"></i>
|
||||
</>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -65,7 +73,26 @@
|
||||
?>
|
||||
</tbody>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
<script>
|
||||
function confirmDelete(event) {
|
||||
event.preventDefault();
|
||||
Swal.fire({
|
||||
title: 'Konfirmasi Hapus',
|
||||
text: 'Apakah Anda yakin ingin menghapus data ini?',
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#d33',
|
||||
cancelButtonColor: '#3085d6',
|
||||
confirmButtonText: 'Ya, Hapus',
|
||||
cancelButtonText: 'Batal'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
window.location.href = event.currentTarget.href;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -52,35 +52,41 @@
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
|
||||
if (isset ($_POST['Simpan'])){
|
||||
//mulai proses simpan data
|
||||
$sql_simpan = "INSERT INTO tb_mendu (id_pdd, tgl_mendu, sebab) VALUES (
|
||||
'".$_POST['id_pdd']."',
|
||||
'".$_POST['tgl_mendu']."',
|
||||
'".$_POST['sebab']."')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
|
||||
$sql_ubah = "UPDATE tb_pdd SET
|
||||
status='Meninggal'
|
||||
WHERE id_pend='".$_POST['id_pdd']."'";
|
||||
$query_ubah = mysqli_query($koneksi, $sql_ubah);
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_simpan && $query_ubah) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=data-mendu';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-mendu';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
//selesai proses simpan data
|
||||
<?php
|
||||
|
||||
if (isset ($_POST['Simpan'])){
|
||||
//mulai proses simpan data
|
||||
|
||||
// Sanitize Input to prevent SQL Injection & Syntax Errors
|
||||
$id_pdd = (int)$_POST['id_pdd']; // Cast to integer for safety
|
||||
$tgl_mendu = mysqli_real_escape_string($koneksi, trim($_POST['tgl_mendu']));
|
||||
$sebab = mysqli_real_escape_string($koneksi, trim($_POST['sebab']));
|
||||
|
||||
$sql_simpan = "INSERT INTO tb_mendu (id_pdd, tgl_mendu, sebab) VALUES (
|
||||
'$id_pdd',
|
||||
'$tgl_mendu',
|
||||
'$sebab')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
|
||||
$sql_ubah = "UPDATE tb_pdd SET
|
||||
status='Meninggal'
|
||||
WHERE id_pend='$id_pdd'";
|
||||
$query_ubah = mysqli_query($koneksi, $sql_ubah);
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_simpan && $query_ubah) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=data-mendu';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-mendu';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
//selesai proses simpan data
|
||||
|
||||
@@ -13,20 +13,21 @@
|
||||
<br>
|
||||
<table id="example1" class="table table-bordered table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>No</th>
|
||||
<th>NIK</th>
|
||||
<th>Nama</th>
|
||||
<th>Tanggal</th>
|
||||
<th>Sebab</th>
|
||||
<th>Aksi</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>No</th>
|
||||
<th>NIK</th>
|
||||
<th>Nama</th>
|
||||
<th>Jenis Kelamin</th>
|
||||
<th>Tanggal</th>
|
||||
<th>Sebab</th>
|
||||
<th>Aksi</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<?php
|
||||
$no = 1;
|
||||
$sql = $koneksi->query("SELECT p.id_pend, p.nik, p.nama, m.tgl_mendu, m.sebab, m.id_mendu from
|
||||
$sql = $koneksi->query("SELECT p.id_pend, p.nik, p.nama, p.jekel, m.tgl_mendu, m.sebab, m.id_mendu from
|
||||
tb_mendu m inner join tb_pdd p on p.id_pend=m.id_pdd");
|
||||
while ($data= $sql->fetch_assoc()) {
|
||||
?>
|
||||
@@ -41,9 +42,12 @@
|
||||
<td>
|
||||
<?php echo $data['nama']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['tgl_mendu']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['jekel'] == 'LK' ? 'LAKI-LAKI' : 'PEREMPUAN'; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['tgl_mendu']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['sebab']; ?>
|
||||
</td>
|
||||
@@ -56,10 +60,10 @@
|
||||
class="btn btn-success btn-sm">
|
||||
<i class="fa fa-edit"></i>
|
||||
</a>
|
||||
<a href="?page=del-mendu&kode=<?php echo $data['id_pend']; ?>" onclick="return confirm('Apakah anda yakin hapus data ini ?')"
|
||||
<a href="?page=del-mendu&kode=<?php echo $data['id_pend']; ?>" onclick="confirmDelete(event)"
|
||||
title="Hapus" class="btn btn-danger btn-sm">
|
||||
<i class="fa fa-trash"></i>
|
||||
</>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -68,7 +72,26 @@
|
||||
?>
|
||||
</tbody>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
<script>
|
||||
function confirmDelete(event) {
|
||||
event.preventDefault();
|
||||
Swal.fire({
|
||||
title: 'Konfirmasi Hapus',
|
||||
text: 'Apakah Anda yakin ingin menghapus data ini?',
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#d33',
|
||||
cancelButtonColor: '#3085d6',
|
||||
confirmButtonText: 'Ya, Hapus',
|
||||
cancelButtonText: 'Batal'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
window.location.href = event.currentTarget.href;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -90,7 +90,15 @@
|
||||
<b>Jenis Kelamin</b>
|
||||
</td>
|
||||
<td>:
|
||||
<?php echo $data_cek['jekel']; ?>
|
||||
<?php
|
||||
if ($data_cek['jekel'] == 'LK') {
|
||||
echo 'LAKI-LAKI';
|
||||
} elseif ($data_cek['jekel'] == 'PR') {
|
||||
echo 'PEREMPUAN';
|
||||
} else {
|
||||
echo $data_cek['jekel'];
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
<?php
|
||||
$return_to = isset($_GET['return_to']) ? mysqli_real_escape_string($koneksi, trim($_GET['return_to'])) : '';
|
||||
?>
|
||||
<div class="card card-primary">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">
|
||||
@@ -88,10 +91,10 @@
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">RT/RW</label>
|
||||
<div class="col-sm-3">
|
||||
<input type="text" class="form-control" id="rt" name="rt" placeholder="RT" required>
|
||||
<input type="text" class="form-control" id="rt" name="rt" placeholder="RT" value="000" required>
|
||||
</div>
|
||||
<div class="col-sm-3">
|
||||
<input type="text" class="form-control" id="rw" name="rw" placeholder="RW" required>
|
||||
<input type="text" class="form-control" id="rw" name="rw" placeholder="RW" value="000" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -140,11 +143,62 @@
|
||||
</div>
|
||||
|
||||
<script>
|
||||
window.addEventListener('load', function() {
|
||||
// Scanner Logic
|
||||
var inputImage = document.getElementById('foto_ktp');
|
||||
var preview = document.getElementById('preview_ktp');
|
||||
var hiddenInput = document.getElementById('foto_cropped');
|
||||
window.addEventListener('load', function() {
|
||||
// Pre-fill form from URL parameters
|
||||
var urlParams = new URLSearchParams(window.location.search);
|
||||
if (urlParams.has('nik')) document.getElementsByName('nik')[0].value = urlParams.get('nik');
|
||||
if (urlParams.has('nama')) document.getElementsByName('nama')[0].value = urlParams.get('nama');
|
||||
if (urlParams.has('desa')) document.getElementsByName('desa')[0].value = urlParams.get('desa');
|
||||
if (urlParams.has('rt')) document.getElementsByName('rt')[0].value = urlParams.get('rt');
|
||||
if (urlParams.has('rw')) document.getElementsByName('rw')[0].value = urlParams.get('rw');
|
||||
if (urlParams.has('kecamatan')) document.getElementsByName('kecamatan')[0].value = urlParams.get('kecamatan');
|
||||
if (urlParams.has('kabupaten')) document.getElementsByName('kabupaten')[0].value = urlParams.get('kabupaten');
|
||||
if (urlParams.has('provinsi')) document.getElementsByName('provinsi')[0].value = urlParams.get('provinsi');
|
||||
|
||||
// NIK Validation (16 digits, numeric)
|
||||
var nikInput = document.getElementsByName('nik')[0];
|
||||
function validateNIK(nik) {
|
||||
nik = nik.trim();
|
||||
if (nik.length !== 16) return false;
|
||||
return /^\d+$/.test(nik); // Only digits
|
||||
}
|
||||
function showNIKError(message) {
|
||||
Swal.fire({
|
||||
icon: 'warning',
|
||||
title: 'Format NIK Salah',
|
||||
text: message,
|
||||
confirmButtonText: 'OK'
|
||||
});
|
||||
}
|
||||
// Validate on blur
|
||||
if (nikInput) {
|
||||
nikInput.addEventListener('blur', function() {
|
||||
var nik = this.value.trim();
|
||||
if (nik === '') return;
|
||||
if (!validateNIK(nik)) {
|
||||
showNIKError('NIK harus terdiri dari 16 digit angka.');
|
||||
this.focus();
|
||||
}
|
||||
});
|
||||
}
|
||||
// Validate on form submit
|
||||
var form = document.querySelector('form');
|
||||
if (form) {
|
||||
form.addEventListener('submit', function(e) {
|
||||
var nik = nikInput.value.trim();
|
||||
if (nik !== '' && !validateNIK(nik)) {
|
||||
e.preventDefault();
|
||||
showNIKError('NIK harus terdiri dari 16 digit angka.');
|
||||
nikInput.focus();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Scanner Logic
|
||||
var inputImage = document.getElementById('foto_ktp');
|
||||
var preview = document.getElementById('preview_ktp');
|
||||
var hiddenInput = document.getElementById('foto_cropped');
|
||||
|
||||
// Defines callback for scanner modal
|
||||
window.handleScannerResult = function(base64) {
|
||||
@@ -331,69 +385,144 @@ window.addEventListener('load', function() {
|
||||
}
|
||||
|
||||
//mulai proses simpan data
|
||||
$nik = $_POST['nik'];
|
||||
$cek_nik = mysqli_query($koneksi, "SELECT * FROM tb_pdd WHERE nik='$nik'");
|
||||
if(mysqli_num_rows($cek_nik) > 0){
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Gagal',text: 'NIK sudah terdaftar dalam sistem!',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-pend';
|
||||
}
|
||||
})</script>";
|
||||
return;
|
||||
}
|
||||
$nik = mysqli_real_escape_string($koneksi, trim($_POST['nik']));
|
||||
$cek_nik = mysqli_query($koneksi, "SELECT * FROM tb_pdd WHERE nik='$nik'");
|
||||
if(mysqli_num_rows($cek_nik) > 0){
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Gagal',text: 'NIK sudah terdaftar dalam sistem!',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-pend" . (!empty($return_to) ? '&return_to=' . $return_to : '') . "';
|
||||
}
|
||||
})</script>";
|
||||
return;
|
||||
}
|
||||
|
||||
// Sanitize Input to prevent SQL Injection & Syntax Errors
|
||||
$nama = mysqli_real_escape_string($koneksi, trim($_POST['nama']));
|
||||
$tempat_lh = mysqli_real_escape_string($koneksi, trim($_POST['tempat_lh']));
|
||||
$tgl_lh = mysqli_real_escape_string($koneksi, trim($_POST['tgl_lh']));
|
||||
$jekel = mysqli_real_escape_string($koneksi, trim($_POST['jekel']));
|
||||
$desa = mysqli_real_escape_string($koneksi, trim($_POST['desa']));
|
||||
$rt = mysqli_real_escape_string($koneksi, trim($_POST['rt']));
|
||||
$rw = mysqli_real_escape_string($koneksi, trim($_POST['rw']));
|
||||
$agama = mysqli_real_escape_string($koneksi, trim($_POST['agama']));
|
||||
$kawin = mysqli_real_escape_string($koneksi, trim($_POST['kawin']));
|
||||
$pekerjaan = mysqli_real_escape_string($koneksi, trim($_POST['pekerjaan']));
|
||||
$kecamatan = mysqli_real_escape_string($koneksi, trim($_POST['kecamatan']));
|
||||
$kabupaten = mysqli_real_escape_string($koneksi, trim($_POST['kabupaten']));
|
||||
$provinsi = mysqli_real_escape_string($koneksi, trim($_POST['provinsi']));
|
||||
$kewarganegaraan = mysqli_real_escape_string($koneksi, trim($_POST['kewarganegaraan']));
|
||||
|
||||
// Sanitize Input to prevent SQL Injection & Syntax Errors
|
||||
$nik = mysqli_real_escape_string($koneksi, $_POST['nik']);
|
||||
$nama = mysqli_real_escape_string($koneksi, $_POST['nama']);
|
||||
$tempat_lh = mysqli_real_escape_string($koneksi, $_POST['tempat_lh']);
|
||||
$tgl_lh = mysqli_real_escape_string($koneksi, $_POST['tgl_lh']);
|
||||
$jekel = mysqli_real_escape_string($koneksi, $_POST['jekel']);
|
||||
$desa = mysqli_real_escape_string($koneksi, $_POST['desa']);
|
||||
$rt = mysqli_real_escape_string($koneksi, $_POST['rt']);
|
||||
$rw = mysqli_real_escape_string($koneksi, $_POST['rw']);
|
||||
$agama = mysqli_real_escape_string($koneksi, $_POST['agama']);
|
||||
$kawin = mysqli_real_escape_string($koneksi, $_POST['kawin']);
|
||||
$pekerjaan = mysqli_real_escape_string($koneksi, $_POST['pekerjaan']);
|
||||
$kecamatan = mysqli_real_escape_string($koneksi, $_POST['kecamatan']);
|
||||
$kabupaten = mysqli_real_escape_string($koneksi, $_POST['kabupaten']);
|
||||
$provinsi = mysqli_real_escape_string($koneksi, $_POST['provinsi']);
|
||||
$kewarganegaraan = mysqli_real_escape_string($koneksi, $_POST['kewarganegaraan']);
|
||||
|
||||
$sql_simpan = "INSERT INTO tb_pdd (nik, nama, tempat_lh, tgl_lh, jekel, desa, rt, rw, agama, kawin, pekerjaan, foto_ktp, status, kecamatan, kabupaten, provinsi, kewarganegaraan) VALUES (
|
||||
'$nik',
|
||||
'$nama',
|
||||
'$tempat_lh',
|
||||
'$tgl_lh',
|
||||
'$jekel',
|
||||
'$desa',
|
||||
'$rt',
|
||||
'$rw',
|
||||
'$agama',
|
||||
'$kawin',
|
||||
'$pekerjaan',
|
||||
'$nama_file',
|
||||
'Ada',
|
||||
'$kecamatan',
|
||||
'$kabupaten',
|
||||
'$provinsi',
|
||||
'$kewarganegaraan')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_simpan) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=data-pend';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Gagal',text: '<?php echo mysqli_error($koneksi); ?>',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-pend';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
$sql_simpan = "INSERT INTO tb_pdd (nik, nama, tempat_lh, tgl_lh, jekel, desa, rt, rw, agama, kawin, pekerjaan, foto_ktp, status, kecamatan, kabupaten, provinsi, kewarganegaraan) VALUES (
|
||||
'$nik',
|
||||
'$nama',
|
||||
'$tempat_lh',
|
||||
'$tgl_lh',
|
||||
'$jekel',
|
||||
'$desa',
|
||||
'$rt',
|
||||
'$rw',
|
||||
'$agama',
|
||||
'$kawin',
|
||||
'$pekerjaan',
|
||||
'$nama_file',
|
||||
'Ada',
|
||||
'$kecamatan',
|
||||
'$kabupaten',
|
||||
'$provinsi',
|
||||
'$kewarganegaraan')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
|
||||
if ($query_simpan) {
|
||||
$id_pend_baru = mysqli_insert_id($koneksi);
|
||||
$redirect_url = !empty($return_to) ? "index.php?page=" . $return_to . "&selected_id=" . $id_pend_baru : "index.php?page=data-pend";
|
||||
|
||||
// KTP → KK: Cari KK yang cocok berdasarkan alamat
|
||||
$sql_cari_kk = "SELECT k.id_kk, k.no_kk, k.kepala, k.desa, k.rt, k.rw
|
||||
FROM tb_kk k
|
||||
WHERE k.desa='$desa' AND k.rt='$rt' AND k.rw='$rw'
|
||||
AND k.kec='$kecamatan' AND k.kab='$kabupaten' AND k.prov='$provinsi'";
|
||||
$q_cari_kk = mysqli_query($koneksi, $sql_cari_kk);
|
||||
$kk_cocok = mysqli_fetch_assoc($q_cari_kk);
|
||||
|
||||
if ($kk_cocok) {
|
||||
// Tawarkan untuk menghubungkan dengan KK
|
||||
$no_kk = $kk_cocok['no_kk'];
|
||||
$kepala_kk = $kk_cocok['kepala'];
|
||||
$id_kk = $kk_cocok['id_kk'];
|
||||
|
||||
// Cek apakah sudah terhubung
|
||||
$sql_cek_hubungan = "SELECT * FROM tb_anggota WHERE id_kk='$id_kk' AND id_pend='$id_pend_baru'";
|
||||
$q_cek_hubungan = mysqli_query($koneksi, $sql_cek_hubungan);
|
||||
|
||||
if (mysqli_num_rows($q_cek_hubungan) == 0) {
|
||||
// Simpan sementara data untuk konfirmasi JavaScript
|
||||
$_SESSION['kk_link_data'] = [
|
||||
'id_pend' => $id_pend_baru,
|
||||
'id_kk' => $id_kk,
|
||||
'no_kk' => $no_kk,
|
||||
'kepala_kk' => $kepala_kk,
|
||||
'nama_pend' => $nama
|
||||
];
|
||||
|
||||
echo "<script>
|
||||
Swal.fire({
|
||||
title: 'Data Penduduk Disimpan!',
|
||||
html: '<b>Data berhasil disimpan.</b><br><br>Ditemukan KK dengan alamat yang sama:<br><b>No KK: $no_kk</b><br>Kepala Keluarga: $kepala_kk<br><br>Hubungkan ke KK ini sebagai anggota?',
|
||||
icon: 'success',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: 'Ya, Hubungkan',
|
||||
cancelButtonText: 'Tidak, Simpan Saja'
|
||||
}).then((result) => {
|
||||
if (result.value) {
|
||||
// Kirim permintaan untuk menghubungkan
|
||||
fetch('admin/pend/link_to_kk.php', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
body: 'id_pend=$id_pend_baru&id_kk=$id_kk&hubungan=ANGGOTA'
|
||||
}).then(resp => resp.json()).then(data => {
|
||||
if(data.success) {
|
||||
Swal.fire('Berhasil!', 'Data telah dihubungkan dengan KK.', 'success').then(() => {
|
||||
window.location = '$redirect_url';
|
||||
});
|
||||
} else {
|
||||
Swal.fire('Gagal', 'Gagal menghubungkan: ' + data.message, 'error').then(() => {
|
||||
window.location = '$redirect_url';
|
||||
});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
window.location = '$redirect_url';
|
||||
}
|
||||
});
|
||||
</script>";
|
||||
} else {
|
||||
// Sudah terhubung
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: 'Data telah terhubung dengan KK $no_kk',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = '$redirect_url';
|
||||
}
|
||||
})</script>";
|
||||
}
|
||||
} else {
|
||||
// Tidak ada KK yang cocok
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = '$redirect_url';
|
||||
}
|
||||
})</script>";
|
||||
}
|
||||
} else {
|
||||
$error_redirect = 'index.php?page=add-pend' . (!empty($return_to) ? '&return_to=' . $return_to : '');
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Gagal',text: '" . mysqli_error($koneksi) . "',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = '$error_redirect';
|
||||
}
|
||||
})</script>";
|
||||
}
|
||||
mysqli_close($koneksi);
|
||||
}
|
||||
//selesai proses simpan data
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<th>No</th>
|
||||
<th>NIK</th>
|
||||
<th>Nama</th>
|
||||
<th>JK</th>
|
||||
<th>Jenis Kelamin</th>
|
||||
<th>Alamat</th>
|
||||
<th>No KK</th>
|
||||
<th>Aksi</th>
|
||||
@@ -59,7 +59,15 @@
|
||||
<?php echo $data['nama']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['jekel']; ?>
|
||||
<?php
|
||||
if ($data['jekel'] == 'LK') {
|
||||
echo 'LAKI-LAKI';
|
||||
} elseif ($data['jekel'] == 'PR') {
|
||||
echo 'PEREMPUAN';
|
||||
} else {
|
||||
echo $data['jekel'];
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['desa']; ?>
|
||||
|
||||
62
admin/pend/link_to_kk.php
Normal file
62
admin/pend/link_to_kk.php
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
session_start();
|
||||
include "../inc/koneksi.php";
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if (!isset($_SESSION["ses_username"])) {
|
||||
echo json_encode(['success' => false, 'message' => 'Unauthorized']);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
||||
echo json_encode(['success' => false, 'message' => 'Invalid request method']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$id_pend = isset($_POST['id_pend']) ? intval($_POST['id_pend']) : 0;
|
||||
$id_kk = isset($_POST['id_kk']) ? intval($_POST['id_kk']) : 0;
|
||||
$hubungan = isset($_POST['hubungan']) ? mysqli_real_escape_string($koneksi, $_POST['hubungan']) : 'ANGGOTA';
|
||||
|
||||
if ($id_pend <= 0 || $id_kk <= 0) {
|
||||
echo json_encode(['success' => false, 'message' => 'Invalid ID']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Cek apakah sudah terhubung
|
||||
$sql_cek = "SELECT * FROM tb_anggota WHERE id_kk='$id_kk' AND id_pend='$id_pend'";
|
||||
$q_cek = mysqli_query($koneksi, $sql_cek);
|
||||
|
||||
if (mysqli_num_rows($q_cek) > 0) {
|
||||
echo json_encode(['success' => false, 'message' => 'Sudah terhubung']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Cek apakah penduduk ada
|
||||
$sql_cek_pend = "SELECT * FROM tb_pdd WHERE id_pend='$id_pend'";
|
||||
$q_cek_pend = mysqli_query($koneksi, $sql_cek_pend);
|
||||
if (mysqli_num_rows($q_cek_pend) == 0) {
|
||||
echo json_encode(['success' => false, 'message' => 'Data penduduk tidak ditemukan']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Cek apakah KK ada
|
||||
$sql_cek_kk = "SELECT * FROM tb_kk WHERE id_kk='$id_kk'";
|
||||
$q_cek_kk = mysqli_query($koneksi, $sql_cek_kk);
|
||||
if (mysqli_num_rows($q_cek_kk) == 0) {
|
||||
echo json_encode(['success' => false, 'message' => 'Data KK tidak ditemukan']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Hubungkan
|
||||
$sql_link = "INSERT INTO tb_anggota (id_kk, id_pend, hubungan) VALUES ('$id_kk', '$id_pend', '$hubungan')";
|
||||
$q_link = mysqli_query($koneksi, $sql_link);
|
||||
|
||||
if ($q_link) {
|
||||
echo json_encode(['success' => true, 'message' => 'Berhasil dihubungkan']);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => 'Database error: ' . mysqli_error($koneksi)]);
|
||||
}
|
||||
|
||||
mysqli_close($koneksi);
|
||||
?>
|
||||
@@ -30,11 +30,11 @@
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Level</label>
|
||||
<div class="col-sm-4">
|
||||
<select name="level" id="level" class="form-control">
|
||||
<option>- Pilih -</option>
|
||||
<option>Administrator</option>
|
||||
<option>Kaur Pemerintah</option>
|
||||
</select>
|
||||
<select name="level" id="level" class="form-control">
|
||||
<option value="">- Pilih -</option>
|
||||
<option value="Administrator">Administrator</option>
|
||||
<option value="Kaur Pemerintah">Kaur Pemerintah</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -46,31 +46,45 @@
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
|
||||
if (isset ($_POST['Simpan'])){
|
||||
//mulai proses simpan data
|
||||
$sql_simpan = "INSERT INTO tb_pengguna (nama_pengguna,username,password,level) VALUES (
|
||||
'".$_POST['nama_pengguna']."',
|
||||
'".$_POST['username']."',
|
||||
'".$_POST['password']."',
|
||||
'".$_POST['level']."')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_simpan) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=data-pengguna';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-pengguna';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
//selesai proses simpan data
|
||||
<?php
|
||||
|
||||
if (isset ($_POST['Simpan'])){
|
||||
// Map level untuk database (enum: 'admin', 'kaur')
|
||||
$level_map = [
|
||||
'Administrator' => 'admin',
|
||||
'Kaur Pemerintah' => 'kaur'
|
||||
];
|
||||
$level_db = isset($level_map[$_POST['level']]) ? $level_map[$_POST['level']] : $_POST['level'];
|
||||
|
||||
// Sanitize Input to prevent SQL Injection & Syntax Errors
|
||||
$nama_pengguna = mysqli_real_escape_string($koneksi, trim($_POST['nama_pengguna']));
|
||||
$username = mysqli_real_escape_string($koneksi, trim($_POST['username']));
|
||||
$password_raw = trim($_POST['password']);
|
||||
$password_hash = MD5($password_raw);
|
||||
$level_db = mysqli_real_escape_string($koneksi, $level_db);
|
||||
|
||||
//mulai proses simpan data
|
||||
$sql_simpan = "INSERT INTO tb_pengguna (nama_pengguna,username,password,level) VALUES (
|
||||
'$nama_pengguna',
|
||||
'$username',
|
||||
'$password_hash',
|
||||
'$level_db')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_simpan) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=data-pengguna';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-pengguna';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
//selesai proses simpan data
|
||||
|
||||
@@ -23,11 +23,16 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<?php
|
||||
$no = 1;
|
||||
$sql = $koneksi->query("select * from tb_pengguna");
|
||||
while ($data= $sql->fetch_assoc()) {
|
||||
?>
|
||||
<?php
|
||||
$no = 1;
|
||||
$level_map = [
|
||||
'admin' => 'Administrator',
|
||||
'kaur' => 'Kaur Pemerintah'
|
||||
];
|
||||
$sql = $koneksi->query("select * from tb_pengguna");
|
||||
while ($data= $sql->fetch_assoc()) {
|
||||
$level_display = isset($level_map[$data['level']]) ? $level_map[$data['level']] : $data['level'];
|
||||
?>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
@@ -40,17 +45,17 @@
|
||||
<?php echo $data['username']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['level']; ?>
|
||||
<?php echo $level_display; ?>
|
||||
</td>
|
||||
<td>
|
||||
<a href="?page=edit-pengguna&kode=<?php echo $data['id_pengguna']; ?>" title="Ubah"
|
||||
class="btn btn-success btn-sm">
|
||||
<i class="fa fa-edit"></i>
|
||||
</a>
|
||||
<a href="?page=del-pengguna&kode=<?php echo $data['id_pengguna']; ?>" onclick="return confirm('Apakah anda yakin hapus data ini ?')"
|
||||
<a href="?page=del-pengguna&kode=<?php echo $data['id_pengguna']; ?>" onclick="confirmDelete(event)"
|
||||
title="Hapus" class="btn btn-danger btn-sm">
|
||||
<i class="fa fa-trash"></i>
|
||||
</>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -59,7 +64,26 @@
|
||||
?>
|
||||
</tbody>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
<script>
|
||||
function confirmDelete(event) {
|
||||
event.preventDefault();
|
||||
Swal.fire({
|
||||
title: 'Konfirmasi Hapus',
|
||||
text: 'Apakah Anda yakin ingin menghapus data ini?',
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#d33',
|
||||
cancelButtonColor: '#3085d6',
|
||||
confirmButtonText: 'Ya, Hapus',
|
||||
cancelButtonText: 'Batal'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
window.location.href = event.currentTarget.href;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -46,17 +46,29 @@
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Level</label>
|
||||
<div class="col-sm-4">
|
||||
<select name="level" id="level" class="form-control">
|
||||
<option value="">-- Pilih Level --</option>
|
||||
<?php
|
||||
//menhecek data yg dipilih sebelumnya
|
||||
if ($data_cek['level'] == "Administrator") echo "<option value='Administrator' selected>Administrator</option>";
|
||||
else echo "<option value='Administrator'>Administrator</option>";
|
||||
|
||||
if ($data_cek['level'] == "Kaur Pemerintah") echo "<option value='Kaur Pemerintah' selected>Kaur Pemerintah</option>";
|
||||
else echo "<option value='Kaur Pemerintah'>Kaur Pemerintah</option>";
|
||||
?>
|
||||
</select>
|
||||
<select name="level" id="level" class="form-control">
|
||||
<option value="">-- Pilih Level --</option>
|
||||
<?php
|
||||
// Mapping level dari database ke tampilan
|
||||
$level_display_map = [
|
||||
'admin' => 'Administrator',
|
||||
'kaur' => 'Kaur Pemerintah',
|
||||
'Administrator' => 'Administrator', // backward compatibility
|
||||
'Kaur Pemerintah' => 'Kaur Pemerintah'
|
||||
];
|
||||
$current_level = $data_cek['level'];
|
||||
$current_display = isset($level_display_map[$current_level]) ? $level_display_map[$current_level] : $current_level;
|
||||
|
||||
// Opsi Administrator
|
||||
if ($current_display == "Administrator") {
|
||||
echo "<option value='Administrator' selected>Administrator</option>";
|
||||
echo "<option value='Kaur Pemerintah'>Kaur Pemerintah</option>";
|
||||
} else {
|
||||
echo "<option value='Administrator'>Administrator</option>";
|
||||
echo "<option value='Kaur Pemerintah' selected>Kaur Pemerintah</option>";
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -72,14 +84,21 @@
|
||||
|
||||
<?php
|
||||
|
||||
if (isset ($_POST['Ubah'])){
|
||||
$sql_ubah = "UPDATE tb_pengguna SET
|
||||
nama_pengguna='".$_POST['nama_pengguna']."',
|
||||
username='".$_POST['username']."',
|
||||
password='".$_POST['password']."',
|
||||
level='".$_POST['level']."'
|
||||
WHERE id_pengguna='".$_POST['id_pengguna']."'";
|
||||
$query_ubah = mysqli_query($koneksi, $sql_ubah);
|
||||
if (isset ($_POST['Ubah'])){
|
||||
// Map level untuk database (enum: 'admin', 'kaur')
|
||||
$level_map = [
|
||||
'Administrator' => 'admin',
|
||||
'Kaur Pemerintah' => 'kaur'
|
||||
];
|
||||
$level_db = isset($level_map[$_POST['level']]) ? $level_map[$_POST['level']] : $_POST['level'];
|
||||
|
||||
$sql_ubah = "UPDATE tb_pengguna SET
|
||||
nama_pengguna='".$_POST['nama_pengguna']."',
|
||||
username='".$_POST['username']."',
|
||||
password='".$_POST['password']."',
|
||||
level='".$level_db."'
|
||||
WHERE id_pengguna='".$_POST['id_pengguna']."'";
|
||||
$query_ubah = mysqli_query($koneksi, $sql_ubah);
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_ubah) {
|
||||
|
||||
@@ -52,35 +52,41 @@
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
|
||||
if (isset ($_POST['Simpan'])){
|
||||
//mulai proses simpan data
|
||||
$sql_simpan = "INSERT INTO tb_pindah (id_pdd, tgl_pindah, alasan) VALUES (
|
||||
'".$_POST['id_pdd']."',
|
||||
'".$_POST['tgl_pindah']."',
|
||||
'".$_POST['alasan']."')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
|
||||
$sql_ubah = "UPDATE tb_pdd SET
|
||||
status='Pindah'
|
||||
WHERE id_pend='".$_POST['id_pdd']."'";
|
||||
$query_ubah = mysqli_query($koneksi, $sql_ubah);
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_simpan && $query_ubah) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=data-pindah';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-pindah';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
//selesai proses simpan data
|
||||
<?php
|
||||
|
||||
if (isset ($_POST['Simpan'])){
|
||||
//mulai proses simpan data
|
||||
|
||||
// Sanitize Input to prevent SQL Injection & Syntax Errors
|
||||
$id_pdd = (int)$_POST['id_pdd']; // Cast to integer for safety
|
||||
$tgl_pindah = mysqli_real_escape_string($koneksi, trim($_POST['tgl_pindah']));
|
||||
$alasan = mysqli_real_escape_string($koneksi, trim($_POST['alasan']));
|
||||
|
||||
$sql_simpan = "INSERT INTO tb_pindah (id_pdd, tgl_pindah, alasan) VALUES (
|
||||
'$id_pdd',
|
||||
'$tgl_pindah',
|
||||
'$alasan')";
|
||||
$query_simpan = mysqli_query($koneksi, $sql_simpan);
|
||||
|
||||
$sql_ubah = "UPDATE tb_pdd SET
|
||||
status='Pindah'
|
||||
WHERE id_pend='$id_pdd'";
|
||||
$query_ubah = mysqli_query($koneksi, $sql_ubah);
|
||||
mysqli_close($koneksi);
|
||||
|
||||
if ($query_simpan && $query_ubah) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Berhasil',text: '',icon: 'success',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=data-pindah';
|
||||
}
|
||||
})</script>";
|
||||
}else{
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Tambah Data Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value){
|
||||
window.location = 'index.php?page=add-pindah';
|
||||
}
|
||||
})</script>";
|
||||
}}
|
||||
//selesai proses simpan data
|
||||
|
||||
@@ -13,20 +13,21 @@
|
||||
<br>
|
||||
<table id="example1" class="table table-bordered table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>No</th>
|
||||
<th>NIK</th>
|
||||
<th>Nama</th>
|
||||
<th>Tanggal</th>
|
||||
<th>Alasan</th>
|
||||
<th>Aksi</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>No</th>
|
||||
<th>NIK</th>
|
||||
<th>Nama</th>
|
||||
<th>Jenis Kelamin</th>
|
||||
<th>Tanggal</th>
|
||||
<th>Alasan</th>
|
||||
<th>Aksi</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<?php
|
||||
$no = 1;
|
||||
$sql = $koneksi->query("SELECT p.id_pend, p.nik, p.nama, d.tgl_pindah, d.alasan, d.id_pindah from
|
||||
$sql = $koneksi->query("SELECT p.id_pend, p.nik, p.nama, p.jekel, d.tgl_pindah, d.alasan, d.id_pindah from
|
||||
tb_pindah d inner join tb_pdd p on p.id_pend=d.id_pdd");
|
||||
while ($data= $sql->fetch_assoc()) {
|
||||
?>
|
||||
@@ -41,9 +42,12 @@
|
||||
<td>
|
||||
<?php echo $data['nama']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['tgl_pindah']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['jekel'] == 'LK' ? 'LAKI-LAKI' : 'PEREMPUAN'; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['tgl_pindah']; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $data['alasan']; ?>
|
||||
</td>
|
||||
@@ -56,10 +60,10 @@
|
||||
class="btn btn-success btn-sm">
|
||||
<i class="fa fa-edit"></i>
|
||||
</a>
|
||||
<a href="?page=del-pindah&kode=<?php echo $data['id_pend']; ?>" onclick="return confirm('Apakah anda yakin hapus data ini ?')"
|
||||
<a href="?page=del-pindah&kode=<?php echo $data['id_pend']; ?>" onclick="confirmDelete(event)"
|
||||
title="Hapus" class="btn btn-danger btn-sm">
|
||||
<i class="fa fa-trash"></i>
|
||||
</>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -68,7 +72,26 @@
|
||||
?>
|
||||
</tbody>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
<script>
|
||||
function confirmDelete(event) {
|
||||
event.preventDefault();
|
||||
Swal.fire({
|
||||
title: 'Konfirmasi Hapus',
|
||||
text: 'Apakah Anda yakin ingin menghapus data ini?',
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#d33',
|
||||
cancelButtonColor: '#3085d6',
|
||||
confirmButtonText: 'Ya, Hapus',
|
||||
cancelButtonText: 'Batal'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
window.location.href = event.currentTarget.href;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -90,7 +90,15 @@
|
||||
<b>Jenis Kelamin</b>
|
||||
</td>
|
||||
<td>:
|
||||
<?php echo $data_cek['jekel']; ?>
|
||||
<?php
|
||||
if ($data_cek['jekel'] == 'LK') {
|
||||
echo 'LAKI-LAKI';
|
||||
} elseif ($data_cek['jekel'] == 'PR') {
|
||||
echo 'PEREMPUAN';
|
||||
} else {
|
||||
echo $data_cek['jekel'];
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -3,28 +3,51 @@
|
||||
<div class="modal fade" id="modalScanner" tabindex="-1" role="dialog" aria-labelledby="modalScannerLabel" aria-hidden="true" data-backdrop="static">
|
||||
<div class="modal-dialog modal-xl" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="modalScannerLabel"><i class="fas fa-expand"></i> Smart Scanner</h5>
|
||||
<div class="ml-auto mr-3">
|
||||
<div class="btn-group btn-group-sm" role="group" id="scannerModeToggle">
|
||||
<button type="button" class="btn btn-outline-primary active" data-mode="smart">
|
||||
<i class="fas fa-magic"></i> Smart Scan
|
||||
</button>
|
||||
<button type="button" class="btn btn-outline-secondary" data-mode="manual">
|
||||
<i class="fas fa-crop-alt"></i> Manual Crop
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body text-center bg-dark p-0" style="position: relative; overflow: hidden; height: 80vh;">
|
||||
<!-- Container for Canvases -->
|
||||
<div id="scanner-container" style="position: relative; margin: auto; display: inline-block;">
|
||||
<div class="modal-body text-center bg-dark p-0" style="position: relative; overflow: hidden; height: 80vh;">
|
||||
<!-- Smart Scan Mode (Default) -->
|
||||
<div id="scanner-container" class="scanner-mode" data-mode="smart" style="display: block; position: relative; margin: auto; display: inline-block;">
|
||||
<canvas id="canvas-image" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
||||
<canvas id="canvas-overlay" style="position: absolute; left: 0; top: 0; z-index: 2; cursor: crosshair;"></canvas>
|
||||
</div>
|
||||
|
||||
<!-- Manual Crop Mode (Cropper.js) -->
|
||||
<div id="crop-container" class="scanner-mode" data-mode="manual" style="display: none; width: 100%; height: 100%;">
|
||||
<img id="crop-image" style="max-width: 100%; max-height: 100%;">
|
||||
</div>
|
||||
|
||||
<div id="scanner-loading" style="position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); color: white; display: none;">
|
||||
<i class="fas fa-spinner fa-spin fa-3x"></i><br>Detecting Document...
|
||||
</div>
|
||||
|
||||
<!-- Mobile Help Tips -->
|
||||
<div id="mobile-help" class="d-none d-md-none d-lg-none" style="position: absolute; bottom: 10px; left: 0; right: 0; text-align: center; color: white; background: rgba(0,0,0,0.7); padding: 5px; font-size: 12px;">
|
||||
<span id="help-text-smart">📍 Sentuh & geser titik biru untuk atur sudut (untuk mobile, gunakan Manual Crop)</span>
|
||||
<span id="help-text-manual" style="display: none;">📍 Pinch untuk zoom, geser untuk pindah area crop</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer justify-content-between">
|
||||
<div>
|
||||
<button type="button" class="btn btn-secondary" id="btnScanRotateLeft" title="Putar Kiri (-90°)"><i class="fas fa-undo"></i></button>
|
||||
<button type="button" class="btn btn-secondary" id="btnScanRotateRight" title="Putar Kanan (+90°)"><i class="fas fa-redo"></i></button>
|
||||
<button type="button" class="btn btn-warning" id="btnScanReset"><i class="fas fa-sync"></i> Reset Sudut</button>
|
||||
</div>
|
||||
<div>
|
||||
<button type="button" class="btn btn-secondary" id="btnScanRotateLeft" title="Putar Kiri (-90°)"><i class="fas fa-undo"></i></button>
|
||||
<button type="button" class="btn btn-secondary" id="btnScanRotateRight" title="Putar Kanan (+90°)"><i class="fas fa-redo"></i></button>
|
||||
<button type="button" class="btn btn-warning" id="btnScanReset"><i class="fas fa-sync"></i> Reset Sudut</button>
|
||||
<button type="button" class="btn btn-info d-none" id="btnCropReset"><i class="fas fa-crop"></i> Reset Crop</button>
|
||||
</div>
|
||||
<div>
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
|
||||
<button type="button" class="btn btn-primary" id="btnScanSave"><i class="fas fa-check"></i> Simpan Hasil Scan</button>
|
||||
@@ -34,6 +57,158 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
/* Disable all transitions and hover effects for scanner modal */
|
||||
#modalScanner .card,
|
||||
#modalScanner .modal-content,
|
||||
#modalScanner .modal-body,
|
||||
#modalScanner .modal-header,
|
||||
#modalScanner .modal-footer,
|
||||
#modalScanner .modal-dialog,
|
||||
#modalScanner #scanner-container,
|
||||
#modalScanner #scanner-container * {
|
||||
transition: none !important;
|
||||
}
|
||||
#modalScanner .card:hover,
|
||||
#modalScanner .modal-content:hover,
|
||||
#modalScanner .modal-body:hover,
|
||||
#modalScanner .modal-header:hover,
|
||||
#modalScanner .modal-footer:hover,
|
||||
#modalScanner .modal-dialog:hover,
|
||||
#modalScanner #scanner-container:hover,
|
||||
#modalScanner #scanner-container *:hover {
|
||||
transform: none !important;
|
||||
}
|
||||
/* Ensure canvas is fully visible */
|
||||
#canvas-image {
|
||||
opacity: 1 !important;
|
||||
filter: none !important;
|
||||
background-color: white !important;
|
||||
}
|
||||
#canvas-overlay {
|
||||
opacity: 1 !important;
|
||||
filter: none !important;
|
||||
}
|
||||
/* Prevent canvas from moving on hover */
|
||||
#canvas-image:hover,
|
||||
#canvas-overlay:hover {
|
||||
transform: none !important;
|
||||
}
|
||||
|
||||
/* Prevent modal dragging and improve touch handling on mobile */
|
||||
#modalScanner .modal-dialog,
|
||||
#modalScanner .modal-content,
|
||||
#modalScanner .modal-header,
|
||||
#modalScanner .modal-footer {
|
||||
touch-action: none !important; /* Prevent browser touch gestures (pan, zoom, swipe) */
|
||||
user-select: none !important; /* Prevent text selection during drag */
|
||||
-webkit-user-select: none !important;
|
||||
-webkit-touch-callout: none !important;
|
||||
}
|
||||
|
||||
/* Allow touch interaction only on canvas and buttons */
|
||||
#modalScanner .modal-body,
|
||||
#canvas-image,
|
||||
#canvas-overlay {
|
||||
touch-action: manipulation !important; /* Allow pinch-zoom and pan on canvas only */
|
||||
}
|
||||
|
||||
/* Prevent modal backdrop from responding to touch */
|
||||
.modal-backdrop {
|
||||
touch-action: none !important;
|
||||
}
|
||||
|
||||
/* Lock modal position on mobile */
|
||||
@media (max-width: 768px) {
|
||||
#modalScanner {
|
||||
padding-right: 0 !important; /* Prevent shift from scrollbar */
|
||||
}
|
||||
#modalScanner .modal-dialog {
|
||||
margin: 0 !important;
|
||||
max-height: 100vh !important;
|
||||
height: 100vh !important;
|
||||
width: 100vw !important;
|
||||
max-width: 100vw !important;
|
||||
position: fixed !important;
|
||||
top: 0 !important;
|
||||
left: 0 !important;
|
||||
right: 0 !important;
|
||||
bottom: 0 !important;
|
||||
transform: none !important;
|
||||
transition: none !important;
|
||||
}
|
||||
#modalScanner .modal-content {
|
||||
border-radius: 0 !important;
|
||||
height: 100vh !important;
|
||||
max-height: 100vh !important;
|
||||
width: 100vw !important;
|
||||
max-width: 100vw !important;
|
||||
overflow: hidden !important;
|
||||
position: fixed !important;
|
||||
top: 0 !important;
|
||||
left: 0 !important;
|
||||
transform: none !important;
|
||||
transition: none !important;
|
||||
}
|
||||
#modalScanner .modal-body {
|
||||
height: calc(100vh - 120px) !important; /* Account for header and footer */
|
||||
overflow: hidden !important;
|
||||
}
|
||||
/* Prevent any modal movement */
|
||||
.modal-open #modalScanner {
|
||||
overflow: hidden !important;
|
||||
}
|
||||
/* Larger touch target for close button on mobile */
|
||||
#modalScanner .modal-header .close {
|
||||
padding: 20px !important;
|
||||
font-size: 2rem !important;
|
||||
line-height: 1 !important;
|
||||
margin: -10px -10px -10px auto !important;
|
||||
}
|
||||
|
||||
/* Larger touch targets for all buttons */
|
||||
#modalScanner .modal-footer .btn {
|
||||
min-height: 44px !important;
|
||||
min-width: 44px !important;
|
||||
padding: 10px 15px !important;
|
||||
font-size: 16px !important; /* Prevent zoom on iOS */
|
||||
}
|
||||
|
||||
/* Larger corner points for touch */
|
||||
#canvas-overlay {
|
||||
touch-action: manipulation;
|
||||
}
|
||||
|
||||
/* Mode toggle buttons */
|
||||
#scannerModeToggle .btn {
|
||||
min-height: 36px !important;
|
||||
min-width: 90px !important;
|
||||
font-size: 14px !important;
|
||||
}
|
||||
|
||||
/* Help text */
|
||||
#mobile-help {
|
||||
font-size: 14px !important;
|
||||
padding: 10px !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Cropper.js customizations for mobile */
|
||||
.cropper-point {
|
||||
width: 30px !important;
|
||||
height: 30px !important;
|
||||
}
|
||||
|
||||
.cropper-line {
|
||||
background-color: rgba(0, 123, 255, 0.5) !important;
|
||||
}
|
||||
|
||||
/* Larger hit area for corner points in smart scan */
|
||||
.scanner-mode[data-mode="smart"] canvas {
|
||||
touch-action: pinch-zoom;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
window.addEventListener('load', function() {
|
||||
// Scanner Variables
|
||||
@@ -43,23 +218,72 @@ window.addEventListener('load', function() {
|
||||
var ctxImg = canvasImage.getContext('2d');
|
||||
var ctxOver = canvasOverlay.getContext('2d');
|
||||
|
||||
var scanner = new jscanify();
|
||||
var originalImg = new Image();
|
||||
var scanner = null;
|
||||
try {
|
||||
scanner = new jscanify();
|
||||
} catch (e) {
|
||||
console.error('Failed to initialize jscanify:', e);
|
||||
// scanner remains null
|
||||
}
|
||||
var originalImg = new Image();
|
||||
|
||||
// Cropper.js instance
|
||||
var cropper = null;
|
||||
var currentMode = IS_TOUCH_DEVICE ? 'manual' : 'smart'; // Default to manual for touch devices
|
||||
|
||||
// Corner Points (tl, tr, bl, br)
|
||||
var corners = [];
|
||||
var activePoint = null;
|
||||
var isDragging = false;
|
||||
// Corner Points (tl, tr, bl, br)
|
||||
var corners = [];
|
||||
var activePoint = null;
|
||||
var isDragging = false;
|
||||
var touchStartPos = null;
|
||||
var isTouchInteraction = false;
|
||||
var touchOffset = null;
|
||||
|
||||
// Config
|
||||
const POINT_RADIUS = 15;
|
||||
const POINT_COLOR = '#007bff';
|
||||
const LINE_COLOR = '#00ff00';
|
||||
const LINE_WIDTH = 3;
|
||||
// Config
|
||||
const POINT_RADIUS = IS_TOUCH_DEVICE ? 25 : 15; // Larger for touch devices
|
||||
const POINT_COLOR = '#007bff';
|
||||
const LINE_COLOR = '#00ff00';
|
||||
const LINE_WIDTH = IS_TOUCH_DEVICE ? 5 : 3;
|
||||
const TOUCH_RADIUS_MULTIPLIER = 2.5; // Larger hit area for touch devices
|
||||
const TOUCH_SLOP = 5; // pixels threshold before dragging starts
|
||||
const IS_TOUCH_DEVICE = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
|
||||
|
||||
// --- Public Function to Open Scanner ---
|
||||
// --- Public Function to Open Scanner ---
|
||||
window.openScanner = function(file) {
|
||||
// --- Mode Toggle Handler ---
|
||||
$('#scannerModeToggle button').on('click', function() {
|
||||
var mode = $(this).data('mode');
|
||||
if (mode === currentMode) return;
|
||||
|
||||
// Update UI
|
||||
$('#scannerModeToggle button').removeClass('active btn-primary').addClass('btn-outline-secondary');
|
||||
$(this).removeClass('btn-outline-secondary').addClass('active btn-primary');
|
||||
|
||||
// Switch modes
|
||||
$('.scanner-mode').hide();
|
||||
$('.scanner-mode[data-mode="' + mode + '"]').show();
|
||||
|
||||
// Update help text
|
||||
$('#help-text-smart, #help-text-manual').hide();
|
||||
$('#help-text-' + mode).show();
|
||||
|
||||
// Show/hide appropriate buttons
|
||||
if (mode === 'smart') {
|
||||
$('#btnScanReset').removeClass('d-none');
|
||||
$('#btnCropReset').addClass('d-none');
|
||||
} else {
|
||||
$('#btnScanReset').addClass('d-none');
|
||||
$('#btnCropReset').removeClass('d-none');
|
||||
|
||||
// Initialize cropper if not already
|
||||
if (typeof Cropper !== 'undefined' && !cropper && originalImg.src) {
|
||||
initCropper();
|
||||
}
|
||||
}
|
||||
|
||||
currentMode = mode;
|
||||
});
|
||||
|
||||
// --- Public Function to Open Scanner ---
|
||||
window.openScanner = function(file) {
|
||||
if (!file) return;
|
||||
|
||||
// Reset State
|
||||
@@ -91,77 +315,224 @@ window.addEventListener('load', function() {
|
||||
};
|
||||
reader.readAsDataURL(file);
|
||||
|
||||
// 2. Show Modal & Listen
|
||||
scannerModal.off('shown.bs.modal'); // Remove old listeners
|
||||
scannerModal.on('shown.bs.modal', function() {
|
||||
modalShown = true;
|
||||
checkReady();
|
||||
});
|
||||
// 2. Show Modal & Listen
|
||||
scannerModal.off('shown.bs.modal'); // Remove old listeners
|
||||
scannerModal.on('shown.bs.modal', function() {
|
||||
modalShown = true;
|
||||
checkReady();
|
||||
|
||||
// Prevent body scrolling on mobile
|
||||
document.body.style.overflow = 'hidden';
|
||||
document.body.style.position = 'fixed';
|
||||
document.body.style.width = '100%';
|
||||
|
||||
// Prevent modal dragging on mobile
|
||||
var modalDialog = document.querySelector('#modalScanner .modal-dialog');
|
||||
var modalContent = document.querySelector('#modalScanner .modal-content');
|
||||
var modalHeader = document.querySelector('#modalScanner .modal-header');
|
||||
var modalFooter = document.querySelector('#modalScanner .modal-footer');
|
||||
|
||||
var preventTouch = function(e) {
|
||||
// Allow touch on canvas elements and buttons
|
||||
var target = e.target;
|
||||
var isCanvas = target.id === 'canvas-overlay' || target.id === 'canvas-image' ||
|
||||
target.id === 'crop-image' || target.closest('#crop-container') ||
|
||||
target.closest('#scanner-container');
|
||||
var isButton = target.tagName === 'BUTTON' || target.closest('button');
|
||||
|
||||
if (!isCanvas && !isButton) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
}
|
||||
};
|
||||
|
||||
if (modalDialog) {
|
||||
modalDialog.addEventListener('touchstart', preventTouch, { passive: false });
|
||||
modalDialog.addEventListener('touchmove', preventTouch, { passive: false });
|
||||
}
|
||||
if (modalContent) {
|
||||
modalContent.addEventListener('touchstart', preventTouch, { passive: false });
|
||||
modalContent.addEventListener('touchmove', preventTouch, { passive: false });
|
||||
}
|
||||
if (modalHeader) {
|
||||
modalHeader.addEventListener('touchstart', preventTouch, { passive: false });
|
||||
modalHeader.addEventListener('touchmove', preventTouch, { passive: false });
|
||||
}
|
||||
if (modalFooter) {
|
||||
modalFooter.addEventListener('touchstart', preventTouch, { passive: false });
|
||||
modalFooter.addEventListener('touchmove', preventTouch, { passive: false });
|
||||
}
|
||||
});
|
||||
|
||||
// Restore scrolling when modal is hidden
|
||||
scannerModal.on('hidden.bs.modal', function() {
|
||||
document.body.style.overflow = '';
|
||||
document.body.style.position = '';
|
||||
document.body.style.width = '';
|
||||
// Cleanup cropper
|
||||
destroyCropper();
|
||||
});
|
||||
|
||||
scannerModal.modal('show');
|
||||
};
|
||||
|
||||
function initScanner() {
|
||||
// Resize Canvas to fit screen but keep aspect ratio
|
||||
var maxWidth = $('#modalScanner .modal-body').width() - 20;
|
||||
var maxHeight = $('#modalScanner .modal-body').height() - 20;
|
||||
|
||||
var scale = Math.min(maxWidth / originalImg.width, maxHeight / originalImg.height);
|
||||
var w = originalImg.width * scale;
|
||||
var h = originalImg.height * scale;
|
||||
|
||||
canvasImage.width = w;
|
||||
canvasImage.height = h;
|
||||
canvasOverlay.width = w;
|
||||
canvasOverlay.height = h;
|
||||
|
||||
// Resize container
|
||||
$('#scanner-container').css({ width: w, height: h, marginTop: '10px' });
|
||||
|
||||
// Draw Image
|
||||
ctxImg.drawImage(originalImg, 0, 0, w, h);
|
||||
|
||||
// Detect Contour using jscanify
|
||||
try {
|
||||
// jscanify expects an image element, we can pass originalImg but we need to map coordinates
|
||||
// Wait, jscanify uses OpenCV which might not be ready.
|
||||
if (typeof cv !== 'undefined' && cv.Mat) {
|
||||
// We need to work on the original image for detection, then scale points
|
||||
var contour = scanner.findPaper(originalImg);
|
||||
// contour returns { topLeftCorner, topRightCorner, bottomLeftCorner, bottomRightCorner } each {x, y}
|
||||
|
||||
if (contour) {
|
||||
corners = [
|
||||
{ x: contour.topLeftCorner.x * scale, y: contour.topLeftCorner.y * scale },
|
||||
{ x: contour.topRightCorner.x * scale, y: contour.topRightCorner.y * scale },
|
||||
{ x: contour.bottomRightCorner.x * scale, y: contour.bottomRightCorner.y * scale }, // Order: tr -> br -> bl ?? No, usually tl, tr, br, bl order for polygon drawing
|
||||
{ x: contour.bottomLeftCorner.x * scale, y: contour.bottomLeftCorner.y * scale }
|
||||
];
|
||||
// Reorder primarily for logic: TL, TR, BR, BL
|
||||
corners = [
|
||||
{ x: contour.topLeftCorner.x * scale, y: contour.topLeftCorner.y * scale },
|
||||
{ x: contour.topRightCorner.x * scale, y: contour.topRightCorner.y * scale },
|
||||
{ x: contour.bottomRightCorner.x * scale, y: contour.bottomRightCorner.y * scale },
|
||||
{ x: contour.bottomLeftCorner.x * scale, y: contour.bottomLeftCorner.y * scale }
|
||||
];
|
||||
function detectDocument(scale, w, h, showAlert = false) {
|
||||
// Detect Contour using jscanify
|
||||
try {
|
||||
// jscanify expects an image element, we can pass originalImg but we need to map coordinates
|
||||
// Wait, jscanify uses OpenCV which might not be ready.
|
||||
if (typeof cv !== 'undefined' && cv.Mat) {
|
||||
// We need to work on the original image for detection, then scale points
|
||||
var contour = scanner ? scanner.findPaper(originalImg) : null;
|
||||
// contour returns { topLeftCorner, topRightCorner, bottomLeftCorner, bottomRightCorner } each {x, y}
|
||||
|
||||
if (contour) {
|
||||
// Order: TL, TR, BR, BL (clockwise)
|
||||
corners = [
|
||||
{ x: contour.topLeftCorner.x * scale, y: contour.topLeftCorner.y * scale },
|
||||
{ x: contour.topRightCorner.x * scale, y: contour.topRightCorner.y * scale },
|
||||
{ x: contour.bottomRightCorner.x * scale, y: contour.bottomRightCorner.y * scale },
|
||||
{ x: contour.bottomLeftCorner.x * scale, y: contour.bottomLeftCorner.y * scale }
|
||||
];
|
||||
|
||||
} else {
|
||||
defaultCorners(w, h);
|
||||
}
|
||||
} else {
|
||||
console.warn("OpenCV not ready yet");
|
||||
defaultCorners(w, h);
|
||||
}
|
||||
} catch(e) {
|
||||
console.error("Scanner Error:", e);
|
||||
defaultCorners(w, h); // Fallback
|
||||
}
|
||||
|
||||
$('#scanner-loading').hide();
|
||||
drawOverlay();
|
||||
}
|
||||
} else {
|
||||
defaultCorners(w, h);
|
||||
if (showAlert) {
|
||||
Swal.fire({
|
||||
icon: 'warning',
|
||||
title: 'Deteksi Gagal',
|
||||
text: 'Dokumen tidak terdeteksi. Silakan atur sudut secara manual.',
|
||||
confirmButtonText: 'OK'
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.warn("OpenCV not ready yet");
|
||||
defaultCorners(w, h);
|
||||
if (showAlert) {
|
||||
Swal.fire({
|
||||
icon: 'warning',
|
||||
title: 'Scanner Tidak Siap',
|
||||
text: 'OpenCV belum siap. Silakan atur sudut secara manual.',
|
||||
confirmButtonText: 'OK'
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch(e) {
|
||||
console.error("Scanner Error:", e);
|
||||
defaultCorners(w, h); // Fallback
|
||||
if (showAlert) {
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: 'Error Scanner',
|
||||
text: 'Terjadi kesalahan saat mendeteksi dokumen: ' + e.message,
|
||||
confirmButtonText: 'OK'
|
||||
});
|
||||
}
|
||||
}
|
||||
drawOverlay();
|
||||
}
|
||||
|
||||
function defaultCorners(w, h) {
|
||||
function initScanner() {
|
||||
// Resize Canvas to fit screen but keep aspect ratio
|
||||
var maxWidth = $('#modalScanner .modal-body').width() - 20;
|
||||
var maxHeight = $('#modalScanner .modal-body').height() - 20;
|
||||
|
||||
var scale = Math.min(maxWidth / originalImg.width, maxHeight / originalImg.height);
|
||||
var w = originalImg.width * scale;
|
||||
var h = originalImg.height * scale;
|
||||
|
||||
canvasImage.width = w;
|
||||
canvasImage.height = h;
|
||||
canvasOverlay.width = w;
|
||||
canvasOverlay.height = h;
|
||||
|
||||
// Resize container
|
||||
$('#scanner-container').css({ width: w, height: h, marginTop: '10px' });
|
||||
|
||||
// Draw Image
|
||||
ctxImg.drawImage(originalImg, 0, 0, w, h);
|
||||
|
||||
detectDocument(scale, w, h, false);
|
||||
$('#scanner-loading').hide();
|
||||
|
||||
// Prepare image for cropper
|
||||
var cropImage = document.getElementById('crop-image');
|
||||
cropImage.src = originalImg.src;
|
||||
|
||||
// Initialize cropper if in manual mode
|
||||
if (currentMode === 'manual' && typeof Cropper !== 'undefined') {
|
||||
initCropper();
|
||||
}
|
||||
}
|
||||
|
||||
function initCropper() {
|
||||
if (typeof Cropper === 'undefined') {
|
||||
console.error('Cropper.js not loaded');
|
||||
alert('Cropper library not loaded. Please refresh the page.');
|
||||
return;
|
||||
}
|
||||
|
||||
var cropImage = document.getElementById('crop-image');
|
||||
if (!cropImage.src) {
|
||||
console.warn('Crop image not loaded yet');
|
||||
return;
|
||||
}
|
||||
|
||||
// Destroy existing cropper
|
||||
if (cropper) {
|
||||
cropper.destroy();
|
||||
cropper = null;
|
||||
}
|
||||
|
||||
// Initialize new cropper with mobile-friendly options
|
||||
cropper = new Cropper(cropImage, {
|
||||
viewMode: 1,
|
||||
dragMode: 'crop',
|
||||
initialAspectRatio: 16 / 9,
|
||||
aspectRatio: NaN, // Free aspect ratio
|
||||
autoCrop: true,
|
||||
autoCropArea: 0.8,
|
||||
responsive: true,
|
||||
restore: true,
|
||||
checkCrossOrigin: false,
|
||||
highlight: false,
|
||||
cropBoxMovable: true,
|
||||
cropBoxResizable: true,
|
||||
toggleDragModeOnDblclick: false,
|
||||
minCanvasWidth: 100,
|
||||
minCanvasHeight: 100,
|
||||
minContainerWidth: 100,
|
||||
minContainerHeight: 100,
|
||||
minCropBoxWidth: 50,
|
||||
minCropBoxHeight: 50,
|
||||
|
||||
// Mobile touch settings
|
||||
touchDragZoom: true,
|
||||
wheelZoomRatio: 0.1,
|
||||
|
||||
ready: function() {
|
||||
// Adjust for mobile
|
||||
if (IS_TOUCH_DEVICE) {
|
||||
// Make handles larger for touch
|
||||
var points = this.cropper.cropBox.querySelectorAll('.cropper-point');
|
||||
points.forEach(function(point) {
|
||||
point.style.width = '30px';
|
||||
point.style.height = '30px';
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function destroyCropper() {
|
||||
if (cropper) {
|
||||
cropper.destroy();
|
||||
cropper = null;
|
||||
}
|
||||
}
|
||||
|
||||
function defaultCorners(w, h) {
|
||||
// Default 20% margin
|
||||
var mX = w * 0.1;
|
||||
var mY = h * 0.1;
|
||||
@@ -211,106 +582,225 @@ window.addEventListener('load', function() {
|
||||
};
|
||||
}
|
||||
|
||||
function isInside(pos, point) {
|
||||
var dx = pos.x - point.x;
|
||||
var dy = pos.y - point.y;
|
||||
return dx * dx + dy * dy <= POINT_RADIUS * POINT_RADIUS * 2; // Bigger hit area
|
||||
}
|
||||
function isInside(pos, point) {
|
||||
var dx = pos.x - point.x;
|
||||
var dy = pos.y - point.y;
|
||||
return dx * dx + dy * dy <= POINT_RADIUS * POINT_RADIUS * 2; // Bigger hit area
|
||||
}
|
||||
|
||||
function getClosestCorner(pos, isTouch) {
|
||||
var closestIdx = -1;
|
||||
var closestDist = Infinity;
|
||||
var radius = POINT_RADIUS * (isTouch ? TOUCH_RADIUS_MULTIPLIER : 1.5); // Larger radius for touch
|
||||
var radiusSq = radius * radius;
|
||||
|
||||
corners.forEach((p, i) => {
|
||||
var dx = pos.x - p.x;
|
||||
var dy = pos.y - p.y;
|
||||
var distSq = dx * dx + dy * dy;
|
||||
if (distSq < radiusSq && distSq < closestDist) {
|
||||
closestDist = distSq;
|
||||
closestIdx = i;
|
||||
}
|
||||
});
|
||||
return closestIdx;
|
||||
}
|
||||
|
||||
canvasOverlay.addEventListener('mousedown', function(e) { handleStart(getMousePos(e)); });
|
||||
canvasOverlay.addEventListener('touchstart', function(e) { handleStart(getMousePos(e)); e.preventDefault(); }, {passive: false});
|
||||
canvasOverlay.addEventListener('mousedown', function(e) {
|
||||
handleStart(getMousePos(e), false);
|
||||
e.stopPropagation();
|
||||
});
|
||||
canvasOverlay.addEventListener('touchstart', function(e) {
|
||||
var pos = getMousePos(e);
|
||||
handleStart(pos, true);
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
}, {passive: false});
|
||||
|
||||
window.addEventListener('mousemove', function(e) { if(isDragging) handleMove(getMousePos(e)); }); // Window to catch drag out
|
||||
canvasOverlay.addEventListener('touchmove', function(e) { if(isDragging) handleMove(getMousePos(e)); e.preventDefault(); }, {passive: false});
|
||||
window.addEventListener('mousemove', function(e) { if(isDragging) handleMove(getMousePos(e)); }); // Window to catch drag out
|
||||
canvasOverlay.addEventListener('touchmove', function(e) {
|
||||
if(isDragging) {
|
||||
handleMove(getMousePos(e));
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
}
|
||||
}, {passive: false});
|
||||
|
||||
window.addEventListener('mouseup', function() { handleEnd(); });
|
||||
window.addEventListener('touchend', function() { handleEnd(); });
|
||||
|
||||
function handleStart(pos) {
|
||||
activePoint = null;
|
||||
corners.forEach((p, i) => {
|
||||
if (isInside(pos, p)) {
|
||||
activePoint = i;
|
||||
isDragging = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
function handleStart(pos, isTouch = false) {
|
||||
activePoint = getClosestCorner(pos, isTouch);
|
||||
if (activePoint !== -1) {
|
||||
isTouchInteraction = isTouch;
|
||||
touchOffset = { x: pos.x - corners[activePoint].x, y: pos.y - corners[activePoint].y };
|
||||
if (isTouch) {
|
||||
touchStartPos = pos;
|
||||
// Start dragging immediately but handle slop in handleMove
|
||||
isDragging = true;
|
||||
} else {
|
||||
isDragging = true;
|
||||
touchStartPos = null;
|
||||
}
|
||||
} else {
|
||||
activePoint = null;
|
||||
isDragging = false;
|
||||
isTouchInteraction = false;
|
||||
touchStartPos = null;
|
||||
touchOffset = null;
|
||||
}
|
||||
}
|
||||
|
||||
function handleMove(pos) {
|
||||
if (activePoint !== null) {
|
||||
// Constrain to canvas?? Optional but good
|
||||
corners[activePoint].x = pos.x;
|
||||
corners[activePoint].y = pos.y;
|
||||
drawOverlay();
|
||||
}
|
||||
}
|
||||
|
||||
function handleEnd() {
|
||||
isDragging = false;
|
||||
activePoint = null;
|
||||
}
|
||||
|
||||
// --- Rotate Functions ---
|
||||
function rotateImage(degree) {
|
||||
var offCanvas = document.createElement('canvas');
|
||||
var offCtx = offCanvas.getContext('2d');
|
||||
|
||||
// Swap Width/Height for 90 degree rotation
|
||||
offCanvas.width = originalImg.height;
|
||||
offCanvas.height = originalImg.width;
|
||||
|
||||
offCtx.translate(offCanvas.width / 2, offCanvas.height / 2);
|
||||
offCtx.rotate(degree * Math.PI / 180);
|
||||
offCtx.drawImage(originalImg, -originalImg.width / 2, -originalImg.height / 2);
|
||||
|
||||
// Update originalImg
|
||||
var rotatedUrl = offCanvas.toDataURL();
|
||||
originalImg.onload = function() {
|
||||
initScanner(); // Re-init with new image
|
||||
}
|
||||
originalImg.src = rotatedUrl;
|
||||
}
|
||||
|
||||
$('#btnScanRotateLeft').click(function() { rotateImage(-90); });
|
||||
$('#btnScanRotateRight').click(function() { rotateImage(90); });
|
||||
|
||||
// --- Reset Button ---
|
||||
$('#btnScanReset').click(function() {
|
||||
initScanner();
|
||||
});
|
||||
|
||||
// --- Save / Extract Button ---
|
||||
$('#btnScanSave').click(function() {
|
||||
// Warp Image
|
||||
try {
|
||||
// 1. Get raw points relative to Original Image
|
||||
var scaleX = originalImg.width / canvasImage.width;
|
||||
var scaleY = originalImg.height / canvasImage.height;
|
||||
function handleMove(pos) {
|
||||
if (activePoint !== null) {
|
||||
// Touch slop detection
|
||||
if (isTouchInteraction && touchStartPos) {
|
||||
var dx = pos.x - touchStartPos.x;
|
||||
var dy = pos.y - touchStartPos.y;
|
||||
var distSq = dx * dx + dy * dy;
|
||||
if (distSq < TOUCH_SLOP * TOUCH_SLOP) {
|
||||
return; // Ignore small movements until slop exceeded
|
||||
}
|
||||
// Slop exceeded, clear touchStartPos so we don't check again
|
||||
touchStartPos = null;
|
||||
}
|
||||
|
||||
var tl = { x: corners[0].x * scaleX, y: corners[0].y * scaleY };
|
||||
var tr = { x: corners[1].x * scaleX, y: corners[1].y * scaleY };
|
||||
var br = { x: corners[2].x * scaleX, y: corners[2].y * scaleY };
|
||||
var bl = { x: corners[3].x * scaleX, y: corners[3].y * scaleY };
|
||||
// Apply offset to maintain relative position
|
||||
if (touchOffset) {
|
||||
corners[activePoint].x = pos.x - touchOffset.x;
|
||||
corners[activePoint].y = pos.y - touchOffset.y;
|
||||
} else {
|
||||
corners[activePoint].x = pos.x;
|
||||
corners[activePoint].y = pos.y;
|
||||
}
|
||||
|
||||
// 2. Calculate dimensions of the crop area
|
||||
var widthTop = Math.hypot(tr.x - tl.x, tr.y - tl.y);
|
||||
var widthBottom = Math.hypot(br.x - bl.x, br.y - bl.y);
|
||||
var outputWidth = Math.max(widthTop, widthBottom);
|
||||
// Optional: constrain to canvas bounds
|
||||
var w = canvasOverlay.width;
|
||||
var h = canvasOverlay.height;
|
||||
corners[activePoint].x = Math.max(0, Math.min(w, corners[activePoint].x));
|
||||
corners[activePoint].y = Math.max(0, Math.min(h, corners[activePoint].y));
|
||||
|
||||
var heightLeft = Math.hypot(bl.x - tl.x, bl.y - tl.y);
|
||||
var heightRight = Math.hypot(br.x - tr.x, br.y - tr.y);
|
||||
var outputHeight = Math.max(heightLeft, heightRight);
|
||||
drawOverlay();
|
||||
}
|
||||
}
|
||||
|
||||
var extractPoints = {
|
||||
topLeftCorner: tl,
|
||||
topRightCorner: tr,
|
||||
bottomRightCorner: br,
|
||||
bottomLeftCorner: bl
|
||||
};
|
||||
function handleEnd() {
|
||||
isDragging = false;
|
||||
activePoint = null;
|
||||
isTouchInteraction = false;
|
||||
touchStartPos = null;
|
||||
touchOffset = null;
|
||||
}
|
||||
|
||||
// --- Rotate Functions ---
|
||||
function rotateImage(degree) {
|
||||
var offCanvas = document.createElement('canvas');
|
||||
var offCtx = offCanvas.getContext('2d');
|
||||
|
||||
// Swap Width/Height for 90 degree rotation
|
||||
offCanvas.width = originalImg.height;
|
||||
offCanvas.height = originalImg.width;
|
||||
|
||||
offCtx.translate(offCanvas.width / 2, offCanvas.height / 2);
|
||||
offCtx.rotate(degree * Math.PI / 180);
|
||||
offCtx.drawImage(originalImg, -originalImg.width / 2, -originalImg.height / 2);
|
||||
|
||||
// Update originalImg
|
||||
var rotatedUrl = offCanvas.toDataURL();
|
||||
originalImg.onload = function() {
|
||||
// Re-init scanner for both modes
|
||||
if (currentMode === 'smart') {
|
||||
initScanner();
|
||||
} else {
|
||||
// Update cropper image
|
||||
var cropImage = document.getElementById('crop-image');
|
||||
cropImage.src = rotatedUrl;
|
||||
|
||||
// Reinitialize cropper
|
||||
if (cropper) {
|
||||
cropper.destroy();
|
||||
}
|
||||
initCropper();
|
||||
}
|
||||
}
|
||||
originalImg.src = rotatedUrl;
|
||||
}
|
||||
|
||||
$('#btnScanRotateLeft').click(function() { rotateImage(-90); });
|
||||
$('#btnScanRotateRight').click(function() { rotateImage(90); });
|
||||
|
||||
// --- Reset Button ---
|
||||
$('#btnScanReset').click(function() {
|
||||
initScanner();
|
||||
});
|
||||
|
||||
// --- Crop Reset Button ---
|
||||
$('#btnCropReset').click(function() {
|
||||
if (cropper) {
|
||||
cropper.reset();
|
||||
}
|
||||
});
|
||||
|
||||
// --- Save / Extract Button ---
|
||||
$('#btnScanSave').click(function() {
|
||||
try {
|
||||
var base64;
|
||||
|
||||
// 3. Extract with dynamic dimensions
|
||||
var resultCanvas = scanner.extractPaper(originalImg, outputWidth, outputHeight, extractPoints);
|
||||
var base64 = resultCanvas.toDataURL('image/jpeg');
|
||||
if (currentMode === 'smart') {
|
||||
// Smart Scan Mode - Use jscanify
|
||||
// 1. Get raw points relative to Original Image
|
||||
var scaleX = originalImg.width / canvasImage.width;
|
||||
var scaleY = originalImg.height / canvasImage.height;
|
||||
|
||||
var tl = { x: corners[0].x * scaleX, y: corners[0].y * scaleY };
|
||||
var tr = { x: corners[1].x * scaleX, y: corners[1].y * scaleY };
|
||||
var br = { x: corners[2].x * scaleX, y: corners[2].y * scaleY };
|
||||
var bl = { x: corners[3].x * scaleX, y: corners[3].y * scaleY };
|
||||
|
||||
// 2. Calculate dimensions of the crop area
|
||||
var widthTop = Math.hypot(tr.x - tl.x, tr.y - tl.y);
|
||||
var widthBottom = Math.hypot(br.x - bl.x, br.y - bl.y);
|
||||
var outputWidth = Math.max(widthTop, widthBottom);
|
||||
|
||||
var heightLeft = Math.hypot(bl.x - tl.x, bl.y - tl.y);
|
||||
var heightRight = Math.hypot(br.x - tr.x, br.y - tr.y);
|
||||
var outputHeight = Math.max(heightLeft, heightRight);
|
||||
|
||||
var extractPoints = {
|
||||
topLeftCorner: tl,
|
||||
topRightCorner: tr,
|
||||
bottomRightCorner: br,
|
||||
bottomLeftCorner: bl
|
||||
};
|
||||
|
||||
// 3. Extract with dynamic dimensions
|
||||
var resultCanvas = null;
|
||||
if (scanner && scanner.extractPaper) {
|
||||
resultCanvas = scanner.extractPaper(originalImg, outputWidth, outputHeight, extractPoints);
|
||||
} else {
|
||||
alert("Scanner library not loaded. Please refresh the page.");
|
||||
return;
|
||||
}
|
||||
base64 = resultCanvas.toDataURL('image/jpeg');
|
||||
|
||||
} else {
|
||||
// Manual Crop Mode - Use cropper.js
|
||||
if (!cropper) {
|
||||
alert("Cropper not initialized. Please try again.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Get cropped canvas
|
||||
var canvas = cropper.getCroppedCanvas({
|
||||
width: originalImg.width,
|
||||
height: originalImg.height,
|
||||
fillColor: '#fff',
|
||||
imageSmoothingEnabled: true,
|
||||
imageSmoothingQuality: 'high'
|
||||
});
|
||||
|
||||
base64 = canvas.toDataURL('image/jpeg');
|
||||
}
|
||||
|
||||
if (window.handleScannerResult) {
|
||||
window.handleScannerResult(base64);
|
||||
@@ -318,10 +808,25 @@ window.addEventListener('load', function() {
|
||||
|
||||
scannerModal.modal('hide');
|
||||
|
||||
} catch (e) {
|
||||
alert("Gagal memproses gambar: " + e.message);
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
alert("Gagal memproses gambar: " + e.message);
|
||||
console.error(e);
|
||||
}
|
||||
});
|
||||
|
||||
// Show mobile help if touch device
|
||||
if (IS_TOUCH_DEVICE) {
|
||||
$('#mobile-help').removeClass('d-none');
|
||||
}
|
||||
|
||||
// Set initial mode based on device
|
||||
setTimeout(function() {
|
||||
var initialMode = IS_TOUCH_DEVICE ? 'manual' : 'smart';
|
||||
var button = $('#scannerModeToggle button[data-mode="' + initialMode + '"]');
|
||||
if (button.length) {
|
||||
button.click();
|
||||
}
|
||||
}, 100);
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
||||
2
dist/css/modern.css
vendored
2
dist/css/modern.css
vendored
@@ -15,7 +15,7 @@ body {
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
transform: translateY(-2px);
|
||||
/* transform: translateY(-2px); */
|
||||
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important;
|
||||
}
|
||||
|
||||
|
||||
547
home/admin.php
547
home/admin.php
@@ -78,157 +78,157 @@
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-info">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $pend; ?>
|
||||
</h3>
|
||||
|
||||
<p>Penduduk</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-person-add"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pend" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-info" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $pend; ?>
|
||||
</h3>
|
||||
|
||||
<p>Penduduk</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-person-add"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pend" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ./col -->
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-success">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $kartu; ?>
|
||||
</h3>
|
||||
|
||||
<p>Kartu Keluarga</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-card"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-kartu" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-success" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-kartu'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $kartu; ?>
|
||||
</h3>
|
||||
|
||||
<p>Kartu Keluarga</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-card"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-kartu" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ./col -->
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $laki; ?>
|
||||
</h3>
|
||||
|
||||
<p>Laki-laki</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-male"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pend&jekel=LK" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&jekel=LK'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $laki; ?>
|
||||
</h3>
|
||||
|
||||
<p>Laki-laki</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-male"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pend&jekel=LK" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ./col -->
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-warning">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $prem; ?>
|
||||
</h3>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-warning" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&jekel=PR'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $prem; ?>
|
||||
</h3>
|
||||
|
||||
<p>Perempuan</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-female"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pend&jekel=PR" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>Perempuan</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-female"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pend&jekel=PR" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-info">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $lahir; ?>
|
||||
</h3>
|
||||
|
||||
<p>Lahir</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-happy"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-lahir" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-info" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-lahir'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $lahir; ?>
|
||||
</h3>
|
||||
|
||||
<p>Lahir</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-happy"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-lahir" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ./col -->
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-success">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $mendu; ?>
|
||||
</h3>
|
||||
|
||||
<p>Meninggal</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-sad"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-mendu" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-success" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-mendu'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $mendu; ?>
|
||||
</h3>
|
||||
|
||||
<p>Meninggal</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-sad"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-mendu" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ./col -->
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $datang; ?>
|
||||
</h3>
|
||||
|
||||
<p>Pendatang</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-download"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-datang" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-datang'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $datang; ?>
|
||||
</h3>
|
||||
|
||||
<p>Pendatang</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-download"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-datang" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ./col -->
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-warning">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $pindah; ?>
|
||||
</h3>
|
||||
|
||||
<p>Pindah</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-upload"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pindah" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-warning" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pindah'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $pindah; ?>
|
||||
</h3>
|
||||
|
||||
<p>Pindah</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-upload"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pindah" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -245,111 +245,164 @@
|
||||
<!-- Right Col: Demographics -->
|
||||
<div class="col-lg-6">
|
||||
<div class="row">
|
||||
<!-- Balita -->
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="small-box bg-info">
|
||||
<div class="inner">
|
||||
<h3><?php echo $balita; ?></h3>
|
||||
<p>Balita (0-5)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-baby"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Balita" class="small-box-footer">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Anak -->
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="small-box bg-success">
|
||||
<div class="inner">
|
||||
<h3><?php echo $anak; ?></h3>
|
||||
<p>Anak (6-12)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-child"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Anak" class="small-box-footer">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Remaja -->
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="small-box bg-purple">
|
||||
<div class="inner">
|
||||
<h3><?php echo $remaja; ?></h3>
|
||||
<p>Remaja (13-17)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-user-graduate"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Remaja" class="small-box-footer">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Dewasa -->
|
||||
<div class="col-lg-6 col-6">
|
||||
<div class="small-box bg-primary">
|
||||
<div class="inner">
|
||||
<h3><?php echo $dewasa; ?></h3>
|
||||
<p>Dewasa (18-59)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-user-tie"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Dewasa" class="small-box-footer">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Lansia -->
|
||||
<div class="col-lg-6 col-6">
|
||||
<div class="small-box bg-secondary">
|
||||
<div class="inner">
|
||||
<h3><?php echo $lansia; ?></h3>
|
||||
<p>Lansia (>60)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-blind"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Lansia" class="small-box-footer">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Balita -->
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="small-box bg-info" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&kategori=Balita'">
|
||||
<div class="inner">
|
||||
<h3><?php echo $balita; ?></h3>
|
||||
<p>Balita (0-5)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-baby"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Balita" class="small-box-footer" onclick="event.stopPropagation();">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Anak -->
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="small-box bg-success" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&kategori=Anak'">
|
||||
<div class="inner">
|
||||
<h3><?php echo $anak; ?></h3>
|
||||
<p>Anak (6-12)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-child"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Anak" class="small-box-footer" onclick="event.stopPropagation();">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Remaja -->
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="small-box bg-purple" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&kategori=Remaja'">
|
||||
<div class="inner">
|
||||
<h3><?php echo $remaja; ?></h3>
|
||||
<p>Remaja (13-17)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-user-graduate"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Remaja" class="small-box-footer" onclick="event.stopPropagation();">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Dewasa -->
|
||||
<div class="col-lg-6 col-6">
|
||||
<div class="small-box bg-primary" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&kategori=Dewasa'">
|
||||
<div class="inner">
|
||||
<h3><?php echo $dewasa; ?></h3>
|
||||
<p>Dewasa (18-59)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-user-tie"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Dewasa" class="small-box-footer" onclick="event.stopPropagation();">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Lansia -->
|
||||
<div class="col-lg-6 col-6">
|
||||
<div class="small-box bg-secondary" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&kategori=Lansia'">
|
||||
<div class="inner">
|
||||
<h3><?php echo $lansia; ?></h3>
|
||||
<p>Lansia (>60)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-blind"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Lansia" class="small-box-footer" onclick="event.stopPropagation();">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
// Data from PHP
|
||||
var donutChartCanvas = $('#donutChart').get(0).getContext('2d')
|
||||
var donutData = {
|
||||
labels: [
|
||||
'Balita',
|
||||
'Anak-anak',
|
||||
'Remaja',
|
||||
'Dewasa',
|
||||
'Lansia'
|
||||
],
|
||||
datasets: [
|
||||
{
|
||||
data: [
|
||||
<?php echo $balita; ?>,
|
||||
<?php echo $anak; ?>,
|
||||
<?php echo $remaja; ?>,
|
||||
<?php echo $dewasa; ?>,
|
||||
<?php echo $lansia; ?>
|
||||
],
|
||||
backgroundColor : ['#17a2b8', '#28a745', '#6f42c1', '#007bff', '#6c757d'],
|
||||
}
|
||||
]
|
||||
}
|
||||
var donutOptions = {
|
||||
maintainAspectRatio : false,
|
||||
responsive : true,
|
||||
plugins: {
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Komposisi Penduduk Berdasarkan Usia',
|
||||
font: {
|
||||
size: 16
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
display: true,
|
||||
position: 'right'
|
||||
}
|
||||
}
|
||||
}
|
||||
new Chart(donutChartCanvas, {
|
||||
type: 'doughnut',
|
||||
data: donutData,
|
||||
options: donutOptions
|
||||
})
|
||||
});
|
||||
<script>
|
||||
window.addEventListener('load', function() {
|
||||
console.log('Page fully loaded - Checking libraries...');
|
||||
console.log('jQuery available?', typeof $);
|
||||
console.log('Chart.js available?', typeof Chart);
|
||||
|
||||
// Check if jQuery is loaded
|
||||
if (typeof $ === 'undefined') {
|
||||
console.error('jQuery is not loaded. Chart cannot be initialized.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if Chart.js is loaded
|
||||
if (typeof Chart === 'undefined') {
|
||||
console.error('Chart.js is not loaded. Check if the script is loaded correctly.');
|
||||
// Try to load Chart.js dynamically as fallback
|
||||
var script = document.createElement('script');
|
||||
script.src = 'plugins/vendor/chartjs/chart-3.9.1.min.js';
|
||||
script.onload = function() {
|
||||
console.log('Chart.js loaded dynamically, initializing chart...');
|
||||
initializeChart();
|
||||
};
|
||||
document.head.appendChild(script);
|
||||
} else {
|
||||
initializeChart();
|
||||
}
|
||||
|
||||
function initializeChart() {
|
||||
console.log('Initializing chart...');
|
||||
|
||||
// Check if canvas exists
|
||||
var canvas = document.getElementById('donutChart');
|
||||
if (!canvas) {
|
||||
console.error('Canvas element with id "donutChart" not found');
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if jQuery can get the canvas
|
||||
var $canvas = $('#donutChart');
|
||||
if ($canvas.length === 0) {
|
||||
console.error('jQuery cannot find canvas with id "donutChart"');
|
||||
return;
|
||||
}
|
||||
|
||||
// Get context
|
||||
var donutChartCanvas = $canvas.get(0).getContext('2d');
|
||||
if (!donutChartCanvas) {
|
||||
console.error('Could not get 2d context from canvas');
|
||||
return;
|
||||
}
|
||||
|
||||
// Data from PHP
|
||||
var donutData = {
|
||||
labels: [
|
||||
'Balita',
|
||||
'Anak-anak',
|
||||
'Remaja',
|
||||
'Dewasa',
|
||||
'Lansia'
|
||||
],
|
||||
datasets: [{
|
||||
data: [
|
||||
<?php echo $balita; ?>,
|
||||
<?php echo $anak; ?>,
|
||||
<?php echo $remaja; ?>,
|
||||
<?php echo $dewasa; ?>,
|
||||
<?php echo $lansia; ?>
|
||||
],
|
||||
backgroundColor: ['#17a2b8', '#28a745', '#6f42c1', '#007bff', '#6c757d']
|
||||
}]
|
||||
};
|
||||
|
||||
var donutOptions = {
|
||||
maintainAspectRatio: false,
|
||||
responsive: true,
|
||||
plugins: {
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Komposisi Penduduk Berdasarkan Usia',
|
||||
font: { size: 16 }
|
||||
},
|
||||
legend: {
|
||||
display: true,
|
||||
position: 'right'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
new Chart(donutChartCanvas, {
|
||||
type: 'doughnut',
|
||||
data: donutData,
|
||||
options: donutOptions
|
||||
});
|
||||
console.log('Chart initialized successfully');
|
||||
} catch (error) {
|
||||
console.error('Error initializing chart:', error);
|
||||
console.error('Error details:', error.message, error.stack);
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
519
home/kaur.php
519
home/kaur.php
@@ -78,157 +78,157 @@
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-info">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $pend; ?>
|
||||
</h3>
|
||||
|
||||
<p>Penduduk</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-person-add"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pend" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-info" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $pend; ?>
|
||||
</h3>
|
||||
|
||||
<p>Penduduk</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-person-add"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pend" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ./col -->
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-success">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $kartu; ?>
|
||||
</h3>
|
||||
|
||||
<p>Kartu Keluarga</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-card"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-kartu" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-success" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-kartu'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $kartu; ?>
|
||||
</h3>
|
||||
|
||||
<p>Kartu Keluarga</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-card"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-kartu" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ./col -->
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $laki; ?>
|
||||
</h3>
|
||||
|
||||
<p>Laki-laki</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-male"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pend&jekel=LK" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&jekel=LK'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $laki; ?>
|
||||
</h3>
|
||||
|
||||
<p>Laki-laki</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-male"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pend&jekel=LK" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ./col -->
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-warning">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $prem; ?>
|
||||
</h3>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-warning" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&jekel=PR'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $prem; ?>
|
||||
</h3>
|
||||
|
||||
<p>Perempuan</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-female"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pend&jekel=PR" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>Perempuan</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-female"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pend&jekel=PR" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-info">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $lahir; ?>
|
||||
</h3>
|
||||
|
||||
<p>Lahir</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-happy"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-lahir" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-info" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-lahir'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $lahir; ?>
|
||||
</h3>
|
||||
|
||||
<p>Lahir</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-happy"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-lahir" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ./col -->
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-success">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $mendu; ?>
|
||||
</h3>
|
||||
|
||||
<p>Meninggal</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-sad"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-mendu" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-success" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-mendu'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $mendu; ?>
|
||||
</h3>
|
||||
|
||||
<p>Meninggal</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-sad"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-mendu" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ./col -->
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $datang; ?>
|
||||
</h3>
|
||||
|
||||
<p>Pendatang</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-download"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-datang" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-red" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-datang'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $datang; ?>
|
||||
</h3>
|
||||
|
||||
<p>Pendatang</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-download"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-datang" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ./col -->
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-warning">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $pindah; ?>
|
||||
</h3>
|
||||
|
||||
<p>Pindah</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-upload"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pindah" class="small-box-footer">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-warning" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pindah'">
|
||||
<div class="inner">
|
||||
<h3>
|
||||
<?php echo $pindah; ?>
|
||||
</h3>
|
||||
|
||||
<p>Pindah</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-android-upload"></i>
|
||||
</div>
|
||||
<a href="index.php?page=data-pindah" class="small-box-footer" onclick="event.stopPropagation();">Selengkapnya
|
||||
<i class="fas fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -245,111 +245,136 @@
|
||||
<!-- Right Col: Demographics -->
|
||||
<div class="col-lg-6">
|
||||
<div class="row">
|
||||
<!-- Balita -->
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="small-box bg-info">
|
||||
<div class="inner">
|
||||
<h3><?php echo $balita; ?></h3>
|
||||
<p>Balita (0-5)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-baby"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Balita" class="small-box-footer">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Anak -->
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="small-box bg-success">
|
||||
<div class="inner">
|
||||
<h3><?php echo $anak; ?></h3>
|
||||
<p>Anak (6-12)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-child"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Anak" class="small-box-footer">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Remaja -->
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="small-box bg-purple">
|
||||
<div class="inner">
|
||||
<h3><?php echo $remaja; ?></h3>
|
||||
<p>Remaja (13-17)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-user-graduate"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Remaja" class="small-box-footer">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Dewasa -->
|
||||
<div class="col-lg-6 col-6">
|
||||
<div class="small-box bg-primary">
|
||||
<div class="inner">
|
||||
<h3><?php echo $dewasa; ?></h3>
|
||||
<p>Dewasa (18-59)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-user-tie"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Dewasa" class="small-box-footer">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Lansia -->
|
||||
<div class="col-lg-6 col-6">
|
||||
<div class="small-box bg-secondary">
|
||||
<div class="inner">
|
||||
<h3><?php echo $lansia; ?></h3>
|
||||
<p>Lansia (>60)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-blind"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Lansia" class="small-box-footer">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Balita -->
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="small-box bg-info" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&kategori=Balita'">
|
||||
<div class="inner">
|
||||
<h3><?php echo $balita; ?></h3>
|
||||
<p>Balita (0-5)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-baby"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Balita" class="small-box-footer" onclick="event.stopPropagation();">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Anak -->
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="small-box bg-success" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&kategori=Anak'">
|
||||
<div class="inner">
|
||||
<h3><?php echo $anak; ?></h3>
|
||||
<p>Anak (6-12)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-child"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Anak" class="small-box-footer" onclick="event.stopPropagation();">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Remaja -->
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="small-box bg-purple" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&kategori=Remaja'">
|
||||
<div class="inner">
|
||||
<h3><?php echo $remaja; ?></h3>
|
||||
<p>Remaja (13-17)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-user-graduate"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Remaja" class="small-box-footer" onclick="event.stopPropagation();">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Dewasa -->
|
||||
<div class="col-lg-6 col-6">
|
||||
<div class="small-box bg-primary" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&kategori=Dewasa'">
|
||||
<div class="inner">
|
||||
<h3><?php echo $dewasa; ?></h3>
|
||||
<p>Dewasa (18-59)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-user-tie"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Dewasa" class="small-box-footer" onclick="event.stopPropagation();">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Lansia -->
|
||||
<div class="col-lg-6 col-6">
|
||||
<div class="small-box bg-secondary" style="cursor: pointer;" onclick="window.location.href='index.php?page=data-pend&kategori=Lansia'">
|
||||
<div class="inner">
|
||||
<h3><?php echo $lansia; ?></h3>
|
||||
<p>Lansia (>60)</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fas fa-blind"></i></div>
|
||||
<a href="index.php?page=data-pend&kategori=Lansia" class="small-box-footer" onclick="event.stopPropagation();">Info <i class="fas fa-arrow-circle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
// Data from PHP
|
||||
var donutChartCanvas = $('#donutChart').get(0).getContext('2d')
|
||||
var donutData = {
|
||||
labels: [
|
||||
'Balita',
|
||||
'Anak-anak',
|
||||
'Remaja',
|
||||
'Dewasa',
|
||||
'Lansia'
|
||||
],
|
||||
datasets: [
|
||||
{
|
||||
data: [
|
||||
<?php echo $balita; ?>,
|
||||
<?php echo $anak; ?>,
|
||||
<?php echo $remaja; ?>,
|
||||
<?php echo $dewasa; ?>,
|
||||
<?php echo $lansia; ?>
|
||||
],
|
||||
backgroundColor : ['#17a2b8', '#28a745', '#6f42c1', '#007bff', '#6c757d'],
|
||||
}
|
||||
]
|
||||
}
|
||||
var donutOptions = {
|
||||
maintainAspectRatio : false,
|
||||
responsive : true,
|
||||
plugins: {
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Komposisi Penduduk Berdasarkan Usia',
|
||||
font: {
|
||||
size: 16
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
display: true,
|
||||
position: 'right'
|
||||
}
|
||||
}
|
||||
}
|
||||
new Chart(donutChartCanvas, {
|
||||
type: 'doughnut',
|
||||
data: donutData,
|
||||
options: donutOptions
|
||||
})
|
||||
});
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
console.log('DOMContentLoaded - Chart.js available?', typeof Chart);
|
||||
|
||||
// Check if Chart.js is loaded
|
||||
if (typeof Chart === 'undefined') {
|
||||
console.error('Chart.js is not loaded. Check if the script is loaded correctly.');
|
||||
// Try to load Chart.js dynamically as fallback
|
||||
var script = document.createElement('script');
|
||||
script.src = 'plugins/vendor/chartjs/chart.min.js';
|
||||
script.onload = function() {
|
||||
console.log('Chart.js loaded dynamically, initializing chart...');
|
||||
initializeChart();
|
||||
};
|
||||
document.head.appendChild(script);
|
||||
} else {
|
||||
initializeChart();
|
||||
}
|
||||
|
||||
function initializeChart() {
|
||||
console.log('Initializing chart...');
|
||||
// Data from PHP
|
||||
var donutChartCanvas = $('#donutChart').get(0).getContext('2d')
|
||||
var donutData = {
|
||||
labels: [
|
||||
'Balita',
|
||||
'Anak-anak',
|
||||
'Remaja',
|
||||
'Dewasa',
|
||||
'Lansia'
|
||||
],
|
||||
datasets: [
|
||||
{
|
||||
data: [
|
||||
<?php echo $balita; ?>,
|
||||
<?php echo $anak; ?>,
|
||||
<?php echo $remaja; ?>,
|
||||
<?php echo $dewasa; ?>,
|
||||
<?php echo $lansia; ?>
|
||||
],
|
||||
backgroundColor : ['#17a2b8', '#28a745', '#6f42c1', '#007bff', '#6c757d'],
|
||||
}
|
||||
]
|
||||
}
|
||||
var donutOptions = {
|
||||
maintainAspectRatio : false,
|
||||
responsive : true,
|
||||
plugins: {
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Komposisi Penduduk Berdasarkan Usia',
|
||||
font: {
|
||||
size: 16
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
display: true,
|
||||
position: 'right'
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
new Chart(donutChartCanvas, {
|
||||
type: 'doughnut',
|
||||
data: donutData,
|
||||
options: donutOptions
|
||||
});
|
||||
console.log('Chart initialized successfully');
|
||||
} catch (error) {
|
||||
console.error('Error initializing chart:', error);
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -1,2 +1,14 @@
|
||||
<?php
|
||||
$koneksi = new mysqli ("localhost","sidak_user","sidak_pass","data_penduduk");
|
||||
<?php
|
||||
$db_host = getenv("DB_HOST") ?: "localhost";
|
||||
$db_user = getenv("DB_USER") ?: "sidak_user";
|
||||
$db_pass = getenv("DB_PASS") ?: "sidak_pass";
|
||||
$db_name = getenv("DB_NAME") ?: "data_penduduk";
|
||||
|
||||
$koneksi = new mysqli($db_host, $db_user, $db_pass, $db_name);
|
||||
|
||||
if ($koneksi->connect_error) {
|
||||
die("Koneksi database gagal: " . $koneksi->connect_error);
|
||||
}
|
||||
|
||||
$koneksi->set_charset("utf8mb4");
|
||||
|
||||
|
||||
118
index.php
118
index.php
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
//Mulai Sesion
|
||||
session_start();
|
||||
if (isset($_SESSION["ses_username"])==""){
|
||||
@@ -9,6 +10,11 @@
|
||||
$data_nama = $_SESSION["ses_nama"];
|
||||
$data_user = $_SESSION["ses_username"];
|
||||
$data_level = $_SESSION["ses_level"];
|
||||
$level_map = [
|
||||
'admin' => 'Administrator',
|
||||
'kaur' => 'Kaur Pemerintah'
|
||||
];
|
||||
$data_level_display = isset($level_map[$data_level]) ? $level_map[$data_level] : $data_level;
|
||||
}
|
||||
|
||||
//KONEKSI DB
|
||||
@@ -29,7 +35,7 @@
|
||||
<!-- Font Awesome -->
|
||||
<link rel="stylesheet" href="plugins/fontawesome-free/css/all.min.css">
|
||||
<!-- Ionicons -->
|
||||
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
|
||||
<link rel="stylesheet" href="plugins/vendor/ionicons/css/ionicons.min.css">
|
||||
<!-- DataTables -->
|
||||
<link rel="stylesheet" href="plugins/datatables-bs4/css/dataTables.bootstrap4.css">
|
||||
<!-- overlayScrollbars -->
|
||||
@@ -38,9 +44,9 @@
|
||||
<link rel="stylesheet" href="plugins/select2/css/select2.min.css">
|
||||
<link rel="stylesheet" href="plugins/select2-bootstrap4-theme/select2-bootstrap4.min.css">
|
||||
<!-- Cropper.js -->
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.5.13/cropper.min.css" rel="stylesheet">
|
||||
<link href="plugins/vendor/cropperjs/css/cropper.min.css" rel="stylesheet">
|
||||
<!-- Google Font: Source Sans Pro -->
|
||||
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
|
||||
<link href="plugins/vendor/google-fonts/source-sans-pro/css/fonts-local.css" rel="stylesheet">
|
||||
<!-- Modern CSS -->
|
||||
<link rel="stylesheet" href="dist/css/modern.css">
|
||||
<!-- Alert -->
|
||||
@@ -97,7 +103,7 @@
|
||||
<?php echo $data_nama; ?>
|
||||
</a>
|
||||
<span class="badge badge-success">
|
||||
<?php echo $data_level; ?>
|
||||
<?php echo $data_level_display; ?>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -108,7 +114,7 @@
|
||||
|
||||
<!-- Level -->
|
||||
<?php
|
||||
if ($data_level=="Administrator"){
|
||||
if ($data_level=="admin"){
|
||||
?>
|
||||
<li class="nav-item">
|
||||
<a href="index.php" class="nav-link">
|
||||
@@ -299,7 +305,7 @@
|
||||
</li>
|
||||
|
||||
<?php
|
||||
} elseif($data_level=="Kaur Pemerintah"){
|
||||
} elseif($data_level=="kaur"){
|
||||
?>
|
||||
|
||||
<li class="nav-item">
|
||||
@@ -383,31 +389,31 @@
|
||||
<ul class="nav nav-treeview">
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="#" class="nav-link">
|
||||
<a href="?page=suket-domisili" class="nav-link">
|
||||
<i class="nav-icon far fa-circle text-warning"></i>
|
||||
<p>Su-Ket Domisili</p>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#" class="nav-link">
|
||||
<a href="?page=suket-lahir" class="nav-link">
|
||||
<i class="nav-icon far fa-circle text-warning"></i>
|
||||
<p>Su-Ket Kelahiran</p>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#" class="nav-link">
|
||||
<a href="?page=suket-mati" class="nav-link">
|
||||
<i class="nav-icon far fa-circle text-warning"></i>
|
||||
<p>Su-Ket Kematian</p>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#" class="nav-link">
|
||||
<a href="?page=suket-datang" class="nav-link">
|
||||
<i class="nav-icon far fa-circle text-warning"></i>
|
||||
<p>Su-Ket Pendatang</p>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#" class="nav-link">
|
||||
<a href="?page=suket-pindah" class="nav-link">
|
||||
<i class="nav-icon far fa-circle text-warning"></i>
|
||||
<p>Su-Ket Pindah</p>
|
||||
</a>
|
||||
@@ -477,7 +483,7 @@
|
||||
?>
|
||||
|
||||
<li class="nav-item">
|
||||
<a onclick="return confirm('Apakah anda yakin akan keluar ?')" href="logout.php" class="nav-link">
|
||||
<a href="logout.php" class="nav-link logout-link">
|
||||
<i class="nav-icon fas fa-arrow-circle-right"></i>
|
||||
<p>
|
||||
Logout
|
||||
@@ -658,10 +664,10 @@
|
||||
}
|
||||
}else{
|
||||
// Auto Halaman Home Pengguna
|
||||
if($data_level=="Administrator"){
|
||||
if($data_level=="admin"){
|
||||
include "home/admin.php";
|
||||
}
|
||||
elseif($data_level=="Kaur Pemerintah"){
|
||||
elseif($data_level=="kaur"){
|
||||
include "home/kaur.php";
|
||||
}
|
||||
}
|
||||
@@ -718,16 +724,18 @@
|
||||
|
||||
<!-- jQuery -->
|
||||
<script src="plugins/jquery/jquery.min.js"></script>
|
||||
<!-- ChartJS -->
|
||||
<script src="plugins/vendor/chartjs/chart-3.9.1.min.js"></script>
|
||||
<!-- Bootstrap 4 -->
|
||||
<script src="plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
|
||||
<!-- Select2 -->
|
||||
<script src="plugins/select2/js/select2.full.min.js"></script>
|
||||
<!-- Cropper.js -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.5.13/cropper.min.js"></script>
|
||||
<script src="plugins/vendor/cropperjs/js/cropper.min.js"></script>
|
||||
<!-- OpenCV.js (Required for jscanify) -->
|
||||
<script src="https://docs.opencv.org/4.7.0/opencv.js" async></script>
|
||||
<script src="plugins/vendor/opencv/opencv.js" async></script>
|
||||
<!-- jscanify -->
|
||||
<script src="https://cdn.jsdelivr.net/gh/ColonelParrot/jscanify@master/src/jscanify.min.js"></script>
|
||||
<script src="plugins/vendor/jscanify/jscanify.min.js"></script>
|
||||
<!-- DataTables -->
|
||||
<script src="plugins/datatables/jquery.dataTables.js"></script>
|
||||
<script src="plugins/datatables-bs4/js/dataTables.bootstrap4.js"></script>
|
||||
@@ -793,6 +801,49 @@
|
||||
$('#imageModal').modal('show');
|
||||
}
|
||||
|
||||
function confirmLogout(element, event) {
|
||||
try {
|
||||
console.log('Logout function called for element:', element);
|
||||
|
||||
// Always prevent default behavior
|
||||
if (event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
|
||||
// Prevent multiple clicks
|
||||
if (element.getAttribute('data-logging-out') === 'true') {
|
||||
console.log('Already logging out, ignoring');
|
||||
return false;
|
||||
}
|
||||
|
||||
// Mark as logging out
|
||||
element.setAttribute('data-logging-out', 'true');
|
||||
|
||||
var logoutUrl = element.href;
|
||||
console.log('Logout URL:', logoutUrl);
|
||||
|
||||
// Debug SweetAlert2 availability
|
||||
console.log('Swal exists:', typeof Swal, 'Swal.fire:', Swal && Swal.fire);
|
||||
|
||||
// Use simple confirm for now to ensure it works
|
||||
if (confirm('Apakah Anda yakin akan keluar dari sistem?')) {
|
||||
console.log('User confirmed logout, redirecting...');
|
||||
window.location.href = logoutUrl;
|
||||
} else {
|
||||
console.log('User cancelled logout');
|
||||
element.removeAttribute('data-logging-out');
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('Logout error:', error);
|
||||
// As last resort, go directly to logout
|
||||
window.location.href = element.href;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function zoomIn() {
|
||||
scale += 0.2;
|
||||
setTransform();
|
||||
@@ -848,10 +899,39 @@
|
||||
(delta > 0) ? zoomIn() : zoomOut();
|
||||
}
|
||||
}
|
||||
|
||||
// Handle logout link clicks
|
||||
$(document).ready(function() {
|
||||
console.log('Document ready, attaching logout handler');
|
||||
$(document).on('click', '.logout-link', function(event) {
|
||||
console.log('Logout link clicked');
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
var element = this;
|
||||
var logoutUrl = element.href;
|
||||
|
||||
// Prevent multiple clicks
|
||||
if ($(element).attr('data-logging-out') === 'true') {
|
||||
console.log('Already logging out');
|
||||
return false;
|
||||
}
|
||||
$(element).attr('data-logging-out', 'true');
|
||||
|
||||
// Show confirmation
|
||||
if (confirm('Apakah Anda yakin akan keluar dari sistem?')) {
|
||||
console.log('User confirmed logout');
|
||||
window.location.href = logoutUrl;
|
||||
} else {
|
||||
console.log('User cancelled logout');
|
||||
$(element).removeAttr('data-logging-out');
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- ChartJS -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
21
login.php
21
login.php
@@ -1,6 +1,8 @@
|
||||
<?php
|
||||
// error_reporting(E_ALL);
|
||||
// ini_set('display_errors', 1);
|
||||
include "inc/koneksi.php";
|
||||
|
||||
session_start();
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
@@ -17,7 +19,7 @@
|
||||
<!-- Font Awesome -->
|
||||
<link rel="stylesheet" href="plugins/fontawesome-free/css/all.min.css">
|
||||
<!-- Ionicons -->
|
||||
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
|
||||
<link rel="stylesheet" href="plugins/vendor/ionicons/css/ionicons.min.css">
|
||||
<!-- icheck bootstrap -->
|
||||
<link rel="stylesheet" href="plugins/icheck-bootstrap/icheck-bootstrap.min.css">
|
||||
<!-- Theme style -->
|
||||
@@ -25,7 +27,7 @@
|
||||
<!-- Modern CSS -->
|
||||
<link rel="stylesheet" href="dist/css/modern.css">
|
||||
<!-- Google Font: Source Sans Pro -->
|
||||
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
|
||||
<link href="plugins/vendor/google-fonts/source-sans-pro/css/fonts-local.css" rel="stylesheet">
|
||||
</head>
|
||||
|
||||
<body class="hold-transition login-page">
|
||||
@@ -64,7 +66,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-group mb-3">
|
||||
<input type="text" class="form-control" name="captcha_input" placeholder="Kode Captcha" required>
|
||||
<input type="text" class="form-control" name="captcha_input" placeholder="Masukkan kode captcha" required>
|
||||
<div class="input-group-append">
|
||||
<div class="input-group-text">
|
||||
<img src="inc/captcha.php" alt="CAPTCHA">
|
||||
@@ -109,8 +111,6 @@ if (isset($_POST['btnLogin'])) {
|
||||
$password=mysqli_real_escape_string($koneksi,$_POST['password']);
|
||||
|
||||
//validasi captcha
|
||||
session_start();
|
||||
/* Bypassed for development
|
||||
if ($_POST["captcha_input"] != $_SESSION["captcha_code"]) {
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Login Gagal',text: 'Kode Captcha Salah',icon: 'error',confirmButtonText: 'OK'
|
||||
@@ -119,10 +119,9 @@ if (isset($_POST['btnLogin'])) {
|
||||
})</script>";
|
||||
exit;
|
||||
}
|
||||
*/
|
||||
|
||||
//query login
|
||||
$sql_login = "SELECT * FROM tb_pengguna WHERE BINARY username='$username' AND password='$password'";
|
||||
$sql_login = "SELECT * FROM tb_pengguna WHERE username='$username' AND password=MD5('$password')";
|
||||
$query_login = mysqli_query($koneksi, $sql_login);
|
||||
$data_login = mysqli_fetch_array($query_login,MYSQLI_BOTH);
|
||||
$jumlah_login = mysqli_num_rows($query_login);
|
||||
@@ -142,8 +141,12 @@ if (isset($_POST['btnLogin'])) {
|
||||
{window.location = 'index.php';}
|
||||
})</script>";
|
||||
}else{
|
||||
$error_msg = "Username atau password salah";
|
||||
if (!$query_login) {
|
||||
$error_msg = "Database error: " . mysqli_error($koneksi);
|
||||
}
|
||||
echo "<script>
|
||||
Swal.fire({title: 'Login Gagal',text: '',icon: 'error',confirmButtonText: 'OK'
|
||||
Swal.fire({title: 'Login Gagal',text: '$error_msg',icon: 'error',confirmButtonText: 'OK'
|
||||
}).then((result) => {if (result.value)
|
||||
{window.location = 'login.php';}
|
||||
})</script>";
|
||||
|
||||
42
logout.php
42
logout.php
@@ -1,4 +1,38 @@
|
||||
<?php
|
||||
session_start();
|
||||
session_destroy();
|
||||
echo "<script>location='login.php'</script>";
|
||||
<?php
|
||||
// Turn off error reporting to prevent warnings
|
||||
error_reporting(0);
|
||||
|
||||
// Prevent any output
|
||||
ob_start();
|
||||
|
||||
// Start session if not already started
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
@session_start();
|
||||
}
|
||||
|
||||
// Clear session data
|
||||
$_SESSION = [];
|
||||
|
||||
// Delete session cookie
|
||||
if (ini_get("session.use_cookies")) {
|
||||
$params = session_get_cookie_params();
|
||||
setcookie(session_name(), '', time() - 3600,
|
||||
$params["path"], $params["domain"],
|
||||
$params["secure"], $params["httponly"]
|
||||
);
|
||||
}
|
||||
|
||||
// Destroy session if active
|
||||
if (session_status() === PHP_SESSION_ACTIVE) {
|
||||
@session_destroy();
|
||||
}
|
||||
|
||||
// Clear output buffer
|
||||
ob_end_clean();
|
||||
|
||||
// Set headers
|
||||
header("Cache-Control: no-cache, no-store, must-revalidate");
|
||||
header("Pragma: no-cache");
|
||||
header("Expires: 0");
|
||||
header("Location: login.php");
|
||||
exit();
|
||||
13
plugins/vendor/chartjs/chart-3.9.1.min.js
vendored
Normal file
13
plugins/vendor/chartjs/chart-3.9.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
14
plugins/vendor/chartjs/chart.min.js
vendored
Normal file
14
plugins/vendor/chartjs/chart.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
9
plugins/vendor/cropperjs/css/cropper.min.css
vendored
Normal file
9
plugins/vendor/cropperjs/css/cropper.min.css
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/*!
|
||||
* Cropper.js v1.5.13
|
||||
* https://fengyuanchen.github.io/cropperjs
|
||||
*
|
||||
* Copyright 2015-present Chen Fengyuan
|
||||
* Released under the MIT license
|
||||
*
|
||||
* Date: 2022-11-20T05:30:43.444Z
|
||||
*/.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}
|
||||
10
plugins/vendor/cropperjs/js/cropper.min.js
vendored
Normal file
10
plugins/vendor/cropperjs/js/cropper.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
24
plugins/vendor/google-fonts/source-sans-pro/css/fonts-local.css
vendored
Normal file
24
plugins/vendor/google-fonts/source-sans-pro/css/fonts-local.css
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
src: url(../fonts/source-sans-pro-italic-400.ttf) format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
src: url(../fonts/source-sans-pro-light-300.ttf) format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url(../fonts/source-sans-pro-regular-400.ttf) format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url(../fonts/source-sans-pro-bold-700.ttf) format('truetype');
|
||||
}
|
||||
24
plugins/vendor/google-fonts/source-sans-pro/css/fonts.css
vendored
Normal file
24
plugins/vendor/google-fonts/source-sans-pro/css/fonts.css
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
src: url(https://fonts.gstatic.com/s/sourcesanspro/v23/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDc.ttf) format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
src: url(https://fonts.gstatic.com/s/sourcesanspro/v23/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdr.ttf) format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url(https://fonts.gstatic.com/s/sourcesanspro/v23/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7g.ttf) format('truetype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url(https://fonts.gstatic.com/s/sourcesanspro/v23/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdr.ttf) format('truetype');
|
||||
}
|
||||
BIN
plugins/vendor/google-fonts/source-sans-pro/fonts/source-sans-pro-bold-700.ttf
vendored
Normal file
BIN
plugins/vendor/google-fonts/source-sans-pro/fonts/source-sans-pro-bold-700.ttf
vendored
Normal file
Binary file not shown.
BIN
plugins/vendor/google-fonts/source-sans-pro/fonts/source-sans-pro-italic-400.ttf
vendored
Normal file
BIN
plugins/vendor/google-fonts/source-sans-pro/fonts/source-sans-pro-italic-400.ttf
vendored
Normal file
Binary file not shown.
BIN
plugins/vendor/google-fonts/source-sans-pro/fonts/source-sans-pro-light-300.ttf
vendored
Normal file
BIN
plugins/vendor/google-fonts/source-sans-pro/fonts/source-sans-pro-light-300.ttf
vendored
Normal file
Binary file not shown.
BIN
plugins/vendor/google-fonts/source-sans-pro/fonts/source-sans-pro-regular-400.ttf
vendored
Normal file
BIN
plugins/vendor/google-fonts/source-sans-pro/fonts/source-sans-pro-regular-400.ttf
vendored
Normal file
Binary file not shown.
11
plugins/vendor/ionicons/css/ionicons.min.css
vendored
Normal file
11
plugins/vendor/ionicons/css/ionicons.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
plugins/vendor/ionicons/fonts/ionicons.eot
vendored
Normal file
BIN
plugins/vendor/ionicons/fonts/ionicons.eot
vendored
Normal file
Binary file not shown.
2230
plugins/vendor/ionicons/fonts/ionicons.svg
vendored
Normal file
2230
plugins/vendor/ionicons/fonts/ionicons.svg
vendored
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 326 KiB |
BIN
plugins/vendor/ionicons/fonts/ionicons.ttf
vendored
Normal file
BIN
plugins/vendor/ionicons/fonts/ionicons.ttf
vendored
Normal file
Binary file not shown.
BIN
plugins/vendor/ionicons/fonts/ionicons.woff
vendored
Normal file
BIN
plugins/vendor/ionicons/fonts/ionicons.woff
vendored
Normal file
Binary file not shown.
9
plugins/vendor/jscanify/jscanify.min.js
vendored
Normal file
9
plugins/vendor/jscanify/jscanify.min.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Minified by jsDelivr using Terser v5.39.0.
|
||||
* Original file: /gh/ColonelParrot/jscanify@master/src/jscanify.js
|
||||
*
|
||||
* Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
|
||||
*/
|
||||
/*! jscanify v1.4.0 | (c) ColonelParrot and other contributors | MIT License */
|
||||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.jscanify=t()}(this,(function(){"use strict";return class{constructor(){}findPaperContour(e){const t=new cv.Mat;cv.Canny(e,t,50,200);const o=new cv.Mat;cv.GaussianBlur(t,o,new cv.Size(3,3),0,0,cv.BORDER_DEFAULT);const n=new cv.Mat;cv.threshold(o,n,0,255,cv.THRESH_OTSU);let r=new cv.MatVector,c=new cv.Mat;cv.findContours(n,r,c,cv.RETR_CCOMP,cv.CHAIN_APPROX_SIMPLE);let i=0,a=-1;for(let e=0;e<r.size();++e){let t=cv.contourArea(r.get(e));t>i&&(i=t,a=e)}const s=a>=0?r.get(a):null;return t.delete(),o.delete(),n.delete(),r.delete(),c.delete(),s}highlightPaper(e,t){(t=t||{}).color=t.color||"orange",t.thickness=t.thickness||10;const o=document.createElement("canvas"),n=o.getContext("2d"),r=cv.imread(e),c=this.findPaperContour(r);if(cv.imshow(o,r),c){const{topLeftCorner:e,topRightCorner:o,bottomLeftCorner:i,bottomRightCorner:a}=this.getCornerPoints(c,r);e&&o&&i&&a&&(n.strokeStyle=t.color,n.lineWidth=t.thickness,n.beginPath(),n.moveTo(...Object.values(e)),n.lineTo(...Object.values(o)),n.lineTo(...Object.values(a)),n.lineTo(...Object.values(i)),n.lineTo(...Object.values(e)),n.stroke())}return r.delete(),o}extractPaper(e,t,o,n){const r=document.createElement("canvas"),c=cv.imread(e),i=n?null:this.findPaperContour(c);if(null==i&&void 0===n)return null;const{topLeftCorner:a,topRightCorner:s,bottomLeftCorner:l,bottomRightCorner:v}=n||this.getCornerPoints(i,c);let u=new cv.Mat,d=new cv.Size(t,o),C=cv.matFromArray(4,1,cv.CV_32FC2,[a.x,a.y,s.x,s.y,l.x,l.y,v.x,v.y]),f=cv.matFromArray(4,1,cv.CV_32FC2,[0,0,t,0,0,o,t,o]),h=cv.getPerspectiveTransform(C,f);return cv.warpPerspective(c,u,h,d,cv.INTER_LINEAR,cv.BORDER_CONSTANT,new cv.Scalar),cv.imshow(r,u),c.delete(),u.delete(),r}getCornerPoints(e){const t=cv.minAreaRect(e).center;let o,n,r,c,i=0,a=0,s=0,l=0;for(let d=0;d<e.data32S.length;d+=2){const C={x:e.data32S[d],y:e.data32S[d+1]},f=(v=C,u=t,Math.hypot(v.x-u.x,v.y-u.y));C.x<t.x&&C.y<t.y?f>i&&(o=C,i=f):C.x>t.x&&C.y<t.y?f>a&&(n=C,a=f):C.x<t.x&&C.y>t.y?f>s&&(r=C,s=f):C.x>t.x&&C.y>t.y&&f>l&&(c=C,l=f)}var v,u;return{topLeftCorner:o,topRightCorner:n,bottomLeftCorner:r,bottomRightCorner:c}}}}));
|
||||
//# sourceMappingURL=/sm/f4b0fbf42a9b611deea75f2299eea9ad053e3664950195e6d617ef82058d69b3.map
|
||||
48
plugins/vendor/opencv/opencv.js
vendored
Normal file
48
plugins/vendor/opencv/opencv.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1,9 +1,11 @@
|
||||
<?php
|
||||
include "../inc/koneksi.php";
|
||||
|
||||
if (isset ($_POST['Cetak'])){
|
||||
$id = $_POST['id_datang'];
|
||||
}
|
||||
if (isset ($_POST['Cetak']) && isset($_POST['id_datang'])){
|
||||
$id = $_POST['id_datang'];
|
||||
} else {
|
||||
die("Data tidak valid. Silakan pilih data datang dari form.");
|
||||
}
|
||||
|
||||
$tanggal = date("m/y");
|
||||
$tgl = date("d/m/y");
|
||||
@@ -57,34 +59,42 @@
|
||||
<td>NIK</td>
|
||||
<td>:</td>
|
||||
<td>
|
||||
<?php echo $data['nik']; ?>
|
||||
<?php echo htmlspecialchars($data['nik'], ENT_QUOTES); ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Nama</td>
|
||||
<td>:</td>
|
||||
<td>
|
||||
<?php echo $data['nama_datang']; ?>
|
||||
<?php echo htmlspecialchars($data['nama_datang'], ENT_QUOTES); ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Jenis Kelamin</td>
|
||||
<td>:</td>
|
||||
<td>
|
||||
<?php echo $data['jekel']; ?>
|
||||
<?php
|
||||
$display_jekel = $data['jekel'];
|
||||
if ($display_jekel == 'LK') {
|
||||
$display_jekel = 'LAKI-LAKI';
|
||||
} elseif ($display_jekel == 'PR') {
|
||||
$display_jekel = 'PEREMPUAN';
|
||||
}
|
||||
echo htmlspecialchars($display_jekel, ENT_QUOTES);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Tanggal Datang</td>
|
||||
<td>:</td>
|
||||
<td>
|
||||
<?php echo $data['tgl_datang']; ?>
|
||||
<?php echo htmlspecialchars($data['tgl_datang'], ENT_QUOTES); ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php } ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Benar-benar Telah datang dan berencana untuk tinggal di <?php echo $data_profil['nama_desa']; ?>, <?php echo $data_profil['kecamatan']; ?>, <?php echo $data_profil['kabupaten']; ?>.</P>
|
||||
<p>Benar-benar Telah datang dan berencana untuk tinggal di <?php echo htmlspecialchars($data_profil['nama_desa'], ENT_QUOTES); ?>, <?php echo htmlspecialchars($data_profil['kecamatan'], ENT_QUOTES); ?>, <?php echo htmlspecialchars($data_profil['kabupaten'], ENT_QUOTES); ?>.</P>
|
||||
<p>Demikian Surat ini dibuat, agar dapat digunakan sebagaimana mestinya.</P>
|
||||
<br>
|
||||
<br>
|
||||
@@ -92,7 +102,7 @@
|
||||
<br>
|
||||
<br>
|
||||
<p align="right">
|
||||
<?php echo $data_profil['nama_desa']; ?>,
|
||||
<?php echo htmlspecialchars($data_profil['nama_desa'], ENT_QUOTES); ?>,
|
||||
<?php echo $tgl; ?>
|
||||
<br> KEPALA DESA
|
||||
<br>
|
||||
@@ -101,7 +111,7 @@
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>(<?php echo $data_profil['kepala_desa']; ?>)
|
||||
<br>(<?php echo htmlspecialchars($data_profil['kepala_desa'], ENT_QUOTES); ?>)
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
<?php
|
||||
include "../inc/koneksi.php";
|
||||
|
||||
if (isset ($_POST['Cetak'])){
|
||||
$id = $_POST['id_pend'];
|
||||
}
|
||||
if (isset ($_POST['Cetak']) && isset($_POST['id_pend'])){
|
||||
$id = $_POST['id_pend'];
|
||||
} else {
|
||||
die("Data tidak valid. Silakan pilih data penduduk dari form.");
|
||||
}
|
||||
|
||||
$tanggal = date("m/y");
|
||||
$tgl = date("d/m/y");
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<th>Nama</th>
|
||||
<th>Tgl Lahir</th>
|
||||
<th>Usia</th>
|
||||
<th>JK</th>
|
||||
<th>Jenis Kelamin</th>
|
||||
<th>Alamat</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -67,11 +67,19 @@
|
||||
?>
|
||||
<tr>
|
||||
<td align="center"><?php echo $no++; ?></td>
|
||||
<td>'<?php echo $data['nik']; ?></td>
|
||||
<td><?php echo $data['nik']; ?></td>
|
||||
<td><?php echo $data['nama']; ?></td>
|
||||
<td align="center"><?php echo date("d/m/Y", strtotime($data['tgl_lh'])); ?></td>
|
||||
<td align="center"><?php echo $data['usia']; ?> Thn</td>
|
||||
<td align="center"><?php echo $data['jekel']; ?></td>
|
||||
<td align="center"><?php
|
||||
if ($data['jekel'] == 'LK') {
|
||||
echo 'LAKI-LAKI';
|
||||
} elseif ($data['jekel'] == 'PR') {
|
||||
echo 'PEREMPUAN';
|
||||
} else {
|
||||
echo $data['jekel'];
|
||||
}
|
||||
?></td>
|
||||
<td><?php echo $data['desa']; ?>, RT <?php echo $data['rt']; ?>/ RW <?php echo $data['rw']; ?></td>
|
||||
</tr>
|
||||
<?php } ?>
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
<?php
|
||||
include "../inc/koneksi.php";
|
||||
|
||||
if (isset ($_POST['Cetak'])){
|
||||
$id = $_POST['lahir'];
|
||||
}
|
||||
if (isset ($_POST['Cetak']) && isset($_POST['id_lahir'])){
|
||||
$id = $_POST['id_lahir'];
|
||||
} else {
|
||||
die("Data tidak valid. Silakan pilih data kelahiran dari form.");
|
||||
}
|
||||
|
||||
$tanggal = date("m/y");
|
||||
$tgl = date("d/m/y");
|
||||
@@ -63,7 +65,15 @@
|
||||
<td>Jenis Kelamin</td>
|
||||
<td>:</td>
|
||||
<td>
|
||||
<?php echo $data['jekel']; ?>
|
||||
<?php
|
||||
if ($data['jekel'] == 'LK') {
|
||||
echo 'LAKI-LAKI';
|
||||
} elseif ($data['jekel'] == 'PR') {
|
||||
echo 'PEREMPUAN';
|
||||
} else {
|
||||
echo $data['jekel'];
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
<?php
|
||||
include "../inc/koneksi.php";
|
||||
|
||||
if (isset ($_POST['Cetak'])){
|
||||
$id = $_POST['id_mendu'];
|
||||
}
|
||||
if (isset ($_POST['Cetak']) && isset($_POST['id_mendu'])){
|
||||
$id = $_POST['id_mendu'];
|
||||
} else {
|
||||
die("Data tidak valid. Silakan pilih data kematian dari form.");
|
||||
}
|
||||
|
||||
$tanggal = date("m/y");
|
||||
$tgl = date("d/m/y");
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
<?php
|
||||
include "../inc/koneksi.php";
|
||||
|
||||
if (isset ($_POST['Cetak'])){
|
||||
$id = $_POST['id_pindah'];
|
||||
}
|
||||
if (isset ($_POST['Cetak']) && isset($_POST['id_pindah'])){
|
||||
$id = $_POST['id_pindah'];
|
||||
} else {
|
||||
die("Data tidak valid. Silakan pilih data pindah dari form.");
|
||||
}
|
||||
|
||||
$tanggal = date("m/y");
|
||||
$tgl = date("d/m/y");
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<th>No</th>
|
||||
<th>NIK</th>
|
||||
<th>Nama</th>
|
||||
<th>Jekel</th>
|
||||
<th>Jenis Kelamin</th>
|
||||
<th>Tanggal Datang</th>
|
||||
<th>Pelapor</th>
|
||||
</tr>
|
||||
@@ -44,9 +44,17 @@
|
||||
?>
|
||||
<tr>
|
||||
<td align="center"><?php echo $no++; ?></td>
|
||||
<td>'<?php echo $data['nik']; ?></td>
|
||||
<td><?php echo $data['nik']; ?></td>
|
||||
<td><?php echo $data['nama_datang']; ?></td>
|
||||
<td align="center"><?php echo $data['jekel']; ?></td>
|
||||
<td align="center"><?php
|
||||
if ($data['jekel'] == 'LK') {
|
||||
echo 'LAKI-LAKI';
|
||||
} elseif ($data['jekel'] == 'PR') {
|
||||
echo 'PEREMPUAN';
|
||||
} else {
|
||||
echo $data['jekel'];
|
||||
}
|
||||
?></td>
|
||||
<td><?php echo $data['tgl_datang']; ?></td>
|
||||
<td><?php echo $data['pelapor']; ?></td>
|
||||
</tr>
|
||||
|
||||
@@ -45,7 +45,15 @@
|
||||
<td align="center"><?php echo $no++; ?></td>
|
||||
<td><?php echo $data['nama']; ?></td>
|
||||
<td><?php echo $data['tgl_lh']; ?></td>
|
||||
<td align="center"><?php echo $data['jekel']; ?></td>
|
||||
<td align="center"><?php
|
||||
if ($data['jekel'] == 'LK') {
|
||||
echo 'LAKI-LAKI';
|
||||
} elseif ($data['jekel'] == 'PR') {
|
||||
echo 'PEREMPUAN';
|
||||
} else {
|
||||
echo $data['jekel'];
|
||||
}
|
||||
?></td>
|
||||
<td><?php echo $data['kepala']; ?> (No KK: '<?php echo $data['no_kk']; ?>)</td>
|
||||
</tr>
|
||||
<?php } ?>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
?>
|
||||
<tr>
|
||||
<td align="center"><?php echo $no++; ?></td>
|
||||
<td>'<?php echo $data['nik']; ?></td>
|
||||
<td><?php echo $data['nik']; ?></td>
|
||||
<td><?php echo $data['nama']; ?></td>
|
||||
<td><?php echo $data['tgl_mendu']; ?></td>
|
||||
<td><?php echo $data['sebab']; ?></td>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<th>No</th>
|
||||
<th>NIK</th>
|
||||
<th>Nama</th>
|
||||
<th>JK</th>
|
||||
<th>Jenis Kelamin</th>
|
||||
<th>Alamat</th>
|
||||
<th>Status</th>
|
||||
</tr>
|
||||
@@ -42,9 +42,17 @@
|
||||
?>
|
||||
<tr>
|
||||
<td align="center"><?php echo $no++; ?></td>
|
||||
<td>'<?php echo $data['nik']; ?></td>
|
||||
<td><?php echo $data['nik']; ?></td>
|
||||
<td><?php echo $data['nama']; ?></td>
|
||||
<td align="center"><?php echo $data['jekel']; ?></td>
|
||||
<td align="center"><?php
|
||||
if ($data['jekel'] == 'LK') {
|
||||
echo 'LAKI-LAKI';
|
||||
} elseif ($data['jekel'] == 'PR') {
|
||||
echo 'PEREMPUAN';
|
||||
} else {
|
||||
echo $data['jekel'];
|
||||
}
|
||||
?></td>
|
||||
<td><?php echo $data['desa']; ?>, RT <?php echo $data['rt']; ?>/ RW <?php echo $data['rw']; ?></td>
|
||||
<td><?php echo $data['status']; ?></td>
|
||||
</tr>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
?>
|
||||
<tr>
|
||||
<td align="center"><?php echo $no++; ?></td>
|
||||
<td>'<?php echo $data['nik']; ?></td>
|
||||
<td><?php echo $data['nik']; ?></td>
|
||||
<td><?php echo $data['nama']; ?></td>
|
||||
<td><?php echo $data['tgl_pindah']; ?></td>
|
||||
<td><?php echo $data['alasan']; ?></td>
|
||||
|
||||
189
sidak_database_init.sql
Normal file
189
sidak_database_init.sql
Normal file
@@ -0,0 +1,189 @@
|
||||
-- SIDAK Database Structure
|
||||
-- Version: 2.0
|
||||
-- Created: 2026-01-22
|
||||
-- Description: Empty database structure for SIDAK (Sistem Data Kependudukan)
|
||||
|
||||
-- Create database if not exists
|
||||
CREATE DATABASE IF NOT EXISTS `data_penduduk` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE `data_penduduk`;
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_pdd` (Penduduk)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_pdd` (
|
||||
`id_pend` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`nik` varchar(20) NOT NULL,
|
||||
`nama` varchar(50) NOT NULL,
|
||||
`tempat_lh` varchar(50) NOT NULL,
|
||||
`tgl_lh` date NOT NULL,
|
||||
`jekel` enum('LK','PR') NOT NULL DEFAULT 'LK',
|
||||
`desa` varchar(50) NOT NULL,
|
||||
`rt` varchar(5) NOT NULL,
|
||||
`rw` varchar(5) NOT NULL,
|
||||
`agama` varchar(20) NOT NULL,
|
||||
`kawin` varchar(20) NOT NULL,
|
||||
`pekerjaan` varchar(50) NOT NULL,
|
||||
`foto_ktp` varchar(255) DEFAULT NULL,
|
||||
`status` enum('Ada','Meninggal','Pindah') NOT NULL DEFAULT 'Ada',
|
||||
`kecamatan` varchar(50) DEFAULT NULL,
|
||||
`kabupaten` varchar(50) DEFAULT NULL,
|
||||
`provinsi` varchar(50) DEFAULT NULL,
|
||||
`kewarganegaraan` varchar(20) DEFAULT 'WNI',
|
||||
PRIMARY KEY (`id_pend`),
|
||||
UNIQUE KEY `nik` (`nik`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_kk` (Kartu Keluarga)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_kk` (
|
||||
`id_kk` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`no_kk` varchar(30) NOT NULL,
|
||||
`kepala` varchar(50) NOT NULL,
|
||||
`desa` varchar(50) NOT NULL,
|
||||
`rt` varchar(5) NOT NULL,
|
||||
`rw` varchar(5) NOT NULL,
|
||||
`kec` varchar(50) NOT NULL,
|
||||
`kab` varchar(50) NOT NULL,
|
||||
`prov` varchar(50) NOT NULL,
|
||||
`foto_kk` varchar(255) DEFAULT NULL,
|
||||
PRIMARY KEY (`id_kk`),
|
||||
UNIQUE KEY `no_kk` (`no_kk`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_anggota` (Anggota Keluarga)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_anggota` (
|
||||
`id_anggota` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`id_kk` int(11) NOT NULL,
|
||||
`id_pend` int(11) NOT NULL,
|
||||
`hubungan` varchar(20) NOT NULL,
|
||||
PRIMARY KEY (`id_anggota`),
|
||||
KEY `id_kk` (`id_kk`),
|
||||
KEY `id_pend` (`id_pend`),
|
||||
CONSTRAINT `tb_anggota_ibfk_1` FOREIGN KEY (`id_kk`) REFERENCES `tb_kk` (`id_kk`) ON DELETE CASCADE,
|
||||
CONSTRAINT `tb_anggota_ibfk_2` FOREIGN KEY (`id_pend`) REFERENCES `tb_pdd` (`id_pend`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_lahir` (Kelahiran)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_lahir` (
|
||||
`id_lahir` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`nama` varchar(50) NOT NULL,
|
||||
`tgl_lh` date NOT NULL,
|
||||
`jekel` enum('LK','PR') NOT NULL DEFAULT 'LK',
|
||||
`id_kk` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id_lahir`),
|
||||
KEY `id_kk` (`id_kk`),
|
||||
CONSTRAINT `tb_lahir_ibfk_1` FOREIGN KEY (`id_kk`) REFERENCES `tb_kk` (`id_kk`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_mendu` (Kematian)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_mendu` (
|
||||
`id_mendu` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`id_pdd` int(11) NOT NULL,
|
||||
`tgl_mendu` date NOT NULL,
|
||||
`sebab` varchar(50) NOT NULL,
|
||||
PRIMARY KEY (`id_mendu`),
|
||||
KEY `id_pdd` (`id_pdd`),
|
||||
CONSTRAINT `tb_mendu_ibfk_1` FOREIGN KEY (`id_pdd`) REFERENCES `tb_pdd` (`id_pend`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_datang` (Pendatang)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_datang` (
|
||||
`id_datang` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`nik` varchar(20) NOT NULL,
|
||||
`nama_datang` varchar(50) NOT NULL,
|
||||
`jekel` enum('LK','PR') NOT NULL DEFAULT 'LK',
|
||||
`tgl_datang` date NOT NULL,
|
||||
`pelapor` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id_datang`),
|
||||
KEY `pelapor` (`pelapor`),
|
||||
CONSTRAINT `tb_datang_ibfk_1` FOREIGN KEY (`pelapor`) REFERENCES `tb_pdd` (`id_pend`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_pindah` (Pindah)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_pindah` (
|
||||
`id_pindah` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`id_pdd` int(11) NOT NULL,
|
||||
`tgl_pindah` date NOT NULL,
|
||||
`alasan` varchar(100) NOT NULL,
|
||||
PRIMARY KEY (`id_pindah`),
|
||||
KEY `id_pdd` (`id_pdd`),
|
||||
CONSTRAINT `tb_pindah_ibfk_1` FOREIGN KEY (`id_pdd`) REFERENCES `tb_pdd` (`id_pend`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_pengguna` (Pengguna Sistem)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_pengguna` (
|
||||
`id_pengguna` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`nama_pengguna` varchar(50) NOT NULL,
|
||||
`username` varchar(30) NOT NULL,
|
||||
`password` varchar(100) NOT NULL,
|
||||
`level` enum('admin','kaur') NOT NULL DEFAULT 'kaur',
|
||||
PRIMARY KEY (`id_pengguna`),
|
||||
UNIQUE KEY `username` (`username`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_profil` (Profil Desa)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_profil` (
|
||||
`id_profil` int(11) NOT NULL PRIMARY KEY,
|
||||
`nama_desa` varchar(50) NOT NULL,
|
||||
`alamat` text NOT NULL,
|
||||
`kecamatan` varchar(50) NOT NULL,
|
||||
`kabupaten` varchar(50) NOT NULL,
|
||||
`provinsi` varchar(50) NOT NULL,
|
||||
`kepala_desa` varchar(50) NOT NULL,
|
||||
`nip_kades` varchar(30) NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Insert default data
|
||||
-- --------------------------------------------------------
|
||||
|
||||
-- Default admin user (username: admin, password: admin)
|
||||
INSERT INTO `tb_pengguna` (`id_pengguna`, `nama_pengguna`, `username`, `password`, `level`) VALUES
|
||||
(1, 'Administrator', 'admin', MD5('admin'), 'admin');
|
||||
|
||||
-- Default kaur user (username: kaur, password: kaur)
|
||||
INSERT INTO `tb_pengguna` (`id_pengguna`, `nama_pengguna`, `username`, `password`, `level`) VALUES
|
||||
(2, 'Kaur Pemerintah', 'kaur', MD5('kaur'), 'kaur');
|
||||
|
||||
-- Default profil desa
|
||||
INSERT INTO `tb_profil` (`id_profil`, `nama_desa`, `alamat`, `kecamatan`, `kabupaten`, `provinsi`, `kepala_desa`, `nip_kades`) VALUES
|
||||
(1, 'Desa Percontohan', 'Jl. Contoh No. 1', 'Kecamatan Contoh', 'Kabupaten Contoh', 'Provinsi Contoh', 'Budi Santoso', '123456789');
|
||||
|
||||
-- Reset auto-increment values
|
||||
ALTER TABLE `tb_pdd` AUTO_INCREMENT = 1001;
|
||||
ALTER TABLE `tb_kk` AUTO_INCREMENT = 1001;
|
||||
ALTER TABLE `tb_anggota` AUTO_INCREMENT = 1;
|
||||
ALTER TABLE `tb_lahir` AUTO_INCREMENT = 1;
|
||||
ALTER TABLE `tb_mendu` AUTO_INCREMENT = 1;
|
||||
ALTER TABLE `tb_datang` AUTO_INCREMENT = 1;
|
||||
ALTER TABLE `tb_pindah` AUTO_INCREMENT = 1;
|
||||
ALTER TABLE `tb_pengguna` AUTO_INCREMENT = 3;
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Database user setup (optional - for production)
|
||||
-- --------------------------------------------------------
|
||||
/*
|
||||
CREATE USER IF NOT EXISTS 'sidak_user'@'localhost' IDENTIFIED BY 'sidak_pass';
|
||||
GRANT ALL PRIVILEGES ON `data_penduduk`.* TO 'sidak_user'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
*/
|
||||
154
sidak_database_structure_only.sql
Normal file
154
sidak_database_structure_only.sql
Normal file
@@ -0,0 +1,154 @@
|
||||
-- SIDAK Database Structure Only
|
||||
-- Version: 2.0
|
||||
-- Created: 2026-01-22
|
||||
-- Description: Database structure only (no data) for SIDAK (Sistem Data Kependudukan)
|
||||
|
||||
-- Create database if not exists
|
||||
CREATE DATABASE IF NOT EXISTS `data_penduduk` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE `data_penduduk`;
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_pdd` (Penduduk)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_pdd` (
|
||||
`id_pend` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`nik` varchar(20) NOT NULL,
|
||||
`nama` varchar(50) NOT NULL,
|
||||
`tempat_lh` varchar(50) NOT NULL,
|
||||
`tgl_lh` date NOT NULL,
|
||||
`jekel` enum('LK','PR') NOT NULL DEFAULT 'LK',
|
||||
`desa` varchar(50) NOT NULL,
|
||||
`rt` varchar(5) NOT NULL,
|
||||
`rw` varchar(5) NOT NULL,
|
||||
`agama` varchar(20) NOT NULL,
|
||||
`kawin` varchar(20) NOT NULL,
|
||||
`pekerjaan` varchar(50) NOT NULL,
|
||||
`foto_ktp` varchar(255) DEFAULT NULL,
|
||||
`status` enum('Ada','Meninggal','Pindah') NOT NULL DEFAULT 'Ada',
|
||||
`kecamatan` varchar(50) DEFAULT NULL,
|
||||
`kabupaten` varchar(50) DEFAULT NULL,
|
||||
`provinsi` varchar(50) DEFAULT NULL,
|
||||
`kewarganegaraan` varchar(20) DEFAULT 'WNI',
|
||||
PRIMARY KEY (`id_pend`),
|
||||
UNIQUE KEY `nik` (`nik`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_kk` (Kartu Keluarga)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_kk` (
|
||||
`id_kk` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`no_kk` varchar(30) NOT NULL,
|
||||
`kepala` varchar(50) NOT NULL,
|
||||
`desa` varchar(50) NOT NULL,
|
||||
`rt` varchar(5) NOT NULL,
|
||||
`rw` varchar(5) NOT NULL,
|
||||
`kec` varchar(50) NOT NULL,
|
||||
`kab` varchar(50) NOT NULL,
|
||||
`prov` varchar(50) NOT NULL,
|
||||
`foto_kk` varchar(255) DEFAULT NULL,
|
||||
PRIMARY KEY (`id_kk`),
|
||||
UNIQUE KEY `no_kk` (`no_kk`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_anggota` (Anggota Keluarga)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_anggota` (
|
||||
`id_anggota` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`id_kk` int(11) NOT NULL,
|
||||
`id_pend` int(11) NOT NULL,
|
||||
`hubungan` varchar(20) NOT NULL,
|
||||
PRIMARY KEY (`id_anggota`),
|
||||
KEY `id_kk` (`id_kk`),
|
||||
KEY `id_pend` (`id_pend`),
|
||||
CONSTRAINT `tb_anggota_ibfk_1` FOREIGN KEY (`id_kk`) REFERENCES `tb_kk` (`id_kk`) ON DELETE CASCADE,
|
||||
CONSTRAINT `tb_anggota_ibfk_2` FOREIGN KEY (`id_pend`) REFERENCES `tb_pdd` (`id_pend`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_lahir` (Kelahiran)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_lahir` (
|
||||
`id_lahir` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`nama` varchar(50) NOT NULL,
|
||||
`tgl_lh` date NOT NULL,
|
||||
`jekel` enum('LK','PR') NOT NULL DEFAULT 'LK',
|
||||
`id_kk` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id_lahir`),
|
||||
KEY `id_kk` (`id_kk`),
|
||||
CONSTRAINT `tb_lahir_ibfk_1` FOREIGN KEY (`id_kk`) REFERENCES `tb_kk` (`id_kk`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_mendu` (Kematian)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_mendu` (
|
||||
`id_mendu` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`id_pdd` int(11) NOT NULL,
|
||||
`tgl_mendu` date NOT NULL,
|
||||
`sebab` varchar(50) NOT NULL,
|
||||
PRIMARY KEY (`id_mendu`),
|
||||
KEY `id_pdd` (`id_pdd`),
|
||||
CONSTRAINT `tb_mendu_ibfk_1` FOREIGN KEY (`id_pdd`) REFERENCES `tb_pdd` (`id_pend`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_datang` (Pendatang)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_datang` (
|
||||
`id_datang` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`nik` varchar(20) NOT NULL,
|
||||
`nama_datang` varchar(50) NOT NULL,
|
||||
`jekel` enum('LK','PR') NOT NULL DEFAULT 'LK',
|
||||
`tgl_datang` date NOT NULL,
|
||||
`pelapor` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id_datang`),
|
||||
KEY `pelapor` (`pelapor`),
|
||||
CONSTRAINT `tb_datang_ibfk_1` FOREIGN KEY (`pelapor`) REFERENCES `tb_pdd` (`id_pend`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_pindah` (Pindah)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_pindah` (
|
||||
`id_pindah` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`id_pdd` int(11) NOT NULL,
|
||||
`tgl_pindah` date NOT NULL,
|
||||
`alasan` varchar(100) NOT NULL,
|
||||
PRIMARY KEY (`id_pindah`),
|
||||
KEY `id_pdd` (`id_pdd`),
|
||||
CONSTRAINT `tb_pindah_ibfk_1` FOREIGN KEY (`id_pdd`) REFERENCES `tb_pdd` (`id_pend`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_pengguna` (Pengguna Sistem)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_pengguna` (
|
||||
`id_pengguna` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`nama_pengguna` varchar(50) NOT NULL,
|
||||
`username` varchar(30) NOT NULL,
|
||||
`password` varchar(100) NOT NULL,
|
||||
`level` enum('admin','kaur') NOT NULL DEFAULT 'kaur',
|
||||
PRIMARY KEY (`id_pengguna`),
|
||||
UNIQUE KEY `username` (`username`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
-- Table structure for table `tb_profil` (Profil Desa)
|
||||
-- --------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `tb_profil` (
|
||||
`id_profil` int(11) NOT NULL PRIMARY KEY,
|
||||
`nama_desa` varchar(50) NOT NULL,
|
||||
`alamat` text NOT NULL,
|
||||
`kecamatan` varchar(50) NOT NULL,
|
||||
`kabupaten` varchar(50) NOT NULL,
|
||||
`provinsi` varchar(50) NOT NULL,
|
||||
`kepala_desa` varchar(50) NOT NULL,
|
||||
`nip_kades` varchar(30) NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
@@ -3,7 +3,7 @@
|
||||
<h3 class="card-title">
|
||||
<i class="fa fa-file"></i> Su-Ket Pendatang</h3>
|
||||
</div>
|
||||
<form action="./report/cetak_datang.php" method="post" enctype="multipart/form-data">
|
||||
<form action="./report/cetak_datang.php" method="post" enctype="multipart/form-data" target="_blank">
|
||||
<div class="card-body">
|
||||
|
||||
<div class="form-group row">
|
||||
@@ -18,9 +18,9 @@
|
||||
while ($row = mysqli_fetch_array($hasil)) {
|
||||
?>
|
||||
<option value="<?php echo $row['id_datang'] ?>">
|
||||
<?php echo $row['nik'] ?>
|
||||
<?php echo htmlspecialchars($row['nik'], ENT_QUOTES); ?>
|
||||
-
|
||||
<?php echo $row['nama_datang'] ?>
|
||||
<?php echo htmlspecialchars($row['nama_datang'], ENT_QUOTES); ?>
|
||||
</option>
|
||||
<?php
|
||||
}
|
||||
@@ -32,7 +32,7 @@
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
|
||||
<input target="_blank" type="submit" name="Cetak" value="Cetak" class="btn btn-info"></input>
|
||||
<input type="submit" name="Cetak" value="Cetak" class="btn btn-info">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -3,7 +3,7 @@
|
||||
<h3 class="card-title">
|
||||
<i class="fa fa-file"></i> Su-Ket Domisili</h3>
|
||||
</div>
|
||||
<form action="./report/cetak_domisili.php" method="post" enctype="multipart/form-data">
|
||||
<form action="./report/cetak_domisili.php" method="post" enctype="multipart/form-data" target="_blank">
|
||||
<div class="card-body">
|
||||
|
||||
<div class="form-group row">
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<button type="submit" class="btn btn-info" name="btnCetak" target="_blank">Cetak Surat</button>
|
||||
<input type="submit" name="Cetak" value="Cetak Surat" class="btn btn-info">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -3,13 +3,13 @@
|
||||
<h3 class="card-title">
|
||||
<i class="fa fa-file"></i> Su-Ket Kelahiran</h3>
|
||||
</div>
|
||||
<form action="./report/cetak_lahir.php" method="post" enctype="multipart/form-data">
|
||||
<form action="./report/cetak_lahir.php" method="post" enctype="multipart/form-data" target="_blank">
|
||||
<div class="card-body">
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Kelahiran</label>
|
||||
<div class="col-sm-6">
|
||||
<select name="lahir" id="lahir" class="form-control select2bs4" required>
|
||||
<select name="id_lahir" id="id_lahir" class="form-control select2bs4" required>
|
||||
<option selected="selected">- Pilih Data -</option>
|
||||
<?php
|
||||
// ambil data dari database
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<h3 class="card-title">
|
||||
<i class="fa fa-file"></i> Su-Ket Kematian</h3>
|
||||
</div>
|
||||
<form action="./report/cetak_mati.php" method="post" enctype="multipart/form-data">
|
||||
<form action="./report/cetak_mati.php" method="post" enctype="multipart/form-data" target="_blank">
|
||||
<div class="card-body">
|
||||
|
||||
<div class="form-group row">
|
||||
|
||||
@@ -3,31 +3,32 @@
|
||||
<h3 class="card-title">
|
||||
<i class="fa fa-file"></i> Su-Ket Pindah</h3>
|
||||
</div>
|
||||
<form action="./report/cetak_pindah.php" method="post" enctype="multipart/form-data">
|
||||
<form action="./report/cetak_pindah.php" method="post" enctype="multipart/form-data" target="_blank">
|
||||
<div class="card-body">
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Penduduk</label>
|
||||
<div class="col-sm-6">
|
||||
<select name="id_pend" id="id_pend" class="form-control select2bs4" required>
|
||||
<option selected="selected">- Pilih Data -</option>
|
||||
<?php
|
||||
// ambil data dari database
|
||||
$query = "select * from tb_pdd where status='Pindah'";
|
||||
$hasil = mysqli_query($koneksi, $query);
|
||||
while ($row = mysqli_fetch_array($hasil)) {
|
||||
?>
|
||||
<option value="<?php echo $row['id_pend'] ?>">
|
||||
<?php echo $row['nik'] ?>
|
||||
-
|
||||
<?php echo $row['nama'] ?>
|
||||
</option>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">Pindah</label>
|
||||
<div class="col-sm-6">
|
||||
<select name="id_pindah" id="id_pindah" class="form-control select2bs4" required>
|
||||
<option selected="selected">- Pilih Data -</option>
|
||||
<?php
|
||||
// ambil data dari database
|
||||
$query = "select p.id_pindah, d.nik, d.nama, p.tgl_pindah from tb_pindah p inner join tb_pdd d on p.id_pdd=d.id_pend";
|
||||
$hasil = mysqli_query($koneksi, $query);
|
||||
while ($row = mysqli_fetch_array($hasil)) {
|
||||
?>
|
||||
<option value="<?php echo $row['id_pindah'] ?>">
|
||||
<?php echo $row['nik'] ?>
|
||||
-
|
||||
<?php echo $row['nama'] ?>
|
||||
(<?php echo $row['tgl_pindah'] ?>)
|
||||
</option>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
|
||||
18
unused/.dockerignore
Normal file
18
unused/.dockerignore
Normal file
@@ -0,0 +1,18 @@
|
||||
# Docker ignore file
|
||||
.git
|
||||
.gitignore
|
||||
node_modules
|
||||
npm-debug.log
|
||||
yarn-debug.log
|
||||
yarn-error.log
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
.vscode
|
||||
.idea
|
||||
*.log
|
||||
php_server.pid
|
||||
php_server.log
|
||||
.env
|
||||
docker-compose.override.yml
|
||||
*.md
|
||||
README*
|
||||
38
unused/Dockerfile
Normal file
38
unused/Dockerfile
Normal file
@@ -0,0 +1,38 @@
|
||||
FROM php:8.2-apache
|
||||
|
||||
# Install necessary PHP extensions and tools
|
||||
RUN apt-get update && apt-get install -y \
|
||||
libpng-dev \
|
||||
libjpeg-dev \
|
||||
libfreetype6-dev \
|
||||
libzip-dev \
|
||||
zip \
|
||||
unzip \
|
||||
curl \
|
||||
git \
|
||||
mariadb-client \
|
||||
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
|
||||
&& docker-php-ext-install -j$(nproc) gd \
|
||||
&& docker-php-ext-install mysqli pdo pdo_mysql zip \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Enable Apache rewrite module
|
||||
RUN a2enmod rewrite
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /var/www/html
|
||||
|
||||
# Copy application files
|
||||
COPY . /var/www/html/
|
||||
|
||||
# Set proper permissions
|
||||
RUN chown -R www-data:www-data /var/www/html \
|
||||
&& chmod -R 755 /var/www/html
|
||||
|
||||
# Update koneksi.php to use environment variables
|
||||
RUN sed -i 's/\$koneksi = new mysqli ("localhost","sidak_user","sidak_pass","data_penduduk");/\$db_host = getenv("DB_HOST") ?: "localhost";\n\$db_user = getenv("DB_USER") ?: "sidak_user";\n\$db_pass = getenv("DB_PASS") ?: "sidak_pass";\n\$db_name = getenv("DB_NAME") ?: "data_penduduk";\n\$koneksi = new mysqli (\$db_host,\$db_user,\$db_pass,\$db_name);/g' inc/koneksi.php
|
||||
|
||||
EXPOSE 80
|
||||
|
||||
CMD ["apache2-foreground"]
|
||||
67
unused/INSTALL_DOCKER.md
Normal file
67
unused/INSTALL_DOCKER.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# SIDAK Docker Setup
|
||||
|
||||
Aplikasi SIDAK berjalan dengan Docker Compose.
|
||||
|
||||
## Services yang berjalan:
|
||||
1. **Web App** - PHP Apache: http://localhost:8500
|
||||
2. **Database** - MariaDB: localhost:3307
|
||||
3. **phpMyAdmin** - Database admin: http://localhost:8080
|
||||
|
||||
## Cara menjalankan:
|
||||
|
||||
### 1. Start aplikasi:
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### 2. Stop aplikasi:
|
||||
```bash
|
||||
docker compose down
|
||||
```
|
||||
|
||||
### 3. Stop dan hapus data:
|
||||
```bash
|
||||
docker compose down -v
|
||||
```
|
||||
|
||||
### 4. Melihat logs:
|
||||
```bash
|
||||
docker compose logs -f
|
||||
```
|
||||
|
||||
## Credentials:
|
||||
|
||||
### Aplikasi SIDAK:
|
||||
- URL: http://localhost:8500
|
||||
- Admin: `admin` / `admin`
|
||||
- Kaur: `kaur` / `kaur`
|
||||
|
||||
### Database:
|
||||
- Host: `db` (dalam container) atau `localhost:3307` (dari host)
|
||||
- Database: `data_penduduk`
|
||||
- User: `sidak_user`
|
||||
- Password: `sidak_pass`
|
||||
- Root password: `rootpassword`
|
||||
|
||||
### phpMyAdmin:
|
||||
- URL: http://localhost:8080
|
||||
- Server: `db`
|
||||
- Username: `sidak_user` atau `root`
|
||||
- Password: `sidak_pass` atau `rootpassword`
|
||||
|
||||
## Troubleshooting:
|
||||
|
||||
1. **Port conflict**: Jika port 8500, 8080, atau 3307 sudah digunakan, ubah di `docker-compose.yml`
|
||||
2. **Database connection error**: Tunggu 30 detik untuk database startup
|
||||
3. **PHP extensions**: Extensions mysqli, pdo, pdo_mysql sudah diinstall otomatis
|
||||
4. **File permissions**: Semua file di-mount dari host ke container
|
||||
|
||||
## Struktur file Docker:
|
||||
- `docker-compose.yml` - Konfigurasi services
|
||||
- `init.sql` - Skema dan data awal database
|
||||
- `inc/koneksi.php` - Konfigurasi koneksi database (menggunakan env variables)
|
||||
|
||||
## Catatan:
|
||||
- Perubahan file PHP langsung terlihat (hot reload)
|
||||
- Data database persist di volume Docker `sidak_mariadb-data`
|
||||
- Untuk development, edit file langsung di host
|
||||
74
unused/README_DOCKER.md
Normal file
74
unused/README_DOCKER.md
Normal file
@@ -0,0 +1,74 @@
|
||||
# SIDAK Application with Docker
|
||||
|
||||
## Prerequisites
|
||||
- Docker
|
||||
- Docker Compose
|
||||
|
||||
## Quick Start
|
||||
|
||||
1. **Start the application:**
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
2. **Access the application:**
|
||||
- Web application: http://localhost:8500
|
||||
- phpMyAdmin: http://localhost:8080
|
||||
- MySQL/MariaDB: localhost:3306
|
||||
|
||||
3. **Default credentials:**
|
||||
- **Application:**
|
||||
- Admin: `admin` / `admin`
|
||||
- Kaur: `kaur` / `kaur`
|
||||
- **Database:**
|
||||
- Host: `db`
|
||||
- Database: `data_penduduk`
|
||||
- User: `sidak_user`
|
||||
- Password: `sidak_pass`
|
||||
- Root password: `rootpassword`
|
||||
|
||||
4. **Stop the application:**
|
||||
```bash
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
5. **Stop and remove volumes (clears all data):**
|
||||
```bash
|
||||
docker-compose down -v
|
||||
```
|
||||
|
||||
## Services
|
||||
|
||||
1. **web** - PHP Apache application
|
||||
- Port: 8500
|
||||
- Directory mounted: `/var/www/html`
|
||||
- Environment variables: DB_HOST, DB_USER, DB_PASS, DB_NAME
|
||||
|
||||
2. **db** - MariaDB database
|
||||
- Port: 3306
|
||||
- Database: `data_penduduk`
|
||||
- Auto-initialized with schema and sample data
|
||||
- Data persisted in volume: `mariadb-data`
|
||||
|
||||
3. **phpmyadmin** - Database management
|
||||
- Port: 8080
|
||||
- Connect to host: `db`
|
||||
|
||||
## Development
|
||||
|
||||
- **Hot reload:** Changes to PHP files are reflected immediately due to volume mounting
|
||||
- **Database persistence:** Data is preserved between container restarts
|
||||
- **Build custom image:** `docker-compose build`
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
1. **Port conflicts:** Check if ports 8500, 8080, or 3306 are already in use
|
||||
2. **Database connection issues:** Wait a few seconds for database to initialize
|
||||
3. **View logs:** `docker-compose logs -f`
|
||||
4. **Reset database:** `docker-compose down -v && docker-compose up -d`
|
||||
|
||||
## File Structure
|
||||
- `docker-compose.yml` - Service definitions
|
||||
- `Dockerfile` - PHP Apache image configuration
|
||||
- `init.sql` - Database initialization script
|
||||
- `.dockerignore` - Files to exclude from build context
|
||||
30
unused/add_dummy_data.sql
Normal file
30
unused/add_dummy_data.sql
Normal file
@@ -0,0 +1,30 @@
|
||||
-- Add dummy population data for donut chart testing
|
||||
-- Balita (0-5 years) - 5 records
|
||||
INSERT INTO tb_pdd (id_pend, nik, nama, tempat_lh, tgl_lh, jekel, desa, rt, rw, agama, kawin, pekerjaan, status) VALUES
|
||||
(16, '3201010101001001', 'Balita 1', 'Bogor', '2023-01-15', 'LK', 'Sukamaju', '01', '02', 'Islam', 'Belum', 'Balita', 'Ada'),
|
||||
(17, '3201010101001002', 'Balita 2', 'Bogor', '2022-06-30', 'PR', 'Sukamaju', '01', '02', 'Islam', 'Belum', 'Balita', 'Ada'),
|
||||
(18, '3201010101001003', 'Balita 3', 'Bogor', '2021-03-20', 'LK', 'Sukamaju', '01', '02', 'Islam', 'Belum', 'Balita', 'Ada'),
|
||||
(19, '3201010101001004', 'Balita 4', 'Bogor', '2020-11-10', 'PR', 'Sukamaju', '02', '03', 'Islam', 'Belum', 'Balita', 'Ada'),
|
||||
(20, '3201010101001005', 'Balita 5', 'Bogor', '2024-02-28', 'LK', 'Sukamaju', '02', '03', 'Islam', 'Belum', 'Balita', 'Ada');
|
||||
|
||||
-- Anak-anak (6-12 years) - 5 records
|
||||
INSERT INTO tb_pdd (id_pend, nik, nama, tempat_lh, tgl_lh, jekel, desa, rt, rw, agama, kawin, pekerjaan, status) VALUES
|
||||
(21, '3201010101001006', 'Anak 1', 'Bogor', '2018-05-15', 'LK', 'Sukamaju', '01', '02', 'Islam', 'Belum', 'Pelajar', 'Ada'),
|
||||
(22, '3201010101001007', 'Anak 2', 'Bogor', '2017-08-20', 'PR', 'Sukamaju', '01', '02', 'Islam', 'Belum', 'Pelajar', 'Ada'),
|
||||
(23, '3201010101001008', 'Anak 3', 'Bogor', '2016-12-10', 'LK', 'Sukamaju', '02', '03', 'Islam', 'Belum', 'Pelajar', 'Ada'),
|
||||
(24, '3201010101001009', 'Anak 4', 'Bogor', '2015-04-25', 'PR', 'Sukamaju', '02', '03', 'Islam', 'Belum', 'Pelajar', 'Ada'),
|
||||
(25, '3201010101001010', 'Anak 5', 'Bogor', '2014-09-05', 'LK', 'Sukamaju', '03', '04', 'Islam', 'Belum', 'Pelajar', 'Ada');
|
||||
|
||||
-- Remaja (13-17 years) - 5 records
|
||||
INSERT INTO tb_pdd (id_pend, nik, nama, tempat_lh, tgl_lh, jekel, desa, rt, rw, agama, kawin, pekerjaan, status) VALUES
|
||||
(26, '3201010101001011', 'Remaja 1', 'Bogor', '2011-07-15', 'LK', 'Sukamaju', '01', '02', 'Islam', 'Belum', 'Pelajar', 'Ada'),
|
||||
(27, '3201010101001012', 'Remaja 2', 'Bogor', '2010-03-20', 'PR', 'Sukamaju', '01', '02', 'Islam', 'Belum', 'Pelajar', 'Ada'),
|
||||
(28, '3201010101001013', 'Remaja 3', 'Bogor', '2009-11-30', 'LK', 'Sukamaju', '02', '03', 'Islam', 'Belum', 'Pelajar', 'Ada'),
|
||||
(29, '3201010101001014', 'Remaja 4', 'Bogor', '2008-06-10', 'PR', 'Sukamaju', '02', '03', 'Islam', 'Belum', 'Pelajar', 'Ada'),
|
||||
(30, '3201010101001015', 'Remaja 5', 'Bogor', '2007-01-25', 'LK', 'Sukamaju', '03', '04', 'Islam', 'Belum', 'Pelajar', 'Ada');
|
||||
|
||||
-- Lansia (60+ years) - 3 records
|
||||
INSERT INTO tb_pdd (id_pend, nik, nama, tempat_lh, tgl_lh, jekel, desa, rt, rw, agama, kawin, pekerjaan, status) VALUES
|
||||
(31, '3201010101001016', 'Lansia 1', 'Bogor', '1960-05-15', 'LK', 'Sukamaju', '01', '02', 'Islam', 'Kawin', 'Pensiunan', 'Ada'),
|
||||
(32, '3201010101001017', 'Lansia 2', 'Bogor', '1958-08-20', 'PR', 'Sukamaju', '01', '02', 'Islam', 'Cerai Mati', 'Pensiunan', 'Ada'),
|
||||
(33, '3201010101001018', 'Lansia 3', 'Bogor', '1955-12-10', 'LK', 'Sukamaju', '02', '03', 'Islam', 'Kawin', 'Pensiunan', 'Ada');
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user