# 📚 Penjelasan Aplikasi Oceango - Sistem Pemesanan Tiket Kapal

## 🎯 Gambaran Umum

**Oceango** adalah sistem manajemen pemesanan tiket kapal berbasis web yang dirancang untuk memudahkan pelanggan dalam memesan tiket dan membantu admin dalam mengelola operasional bisnis kapal penumpang.

**Deskripsi:**
Aplikasi ini memungkinkan pengguna biasa untuk memesan tiket kapal dengan berbagai pilihan kelas, dan memberikan panel admin untuk mengelola pengguna, pemesanan, serta tracking status perjalanan kapal secara real-time.

---

## 🏗️ Arsitektur Sistem

### Technology Stack
- **Backend:** Laravel 12 (PHP Framework)
- **Database:** MySQL
- **Frontend:** Blade Template + Tailwind CSS
- **Authentication:** Laravel Built-in Authentication

### Struktur Folder
```
app/
├── Http/Controllers/          # Controller logic
│   ├── AdminController.php     # Admin operations (CRUD users, bookings, progress)
│   ├── AdminAuthController.php # Admin login/logout
│   ├── AuthController.php      # User login/register/logout
│   ├── DashboardController.php # Dashboard display
│   └── UserBookingController.php # User booking management
├── Models/                     # Database models
│   ├── User.php               # User model dengan role
│   ├── Booking.php            # Booking model (auto-generate code)
│   └── Progress.php           # Progress tracking model
routes/
├── web.php                    # Semua routes aplikasi
database/
├── migrations/                # Database schema
├── seeders/                   # Data dummy (seeder)
└── factories/                 # Factory untuk testing
resources/
├── views/                     # Blade templates
│   ├── admin/                # Admin views
│   ├── user/                 # User views
│   ├── login/                # Auth views
│   └── layouts/              # Layout templates
```

---

## 👥 User Roles & Permissions

### 1. **Admin** 👨‍💼
**Hak Akses:**
- ✅ Login ke admin panel (`/admin/login`)
- ✅ Akses dashboard admin (`/admin/dashboard`)
- ✅ **Kelola Pengguna** - Tambah, edit, hapus pengguna
- ✅ **Kelola Pemesanan** - Lihat, ubah status, batalkan booking
- ✅ **Kelola Progress** - Update tracking status kapal real-time
- ✅ Melihat statistik sistem (total users, bookings, revenue, pending bookings)

**Protected Routes:**
- Middleware: `auth` + `isAdmin` (hanya role admin yang bisa akses)

### 2. **User/Pelanggan** 👤
**Hak Akses:**
- ✅ Register akun (`/register`)
- ✅ Login (`/login`)
- ✅ Akses user dashboard (`/my-bookings`)
- ✅ **Pesan Tiket Baru** - Membuat booking baru
- ✅ **Lihat Pemesanan** - Melihat riwayat bookings
- ✅ **Tracking Status** - Melihat progress perjalanan (dari table progress)
- ✅ **Batalkan Booking** - Batalkan pemesanan yang masih pending

**Protected Routes:**
- Middleware: `auth` (login required)

### 3. **Public User** 🌐
**Hak Akses (Tanpa Login):**
- ✅ Lihat halaman welcome (`/`)
- ✅ Register (`/register`)
- ✅ Login (`/login`)

---

## 📊 Database Schema

### **users table**
```sql
id                  INT (PK)
name               VARCHAR - Nama lengkap pengguna
email              VARCHAR - Email unik untuk login
password           VARCHAR - Encrypted password
role               ENUM - 'admin' atau 'user' (default: 'user')
created_at         TIMESTAMP
updated_at         TIMESTAMP
```

### **bookings table**
```sql
id                 INT (PK)
user_id            INT (FK) - Reference ke users table
booking_code       VARCHAR UNIQUE - Auto-generated: OG-YYYYMMDD-XXXXXX
route_from         VARCHAR - Pelabuhan asal (contoh: "Jakarta")
route_to           VARCHAR - Pelabuhan tujuan (contoh: "Surabaya")
departure_date     DATETIME - Tanggal keberangkatan
passengers         INT - Jumlah penumpang
class              ENUM - 'ekonomi', 'bisnis', 'vip', 'suite'
price              DECIMAL - Harga tiket per penumpang
status             ENUM - 'pending', 'confirmed', 'completed', 'cancelled'
notes              TEXT - Catatan tambahan (optional)
created_at         TIMESTAMP
updated_at         TIMESTAMP
```

### **progress table**
```sql
id                 INT (PK)
booking_id         INT (FK) - Reference ke bookings table
status             VARCHAR - Status perjalanan (contoh: "Berangkat", "Di Laut", "Tiba")
description        TEXT - Deskripsi detail status (optional)
location           VARCHAR - Lokasi kapal saat ini
updated_at_status  DATETIME - Waktu update status terakhir
created_at         TIMESTAMP
updated_at         TIMESTAMP
```

---

## 🔄 Workflow & Alur Bisnis

