feat: Introduce Docker containerization and revamp the resident movement report to include both incoming and outgoing population data.

This commit is contained in:
2026-02-06 18:11:16 +08:00
parent ce88ac52f6
commit 68b2a33321
7 changed files with 192 additions and 28 deletions

18
.dockerignore Normal file
View 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
Dockerfile Normal file
View 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"]

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

50
docker-compose.yml Normal file
View File

@@ -0,0 +1,50 @@
services:
web:
build: .
ports:
- "8500:80"
volumes:
- ./:/var/www/html
depends_on:
- db
environment:
- DB_HOST=db
- DB_USER=sidak_user
- DB_PASS=sidak_pass
- DB_NAME=data_penduduk
networks:
- sidak-network
db:
image: mariadb:10.11
ports:
- "3307:3306"
environment:
- MARIADB_ROOT_PASSWORD=rootpassword
- MARIADB_DATABASE=data_penduduk
- MARIADB_USER=sidak_user
- MARIADB_PASSWORD=sidak_pass
volumes:
- ./sidak_database_init.sql:/docker-entrypoint-initdb.d/init.sql:ro
- mariadb-data:/var/lib/mysql
networks:
- sidak-network
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- "8080:80"
environment:
- PMA_HOST=db
- PMA_PORT=3306
depends_on:
- db
networks:
- sidak-network
networks:
sidak-network:
driver: bridge
volumes:
mariadb-data:

View File

@@ -273,7 +273,7 @@
<li class="nav-item">
<a href="./report/laporan_pindah.php" target="_blank" class="nav-link">
<i class="nav-icon far fa-circle text-warning"></i>
<p>Data Pindah</p>
<p>Laporan Pindah</p>
</a>
</li>
<li class="nav-item">
@@ -372,7 +372,7 @@
<li class="nav-item">
<a href="?page=data-pindah" class="nav-link">
<i class="nav-icon far fa-circle text-warning"></i>
<p>Data Pindah</p>
<p>Laporan Pindah</p>
</a>
</li>
</ul>
@@ -464,7 +464,7 @@
<li class="nav-item">
<a href="./report/laporan_pindah.php" target="_blank" class="nav-link">
<i class="nav-icon far fa-circle text-warning"></i>
<p>Data Pindah</p>
<p>Laporan Pindah</p>
</a>
</li>
<li class="nav-item">

View File

