MIF_E31230069/spk_kontrakan/BOOKING_SYSTEM.md

156 lines
5.1 KiB
Markdown

# Sistem Booking Kontrakan - Dokumentasi
## Ringkasan
Sistem ini memungkinkan pemilik kontrakan untuk melacak status penyewaan kontrakan mereka, termasuk siapa yang sedang menyewa, periode sewa, dan status pembayaran.
## Fitur Utama
### 1. Status Kontrakan
Setiap kontrakan memiliki status yang menunjukkan ketersediaan:
- **Tersedia (available)** - Kontrakan siap disewakan
- **Dipesan (booked)** - Kontrakan sudah dibooking tapi belum ditempati
- **Terisi (occupied)** - Kontrakan sedang ditempati penyewa
- **Pemeliharaan (maintenance)** - Kontrakan sedang dalam perbaikan
### 2. Manajemen Booking
Setiap booking memiliki siklus hidup:
1. **Pending** - Booking baru dibuat, menunggu konfirmasi
2. **Confirmed** - Booking dikonfirmasi, penyewa belum masuk
3. **Checked In** - Penyewa sudah masuk dan menempati kontrakan
4. **Completed** - Masa sewa selesai, penyewa sudah keluar
5. **Cancelled** - Booking dibatalkan
### 3. Pengecekan Konflik Otomatis
- Sistem mencegah double-booking dengan pengecekan overlap tanggal
- Menggunakan database transaction untuk menghindari race condition
- Validasi ketersediaan real-time via AJAX
### 4. Sinkronisasi Status Otomatis
- Status kontrakan otomatis berubah saat ada aksi booking
- Artisan command untuk sinkronisasi manual: `php artisan kontrakan:sync-status`
## Cara Penggunaan
### Membuat Booking Baru
1. Klik menu **Booking Kontrakan** di sidebar
2. Klik tombol **Buat Booking Baru**
3. Pilih kontrakan yang akan dibooking
4. Isi tanggal mulai dan selesai (sistem akan cek ketersediaan)
5. Isi data penyewa (nama, nomor HP)
6. Klik **Simpan Booking**
### Mengelola Booking
- **Konfirmasi**: Ubah status dari Pending ke Confirmed
- **Check-in**: Tandai penyewa sudah masuk (status kontrakan jadi "Terisi")
- **Check-out**: Tandai penyewa sudah keluar (status kontrakan kembali "Tersedia")
- **Batalkan**: Batalkan booking dengan alasan (opsional)
- **Tandai Lunas**: Catat pembayaran sudah lunas
### Melihat Riwayat Booking
- Dari halaman detail kontrakan, klik tombol **Riwayat Booking**
- Atau dari menu Booking → filter berdasarkan kontrakan
## Struktur Database
### Tabel `kontrakans` (diperbarui)
```sql
status ENUM('available', 'booked', 'occupied', 'maintenance') DEFAULT 'available'
occupied_until DATE NULL
```
### Tabel `bookings` (baru)
```sql
- id
- kontrakan_id (FK ke kontrakans)
- user_id (FK ke users, nullable)
- start_date
- end_date
- status (pending/confirmed/checked_in/completed/cancelled)
- amount (biaya sewa)
- payment_status (unpaid/paid/refunded)
- payment_method
- paid_at
- tenant_name
- tenant_phone
- notes
- confirmed_at
- checked_in_at
- checked_out_at
- cancelled_at
- cancellation_reason
- timestamps
```
## File-file Baru
### Migrations
- `database/migrations/2025_12_26_000001_add_status_to_kontrakans.php`
- `database/migrations/2025_12_26_000002_create_bookings_table.php`
### Models
- `app/Models/Booking.php`
- `app/Models/Kontrakan.php` (diperbarui)
### Controllers
- `app/Http/Controllers/BookingController.php`
### Views
- `resources/views/admin/bookings/index.blade.php` - Daftar booking
- `resources/views/admin/bookings/create.blade.php` - Form buat booking
- `resources/views/admin/bookings/show.blade.php` - Detail booking
- `resources/views/admin/bookings/edit.blade.php` - Edit booking
- `resources/views/admin/bookings/kontrakan-history.blade.php` - Riwayat booking per kontrakan
### Commands
- `app/Console/Commands/SyncKontrakanStatus.php` - Sinkronisasi status
## API Endpoint
### Cek Ketersediaan
```
GET /admin/bookings/check-availability
Parameters:
- kontrakan_id: ID kontrakan
- start_date: Tanggal mulai (YYYY-MM-DD)
- end_date: Tanggal selesai (YYYY-MM-DD)
- exclude_id: ID booking yang dikecualikan (untuk edit)
Response:
{
"available": true/false,
"conflicts": [...] // daftar booking yang bertabrakan
}
```
## Artisan Commands
### Sinkronisasi Status Manual
```bash
php artisan kontrakan:sync-status
```
Gunakan untuk memastikan status semua kontrakan sesuai dengan data booking.
## Tips untuk Sidang TA
### Poin-poin yang bisa disampaikan:
1. **Concurrency Handling** - Sistem menggunakan database transaction untuk mencegah race condition saat multiple user membuat booking bersamaan
2. **Conflict Detection** - Algoritma pengecekan overlap tanggal untuk mencegah double-booking
3. **State Machine** - Booking memiliki lifecycle yang terstruktur dengan validasi transisi status
4. **Real-time Validation** - AJAX untuk validasi ketersediaan sebelum submit
5. **Audit Trail** - Setiap aksi dicatat waktunya (confirmed_at, checked_in_at, dll)
6. **Soft Status Sync** - Status kontrakan otomatis mengikuti status booking aktif
### Demo yang bisa ditampilkan:
1. Buat booking baru dengan cek ketersediaan
2. Konfirmasi → Check-in → Check-out flow
3. Coba buat booking yang overlap (akan ditolak)
4. Batalkan booking dan lihat status kontrakan berubah
5. Jalankan artisan command untuk sync status
## Pengembangan Lanjutan (Future)
- Notifikasi via WhatsApp/Email saat booking berubah status
- Dashboard laporan pendapatan per bulan
- Integrasi payment gateway
- Calendar view untuk visualisasi booking
- Export laporan ke PDF/Excel