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

  1. Pendahuluan & Gambaran Umum
  2. Arsitektur Teknologi
  3. Struktur Database & Relasi

Part II — Alur Aplikasi

  1. Alur Booking Multi-Step
  2. Sistem Autentikasi

Part III — Fitur & Role

  1. Fitur Web
  2. Panel Admin
  3. Role & Akses

Part IV — Pengembangan

  1. Security Assessment
  2. Rekomendasi

Lampiran

Part I
Arsitektur, teknologi, dan fondasi database

Bab 1: Pendahuluan & Gambaran Umum

1.1 4W+1H

AspekDeskripsi
ApaAplikasi booking servis AC berbasis web untuk perusahaan Top Airconditioner. Pelanggan bisa memesan layanan servis AC, upload bukti bayar, dan melacak status booking.
MengapaMempermudah pelanggan melakukan booking layanan servis AC secara online tanpa perlu datang langsung atau telepon. Menghemat waktu dan meningkatkan efisiensi operasional.
SiapaAdmin (pengelola sistem), Customer (pelanggan), Pemilik (owner bisnis), Staff/Teknisi (teknisi AC lapangan)
KapanDikembangkan Juli 2026. Berdiri sejak tahun 1977.
BagaimanaCodeIgniter 3.1.13 + PHP 8.2.12 + MySQL/MariaDB + Bootstrap + Font Awesome + Google Fonts Poppins

1.2 Pengguna & Role

RoleMetode LoginDashboardKeterangan
Adminemail + MD5/dashboardInternal Pengelola penuh: user, staff, service, booking, laporan
Customeremail + MD5/homeExternal Booking servis AC, upload bukti bayar, lihat riwayat
Pemilikemail + MD5/dashboard_pimpinanOwner Melihat laporan booking & hasil kerja
Staff/Teknisiusername + bcrypt/dashboard_teknisiInternal Mengerjakan servis, update status, unggah hasil

1.3 Fitur Utama

#FiturStatus
1Multi-step Booking (3 langkah + pembayaran)Aktif
2Login & Register (admin, customer, pemilik)Aktif
3Login Staff (username + bcrypt)Aktif
4Upload Bukti PembayaranAktif
5Admin Booking Management & ApproveAktif
6Staff: Update Status & Upload Hasil KerjaAktif
7Laporan Booking & Hasil KerjaAktif
8CRUD User, Staff, ServiceAktif

Bab 2: Arsitektur Teknologi

2.1 Tech Stack

KomponenTeknologiKeterangan
Backend FrameworkCodeIgniter 3.1.13PHP MVC Framework
PHP VersionPHP 8.2.12 (ZTS)⚠️ CI3 belum fully compatible PHP 8.2
DatabaseMySQL / MariaDB — db_top4 tabel utama + 1 relasi
FrontendBootstrap 5 + Custom CSSResponsive layout
FontGoogle Fonts — Poppins300-700 weight
IkonFont Awesome 6.5.1 + Bootstrap IconsIcon library
Password (Users)MD5⚠️ Insecure, harus diganti bcrypt
Password (Staff)bcrypt (password_hash)✅ Aman
SessionCI Files DriverDisimpan di cache/sessions/

2.2 Autoloaded Resources

KategoriItems
Librariesdatabase, session
Helpersurl
ModelsNone (loaded per controller)
PackagesNone

2.3 Environment & Config

SettingNilaiKeterangan
ENVIRONMENTdevelopmentError reporting aktif penuh
base_urlhttp://localhost/top/
index_pageindex.phpURL mengandung index.php
csrf_protectionFALSE⚠️ CSRF tidak aktif
encryption_keytop_aircon_secure_key_2026Untuk session/cookie

Bab 3: Struktur Database & Relasi

3.1 users

ColumnTypeKeterangan
idint(11) PK AI
namevarchar(100)Nama lengkap
emailvarchar(100) UNIQUEEmail untuk login
passwordvarchar(255)MD5 hash
roleenum('admin','customer','pemilik')Default: customer
created_attimestampDEFAULT CURRENT_TIMESTAMP

3.2 staff

ColumnTypeKeterangan
id_staffint(11) PK AI
namevarchar(100) NOT NULLNama teknisi
usernamevarchar(20) NOT NULLLogin credential
passwordvarchar(255) NOT NULLbcrypt hash
addresstextAlamat
phonevarchar(20)No. telepon
salarydecimal(12,2)Gaji
date_indateTanggal masuk
date_outdateTanggal keluar
specialistvarchar(100)Keahlian
image_staffvarchar(255)Foto teknisi

