# ๐Ÿงฐ 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 | โŒ |