Entitas bisnis utama. Tidak ada SoftDeletes, tidak ada casts. Status pakai string literal (bukan enum).
Definisi model
app/Models/Order.php
| Properti | Nilai | Sumber |
|---|---|---|
| Collection | orders (default konvensi) | — |
$guarded | [] | Order.php:13 |
| SoftDeletes | ❌ | — |
| Casts | ❌ (tidak ada) | — |
$hidden | ❌ | — |
$appends | ❌ | — |
| Primary key | UUID string | Order.php:14-16,21-23 |
Field
| Field | Tipe | Default | Sumber |
|---|---|---|---|
id | string UUID | generated | Order.php:22 |
email_customer | string/null | null | OrderController.php:1779 |
device_id | string/null | null | :1780 |
order_number | string | — | :1781 (helper :2245) |
customer_id | string | — | :1782 |
customer_name | string | — | :1783 |
customer_wa | string | — | :1784 |
sequence | integer | — | :1785 (helper :2283) |
payment_method | string | — | :1786 |
store_id | string | — | :1787 (scope multi-tenant) |
total_price | integer | — | :1788 |
team_id | string (UserStore.id) | — | :1789 |
team_role | string | — | :1790 |
shipping | object | — | :1791,1508-1517,1545+ |
status | string | dinamis | :1792,1253 |
order_via | string/null | null | :1793 |
user_notes | string/null | null | :1794 |
payment_status | string | 'unpaid' | :1795,1268 |
utm_source | string/null | null | :1796 |
utm_medium | string/null | null | :1797 |
utm_campaing | string/null | null | :1798 typo |
utm_term | string/null | null | :1799 |
utm_content | string/null | null | :1800 |
rating | integer | 0 | :1801 |
proof_transaction | string/null (URL CDN) | null | :1802 |
addresses | object | — | :1803,1407-1425,1499-1544 |
tracking_status | string | 'none' | :1804,1518,1565 |
followUp | object | — | :2703-2704 |
rating_access | boolean | — | :1400-1402 (side effect baca) |
addresses (tidak seragam)
{
"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
{
"name": "string",
"code": "string",
"service": "string",
"description": "string",
"etd": "string",
"cost": "integer",
"resi": "string|null",
"courier": "object"
}followUp
Dari OrderController.php:2688-2695:
{
"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 viamanual_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
| Nama | Tipe | FK | Sumber |
|---|---|---|---|
product | belongsTo | Product.id ← product_id | Order.php:38-41 |
customer | hasOne | Customer.id ← customer_id | :43-45 |
team | belongsTo | UserStore.id ← team_id | :47-49 |
order_item | hasMany | OrderItem.order_id ← id | :51-53 |
OrderObserver
app/Observers/OrderObserver.php:18-57. Hanya updated event di-handle.
Trigger condition:
if ($order->isDirty('payment_status')
&& $order->payment_status === 'paid'
&& $order->getOriginal('payment_status') !== 'paid') {
// jalan
}Yang dilakukan:
- Wallet deposit (hanya
payment_method === 'instant_payment') - Decrement stok via
decrementStock()(non-blocking) - Kirim link digital via
DigitalProductService->sendProductLink()
Contoh dokumen
{
"_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— modelapp/Http/Controllers/OrderController.php— controller 2.987 barisapp/Observers/OrderObserver.php— observerapp/Enums/StatusOrder.php— enum (tidak dipakai)