# ๐งฐ Konsep Layanan Jasa
## ๐ฏ Tujuan
Membangun sistem pemesanan layanan jasa berbasis lokasi yang terintegrasi dengan **WhatsApp bot**, di mana pelanggan dapat memesan layanan tanpa menggunakan aplikasi web/app, hanya melalui pesan WhatsApp. Admin toko mengelola layanan jasa melalui dashboard web (React JS + Spring Boot).
## ๐ฆ 1. Struktur Database
### ๐น Tabel Utama: `products`
```sql
-- Field tambahan:
is_jasa BOOLEAN DEFAULT FALSE
```
> - Produk bertipe jasa memiliki field `is_jasa = TRUE`
> - Tetap menggunakan tabel `products` agar mudah dikelola bersama produk retail
### ๐น Tabel Baru: `service_providers`
Penyedia jasa terikat pada satu toko/merchant.
```sql
CREATE TABLE service_providers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
nama VARCHAR(255),
no_wa VARCHAR(20) NOT NULL,
merchant_id BIGINT REFERENCES merchants(id),
latitude NUMERIC(9,6),
longitude NUMERIC(9,6),
tanggal_dibuat TIMESTAMP DEFAULT NOW()
);
```
### ๐น Tabel Baru: `service_schedules`
Slot waktu layanan yang tersedia.
```sql
CREATE TABLE service_schedules (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
product_id UUID REFERENCES products(id),
provider_id UUID REFERENCES service_providers(id),
waktu_mulai TIMESTAMP,
durasi INT, -- dalam menit
status VARCHAR(20) CHECK (status IN ('tersedia', 'booked')) DEFAULT 'tersedia',
tanggal_dibuat TIMESTAMP DEFAULT NOW()
);
```
### ๐น Tabel Baru: `service_bookings`
Booking layanan dari pelanggan.
```sql
CREATE TABLE service_bookings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
customer_id BIGINT REFERENCES customers(id),
schedule_id UUID REFERENCES service_schedules(id),
alamat TEXT,
catatan TEXT,
status VARCHAR(20) CHECK (status IN ('pending', 'confirmed', 'completed', 'canceled')),
tanggal_booking TIMESTAMP DEFAULT NOW()
);
```
---
## ๐ 2. REST API Endpoints
### ๐ธ Service Providers
| Endpoint | Method | Deskripsi |
|---------|--------|-----------|
| `GET /api/service-providers` | GET | Daftar semua penyedia jasa |
| `POST /api/service-providers` | POST | Tambah penyedia jasa baru |
| `PUT /api/service-providers/{id}` | PUT | Edit info penyedia jasa |
| `DELETE /api/service-providers/{id}` | DELETE | Hapus penyedia jasa |
### ๐ธ Service Schedules
| Endpoint | Method | Deskripsi |
|---------|--------|-----------|
| `GET /api/service-schedules?product_id=xxx` | GET | Daftar slot waktu tersedia |
| `POST /api/service-schedules` | POST | Tambah slot waktu manual |
| `PUT /api/service-schedules/{id}/confirm` | PUT | Ubah status menjadi booked |
| `DELETE /api/service-schedules/{id}` | DELETE | Hapus slot waktu (jika belum dipesan) |
### ๐ธ Service Bookings
| Endpoint | Method | Deskripsi |
|---------|--------|-----------|
| `POST /api/v1/whatsapp/schedule-book` | POST | Booking via WhatsApp |
| `GET /api/service-bookings?customer_id=xxx` | GET | Riwayat pesanan pelanggan |
| `GET /api/service-bookings/provider/{provider_id}` | GET | Riwayat pesanan penyedia jasa |
| `PUT /api/service-bookings/{id}/confirm` | PUT | Konfirmasi atau batalkan pesanan |
### ๐ธ Nearby Services
| Endpoint | Method | Deskripsi |
|---------|--------|-----------|
| `POST /api/v1/whatsapp/user-location` | POST | Simpan lokasi pelanggan |
| `GET /api/v1/whatsapp/nearby-services` | GET | Cari layanan jasa terdekat |
| `GET /api/v1/whatsapp/product-schedules` | GET | Ambil daftar slot waktu tersedia |
---
## ๐ 3. Flow Diagram (Mermaid)
### ๐น Alur Pemesanan Jasa via WhatsApp
```mermaid
graph TD
A[User WA: Butuh servis AC] --> B[Bot minta lokasi Anda]
B --> C{Apakah user sudah punya alamat default?}
C -- Ya --> D[Tampilkan daftar penyedia jasa terdekat]
C -- Tidak --> E[User ketik alamat atau share location]
E --> D
D --> F[Pilih layanan]
F --> G[Tampilkan slot waktu tersedia]
G --> H[User pilih slot waktu]
H --> I[Booking slot, buat transaksi]
I --> J[Kirim konfirmasi ke user & notifikasi ke penyedia jasa]
```
### ๐น Alur Admin Kelola Jadwal Jasa
```mermaid
graph TD
K[Admin] --> L[Buka halaman tambah jadwal]
L --> M[Pilih produk jasa]
M --> N[Pilih penyedia jasa]
N --> O[Set waktu mulai & durasi]
O --> P[Simpan ke database]
P --> Q{Berhasil?}
Q -- Ya --> R[Slot muncul di bot WhatsApp]
Q -- Tidak --> S[Pesan error ditampilkan]
```
---
## ๐ ๏ธ 4. Logika Bisnis Tambahan
### ๐ Hitung Jarak Toko โ Lokasi User
Gunakan rumus Haversine:
```python
def haversine(lat1, lon1, lat2, lon2):
R = 6371 # Radius bumi dalam km
dlat = radians(lat2 - lat1)
dlon = radians(lon2 - lon1)
a = sin(dlat/2)**2 + cos(radians(lat1)) * cos(radians(lat2)) * sin(dlon/2)**2
c = 2 * atan2(sqrt(a), sqrt(1-a))
distance = R * c
return distance # dalam km
```
### โ ๏ธ Validasi Slot Waktu
- Tidak boleh tumpang tindih
- Maksimal jumlah slot per hari bisa dikontrol via setting admin
### ๐ข Pengingat Otomatis
- Kirim pengingat 1 hari sebelum layanan via WhatsApp bot
- Gunakan scheduler seperti Celery, Bull.js, atau cron job
### ๐งพ Riwayat Layanan
- Setiap layanan selesai โ simpan sebagai riwayat
- Termasuk rating & ulasan dari pelanggan (opsional)
---
## ๐ฅ๏ธ 5. UI/UX Suggestion (Frontend - React JS)
### ๐น Halaman Daftar Layanan Jasa
| Kolom | Isi |
|-------|-----|
| Nama Layanan | Servis AC |
| Durasi | 60 menit |
| Harga | Rp 150.000 |
| Status | Aktif |
| Aksi | Detail, Edit, Hapus |
### ๐น Form Tambah/Edit Jadwal Layanan
| Field | Jenis Input | Keterangan |
|-------|--------------|------------|
| Produk Jasa | Dropdown list | Hanya produk dengan `is_jasa = true` |
| Penyedia Jasa | Dropdown list | Hanya penyedia jasa aktif |
| Waktu Mulai | DateTime picker | Format: YYYY-MM-DD HH:mm |
| Durasi | Number input | Dalam menit |
| Status | Toggle switch | Default: tersedia |
### ๐น Halaman Riwayat Pesanan Jasa
| Kolom | Isi |
|-------|-----|
| Nama Pelanggan | Budi Santoso |
| Alamat | Jl. Raya Jakarta No. 10 |
| Waktu Layanan | 15-Jun-2025 10:00 |
| Status | Dipesan |
| Aksi | Edit Status, Kirim Notifikasi |
---
## ๐ 6. Catatan Penting
- **Customer wajib isi alamat saat checkout**
- **Layanan jasa tidak memiliki reseller**
- **Jasa menggunakan field `is_jasa = true` di tabel `products`**
---
## ๐ 7. Checklist Task Development
| Task | Developer | Status |
|------|-----------|--------|
| Setup model database `service_providers`, `service_schedules`, `service_bookings` | BE Dev 1 | โ |
| Implementasi endpoint CRUD layanan jasa | BE Dev 1 | โ |
| Validasi tidak bentrok waktu saat booking | BE Dev 1 | โ |
| Sinkronisasi flow chatbot pencarian lokasi | BE Dev 1 | โ |
| UI halaman jadwal layanan & form tambah/edit | FE Dev | โ |
| Testing flow lokasi + booking jasa | Semua Tim | โ |