D
Modul

Order

Modul terbesar di codebase — OrderController 2.987 baris, Order/Main.vue 9.668 baris. Alur pembuatan, status, observer, invoice, dan integrasi service.

Modul Order adalah modul terbesar di dazoapp. Mencakup pembuatan order, status flow, pembayaran, invoice, shipping, export, dan integrasi ke engine WhatsApp & backend Go.

File kunci

FileBarisPeran
app/Http/Controllers/OrderController.php2.987CRUD order, status, shipping, invoice, export
resources/js/Pages/Order/Main.vue9.668UI utama — 8 modal + 2 tab + dashboard
app/Models/Order.php57Model MongoDB, UUID, $guarded = []
app/Models/OrderItem.php41Item per order, snapshot produk embed
app/Models/OrderPayment.php26Bukti pembayaran, soft-delete
app/Observers/OrderObserver.php192Trigger saat payment_statuspaid
app/Enums/StatusOrder.php33Enum status (tidak dipakai sebagai validasi)
app/Exports/OrdersExport.php81Export Excel

Model Order

MongoDB, $guarded = [] (mass-assignment terbuka), PK UUID di boot().

Field utama

FieldCatatan
idUUID
store_idMulti-tenant scope
customer_id, customer_name, customer_wa, email_customerDenormalized snapshot
device_idUntuk kirim via WA engine
order_numberGenerated via order_number() (:2245)
sequenceInt, generated via sequence() (:2283)
team_idFK ke UserStore (CS/tim)
product_idLegacy: produk tunggal
payment_methodbank transfer / qr / cod / instant_payment
payment_statusunpaid / confirmed / paid
total_priceInt
shipping{courier, resi, code, cost, shipping_cost}
addresses{province, city, district, subdistrict, village, address, postal_code}
statuspending / process / delivery / complete / cancel / complained / refund
utm_*Source, medium, campaing (typo), term, content
ratingDefault 0
proof_transactionURL bukti bayar ke CDN
followUpNested: {processing: {otomatic_send}, completed: {otomatic_send}}
doku_payment_url, doku_payment_reference, doku_payment_expired_atUntuk DOKU Checkout

OrderItem — snapshot produk

OrderItem menyimpan snapshot produk di embedded document (product, item_product). Pola umum MongoDB untuk freeze state produk saat order dibuat. Field: order_id, product_id, qty, normal_price, real_price, variant_product, total_price, weight.

Status — dua dimensi terpisah

Order punya dua field status yang berbeda:

status (status order)

Enum app/Enums/StatusOrder.php mendefinisikan 6 nilai, tapi tidak dipakai sebagai validasi. Controller bebas tulis string:

NilaiKapan di-set
pendingProduk fisik tanpa courier
processProduk digital, atau fisik + courier
deliverySaat number_receipt diisi (createOrder)
completeManual via change_order_status
complainedVia change_order_status_multiple — gabung jadi 'complete,complained'
cancel, refundManual

payment_status (status pembayaran)

NilaiKapan di-set
unpaidDefault saat create
confirmedManual
paidPemicu OrderObserver — transisi ke paid trigger deposit wallet + decrement stok + kirim link digital

OrderObserver

File: app/Observers/OrderObserver.php (192 baris). Registrasi: AppServiceProvider.php:18.

Hanya listen 1 event: updated. Trigger hanya saat transisi payment_status ke 'paid'.

Apa yang dilakukan saat payment_status → paid

  1. Wallet deposit — jika payment_method === 'instant_payment', panggil WalletService::processDeposit(). Error non-blocking
  2. Decrement stok — iterasi order_item, decrement Product.stock atau variant stock. Error non-blocking
  3. Kirim link produk digitalDigitalProductService::sendProductLink()

OrderController — method utama

CRUD

MethodBarisFungsi
createOrder:1612Buat order + order items + update stok + kirim WA delivery
updateOrder:2088Update info order dari halaman detail
updateOrderColumn:3266Update 1 kolom (inline edit)

Status update

MethodBarisFungsiObserver?
change_order_status:1192Ubah status tunggal + sync followUp
change_order_status_multiple:1224Bulk ubah status — khusus complained
change_payment_status:1260Ubah payment_status tunggalTidak (mass update)
change_payment_status_multiple:1280Bulk ubah payment_statusYa (save())

Shipping

MethodBarisFungsi
update_shipping:1482Update data shipping
update_address:1571Update alamat
upload_resi:2716Upload nomor resi (massal/single)
generate_shippinglabel:3275PDF label via labellayout_1.blade.php

Invoice & export

MethodBarisFungsi
invoice:1307Render HTML invoice
invoicePdf:1335Stream PDF via DomPDF
export:1352Export semua order ke PDF
exportExcel:1363Export Excel via OrdersExport

Route

Web (routes/web.php)

MethodPathFungsi
GET/ordersHalaman utama
GET/orders/createForm buat order
GET/orders/detail/{id}Halaman detail
GET/orders/{id}Invoice HTML
GET/orders/exportExport PDF
GET/orders/export-order-excelExport Excel

API (routes/api.php)

Prefix /order:

MethodPathFungsi
POST/order/createBuat order
POST/order/change_order_statusUbah status
POST/order/change_payment_statusUbah payment status (tunggal)
POST/order/change_payment_status_multipleBulk payment status
POST/order/upload_resiUpload resi
PUT/order/update_order_columnInline edit
POST/order/listList paginate

Invoice

Blade: resources/views/invoice.blade.php (705 baris). Dipakai oleh invoice() (HTML) dan invoicePdf() (PDF stream).

Field ditampilkan: logo store, barcode order_number, data customer, tabel item, metode pembayaran (bank/QR/COD), kurir & resi, total. Ada widget tracking Rajaongkir di footer.

Integrasi service eksternal

Backend Go (url_api)

MethodEndpointFungsi
createOrderPOST {url_api}send_imageKirim gambar
createOrderPOST {url_api}send_messageKirim pesan WA ke pembeli

Engine WhatsApp (url_engine)

MethodEndpointFungsi
updateDataSourcePOST {url_engine}update-chatlistSync chat list
deviceInfoPOST {url_engine}deviceinfoAmbil info device
createNotifPOST {url_engine}push-notifPush notif ke device

God component — Order/Main.vue

Struktur tingkat tinggi (9.668 baris):

  • 2 tab via currentTab: overview_data (laporan) + order_data (tabel)
  • 8 modal: Create Order, Cetak Label, Detail, Ubah Status Transaksi, Ubah Status Pembayaran, Input Resi, Export Data, Scan Barcode
  • Sub-komponen yang sudah diekstrak: hanya components/FollowUpModal.vue + components/FollowUpTabsDropdowns.vue

Langkah berikutnya

  • Butuh memahami pembayaran? Baca Wallet.
  • Butuh kirim pesan WA ke customer order? Baca WhatsApp.