Skip to content

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:

  1. Menyimpan baris orders beserta order_items dan order_addresses-nya, status pending_payment.
  2. wmsService.createOrder() — memesan order di WMS.
  3. deliveriesService.createDraftOrder() — membuat draft Biteship untuk courier terpilih.
  4. 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)

  • /checkout redirect ke /checkout/shipping (src/app/checkout/shipping/page.tsx). Sebuah leave-guard (useCheckoutLeave) memperingatkan saat menavigasi keluar.
  • Addresssrc/modules/shipping/components/address-selection-form.tsx, src/context/address-context.tsx, src/lib/address/.
  • Couriershipping-form.tsx memakai frontCouriers(memberCartId) (name, code, service, price, duration) lalu frontUpdateCartCourier. Biteship tidak disebut di frontend; data courier datang dari backend.
  • Vouchervouchers-form.tsx, src/lib/vouchers/. Lihat Promotions.
  • PayfrontValidateMemberCartCheckout mengembalikan paymentLinkUrl; script DOKU Jokul Checkout membukanya (src/hooks/useDokuCheckoutPayment.tsx, sandbox vs production berdasarkan NEXT_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.