Cart and checkout
Dari cart seorang member sampai order dibuat. Cart ada di module users; membuat order menyerahkannya ke orders, yang bicara ke WMS, Biteship dan DOKU.
Cara halaman ini diverifikasi
Dibaca pada 2026-09-15 dari cart service backend (src/users/services/members-carts.service.ts), order service (src/orders/services/orders.service.ts), dan alur storefront /checkout/shipping.
Cart (backend)
Satu member punya satu cart (member_carts) dengan item (member_cart_items) dan shipping method terpilih (member_cart_shipping_methods). Resolver storefront (storefront-members-carts, semua front*, dijaga JwtMemberAuthGuard):
frontMemberCart— membaca cart.frontUpdateCartItem,frontDeleteCartItem,frontAddCartItemToTemporaryCart(buy-now).frontUpdateCartAddress— mengeset alamat pengiriman.frontCouriers— opsi courier untuk cart (backend memanggil Biteship rates).frontUpdateCartCourier— memilih satu.frontValidateMemberCartCheckout— memvalidasi dan membuat order.
Error add-to-cart punya formatError GraphQL kustom yang mengembalikan message, code dan cartId opsional.
Membuat order
frontValidateMemberCartCheckout di cart service memanggil ordersService.createOrder(...). createOrder() (di src/orders/services/orders.service.ts) adalah alur intinya:
- Menyimpan baris
ordersbesertaorder_itemsdanorder_addresses-nya, statuspending_payment. wmsService.createOrder()— memesan order di WMS.deliveriesService.createDraftOrder()— membuat draft Biteship untuk courier terpilih.- Membuat payment DOKU dan mengembalikan
paymentLinkUrl.
Ia memancarkan event keluarga order.completed untuk statistik member. Nilai status order: pending_payment, processing, completed, canceled, shipped (lihat Orders).
Checkout (storefront)
/checkoutredirect ke/checkout/shipping(src/app/checkout/shipping/page.tsx). Sebuah leave-guard (useCheckoutLeave) memperingatkan saat menavigasi keluar.- Address —
src/modules/shipping/components/address-selection-form.tsx,src/context/address-context.tsx,src/lib/address/. - Courier —
shipping-form.tsxmemakaifrontCouriers(memberCartId)(name, code, service, price, duration) lalufrontUpdateCartCourier. Biteship tidak disebut di frontend; data courier datang dari backend. - Voucher —
vouchers-form.tsx,src/lib/vouchers/. Lihat Promotions. - Pay —
frontValidateMemberCartCheckoutmengembalikanpaymentLinkUrl; script DOKU Jokul Checkout membukanya (src/hooks/useDokuCheckoutPayment.tsx, sandbox vs production berdasarkanNEXT_PUBLIC_DOKU_ENV). Saat ditutup, user menuju/user/my-order?status=pending_payment. Lihat Payment.
Cart tidak punya route /cart — ia adalah src/context/cart-context.tsx (add, update qty, delete, temp cart buy-now, hitung voucher dan discount) yang ditampilkan sebagai slide-over.
Hal yang perlu diwaspadai
- Checkout adalah satu panggilan backend yang melakukan empat hal eksternal. Kalau membuat order gagal di dev, bisa jadi kaki WMS, Biteship atau DOKU — dan dev menunjuk ke simulator, yang bisa memaksa salah satunya jadi 500.
- Payment window adalah
DOKU_PAYMENT_DUE_DATE_MINUTE; order expiry cron membatalkan order yang belum dibayar setelahnya.