Work Order (SPK)
Modul inti pengelolaan pekerjaan servis: dari penerimaan kendaraan, diagnosa, pengerjaan, QC, sampai serah terima & pembayaran. Mendukung customer type (regular/corporate/vip), noPpn per transaksi, field dueDate untuk tempo corporate, dan bay maintenance filter. Real-time multi-role via WebSocket.
Status Work Order
| Status | Badge | Deskripsi | Actor |
|---|---|---|---|
antrian | Antrian | WO baru dibuat, menunggu mekanik tersedia | Admin / SA |
diagnosa | Diagnosa | Mekanik sedang mendiagnosa kerusakan kendaraan | Mekanik |
pengerjaan | Pengerjaan | Pekerjaan servis sedang berlangsung | Mekanik |
quality_check | QC | Quality check oleh kepala mekanik — wajib sebelum selesai | Kepala Mekanik |
selesai | Selesai | QC lulus, WO siap diserahkan ke kasir | KM / Sistem |
diserahkan | Diserahkan | Invoice lunas, kendaraan sudah diserahkan | Kasir / Admin |
batal | Batal | WO dibatalkan (bisa dari status apapun, harus ada alasan) | Admin |
State Diagram — Transisi Status WO
Work Order State Machine
Semua kemungkinan perpindahan status dari awal hingga selesai
stateDiagram-v2
[*] --> antrian : Admin buat WO
antrian --> diagnosa : Mekanik mulai diagnosa
antrian --> batal : Admin batalkan
diagnosa --> pengerjaan : Diagnosa selesai, mulai kerjakan
diagnosa --> batal : Admin batalkan
pengerjaan --> quality_check : Semua job selesai
pengerjaan --> diagnosa : Perlu diagnosa ulang
pengerjaan --> batal : Admin batalkan
quality_check --> selesai : QC lulus
quality_check --> pengerjaan : QC gagal — rework
selesai --> diserahkan : Invoice lunas + serah terima
selesai --> batal : Admin batalkan (jarang)
batal --> [*]
diserahkan --> [*]
State Diagram — Status Job Item
WO Job Item State Machine
Status setiap item pekerjaan dalam satu Work Order
stateDiagram-v2
[*] --> waiting : Job dibuat (otomatis dari jasa item)
waiting --> running : Mekanik mulai kerjakan
running --> paused : Menunggu parts / istirahat
paused --> running : Lanjutkan pengerjaan
running --> done : Mekanik tandai selesai
done --> waiting : KM reject QC — rework (attempts++)
done --> [*] : QC lulus
UI Mockup — Daftar Work Order
Bengkel
Pintar
Pintar
Operations
Work Order
Quotation
Kasir
Inventory
Parts
Purchase
Daftar Work Order
8
Antrian
3
Diagnosa
12
Dikerjakan
5
Selesai
WO-2025-001
Honda Jazz • B 1234 ABC • Budi Santoso Regular
WO-2025-002
Toyota Avanza • B 5678 DEF • PT. Sinar Abadi Corporate
WO-2025-003
Suzuki Ertiga • D 9012 GHI • Ahmad Fauzi VIP
WO-2025-004
Mitsubishi Xpander • F 3456 JKL • Indira Sari
Bengkel
Pintar
Pintar
Work Order
Quotation
Kasir
Info Kendaraan & Pelanggan
VIP
Pelanggan
Ahmad Fauzi
No. Polisi
D 9012 GHI
Kendaraan
Suzuki Ertiga 2022
KM
45.230 km
Bay / Stall
Bay 3
Est. Selesai
14:00
Job Items
3 items
| Tipe | Deskripsi | Mekanik | Status |
|---|---|---|---|
| Jasa | Ganti oli mesin | Rudi | Done |
| Jasa | Cek rem depan | Rudi | Running |
| Parts | Kampas rem depan | — | Waiting |
Sequence Diagram — Work Order Lifecycle
WO Sequence — End-to-End
Interaksi antar aktor dari pembuatan WO hingga serah terima kendaraan
sequenceDiagram
actor C as Pelanggan
participant A as Admin / SA
participant S as Sistem
participant M as Mekanik
participant G as Gudang
participant KM as Kep. Mekanik
participant K as Kasir
C->>A: Datang + keluhan kendaraan
A->>S: Buat WO baru (pilih bay, assign mekanik)
Note over A,S: Cek AR overdue customer sebelum buat WO
S-->>A: WO-XXXX (status: ANTRIAN)
S-->>M: Notifikasi WO baru via WebSocket
M->>S: Mulai diagnosa
S-->>S: Status: DIAGNOSA
M->>S: Tambah item jasa & parts ke WO
Note over M,S: Setiap jasa → otomatis buat WOJob
M->>S: Request parts ke gudang
S->>G: Notifikasi Parts Request
alt Stok tersedia
G-->>S: Approve & siapkan parts
S-->>M: Parts siap
else Stok habis
G->>S: Tandai out of stock
S-->>A: Notif → Buat PO ke supplier
A->>S: Approve PO
S-->>G: PO dikirim supplier
Note over G: Tunggu barang tiba
G-->>S: Terima barang, approve parts
S-->>M: Parts siap
end
M->>S: Update semua job → done
S-->>S: Status: QUALITY_CHECK
S-->>KM: Notifikasi QC diperlukan
KM->>S: Lakukan QC per job
alt QC Lulus
S-->>S: Status: SELESAI
S-->>K: WO muncul di antrian kasir
K->>C: Tampilkan tagihan
C-->>K: Bayar (cash/transfer/QRIS)
K->>S: Konfirmasi pembayaran lunas
S-->>S: Status: DISERAHKAN
S-->>A: Kirim invoice email ke pelanggan
A->>C: Serah terima kendaraan
else QC Gagal
KM->>S: Reject job + catatan rework
S-->>S: Job status: waiting (attempts++)
S-->>M: Notifikasi revisi
M->>S: Kerjakan ulang
end
Flow Diagram — Alur Work Order Lengkap
Main Work Order Flow
Alur lengkap dari pembuatan WO hingga serah terima kendaraan beserta percabangan
flowchart TD
A([Pelanggan Datang]) --> AA{Ada Quotation\ndisetujui?}
AA -->|Ya| AB[Import dari Quotation]
AA -->|Tidak| AC[Buat WO Baru]
AB --> B
AC --> B
B{Cek AR Overdue\nCustomer} -->|Tidak ada overdue| C[WO Status: ANTRIAN]
B -->|Ada overdue > limit| D[Blokir — Perlu\nAlasan Override]
D --> C
C --> E[Admin: Assign Mekanik\n& Pilih Bay]
E --> F[Mekanik: Mulai Diagnosa]
F --> G[WO Status: DIAGNOSA]
G --> H[Mekanik: Tambah\nItem Jasa & Parts]
H --> I{Perlu\nSparepart?}
I -->|Ya| J[Buat Parts Request\nke Gudang]
J --> K{Stok\nTersedia?}
K -->|Ya| L[Gudang: Siapkan\ndan Serahkan Parts]
K -->|Tidak| M[Buat Purchase Order\nke Supplier]
M --> N[Supplier Kirim\nBarang]
N --> L
I -->|Tidak| O
L --> O[Mekanik: Kerjakan\nSemua Job]
O --> P[WO Status: PENGERJAAN]
P --> Q{Semua Job\nStatus Done?}
Q -->|Belum| P
Q -->|Ya| R[WO Status: QUALITY CHECK]
R --> S[Kepala Mekanik:\nLakukan QC per Job]
S --> T{QC Lulus\nSemua?}
T -->|Tidak| U[Job di-reject\nMekanik rework]
U --> P
T -->|Ya| V[WO Status: SELESAI]
V --> W[Kasir: Buat Invoice\nPilih Tipe Bayar]
W --> X{Tipe\nPembayaran?}
X -->|Tunai / Transfer| Y[Bayar Langsung\nInvoice LUNAS]
X -->|Corporate Tempo| Z[Close as Tempo\nAR Piutang]
Y --> AA2[WO Status: DISERAHKAN]
Z --> AA2
AA2 --> BB([Selesai])
style A fill:#dbeafe,stroke:#3b82f6
style BB fill:#dcfce7,stroke:#16a34a
style C fill:#fef3c7,stroke:#f59e0b
style G fill:#ede9fe,stroke:#8b5cf6
style P fill:#dbeafe,stroke:#3b82f6
style R fill:#cffafe,stroke:#06b6d4
style V fill:#dcfce7,stroke:#16a34a
style D fill:#fee2e2,stroke:#ef4444
Panduan Per Role
🧑💼 Admin / Service Advisor
- Buat WO: Isi data pelanggan, kendaraan, keluhan, bay, dan estimasi selesai
- Assign mekanik: Pilih dari daftar mekanik aktif (max 3 WO aktif/mekanik)
- Credit check: Sistem otomatis cek AR overdue customer sebelum buat WO
- Corporate: Set
dueDate= hari ini + term hari sesuai kontrak - Serah terima: Konfirmasi setelah kasir mark lunas / close tempo
🔧 Mekanik
- Mulai diagnosa: Klik "Mulai Diagnosa" di WO yang ditugaskan
- Tambah item: Tambah jasa servis dan parts yang dibutuhkan ke WO
- Parts request: Klik "Ajukan Parts Request" jika butuh sparepart
- Update job: Tandai setiap job sebagai Running → Done setelah selesai
- Rework: Jika QC gagal, job kembali ke waiting — kerjakan ulang
🔍 Kepala Mekanik (QC)
- QC trigger: Otomatis masuk queue QC ketika semua job WO berstatus Done
- Checklist QC: Verifikasi tiap job sesuai standar servis
- Approve: Klik "Lulus QC" → WO pindah ke status SELESAI
- Reject: Klik "Gagal QC" + isi catatan → job kembali ke mekanik
- Larangan: Tidak boleh QC pekerjaan milik sendiri
💳 Kasir
- Antrian bayar: WO status SELESAI otomatis muncul di antrian kasir
- Invoice: Sistem auto-generate invoice dari semua item WO
- Pilih bayar: Tunai, Transfer, QRIS, Debit, atau Split Payment
- Corporate tempo: Klik "Close as Tempo" → AR posting,
dueDateotomatis set - Setelah lunas: Invoice email otomatis terkirim ke pelanggan
Aturan & Validasi
📋 Pembuatan WO
- Nomor WO auto-generate format
WO-YYYY-NNNNN - Data wajib: nama pelanggan, no. polisi, jenis kendaraan, keluhan
- Bisa import dari Quotation yang sudah disetujui
- Bay status
maintenanceotomatis di-exclude dari picker
📦 Item & Parts
- Tipe item:
parts(stok),jasa(layanan),warranty(tanpa biaya) - Setiap item
jasaotomatis buat WOJob dengan status waiting - Item
partslangsung kurangi stok cabang saat WO dibuat - WO tidak bisa SELESAI jika ada parts request belum fulfilled
🔍 Quality Check
- QC wajib dilakukan oleh Kepala Mekanik
- Tidak boleh QC pekerjaan sendiri
- QC gagal → job kembali ke waiting, counter
attempts+1 - Banyak rework berpengaruh pada KPI mekanik
🔄 Real-time WebSocket
- Event
wo:created,wo:status_changed,wo:assigned - Event
wo:job_started,wo:job_done,wo:job_rejected - Event
wo:ready_to_paydikirim ke kasir saat semua job done - Scoped per cabang — data tidak bocor lintas cabang
Field Khusus: Corporate, PPN, & Bay
📅 dueDate — Tempo Corporate
- Hanya berlaku untuk customer type
corporate dueDate = today + paymentTermDays(dari kontrak customer)- Saat close as tempo → posting AR:
D/Piutang — K/Penjualan - AR aging widget di dashboard monitor piutang jatuh tempo
- Cron reminder H-3 sebelum jatuh tempo via email/WA
🚫 noPpn — Skip PPN
- Checkbox per transaksi: WO, Quotation, PO
- Default
false= kena PPN 11% - Saat
true: total tanpa PPN, posting jurnal juga skip line PPN - Use case: customer non-PKP, ekspor, internal
🛠️ Bay Filter — Maintenance
- Bay status
maintenanceotomatis disembunyikan dari picker stall - Berlaku di 3 form: WO create, WO edit, assign stall
- Hanya tampil bay
availabledanoccupied(untuk swap) - Admin bisa set bay ke maintenance dari halaman master bay
🏢 Parent-Child WO
- WO bisa punya child WO (untuk fleet / multi-kendaraan)
- Parent WO tidak bisa SELESAI jika ada child WO belum selesai
- Laporan bisa di-drill down per child WO
- Corporate fleet: 1 PO → banyak WO
API Endpoints
| Method | Endpoint | Deskripsi | Role |
|---|---|---|---|
| GET | /api/work-orders | List WO (filter status, cabang, tanggal) | Admin, Kasir |
| POST | /api/work-orders | Buat WO baru (cek AR overdue) | Admin |
| GET | /api/work-orders/:id | Detail WO + job items + payments | Semua |
| PATCH | /api/work-orders/:id/status | Ubah status WO (validasi state machine) | Admin, Mekanik, KM |
| POST | /api/work-orders/:id/items | Tambah item jasa/parts/warranty | Admin, Mekanik |
| PATCH | /api/work-orders/:id/items/:iid | Update item | Admin, Mekanik |
| DELETE | /api/work-orders/:id/items/:iid | Hapus item (hanya status antrian/diagnosa) | Admin |
| POST | /api/work-orders/:id/jobs/:jid/start | Mulai kerjakan job | Mekanik |
| POST | /api/work-orders/:id/jobs/:jid/complete | Tandai job selesai | Mekanik |
| POST | /api/work-orders/:id/qc | Submit hasil QC | Kepala Mekanik |
| POST | /api/work-orders/:id/cancel | Batalkan WO (wajib isi alasan) | Admin |
| POST | /api/work-orders/:id/damages | Tambah catatan kerusakan (zona, tipe, foto) | Admin, Mekanik |