diff --git a/assets/css/custom.css b/assets/css/custom.css
index 581b33f..795b905 100644
--- a/assets/css/custom.css
+++ b/assets/css/custom.css
@@ -1,8 +1,113 @@
-/* Custom CSS for Si-Apon */
+/* Add your custom styles here */
+
+.alert {
+ padding: 1rem;
+ margin-bottom: 1rem;
+ border-radius: 0.5rem;
+ border: 1px solid transparent;
+}
+
+.alert-danger {
+ color: #721c24;
+ background-color: #f8d7da;
+ border-color: #f5c6cb;
+}
+
+.alert-success {
+ color: #155724;
+ background-color: #d4edda;
+ border-color: #c3e6cb;
+}
+
+/* Login & Register Page */
+.login-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ min-height: 100vh;
+ background-color: #f4f4f4;
+}
+
+.login-box {
+ background: #fff;
+ padding: 2.5rem;
+ border-radius: 0.5rem;
+ box-shadow: 0 4px 15px rgba(0,0,0,0.1);
+ width: 100%;
+ max-width: 420px;
+}
+
+.login-header {
+ text-align: center;
+ margin-bottom: 2rem;
+}
+.login-header h2 {
+ margin: 0;
+ font-size: 1.8rem;
+ color: #264653;
+}
+.login-header p {
+ color: #6c757d;
+}
+.logo-link {
+ text-decoration: none;
+}
+
+.login-form .form-group {
+ margin-bottom: 1.5rem;
+}
+
+.login-form label {
+ display: block;
+ margin-bottom: 0.5rem;
+ font-weight: bold;
+ color: #264653;
+}
+
+.login-form input {
+ width: 100%;
+ padding: 0.75rem;
+ border: 1px solid #ccc;
+ border-radius: 0.25rem;
+}
+
+.btn-login {
+ width: 100%;
+ padding: 0.85rem;
+ border: none;
+ border-radius: 0.25rem;
+ background-color: #2A9D8F;
+ color: white;
+ font-size: 1.1rem;
+ cursor: pointer;
+ transition: background-color 0.3s;
+}
+.btn-login:hover {
+ background-color: #248a7e;
+}
+
+.login-footer {
+ text-align: center;
+ margin-top: 1.5rem;
+}
+.login-footer p {
+ margin: 0.5rem 0;
+ color: #6c757d;
+}
+.login-footer a {
+ color: #2A9D8F;
+ text-decoration: none;
+}
+.login-footer a:hover {
+ text-decoration: underline;
+}
+
+
body {
font-family: 'Lato', sans-serif;
color: #264653;
background-color: #F4F4F4;
+ margin: 0;
}
h1, h2, h3, h4, h5, h6 {
@@ -36,6 +141,9 @@ h1, h2, h3, h4, h5, h6 {
border-color: #2A9D8F;
padding: 10px 20px;
border-radius: 0.5rem;
+ color: white;
+ text-decoration: none;
+ display: inline-block;
}
.btn-secondary {
@@ -50,7 +158,239 @@ section {
}
.card {
+ background: #fff;
+ padding: 2rem;
border: none;
border-radius: 0.5rem;
- box-shadow: 0 4px 8px rgba(0,0,0,0.1);
+ box-shadow: 0 4px 8px rgba(0,0,0,0.05);
+ margin-bottom: 2rem;
+}
+
+/* Dashboard Layout */
+.dashboard-wrapper {
+ display: flex;
+ min-height: 100vh;
+}
+
+.sidebar {
+ width: 260px;
+ background: #264653;
+ color: #fff;
+ display: flex;
+ flex-direction: column;
+}
+
+.sidebar-header {
+ padding: 1.5rem;
+ text-align: center;
+ border-bottom: 1px solid #3a5e6c;
+}
+.sidebar-header h3 {
+ margin: 0;
+ color: #fff;
+}
+.sidebar-header a {
+ text-decoration: none;
+}
+
+.sidebar-nav {
+ flex-grow: 1;
+ padding-top: 1rem;
+}
+.sidebar-nav a {
+ display: block;
+ padding: 1rem 1.5rem;
+ color: #e0e0e0;
+ text-decoration: none;
+ transition: background 0.3s, color 0.3s;
+}
+.sidebar-nav a:hover, .sidebar-nav a.active {
+ background: #2A9D8F;
+ color: #fff;
+}
+
+.sidebar-footer {
+ padding: 1.5rem;
+ border-top: 1px solid #3a5e6c;
+}
+.sidebar-footer a {
+ display: block;
+ text-align: center;
+ color: #e0e0e0;
+ text-decoration: none;
+}
+
+.main-content {
+ flex-grow: 1;
+ background: #f4f4f4;
+}
+
+.main-header {
+ background: #fff;
+ padding: 1rem 2rem;
+ border-bottom: 1px solid #ddd;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.content-area {
+ padding: 2rem;
+}
+
+/* Dashboard Table */
+.table-responsive {
+ overflow-x: auto;
+}
+
+table {
+ width: 100%;
+ border-collapse: collapse;
+ margin-top: 1rem;
+}
+
+thead {
+ background-color: #f8f9fa;
+}
+
+th, td {
+ padding: 0.9rem 1rem;
+ text-align: left;
+ border-bottom: 1px solid #dee2e6;
+}
+
+tbody tr:hover {
+ background-color: #f1f1f1;
+}
+
+/* Badges */
+.badge {
+ padding: 0.3em 0.6em;
+ border-radius: 0.25rem;
+ font-size: 0.85em;
+ font-weight: 700;
+ color: #fff;
+}
+
+.role-admin {
+ background-color: #d9534f;
+}
+
+.role-petugas-pajak {
+ background-color: #f0ad4e;
+}
+
+.role-wajib-pajak {
+ background-color: #5bc0de;
+}
+
+/* Status Badges */
+.status-pending {
+ background-color: #f0ad4e; /* Orange */
+}
+
+.status-approved {
+ background-color: #5cb85c; /* Green */
+}
+
+.status-rejected {
+ background-color: #d9534f; /* Red */
+}
+
+/* Form Card for Lapor Pajak */
+.form-card {
+ max-width: 800px;
+ margin: 0 auto;
+}
+
+.form-group {
+ margin-bottom: 1.5rem;
+}
+
+.form-group label {
+ display: block;
+ margin-bottom: .5rem;
+ font-weight: bold;
+}
+
+.form-group input,
+.form-group select {
+ width: 100%;
+ padding: .75rem;
+ border: 1px solid #ccc;
+ border-radius: .25rem;
+ box-sizing: border-box; /* Add this */
+}
+
+.period-group {
+ display: flex;
+ gap: 1rem;
+}
+
+.period-group select {
+ flex: 1;
+}
+
+.btn-block {
+ width: 100%;
+}
+
+/* Dashboard card header */
+.card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 1.5rem;
+ padding-bottom: 1rem;
+ border-bottom: 1px solid #eee;
+}
+
+.card-header h3 {
+ margin: 0;
+}
+
+/* General Dashboard Container */
+.dashboard-container {
+ display: flex;
+ min-height: 100vh;
+}
+
+.logo {
+ text-decoration: none;
+ color: #fff;
+ font-family: 'Merriweather', serif;
+ font-size: 1.5rem;
+}
+
+.user-info {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+}
+
+/* Action Buttons in Tables */
+.actions {
+ white-space: nowrap;
+}
+
+.actions .btn {
+ margin-right: 0.5rem;
+}
+
+.btn-sm {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.2rem;
+}
+
+.btn-success {
+ background-color: #5cb85c;
+ border-color: #5cb85c;
+ color: white;
+}
+
+.btn-danger {
+ background-color: #d9534f;
+ border-color: #d9534f;
+ color: white;
}
diff --git a/dashboard.php b/dashboard.php
new file mode 100644
index 0000000..05d4e52
--- /dev/null
+++ b/dashboard.php
@@ -0,0 +1,197 @@
+query("SELECT id, name, email, role, created_at FROM users ORDER BY created_at DESC");
+ $users = $stmt->fetchAll();
+} elseif ($userRole === 'Wajib Pajak') {
+ $stmt = $pdo->prepare("SELECT * FROM tax_reports WHERE user_id = :user_id ORDER BY created_at DESC");
+ $stmt->execute([':user_id' => $user_id]);
+ $tax_reports = $stmt->fetchAll();
+} elseif ($userRole === 'Petugas Pajak') {
+ $stmt = $pdo->query("SELECT tr.*, u.name AS taxpayer_name FROM tax_reports tr JOIN users u ON tr.user_id = u.id ORDER BY tr.created_at DESC");
+ $tax_reports = $stmt->fetchAll();
+}
+
+?>
+
+
+
+
+
+ Dashboard - Si-Apon
+
+
+
+
+
+
+
+
+ Selamat Datang, !
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | Nama |
+ Email |
+ Peran |
+ Tanggal Terdaftar |
+
+
+
+
+ | Tidak ada pengguna untuk ditampilkan. |
+
+
+
+ |
+ |
+ |
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | Wajib Pajak |
+ Tanggal Lapor |
+ Jenis Pajak |
+ Total Pajak |
+ Status |
+ Aksi |
+
+
+
+
+ | Tidak ada laporan untuk diverifikasi. |
+
+
+
+ |
+ |
+ |
+ Rp |
+ |
+
+
+ Setuju
+ Tolak
+
+ -
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | Jenis Pajak |
+ Periode |
+ Omzet Kotor |
+ Total Pajak |
+ Status |
+ Tanggal Lapor |
+
+
+
+
+ | Anda belum memiliki riwayat laporan. |
+
+
+
+ |
+ |
+ Rp |
+ Rp |
+ |
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/db/setup.php b/db/setup.php
new file mode 100644
index 0000000..989efb7
--- /dev/null
+++ b/db/setup.php
@@ -0,0 +1,86 @@
+exec($sql_users);
+ echo "Table 'users' created successfully (if it didn't exist).
";
+
+ // Inser dummy users
+ $users = [
+ [
+ 'name' => 'Admin',
+ 'email' => 'admin@sarmikab.go.id',
+ 'password' => password_hash('admin123', PASSWORD_DEFAULT),
+ 'role' => 'Super Administrator'
+ ],
+ [
+ 'name' => 'Petugas Pajak',
+ 'email' => 'petugas@sarmikab.go.id',
+ 'password' => password_hash('petugas123', PASSWORD_DEFAULT),
+ 'role' => 'Petugas Pajak'
+ ],
+ [
+ 'name' => 'Wajib Pajak Contoh',
+ 'email' => 'wajibpajak@example.com',
+ 'password' => password_hash('wajibpajak123', PASSWORD_DEFAULT),
+ 'role' => 'Wajib Pajak'
+ ],
+ [
+ 'name' => 'Pimpinan',
+ 'email' => 'pimpinan@sarmikab.go.id',
+ 'password' => password_hash('pimpinan123', PASSWORD_DEFAULT),
+ 'role' => 'Pimpinan'
+ ]
+ ];
+
+ $stmt = $pdo->prepare("INSERT INTO users (name, email, password, role) VALUES (:name, :email, :password, :role)");
+
+ foreach ($users as $user) {
+ // Check if user exists
+ $check_stmt = $pdo->prepare("SELECT id FROM users WHERE email = :email");
+ $check_stmt->execute(['email' => $user['email']]);
+ if ($check_stmt->fetch()) {
+ echo "User with email {$user['email']} already exists. Skipping.
";
+ } else {
+ $stmt->execute($user);
+ echo "User with email {$user['email']} inserted successfully.
";
+ }
+ }
+
+ // Create tax_reports table
+ $sql_tax_reports = "
+ CREATE TABLE IF NOT EXISTS tax_reports (
+ id INT AUTO_INCREMENT PRIMARY KEY,
+ user_id INT NOT NULL,
+ tax_type VARCHAR(100) NOT NULL,
+ period_month INT NOT NULL,
+ period_year INT NOT NULL,
+ gross_revenue DECIMAL(15, 2) NOT NULL,
+ tax_amount DECIMAL(15, 2) NOT NULL,
+ status ENUM('pending', 'approved', 'rejected') NOT NULL DEFAULT 'pending',
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
+ ) ENGINE=INNODB;
+ ";
+ $pdo->exec($sql_tax_reports);
+ echo "Table 'tax_reports' created successfully (if it didn't exist).
";
+
+ echo "
Database setup complete!";
+
+} catch (PDOException $e) {
+ die("DB ERROR: " . $e->getMessage());
+}
diff --git a/index.php b/index.php
index ab5635d..fc57eaa 100644
--- a/index.php
+++ b/index.php
@@ -33,7 +33,7 @@
Tentang
Pajak & Retribusi
Kontak
- Login
+ Login
diff --git a/lapor-pajak.php b/lapor-pajak.php
new file mode 100644
index 0000000..1ed9b79
--- /dev/null
+++ b/lapor-pajak.php
@@ -0,0 +1,145 @@
+prepare(
+ "INSERT INTO tax_reports (user_id, tax_type, period_month, period_year, gross_revenue, tax_amount)
+ VALUES (:user_id, :tax_type, :period_month, :period_year, :gross_revenue, :tax_amount)"
+ );
+
+ $stmt->execute([
+ ':user_id' => $user_id,
+ ':tax_type' => $tax_type,
+ ':period_month' => $period_month,
+ ':period_year' => $period_year,
+ ':gross_revenue' => $gross_revenue,
+ ':tax_amount' => $tax_amount
+ ]);
+
+ $notification = 'Laporan pajak Anda telah berhasil diserahkan. Tarif pajak yang dikenakan adalah 10%.';
+
+ } catch (PDOException $e) {
+ $error = "Gagal menyimpan laporan: " . $e->getMessage();
+ }
+ }
+}
+?>
+
+
+
+
+
+ Lapor Pajak - Si-Apon
+
+
+
+
+
+
+
+
+ Formulir Pelaporan Pajak
+
+
+
+
+
+
+
+
+
+
diff --git a/login.php b/login.php
new file mode 100644
index 0000000..a0bf62b
--- /dev/null
+++ b/login.php
@@ -0,0 +1,96 @@
+prepare("SELECT * FROM users WHERE email = :email");
+ $stmt->execute(['email' => $email]);
+ $user = $stmt->fetch();
+
+ if ($user && password_verify($password, $user['password'])) {
+ // Password is correct, start session
+ $_SESSION['user_id'] = $user['id'];
+ $_SESSION['user_name'] = $user['name'];
+ $_SESSION['user_role'] = $user['role'];
+
+ header("Location: dashboard.php");
+ exit();
+ } else {
+ $error_message = "Email atau password salah.";
+ }
+ } catch (PDOException $e) {
+ $error_message = "Terjadi kesalahan koneksi database.";
+ // For development: error_log($e->getMessage());
+ }
+ }
+}
+?>
+
+
+
+
+
+ Login - Si-Apon
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/logout.php b/logout.php
new file mode 100644
index 0000000..6f6b58b
--- /dev/null
+++ b/logout.php
@@ -0,0 +1,22 @@
+prepare("SELECT id FROM users WHERE email = ?");
+ $stmt->execute([$email]);
+ if ($stmt->fetch()) {
+ $error = 'Email sudah terdaftar.';
+ } else {
+ // Hash the password
+ $hashed_password = password_hash($password, PASSWORD_DEFAULT);
+
+ // Insert new user
+ $stmt = $pdo->prepare("INSERT INTO users (name, email, password, role) VALUES (?, ?, ?, ?)");
+ if ($stmt->execute([$name, $email, $hashed_password, $role])) {
+ $_SESSION['success_message'] = "Registrasi berhasil! Silakan login.";
+ header("Location: login.php");
+ exit;
+ } else {
+ $error = 'Terjadi kesalahan. Gagal mendaftar.';
+ }
+ }
+ } catch (PDOException $e) {
+ // In production, you should log this error instead of showing it to the user.
+ $error = "Database error: " . $e->getMessage();
+ }
+ }
+}
+?>
+
+
+
+
+
+ Registrasi - Si-Apon
+
+
+
+
+
+
+
diff --git a/verifikasi-laporan.php b/verifikasi-laporan.php
new file mode 100644
index 0000000..cdbdc4c
--- /dev/null
+++ b/verifikasi-laporan.php
@@ -0,0 +1,30 @@
+prepare("UPDATE tax_reports SET status = :status WHERE id = :id");
+ $stmt->execute([':status' => $new_status, ':id' => $report_id]);
+ } catch (PDOException $e) {
+ // Sebaiknya log error ini di production
+ die("Database error: " . $e->getMessage());
+ }
+}
+
+// Redirect kembali ke dashboard
+header("Location: dashboard.php");
+exit();
+?>