Sentra Automotive — API Documentation¶
5.1 POST /api/v1/work-orders¶
Inisiasi registrasi kendaraan & inspeksi — meregistrasikan check-in kendaraan awal oleh Service Advisor dan menghasilkan SPK.
Request Header:
Request Body:
{
"license_plate": "B 1234 SQA",
"vin_number": "MHRM12891K009211",
"brand_model": "Toyota Avanza 1.3G",
"current_odometer": 45012,
"customer_complaints": "Mesin ndut-ndutan di putaran rendah, AC kurang dingin, rem bunyi berdecit saat jalan turunan.",
"inspection_checklist": {
"body_scratches": ["Pintu kanan depan baret", "Bumper belakang kiri penyok"],
"engine_oil_status": "Keruh/Kotor",
"brake_fluid": "Cukup",
"battery_voltage": "11.8V (Low)"
}
}
Response 201 Created:
{
"status": "success",
"data": {
"work_order_id": "ca21b01c-6d1a-41d1-9311-bf17b0c34da8",
"wo_number": "WO/2026/05/0091",
"status": "INTAKE",
"created_at": "2026-05-21T20:20:15+07:00"
}
}
5.2 POST /api/v1/work-orders/:id/additional-charges¶
Request persetujuan biaya tambahan — dipanggil ketika mekanik membongkar mesin dan menemukan kerusakan baru yang memerlukan penggantian sparepart di luar estimasi awal SPK. API ini memicu background task untuk mengirimkan link persetujuan digital via WhatsApp ke pelanggan.
Request Body:
{
"additional_items": [
{
"item_type": "SPAREPART",
"sparepart_id": "b9cf8721-a01c-4b92-809c-7c01bda8f212",
"name": "Piringan Rem Depan Ori Toyota (Disc Brake)",
"quantity": 1,
"estimated_price": 450000.00
},
{
"item_type": "SERVICE_LABOR",
"name": "Jasa Pasang Piringan Rem Depan",
"quantity": 1,
"estimated_price": 75000.00
}
]
}
Response 200 OK:
{
"status": "success",
"message": "Additional charges submitted. WhatsApp approval link sent to customer.",
"data": {
"approval_transaction_id": "tx_additional_appr_8912",
"whatsapp_sent_to": "081234567890",
"approval_url": "https://sentraauto.id/wo/approve/ca21b01c_token"
}
}
Flow setelah response:
- WO status berubah ke
WAITING_PARTS, SLA timer berhenti. - Pelanggan mengklik link approval →
APPROVEDatauREJECTED. - Jika
APPROVED: sistem melepas lock, mekanik dapat mengambil part via barcode scan. - Jika
REJECTED: sistem mencetak disclaimer penolakan di invoice kasir.
5.3 POST /api/v1/inventory/pick-part¶
Dispense sparepart via barcode reader — dipanggil oleh sistem komputer gudang ketika storekeeper men-scan barcode fisik barang untuk diserahkan ke mekanik yang mengerjakan SPK.
Request Body:
{
"work_order_id": "ca21b01c-6d1a-41d1-9311-bf17b0c34da8",
"barcode_data": "8991209381921",
"quantity": 4
}
Response 200 OK (Sukses Potong Stok FEFO):
{
"status": "success",
"message": "Sparepart allocated and stock deducted successfully.",
"data": {
"sparepart_name": "Oli Toyota Motor Oil 10W-40 Synthetic",
"allocated_batch": "BATCH-OLI-2026A",
"remaining_stock": 142,
"selling_price_total": 380000.00
}
}
Response 400 Bad Request (Barcode SKU Tidak Cocok):
{
"status": "error",
"error_code": "BARCODE_SKU_MISMATCH",
"message": "Barcode tidak sesuai dengan item yang diminta di pick-slip SPK. Periksa kembali item yang diambil.",
"data": {
"scanned_barcode": "8991209381921",
"expected_sku": "TMO-5W30-4L"
}
}
Catatan Teknis:
- Dispense menggunakan strategi FEFO (First Expired First Out) — sistem secara otomatis mengambil batch dengan tanggal kadaluarsa terdekat terlebih dahulu.
- Stok
sparepart_batches.current_stockdikurangi secara transaksional di dalam DB transaction. - Setelah dispense berhasil, biaya part otomatis ditambahkan ke invoice kasir (
invoices.parts_subtotal). - Peristiwa dispense dicatat ke audit log dengan ID storekeeper, timestamp, dan SKU yang di-scan.
5.4 PATCH /api/v1/work-orders/:id/status¶
Transisi status WO oleh mekanik atau Service Advisor.
Request Body:
Allowed Transitions:
| From | To | Actor |
|---|---|---|
INTAKE |
DIAGNOSING |
Service Advisor |
DIAGNOSING |
WORKING |
Service Advisor |
WORKING |
WAITING_PARTS |
Mechanic |
WAITING_PARTS |
WORKING |
System (auto on customer approval) |
WORKING |
QC_TEST |
Mechanic |
QC_TEST |
WORKING |
Head Mechanic (rework) |
QC_TEST |
COMPLETED |
Head Mechanic |
* |
CANCELLED |
Service Advisor / Branch Manager |