D
Engineering

orders

Skema koleksi orders — field utama, addresses/shipping embedded, typo utm_campaing, OrderObserver trigger.

Entitas bisnis utama. Tidak ada SoftDeletes, tidak ada casts. Status pakai string literal (bukan enum).

Definisi model

app/Models/Order.php

PropertiNilaiSumber
Collectionorders (default konvensi)
$guarded[]Order.php:13
SoftDeletes
Casts❌ (tidak ada)
$hidden
$appends
Primary keyUUID stringOrder.php:14-16,21-23

Field

FieldTipeDefaultSumber
idstring UUIDgeneratedOrder.php:22
email_customerstring/nullnullOrderController.php:1779
device_idstring/nullnull:1780
order_numberstring:1781 (helper :2245)
customer_idstring:1782
customer_namestring:1783
customer_wastring:1784
sequenceinteger:1785 (helper :2283)
payment_methodstring:1786
store_idstring:1787 (scope multi-tenant)
total_priceinteger:1788
team_idstring (UserStore.id):1789
team_rolestring:1790
shippingobject:1791,1508-1517,1545+
statusstringdinamis:1792,1253
order_viastring/nullnull:1793
user_notesstring/nullnull:1794
payment_statusstring'unpaid':1795,1268
utm_sourcestring/nullnull:1796
utm_mediumstring/nullnull:1797
utm_campaingstring/nullnull:1798 typo
utm_termstring/nullnull:1799
utm_contentstring/nullnull:1800
ratinginteger0:1801
proof_transactionstring/null (URL CDN)null:1802
addressesobject:1803,1407-1425,1499-1544
tracking_statusstring'none':1804,1518,1565
followUpobject:2703-2704
rating_accessboolean:1400-1402 (side effect baca)

addresses (tidak seragam)

json
{
  "id": "string|null",
  "province": { "label": "string", "value": {...} } | "string",
  "city": { "label": "string", "value": {...} } | "string",
  "district": { "label": "string", "value": {...} } | "string",
  "subdistrict": "string|null",
  "village": "string|null",
  "address": "string|null",
  "postal_code": "string|null"
}

shipping

json
{
  "name": "string",
  "code": "string",
  "service": "string",
  "description": "string",
  "etd": "string",
  "cost": "integer",
  "resi": "string|null",
  "courier": "object"
}

followUp

Dari OrderController.php:2688-2695:

json
{
  "welcome": "active",
  "follow_up_1": "inactive",
  "follow_up_2": "inactive",
  "follow_up_3": "inactive",
  "follow_up_4": "inactive"
}

Status values

Enum formal ada di app/Enums/StatusOrder.php:5-12: pending, process, cancel, completed, complained, refund. Tapi tidak dipakai — seluruh transisi pakai string literal.

String tambahan di codebase yang tidak ada di enum:

  • 'delivery' — saat create pakai resi (:1743), update via manual_receipt_input (:3223)
  • 'complete' — typo/inconsistency dengan 'completed' (:1235,2784,2939)
  • 'complete,complained' — compound status (:1237)

payment_status values: 'unpaid', 'confirmed', 'pending', 'paid', 'failed' (subscription only).

Relasi

NamaTipeFKSumber
productbelongsToProduct.idproduct_idOrder.php:38-41
customerhasOneCustomer.idcustomer_id:43-45
teambelongsToUserStore.idteam_id:47-49
order_itemhasManyOrderItem.order_idid:51-53

OrderObserver

app/Observers/OrderObserver.php:18-57. Hanya updated event di-handle.

Trigger condition:

php
if ($order->isDirty('payment_status') 
    && $order->payment_status === 'paid' 
    && $order->getOriginal('payment_status') !== 'paid') {
    // jalan
}

Yang dilakukan:

  1. Wallet deposit (hanya payment_method === 'instant_payment')
  2. Decrement stok via decrementStock() (non-blocking)
  3. Kirim link digital via DigitalProductService->sendProductLink()

Contoh dokumen

json
{
  "_id": ObjectId("..."),
  "id": "uuid-order",
  "email_customer": null,
  "device_id": null,
  "order_number": "ORD-...",
  "customer_id": "<customer.id>",
  "customer_name": "Budi",
  "customer_wa": "+62812...",
  "sequence": 5,
  "payment_method": "bank_transfer",
  "store_id": "<store.id>",
  "total_price": 150000,
  "team_id": "<userStore.id>",
  "team_role": "Owner",
  "shipping": {},
  "status": "pending",
  "order_via": "whatsapp",
  "user_notes": null,
  "payment_status": "unpaid",
  "utm_source": null,
  "utm_medium": null,
  "utm_campaing": null,
  "utm_term": null,
  "utm_content": null,
  "rating": 0,
  "proof_transaction": null,
  "addresses": {},
  "tracking_status": "none",
  "created_at": ISODate("..."),
  "updated_at": ISODate("...")
}

Referensi

  • Order Lifecycle — alur lengkap
  • app/Models/Order.php — model
  • app/Http/Controllers/OrderController.php — controller 2.987 baris
  • app/Observers/OrderObserver.php — observer
  • app/Enums/StatusOrder.php — enum (tidak dipakai)