Orders
Hidup sebuah order setelah checkout, alur status-nya, dan di mana ketiga third party menggerakkannya.
Cara halaman ini diverifikasi
Dibaca pada 2026-09-15 dari module orders backend (service, cron, resolver), storefront /user/my-order, dan admin /admin/orders (view only).
Model dan status
Tabel: orders, order_items, order_addresses. Nilai status (utils/order-status.const.ts):
| Status | Arti |
|---|---|
pending_payment | dibuat, menunggu customer membayar |
processing | sudah dibayar (DOKU success), sedang disiapkan |
shipped | diserahkan ke courier / dipilih oleh WMS |
completed | terkirim |
canceled | dibatalkan (oleh customer, atau kedaluwarsa belum dibayar) |
Apa yang memindahkan order antar status
Order dibuat pending_payment oleh createOrder() (lihat Cart and checkout). Setelah itu, ketiga third party yang menggerakkannya — masing-masing lewat webhook masuknya:
- DOKU —
webhook-payments.service.ts: padatransaction.status === 'SUCCESS'order berpindah keprocessing. - WMS —
webhook-wms.service.ts: event sales-order WMS yang masuk memindahkan order keshipped(deliveryprocessing). - Biteship —
webhook-deliveries.service.ts: memetakan tracking Biteship ke deliveryshipped/delivered; saat delivered order berpindah kecompleted.
Lihat Third parties untuk cara callback tiba.
Expiry cron
OrdersCronService.handleOrderPaymentExpiry (src/orders/services/orders-cron.service.ts) berjalan setiap menit. Ia mencari order pending_payment yang lewat paymentExpiredAt, mengecek ulang status DOKU, dan membatalkan yang kedaluwarsa — membatalkan order WMS dan draft Biteship juga. Ini satu-satunya cron di backend.
Resolver
- CMS (
orders.resolver):orders,order,orderTransactionMetrics. - Storefront (
storefront-orders.resolver):frontMemberOrders(search, status),frontMemberOrder(orderId),frontCancelMemberOrder(orderId). - REST (controller
orders): exportGET excel, endpoint test-email, dan endpoint fixfix/update-order-wms-status/:orderId.
Storefront
/user/my-order (src/app/user/my-order/page.tsx) — riwayat order dengan tab ?status= (mis. pending_payment). UI di src/modules/my-order/components/ (item, detail, tab status, badge status, search). "Pay again" membuka ulang DOKU dari detail order. Cancel memanggil frontCancelMemberOrder.
Admin
/admin/orders adalah view only — list page.tsx dan detail [slug]. src/lib/orders/index.ts hanya punya query orders dan order, tanpa mutation, jadi perubahan status tidak terhubung di admin; webhook yang menggerakkannya.
Hal yang perlu diwaspadai
- Admin tidak bisa mengubah status order. Status mengalir dari webhook, bukan dari tombol.
- Prefix nomor order adalah
EXSPORT_ORDER_NO_PREFIX; email notifikasi dijaga olehEXSPORT_ORDER_SHOULD_SEND_NOTIF_EMAIL.