From 3d8da9a26ad829f87f81081e1a576b4511e7509e Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 6 Oct 2025 00:57:03 +0000 Subject: [PATCH] Auto commit: 2025-10-06T00:57:03.276Z --- assets/css/custom.css | 344 ++++++++++++++++++++++++++++++++++++++++- dashboard.php | 197 +++++++++++++++++++++++ db/setup.php | 86 +++++++++++ index.php | 2 +- lapor-pajak.php | 145 +++++++++++++++++ login.php | 96 ++++++++++++ logout.php | 22 +++ register.php | 92 +++++++++++ verifikasi-laporan.php | 30 ++++ 9 files changed, 1011 insertions(+), 3 deletions(-) create mode 100644 dashboard.php create mode 100644 db/setup.php create mode 100644 lapor-pajak.php create mode 100644 login.php create mode 100644 logout.php create mode 100644 register.php create mode 100644 verifikasi-laporan.php 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, !

+ +
+
+ +
+
+

Manajemen Pengguna

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
NamaEmailPeranTanggal Terdaftar
Tidak ada pengguna untuk ditampilkan.
+
+
+
+ + +
+
+

Verifikasi Laporan Pajak

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Wajib PajakTanggal LaporJenis PajakTotal PajakStatusAksi
Tidak ada laporan untuk diverifikasi.
Rp + + Setuju + Tolak + + - + +
+
+
+
+ + +
+
+

Riwayat Laporan Pajak Anda

+ Lapor Pajak Baru +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Jenis PajakPeriodeOmzet KotorTotal PajakStatusTanggal 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 @@ - + 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(); +?>