156 lines
5.1 KiB
Markdown
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
|