### **1. PROSES REGISTRASI PENGGUNA**
```
Public → Register form → Validasi email → Hash password → Create user record → Redirect ke Login
```

### **2. PROSES LOGIN**
```
Login page → Validasi email + password → Session created → Redirect ke Dashboard
```

### **3. PROSES PEMESANAN TIKET (User)**
```
Dashboard User 
  ↓
Klik "Pesan Tiket Baru" 
  ↓
Isi form:
  - Rute (dari - ke)
  - Tanggal keberangkatan
  - Jumlah penumpang
  - Kelas (ekonomi/bisnis/vip/suite)
  - Catatan (optional)
  ↓
Sistem hitung harga otomatis 
  ↓
Submit → Create booking record (status: PENDING)
  ↓
Auto-generate booking code: OG-20260602-ABC123
  ↓
Redirect ke detail booking
```

### **4. PROSES ADMIN APPROVE PEMESANAN**
```
Admin dashboard 
  ↓
Klik "Kelola Pemesanan" 
  ↓
Lihat list semua bookings (pending, confirmed, completed, cancelled)
  ↓
Klik booking yang ingin di-approve 
  ↓
Edit booking → Ubah status dari 'pending' → 'confirmed'
  ↓
User akan melihat status booking berubah di dashboard mereka
```

### **5. PROSES TRACKING STATUS KAPAL (Progress)**
```
Admin → Kelola Progress 
  ↓
Klik booking yang ingin di-track 
  ↓
Buat update status:
  - Status: "Berangkat", "Di Laut", "Tiba"
  - Deskripsi: Detail perjalanan
  - Lokasi: Posisi kapal saat ini
  - Waktu: Update timestamp
  ↓
User otomatis melihat update di "Dashboard" mereka
```

### **6. PROSES BATALKAN PEMESANAN (User)**
```
Dashboard User → Lihat Pemesanan 
  ↓
Klik booking yang ingin dibatalkan 
  ↓
Klik tombol "Batalkan" (hanya untuk status pending/confirmed)
  ↓
Status berubah → 'cancelled'
  ↓
Email notifikasi (jika diimplementasikan)
```

---

## 🎨 Fitur User Interface

### **User Dashboard** (`/my-bookings`)
**Greeting Personal:**
- "Selamat Datang, [Nama User]! 👋"
- Deskripsi: "Kelola pemesanan tiket kapal Anda dengan mudah melalui portal pelanggan Oceango"

**Statistics Cards:**
- Pemesanan Pending
- Pemesanan Konfirmasi
- Pemesanan Selesai
- Total Pemesanan

**Quick Actions:**
- 🎫 Pesan Tiket Baru
- 🗒️ Lihat Pemesanan

**Recent Activity:**
- Riwayat booking terbaru (5 data)
- Progress update terbaru (5 data)

---

### **Admin Dashboard** (`/admin/dashboard`)
**Greeting Personal:**
- "Selamat Datang, [Nama Admin]! 👋"
- Deskripsi: "Kelola sistem pemesanan tiket kapal dan monitor operasional bisnis Oceango"

**Quick Actions:**
- 👥 Kelola Pengguna
- 🎫 Kelola Pemesanan
- 📊 Kelola Progress

**Statistics Grid:**
- Total Pengguna
- Total Pemesanan
- Total Pendapatan (Rp)
- Pemesanan Pending

**Booking Statistics:**
- Berdasarkan Status (Pending, Konfirmasi, Selesai, Dibatalkan)
- Berdasarkan Kelas (Ekonomi, Bisnis, VIP, Suite)

---

## 🔐 Security Features

1. **Password Hashing** - Bcrypt encryption
2. **CSRF Protection** - Token validation pada setiap form
3. **Role-Based Access Control** - Middleware `isAdmin`
4. **Authentication** - Session-based dengan middleware `auth`
5. **Validation** - Input validation pada setiap endpoint

---

## 🚀 Fitur Teknis

### **Auto-Generated Booking Code**
```php
Format: OG-YYYYMMDD-XXXXXX
Contoh: OG-20260602-ABC123

- OG = Oceango
- YYYYMMDD = Tanggal booking
- XXXXXX = Random 6 character uppercase
```

**Implementasi di Model Booking:**
```php
protected static function boot() {
    static::creating(function ($model) {
        if (!$model->booking_code) {
            $date = now()->format('Ymd');
            $random = strtoupper(Str::random(6));
            $model->booking_code = "OG-{$date}-{$random}";
            // Ensure uniqueness...
        }
    });
}
```

### **Relationship Management**
- **User → Bookings** (One-to-Many)
  - 1 User bisa punya banyak Booking
- **Booking → Progress** (One-to-Many)
  - 1 Booking bisa punya banyak Progress update
- **Booking → User** (Many-to-One)
- **Progress → Booking** (Many-to-One)

### **Middleware**
```
isAdmin - Check jika user role == 'admin'
auth    - Check jika user sudah login (authenticated)
```

---

## 📈 Statistics & Reporting

