'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 // ------------------------------------------------------------------------- public function getStatusLabelAttribute(): string { return match ($this->status) { 'pending' => 'Chờ xử lý', 'processing' => 'Đang xử lý', 'completed' => 'Hoàn tất', 'cancelled' => 'Đã hủy', default => ucfirst($this->status), }; } public function payment() { return $this->belongsTo(Payment::class); } public function moduleVmwares() { return $this->hasMany(ModuleVmware::class, 'order_id'); } public function vmWare() { return $this->hasMany(ModuleVmware::class, 'order_id'); } }