'date', 'paid_at' => 'datetime', ]; public function customer() { return $this->belongsTo(Customer::class); } public function user() { return $this->belongsTo(User::class); } public function discount() { return $this->belongsTo(Discount::class); } /** Line items that make up this order. */ public function orderItems() { return $this->hasMany(OrderItem::class, 'order_id'); } /** First/primary invoice generated from this order (kept for backward compat — an order can have many). */ public function invoice() { return $this->hasOne(Invoice::class, 'order_id'); } /** All invoices billed against this order (initial + renewals) — an order can have many. */ public function invoices() { return $this->hasMany(Invoice::class, 'order_id'); } // ------------------------------------------------------------------------- // Helpers // ------------------------------------------------------------------------- /** * orders.status là tinyInteger (OrderStatus), không phải chuỗi — bản cũ match 'pending'/ * 'completed'… nên mọi giá trị đều rơi vào default và hiển thị ra "0", "1", "2". */ public function getStatusLabelAttribute(): string { return \App\Enums\Order\OrderStatus::tryFrom((int) $this->status)?->label() ?? 'Không xác định'; } public function payment() { return $this->belongsTo(Payment::class, 'payment_method', 'id'); } public function moduleVmwares() { return $this->hasMany(ModuleVmware::class, 'order_id'); } public function vmWare() { return $this->hasMany(ModuleVmware::class, 'order_id'); } }