### **Admin Panel Stats:**
- Total Users: Jumlah semua pengguna terdaftar
- Total Bookings: Semua pemesanan dalam sistem
- Total Revenue: Sum dari semua price × passengers
- Pending Bookings: Booking yang masih menunggu approval

### **User Dashboard Stats:**
- Pending: Booking dengan status 'pending'
- Confirmed: Booking dengan status 'confirmed'
- Completed: Booking dengan status 'completed'
- Total: Total semua booking milik user

---

## 🎯 Use Case Diagram

```
┌─────────────────────────────────────────────────┐
│              OCEANGO SYSTEM                     │
└─────────────────────────────────────────────────┘

┌──────────────┐                   ┌──────────────┐
│  USER/ADMIN  │                   │  DATABASE    │
└──────┬───────┘                   └──────────────┘
       │
       ├─→ LOGIN
       │   ├─→ Register (User)
       │   ├─→ Admin Login
       │   └─→ Logout
       │
       ├─→ BOOKING (User Only)
       │   ├─→ Create Booking
       │   ├─→ View Bookings
       │   ├─→ View Booking Detail
       │   └─→ Cancel Booking
       │
       ├─→ ADMIN PANEL (Admin Only)
       │   ├─→ Users Management
       │   │   ├─→ Create User
       │   │   ├─→ Edit User
       │   │   ├─→ Delete User
       │   │   └─→ View Users
       │   │
       │   ├─→ Bookings Management
       │   │   ├─→ View Bookings
       │   │   ├─→ Update Status
       │   │   ├─→ Create Manual Booking
       │   │   └─→ Delete Booking
       │   │
       │   └─→ Progress Management
       │       ├─→ Create Progress
       │       ├─→ Update Progress
       │       └─→ Delete Progress
       │
       └─→ DASHBOARD
           ├─→ View Statistics
           ├─→ Recent Activities
           └─→ Quick Actions
```

---

## 🛠️ Troubleshooting & Key Points

### **Database Error [2002]**
- Pastikan MySQL running
- Check `.env` untuk DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD
- Run: `php artisan migrate`

### **Authentication Issues**
- Pastikan session driver sudah dikonfigurasi di `.env`
- Clear cache: `php artisan cache:clear`

### **Booking Code Generation**
- Automatic di model Booking
- Format: OG-YYYYMMDD-XXXXXX
- Unique constraint di database

---

## 📱 Pages Overview

### **Public Pages:**
| Route | Name | Description |
|-------|------|-------------|
| `/` | Welcome | Landing page |
| `/login` | Login | User login page |
| `/register` | Register | User registration page |
| `/admin/login` | Admin Login | Admin login page |

### **User Pages** (Protected):
| Route | Name | Description |
|-------|------|-------------|
| `/my-bookings` | Dashboard | User dashboard dengan stats |
| `/my-bookings/list` | Bookings | Daftar semua booking user |
| `/my-bookings/pesan` | Create Booking | Form pesan tiket baru |
| `/my-bookings/{id}` | Booking Detail | Detail booking + progress |

### **Admin Pages** (Protected):
| Route | Name | Description |
|-------|------|-------------|
| `/admin/dashboard` | Admin Dashboard | Admin main dashboard |
| `/admin/users` | Users List | Kelola semua pengguna |
| `/admin/bookings` | Bookings List | Kelola semua pemesanan |
| `/admin/progress` | Progress List | Kelola tracking kapal |

---

## 💡 Key Features Summary

✅ **User Registration & Authentication**
- Email validation
- Password hashing dengan Bcrypt
- Session management

✅ **Booking System**
- Create new booking dengan auto-generated code
- View booking history
- Cancel booking
- Real-time status updates

✅ **Admin Management**
- User CRUD operations
- Booking approval workflow
- Progress tracking
- Revenue statistics

✅ **Responsive Design**
- Tailwind CSS
- Ocean theme dengan warna cyan, teal, dan gold
- Mobile-friendly

✅ **Database Relationships**
- One-to-Many relationships
- Foreign key constraints
- Cascade delete

✅ **Security**
- Role-based access control
- CSRF token protection
- Password encryption

---

## 🎓 Kesimpulan

**Oceango** adalah aplikasi web modern yang mengintegrasikan:
- ✅ User-friendly interface
- ✅ Role-based access control
- ✅ Real-time tracking system
- ✅ Admin reporting & statistics
- ✅ Secure authentication
- ✅ Responsive design

Aplikasi ini cocok untuk:
- Perusahaan penyedia tiket kapal
- Tourism agencies
- Travel booking platforms

---

## 📞 Contact & Support

Untuk pertanyaan teknis atau troubleshooting:
1. Check `.env` configuration
2. Run migrations: `php artisan migrate`
3. Seed database: `php artisan db:seed`
4. Clear cache: `php artisan cache:clear`
5. Start server: `php artisan serve`

**Database Default:**
- Host: 127.0.0.1
- Port: 3306
- Username: root
- Password: (empty)
- Database: oceangov2
