Top Airconditioner — Buku Dokumentasi Teknis
Dokumentasi Lengkap — Aplikasi Booking Servis AC Berbasis Web
Aplikasi: Top Airconditioner — Booking Servis AC
Author: Tulus Harapan Hutauruk
Versi: 1.0 — Juli 2026
Database: db_top (MySQL)
Tech Stack: CodeIgniter 3 · PHP 8.2 · MySQL · Bootstrap · Poppins · Font Awesome
Daftar Isi
Part I — Fundasi Sistem
- Pendahuluan & Gambaran Umum
- Arsitektur Teknologi
- Struktur Database & Relasi
Part II — Alur Aplikasi
- Alur Booking Multi-Step
- Sistem Autentikasi
Part III — Fitur & Role
- Fitur Web
- Panel Admin
- Role & Akses
Part IV — Pengembangan
- Security Assessment
- Rekomendasi
Lampiran
Bab 1: Pendahuluan & Gambaran Umum
1.1 4W+1H
| Aspek | Deskripsi |
| Apa | Aplikasi booking servis AC berbasis web untuk perusahaan Top Airconditioner. Pelanggan bisa memesan layanan servis AC, upload bukti bayar, dan melacak status booking. |
| Mengapa | Mempermudah pelanggan melakukan booking layanan servis AC secara online tanpa perlu datang langsung atau telepon. Menghemat waktu dan meningkatkan efisiensi operasional. |
| Siapa | Admin (pengelola sistem), Customer (pelanggan), Pemilik (owner bisnis), Staff/Teknisi (teknisi AC lapangan) |
| Kapan | Dikembangkan Juli 2026. Berdiri sejak tahun 1977. |
| Bagaimana | CodeIgniter 3.1.13 + PHP 8.2.12 + MySQL/MariaDB + Bootstrap + Font Awesome + Google Fonts Poppins |
1.2 Pengguna & Role
| Role | Metode Login | Dashboard | Keterangan |
| Admin | email + MD5 | /dashboard | Internal Pengelola penuh: user, staff, service, booking, laporan |
| Customer | email + MD5 | /home | External Booking servis AC, upload bukti bayar, lihat riwayat |
| Pemilik | email + MD5 | /dashboard_pimpinan | Owner Melihat laporan booking & hasil kerja |
| Staff/Teknisi | username + bcrypt | /dashboard_teknisi | Internal Mengerjakan servis, update status, unggah hasil |
1.3 Fitur Utama
| # | Fitur | Status |
| 1 | Multi-step Booking (3 langkah + pembayaran) | Aktif |
| 2 | Login & Register (admin, customer, pemilik) | Aktif |
| 3 | Login Staff (username + bcrypt) | Aktif |
| 4 | Upload Bukti Pembayaran | Aktif |
| 5 | Admin Booking Management & Approve | Aktif |
| 6 | Staff: Update Status & Upload Hasil Kerja | Aktif |
| 7 | Laporan Booking & Hasil Kerja | Aktif |
| 8 | CRUD User, Staff, Service | Aktif |
Bab 2: Arsitektur Teknologi
2.1 Tech Stack
| Komponen | Teknologi | Keterangan |
| Backend Framework | CodeIgniter 3.1.13 | PHP MVC Framework |
| PHP Version | PHP 8.2.12 (ZTS) | ⚠️ CI3 belum fully compatible PHP 8.2 |
| Database | MySQL / MariaDB — db_top | 4 tabel utama + 1 relasi |
| Frontend | Bootstrap 5 + Custom CSS | Responsive layout |
| Font | Google Fonts — Poppins | 300-700 weight |
| Ikon | Font Awesome 6.5.1 + Bootstrap Icons | Icon library |
| Password (Users) | MD5 | ⚠️ Insecure, harus diganti bcrypt |
| Password (Staff) | bcrypt (password_hash) | ✅ Aman |
| Session | CI Files Driver | Disimpan di cache/sessions/ |
2.2 Autoloaded Resources
| Kategori | Items |
| Libraries | database, session |
| Helpers | url |
| Models | None (loaded per controller) |
| Packages | None |
2.3 Environment & Config
| Setting | Nilai | Keterangan |
ENVIRONMENT | development | Error reporting aktif penuh |
base_url | http://localhost/top/ | |
index_page | index.php | URL mengandung index.php |
csrf_protection | FALSE | ⚠️ CSRF tidak aktif |
encryption_key | top_aircon_secure_key_2026 | Untuk session/cookie |
Bab 3: Struktur Database & Relasi
3.1 users
| Column | Type | Keterangan |
| id | int(11) PK AI | |
| name | varchar(100) | Nama lengkap |
| email | varchar(100) UNIQUE | Email untuk login |
| password | varchar(255) | MD5 hash |
| role | enum('admin','customer','pemilik') | Default: customer |
| created_at | timestamp | DEFAULT CURRENT_TIMESTAMP |
3.2 staff
| Column | Type | Keterangan |
| id_staff | int(11) PK AI | |
| name | varchar(100) NOT NULL | Nama teknisi |
| username | varchar(20) NOT NULL | Login credential |
| password | varchar(255) NOT NULL | bcrypt hash |
| address | text | Alamat |
| phone | varchar(20) | No. telepon |
| salary | decimal(12,2) | Gaji |
| date_in | date | Tanggal masuk |
| date_out | date | Tanggal keluar |
| specialist | varchar(100) | Keahlian |
| image_staff | varchar(255) | Foto teknisi |
3.3 services
| Column | Type | Keterangan |
| id | int(11) PK AI | |
| name | varchar(100) NOT NULL | Nama layanan |
| type | varchar(100) NOT NULL | Jenis layanan (contoh: Cuci AC 1/2 pk) |
| description | text | Deskripsi layanan |
| price | decimal(12,2) NOT NULL | Harga layanan |
| status | varchar(15) | active / inactive |
3.4 booking
| Column | Type | Keterangan |
| id | int(11) PK AI | |
| booking_code | varchar(20) UNIQUE | BK{date}{random} |
| service | varchar(50) | FK → services.id |
| date | date | Tanggal service |
| time | time | Jam service |
| full_name | varchar(100) | Nama pelanggan |
| email | varchar(100) | Email pelanggan |
| phone | varchar(20) | No. telepon |
| address | text | Alamat |
| notes | text | Catatan |
| amount | decimal(12,2) | Total harga |
| status | enum(...) | 6 status: pending_payment, paid, assigned, maintenance, completed, expired |
| payment_proof | varchar(255) | Filename bukti bayar |
| paid_at | datetime | Waktu pembayaran |
| id_staf | int(11) | FK → staff.id_staff |
| expires_at | datetime | 30 menit dari pembuatan |
3.5 booking_result
| Column | Type | Keterangan |
| id_result | int(11) PK AI | |
| booking_id | int(11) KEY | FK → booking.id |
| id_staff | int(11) KEY | FK → staff.id_staff |
| pekerjaan | text NOT NULL | Deskripsi pekerjaan |
| sparepart | text | Suku cadang yang digunakan |
| foto_hasil | varchar(255) | Foto hasil kerja |
3.6 Relasi Antar Tabel
users 1---* booking (via email)
staff 1---* booking (via id_staf)
services 1---* booking (via service FK)
booking 1---1 booking_result (via booking_id)
staff 1---* booking_result (via id_staff)
⚠️ Catatan: Tabel booking menggunakan service sebagai varchar(50) untuk FK ke services.id (int). Ini adalah tipe data mismatch yang berpotensi menyebabkan error.
Bab 4: Alur Booking Multi-Step
4.1 Alur Booking
Step 1: Pilih Service + Tanggal + Jam
|
v
Step 2: Isi Data Diri (nama, email, telepon, alamat, catatan)
|
v
Step 3: Konfirmasi Semua Data
|
v
Confirm: Buat Booking (status: pending_payment, expires: 30 menit)
|
v
Payment: Upload Bukti Bayar → status: paid → Receipt
4.2 Status Booking
| Status | Keterangan | Oleh |
| pending_payment | Menunggu pembayaran (30 menit) | System (otomatis) |
| paid | Pembayaran dikonfirmasi | Customer (upload) |
| assigned | Staff ditugaskan | Admin (approve) |
| maintenance | Sedang dikerjakan | Staff (start) |
| completed | Selesai dikerjakan | Staff (finish + upload hasil) |
| expired | Booking kedaluwarsa | System / Manual |
4.3 Endpoint Booking
| Method | URL | Controller | Keterangan |
| GET | /booking | Booking::index | Step 1 form |
| POST | /booking/submit | Booking::submit | Simpan step 1 |
| POST | /booking/save_step2 | Booking::save_step2 | Simpan step 2 |
| GET | /booking/step3 | Booking::step3 | Konfirmasi |
| GET | /booking/confirm | Booking::confirm | Buat booking |
| GET | /booking/payment/{id} | Booking::payment | Halaman bayar |
| POST | /booking/upload_payment/{id} | Booking::upload_payment | Upload bukti |
| GET | /booking/print_receipt/{id} | Booking::print_receipt | Struk |
| POST | /booking/get_service_price | Booking::get_service_price | AJAX harga |
Bab 5: Sistem Autentikasi
5.1 Login Methods
| Metode | Input | Hash | Redirect |
| User Login | email + password | MD5 | By role: admin→/dashboard, pemilik→/dashboard_pimpinan, customer→/home |
| Staff Login | username + password | bcrypt | /dashboard_teknisi |
| Register | name + email + password | MD5 | → /auth/login |
5.2 Session Data
| Key | Value | Digunakan Oleh |
user_id | User ID | Auth check, transaksi |
user_email | Email user | Booking confirm |
name | Nama user | Header display |
role | Role string | Menu visibility, redirect |
is_admin | Boolean | Admin check |
logged_in | Boolean | Auth gate |
staff_id | Staff ID | Teknisi dashboard |
5.3 Login Flow
Auth::login()
|
├─ Cek users table (MD5)
│ Jika cocok → set session → redirect by role
│
├─ Jika tidak, cek staff table (bcrypt)
│ Jika cocok → set session → redirect /dashboard_teknisi
│
└─ Jika gagal → tampilkan error "Email or password is incorrect"
Bab 6: Fitur Web
6.1 Halaman Publik (Guest)
| Halaman | URL | Keterangan |
| Homepage | /home | Landing page dengan layanan, CTA booking |
| Tentang Kami | /about | Profil perusahaan, sejarah, visi-misi |
| Jenis Service | /servis | Daftar layanan servis AC |
| Tata Cara Booking | /cara_booking | Panduan langkah-langkah booking |
| Kontak | /contact | Informasi kontak & alamat |
| Blog | /blog | Halaman blog |
| Karir | /careers | Halaman lowongan kerja |
| Tim | /team | Daftar teknisi/staff |
| Booking | /booking | Membutuhkan login (tampilkan prompt) |
| Login | /auth/login | Form login |
| Register | /auth/register | Form pendaftaran |
6.2 Halaman User Login
| Halaman | URL | Keterangan |
| Booking | /booking | Form multi-step booking |
| Transaksi | /transaksi | Riwayat booking user |
| Logout | /auth/logout | Hapus session |
6.3 Navigasi Menu
| Menu | Tampil Ketika | Link |
| Home | Selalu | /home |
| Profil | Selalu | /about |
| Service | Selalu | /servis |
| Booking | Selalu | /booking |
| Dashboard | Login + non-customer | /dashboard |
| Transaksi | Login | /transaksi |
| Login | Belum login | /auth/login |
| Daftar | Belum login | /auth/register |
| Logout | Login | /auth/logout |
Bab 7: Panel Admin & Dashboard
7.1 Admin Dashboard
| Menu | URL | Keterangan |
| Dashboard | /dashboard | Stats: total booking, pending, paid, assigned, completed, total service |
| Booking Management | /booking_admin/bookings | List semua booking, filter status/service/tanggal |
| Approve Booking | POST /dashboard/approve | Assign staff ke booking, status: assigned |
| Hasil Pekerjaan | /booking_admin/hasil | List hasil kerja teknisi |
| Cetak Booking | /booking_admin/cetak_booking | Print laporan booking |
| Cetak Hasil | /booking_admin/cetak_hasil | Print laporan hasil kerja |
7.2 CRUD Management
| Manajemen | URL | Controller | Fitur |
| User | /user | User | List, tambah (MD5), hapus |
| Staff | /staff | Staff | List, tambah (bcrypt), edit, hapus, upload foto |
| Service | /services | Services | List, tambah, edit, hapus |
7.3 Dashboard per Role
| Role | Dashboard | Fitur Utama |
| Admin | /dashboard | Stats, approve booking, manage user/staff/service, laporan |
| Customer | /home | Lihat layanan, booking, riwayat transaksi |
| Pemilik | /dashboard_pimpinan | Laporan booking, laporan hasil kerja |
| Staff | /dashboard_teknisi | Booking ditugaskan, start/finish, upload hasil |
Bab 8: Role & Akses
8.1 Matrix Akses
| Menu / Fitur | Admin | Customer | Pemilik | Staff |
| Homepage | ✔ | ✔ | ✔ | ✔ |
| Tentang Kami | ✔ | ✔ | ✔ | ✔ |
| Booking (form) | ✔ | ✔ | ✔ | ✘ |
| Transaksi | ✘ | ✔ | ✘ | ✘ |
| Dashboard Admin | ✔ | ✘ | ✘ | ✘ |
| CRUD User | ✔ | ✘ | ✘ | ✘ |
| CRUD Staff | ✔ | ✘ | ✘ | ✘ |
| CRUD Service | ✔ | ✘ | ✘ | ✘ |
| Booking Management | ✔ | ✘ | ✘ | ✘ |
| Laporan | ✔ | ✘ | ✔ | ✘ |
| Teknisi Dashboard | ✘ | ✘ | ✘ | ✔ |
| Upload Hasil Kerja | ✘ | ✘ | ✘ | ✔ |
⚠️ Peringatan: Controller Staff (CRUD) tidak memiliki auth check. Siapa saja bisa mengakses halaman CRUD staff tanpa login.
Bab 9: Security Assessment
9.1 Masalah Keamanan
| # | Masalah | Severity | Lokasi |
| 1 | Password user pakai MD5 (bisa di-reverse via rainbow table) | CRITICAL | Auth::register, User::store |
| 2 | CSRF Protection dimatikan | CRITICAL | config.php |
| 3 | Tidak ada input sanitization / XSS filtering | CRITICAL | Seluruh views & controllers |
| 4 | Controller Staff tidak ada auth check | CRITICAL | Staff.php |
| 5 | Booking::expired, upload_payment, confirm tanpa auth | CRITICAL | Booking.php |
| 6 | Session tidak di-regenerate setelah login | HIGH | Auth::login |
| 7 | Tidak ada rate limiting pada login | HIGH | Auth::login |
| 8 | Development mode di production (error display aktif) | HIGH | index.php |
| 9 | Cookie HttpOnly = FALSE | HIGH | config.php |
| 10 | Booking code hanya 900 kemungkinan per hari (rand 100-999) | MEDIUM | Booking::confirm |
| 11 | Tidak ada FOREIGN KEY constraints | MEDIUM | Database schema |
| 12 | Booking model::insert() menggunakan undefined variables | MEDIUM | Booking_model.php |
9.2 Konsistensi Hashing
| Tabel | Hash | Contoh | Status |
| users | MD5 | 202cb962ac59075b964b07152d234b70 (password: 123) | Insecure |
| staff | bcrypt | $2y$10$... | Aman |
Bab 10: Rekomendasi
10.1 Prioritas Perbaikan
| # | Rekomendasi | Prioritas |
| 1 | Ganti MD5 → bcrypt untuk semua user (password_hash()) | URGENT |
| 2 | Enable CSRF protection ($config['csrf_protection'] = TRUE) | URGENT |
| 3 | Tambah auth check di semua controller (Staff, Booking expired, upload_payment, confirm) | URGENT |
| 4 | Gunakan htmlspecialchars() di semua output view | URGENT |
| 5 | Set ENVIRONMENT ke production | HIGH |
| 6 | Enable cookie_httponly = TRUE | HIGH |
| 7 | Tambah rate limiting pada login | HIGH |
| 8 | Regenerate session ID setelah login | HIGH |
| 9 | Tambah FOREIGN KEY constraints ke database | MEDIUM |
| 10 | Fix Booking_model::insert() undefined variables | MEDIUM |
10.2 Contoh Perbaikan Password Hashing
// SEBELUM (MD5 - insecure)
$password = md5($this->input->post('password'));
// SESUDAH (bcrypt - aman)
$password = password_hash($this->input->post('password'), PASSWORD_DEFAULT);
10.3 Contoh Tambah Auth Check
// Tambahkan di awal method controller:
if (!$this->session->userdata('logged_in')) {
redirect('auth/login');
}
// Atau cek role:
if ($this->session->userdata('role') !== 'admin') {
show_404();
}
Lampiran A: File Structure
top/
├── index.php (Front controller)
├── .htaccess (URL rewriting)
├── composer.json (CI3 dependency)
├── db_top.sql (Database dump)
├── top_app.md (Dokumentasi Markdown)
├── top_app.html (Dokumentasi HTML)
├── application/
│ ├── config/
│ │ ├── autoload.php (database, session, url)
│ │ ├── config.php (base_url, session, dll)
│ │ └── routes.php (11 routes)
│ ├── controllers/ (21 controllers)
│ │ ├── About.php
│ │ ├── Auth.php
│ │ ├── Blog.php
│ │ ├── Booking.php
│ │ ├── Booking_admin.php
│ │ ├── Cara_booking.php
│ │ ├── Careers.php
│ │ ├── Contact.php
│ │ ├── Dashboard.php
│ │ ├── Dashboard_cus.php
│ │ ├── Dashboard_pimpinan.php
│ │ ├── Dashboard_teknisi.php
│ │ ├── Home.php
│ │ ├── Quote.php
│ │ ├── Services.php
│ │ ├── Servis.php
│ │ ├── Staff.php
│ │ ├── Team.php
│ │ ├── Transaksi.php
│ │ ├── User.php
│ │ └── Welcome.php
│ ├── models/ (5 models)
│ │ ├── Booking_admin_model.php
│ │ ├── Booking_model.php
│ │ ├── Service_model.php
│ │ ├── Staff_model.php
│ │ └── User_model.php
│ ├── views/ (49 views)
│ │ ├── layout/
│ │ │ ├── header.php
│ │ │ ├── footer.php
│ │ │ ├── sidebar_only.php
│ │ │ └── sidebar_teknisi.php
│ │ ├── auth/
│ │ │ ├── login.php
│ │ │ └── register.php
│ │ ├── booking_admin/
│ │ │ ├── bookings.php
│ │ │ ├── cetak_booking.php
│ │ │ ├── cetak_hasil.php
│ │ │ ├── hasil.php
│ │ │ └── print_payment.php
│ │ ├── pimpinan/
│ │ │ ├── dashboard.php
│ │ │ ├── laporan_booking.php
│ │ │ ├── laporan_hasil.php
│ │ │ └── sidebar.php
│ │ ├── teknisi/
│ │ │ └── dashboard.php
│ │ ├── services/index.php
│ │ ├── staff/index.php
│ │ ├── user/index.php
│ │ └── (21 root views: home, booking, about, etc.)
│ └── cache/sessions/ (Session storage)
├── system/ (CI3 framework core)
├── assets/
│ ├── css/style.css (692 lines custom CSS)
│ └── img/ (Logo, produk, staff photos)
├── uploads/
│ ├── payment/ (22 bukti bayar images)
│ └── hasil/ (2 foto hasil kerja)
└── db_top.sql (Database dump)
Lampiran B: Routes
| Route | Maps To | Keterangan |
/ | home | Homepage (default) |
about | about | Tentang Kami |
servis | servis | Daftar service |
booking | booking | Halaman booking |
dashboard | dashboard | Admin dashboard |
services | services | CRUD services |
services/create | services/create | Tambah service |
login | auth/login | Login |
logout | auth/logout | Logout |
Lampiran C: Change Log
| Tanggal | Versi | Perubahan |
| Juli 2026 | 1.0.0 | Initial release: booking multi-step, admin dashboard, staff dashboard, CRUD, laporan, pembayaran |