engineering docs

Commerce database

commerce menangani state belanja dan transaksi. Product/service hanya direferensikan melalui ID dan snapshot.

Aggregate transaksi

Order memiliki orderNumber unik dalam organization, status order/payment/fulfillment, totals, items, payments, invoices, dan shipments. Totals harus dihitung server-side dari line items, bukan dipercaya dari client.

Lifecycle

Cart -> Order draft -> confirmed -> processing -> completed
                         |                    -> cancelled
Payment: unpaid -> pending -> paid / failed / refunded
Fulfillment: unfulfilled -> partially_fulfilled -> fulfilled

CartItem dan OrderItem menyimpan quantity, unit price, subtotal, serta product/service snapshot. Validasi product atau service aktif pada catalog sebelum membuat item.

Customer, invoice, payment, shipment

Semua model memiliki organizationId. Payment harus memakai idempotency key untuk mencegah double charge. Invoice dan Shipment memakai nomor unik per organization. Status transition harus finite-state dan dicatat dengan actor serta request id.

Karena transaksi ini hidup pada satu database commerce tetapi reference berasal dari runner/catalog, lakukan preflight existence checks sebelum menulis dan gunakan retry/compensation untuk workflow lintas database.