3.3 services

ColumnTypeKeterangan
idint(11) PK AI
namevarchar(100) NOT NULLNama layanan
typevarchar(100) NOT NULLJenis layanan (contoh: Cuci AC 1/2 pk)
descriptiontextDeskripsi layanan
pricedecimal(12,2) NOT NULLHarga layanan
statusvarchar(15)active / inactive

3.4 booking

ColumnTypeKeterangan
idint(11) PK AI
booking_codevarchar(20) UNIQUEBK{date}{random}
servicevarchar(50)FK → services.id
datedateTanggal service
timetimeJam service
full_namevarchar(100)Nama pelanggan
emailvarchar(100)Email pelanggan
phonevarchar(20)No. telepon
addresstextAlamat
notestextCatatan
amountdecimal(12,2)Total harga
statusenum(...)6 status: pending_payment, paid, assigned, maintenance, completed, expired
payment_proofvarchar(255)Filename bukti bayar
paid_atdatetimeWaktu pembayaran
id_stafint(11)FK → staff.id_staff
expires_atdatetime30 menit dari pembuatan

3.5 booking_result

ColumnTypeKeterangan
id_resultint(11) PK AI
booking_idint(11) KEYFK → booking.id
id_staffint(11) KEYFK → staff.id_staff
pekerjaantext NOT NULLDeskripsi pekerjaan
spareparttextSuku cadang yang digunakan
foto_hasilvarchar(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.
Part II
Alur booking dan autentikasi pengguna

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

StatusKeteranganOleh
pending_paymentMenunggu pembayaran (30 menit)System (otomatis)
paidPembayaran dikonfirmasiCustomer (upload)
assignedStaff ditugaskanAdmin (approve)
maintenanceSedang dikerjakanStaff (start)
completedSelesai dikerjakanStaff (finish + upload hasil)
expiredBooking kedaluwarsaSystem / Manual

4.3 Endpoint Booking

MethodURLControllerKeterangan
GET/bookingBooking::indexStep 1 form
POST/booking/submitBooking::submitSimpan step 1
POST/booking/save_step2Booking::save_step2Simpan step 2
GET/booking/step3Booking::step3Konfirmasi
GET/booking/confirmBooking::confirmBuat booking
GET/booking/payment/{id}Booking::paymentHalaman bayar
POST/booking/upload_payment/{id}Booking::upload_paymentUpload bukti
GET/booking/print_receipt/{id}Booking::print_receiptStruk
POST/booking/get_service_priceBooking::get_service_priceAJAX harga

Bab 5: Sistem Autentikasi

5.1 Login Methods

MetodeInputHashRedirect
User Loginemail + passwordMD5By role: admin→/dashboard, pemilik→/dashboard_pimpinan, customer→/home
Staff Loginusername + passwordbcrypt/dashboard_teknisi
Registername + email + passwordMD5→ /auth/login

5.2 Session Data

KeyValueDigunakan Oleh
user_idUser IDAuth check, transaksi
user_emailEmail userBooking confirm
nameNama userHeader display
roleRole stringMenu visibility, redirect
is_adminBooleanAdmin check
logged_inBooleanAuth gate
staff_idStaff IDTeknisi 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"
Part III
Fitur web, panel admin, dan hak akses role

Bab 6: Fitur Web

6.1 Halaman Publik (Guest)

HalamanURLKeterangan
Homepage/homeLanding page dengan layanan, CTA booking
Tentang Kami/aboutProfil perusahaan, sejarah, visi-misi
Jenis Service/servisDaftar layanan servis AC
Tata Cara Booking/cara_bookingPanduan langkah-langkah booking
Kontak/contactInformasi kontak & alamat
Blog/blogHalaman blog
Karir/careersHalaman lowongan kerja
Tim/teamDaftar teknisi/staff
Booking/bookingMembutuhkan login (tampilkan prompt)
Login/auth/loginForm login
Register/auth/registerForm pendaftaran

6.2 Halaman User Login

HalamanURLKeterangan
Booking/bookingForm multi-step booking
Transaksi/transaksiRiwayat booking user
Logout/auth/logoutHapus session

6.3 Navigasi Menu

MenuTampil KetikaLink
HomeSelalu/home
ProfilSelalu/about
ServiceSelalu/servis
BookingSelalu/booking
DashboardLogin + non-customer/dashboard
TransaksiLogin/transaksi
LoginBelum login/auth/login
DaftarBelum login/auth/register
LogoutLogin/auth/logout

Bab 7: Panel Admin & Dashboard

7.1 Admin Dashboard

MenuURLKeterangan
Dashboard/dashboardStats: total booking, pending, paid, assigned, completed, total service
Booking Management/booking_admin/bookingsList semua booking, filter status/service/tanggal
Approve BookingPOST /dashboard/approveAssign staff ke booking, status: assigned
Hasil Pekerjaan/booking_admin/hasilList hasil kerja teknisi
Cetak Booking/booking_admin/cetak_bookingPrint laporan booking
Cetak Hasil/booking_admin/cetak_hasilPrint laporan hasil kerja

7.2 CRUD Management

ManajemenURLControllerFitur
User/userUserList, tambah (MD5), hapus
Staff/staffStaffList, tambah (bcrypt), edit, hapus, upload foto
Service/servicesServicesList, tambah, edit, hapus

7.3 Dashboard per Role

RoleDashboardFitur Utama
Admin/dashboardStats, approve booking, manage user/staff/service, laporan
Customer/homeLihat layanan, booking, riwayat transaksi
Pemilik/dashboard_pimpinanLaporan booking, laporan hasil kerja
Staff/dashboard_teknisiBooking ditugaskan, start/finish, upload hasil

Bab 8: Role & Akses

8.1 Matrix Akses

Menu / FiturAdminCustomerPemilikStaff
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.
Part IV
Evaluasi keamanan dan rekomendasi pengembangan

Bab 9: Security Assessment

9.1 Masalah Keamanan

#MasalahSeverityLokasi
1Password user pakai MD5 (bisa di-reverse via rainbow table)CRITICALAuth::register, User::store
2CSRF Protection dimatikanCRITICALconfig.php
3Tidak ada input sanitization / XSS filteringCRITICALSeluruh views & controllers
4Controller Staff tidak ada auth checkCRITICALStaff.php
5Booking::expired, upload_payment, confirm tanpa authCRITICALBooking.php
6Session tidak di-regenerate setelah loginHIGHAuth::login
7Tidak ada rate limiting pada loginHIGHAuth::login
8Development mode di production (error display aktif)HIGHindex.php
9Cookie HttpOnly = FALSEHIGHconfig.php
10Booking code hanya 900 kemungkinan per hari (rand 100-999)MEDIUMBooking::confirm
11Tidak ada FOREIGN KEY constraintsMEDIUMDatabase schema
12Booking model::insert() menggunakan undefined variablesMEDIUMBooking_model.php

9.2 Konsistensi Hashing

TabelHashContohStatus
usersMD5202cb962ac59075b964b07152d234b70 (password: 123)Insecure
staffbcrypt$2y$10$...Aman

Bab 10: Rekomendasi

10.1 Prioritas Perbaikan

#RekomendasiPrioritas
1Ganti MD5 → bcrypt untuk semua user (password_hash())URGENT
2Enable CSRF protection ($config['csrf_protection'] = TRUE)URGENT
3Tambah auth check di semua controller (Staff, Booking expired, upload_payment, confirm)URGENT
4Gunakan htmlspecialchars() di semua output viewURGENT
5Set ENVIRONMENT ke productionHIGH
6Enable cookie_httponly = TRUEHIGH
7Tambah rate limiting pada loginHIGH
8Regenerate session ID setelah loginHIGH
9Tambah FOREIGN KEY constraints ke databaseMEDIUM
10Fix Booking_model::insert() undefined variablesMEDIUM

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
File structure, routes, dan change log

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

RouteMaps ToKeterangan
/homeHomepage (default)
aboutaboutTentang Kami
servisservisDaftar service
bookingbookingHalaman booking
dashboarddashboardAdmin dashboard
servicesservicesCRUD services
services/createservices/createTambah service
loginauth/loginLogin
logoutauth/logoutLogout

Lampiran C: Change Log

TanggalVersiPerubahan
Juli 20261.0.0Initial release: booking multi-step, admin dashboard, staff dashboard, CRUD, laporan, pembayaran