---
# System prepended metadata

title: "\U0001F9F0 Konsep Layanan Jasa"

---

# 🧰 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  | ❌ |