@@ -5,53 +5,111 @@
// Ambil Data Profil
$sql_profil = "SELECT * FROM tb_profil WHERE id_profil='1'";
$query_profil = mysqli_query($koneksi, $sql_profil);
$data_profil = mysqli_fetch_array($query_profil,MYSQLI_BOTH);
$data_profil = mysqli_fetch_array($query_profil, MYSQLI_BOTH);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>LAPORAN DATA PINDAH</title>
<meta charset="UTF-8">
<title>LAPORAN PENDATAAN PENDUDUK PENDATANG</title>
<style>
body { font-family: Arial, sans-serif; font-size: 12px; }
.header { text-align: center; margin-bottom: 20px; }
.header h2, .header h3 { margin: 5px 0; }
.meta { margin-bottom: 15px; }
.meta table { border: none; }
table { width: 100%; border-collapse: collapse; margin-top: 10px; }
th, td { border: 1px solid black; padding: 5px; text-align: center; }
th { background-color: #f2f2f2; }
.footer { margin-top: 30px; float: right; width: 30%; text-align: center; }
.footer .signature { margin-top: 60px; }
</style>
</head>
<body>
<center>
<h2>PEMERINTAH KABUPATEN <?php echo strtoupper($data_profil['kabupaten']); ?></h2>
<h3>KECAMATAN <?php echo strtoupper($data_profil['kecamatan']); ?> <br> DESA <?php echo strtoupper($data_profil['nama_desa']); ?></h3>
<p><?php echo $data_profil['alamat']; ?></p>
<p>________________________________________________________________________</p>
<h3>LAPORAN DATA PINDAH</h3>
<p align="left">Dicetak Tanggal : <?php echo $tanggal; ?></p>
</center>
<div class="header">
<h3>PENDATAAN PENDUDUK PENDATANG DI DESA <?php echo strtoupper($data_profil['nama_desa']); ?></h3>
</div>
<table border="1" cellspacing="0" style="width: 100%">
<div class="meta">
<table>
<tr>
<td style="border:none; text-align:left; width: 150px;">PENAMPUNG</td>
<td style="border:none; text-align:left; width: 10px;">:</td>
<td style="border:none; text-align:left;">................................</td>
</tr>
<tr>
<td style="border:none; text-align:left;">ALAMAT/BANJAR</td>
<td style="border:none; text-align:left;">:</td>
<td style="border:none; text-align:left;">................................</td>
</tr>
</table>
</div>
<table>
<thead>
<tr>
<th>No</th>
<th>NO</th>
<th>NAMA</th>
<th>NIK</th>
<th>Nama</th>
<th>Tanggal Pindah</th>
<th>Alasan</th>
<th>ALAMAT</th>
<th>TTL</th>
<th>PEKERJAAN</th>
<th>MASUK/KELUAR</th>
<th>KET</th>
</tr>
</thead>
<tbody>
<?php
$no=1;
$sql_tampil = "SELECT p.nik, p.nama, m.tgl_pindah, m.alasan
FROM tb_pindah m
INNER JOIN tb_pdd p ON p.id_pend=m.id_pdd";
$no = 1;
// Query Gabungan Datang (Masuk) dan Pindah (Keluar)
$sql_tampil = "
(SELECT p.nama, p.nik, CONCAT(p.desa, ' RT ', p.rt, ' RW ', p.rw) as alamat,
CONCAT(p.tempat_lh, ', ', DATE_FORMAT(p.tgl_lh, '%d-%m-%Y')) as ttl,
p.pekerjaan, d.tgl_datang as tanggal, 'MASUK' as status, '' as keterangan
FROM tb_datang d
JOIN tb_pdd p ON d.id_pend = p.id_pend)
UNION ALL
(SELECT p.nama, p.nik, CONCAT(p.desa, ' RT ', p.rt, ' RW ', p.rw) as alamat,
CONCAT(p.tempat_lh, ', ', DATE_FORMAT(p.tgl_lh, '%d-%m-%Y')) as ttl,
p.pekerjaan, m.tgl_pindah as tanggal, 'KELUAR' as status, m.alasan as keterangan
FROM tb_pindah m
JOIN tb_pdd p ON m.id_pdd = p.id_pend)
ORDER BY tanggal DESC
";
$query_tampil = mysqli_query($koneksi, $sql_tampil);
while ($data = mysqli_fetch_array($query_tampil,MYSQLI_BOTH)) {
if (mysqli_num_rows($query_tampil) > 0) {
while ($data = mysqli_fetch_array($query_tampil, MYSQLI_BOTH)) {
?>
<tr>
<td align="center"><?php echo $no++; ?></td>
<td><?php echo $data['nik']; ?></td>
<td><?php echo $no++; ?></td>
<td><?php echo $data['nama']; ?></td>
<td><?php echo $data['tgl_pindah']; ?></td>
<td><?php echo $data['alasan']; ?></td>
<td><?php echo $data['nik']; ?></td>
<td><?php echo $data['alamat']; ?></td>
<td><?php echo $data['ttl']; ?></td>
<td><?php echo $data['pekerjaan']; ?></td>
<td><?php echo $data['status']; ?></td>
<td><?php echo $data['keterangan']; ?></td>
</tr>
<?php } ?>
<?php
}
} else {
// Tampilkan baris kosong jika tidak ada data
for ($i = 0; $i < 5; $i++) {
echo "<tr><td>&nbsp;</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>";
}
}
?>
</tbody>
</table>
<div class="footer">
<div>................................, .......................</div>
<div style="margin-top: 5px;">Mengetahui</div>
<div class="signature">
(................................)
</div>
</div>
<script>
window.print();
</script>