'date', 'commissioning_date' => 'date', 'warranty_expiration_date' => 'date', ]; protected $appends = [ 'is_under_warranty', 'warranty_status_label', 'warranty_remaining_days', ]; /** * Relation avec la commande d'achat. */ public function order() { return $this->belongsTo(Order::class); } /** * Accesseur : l'équipement est-il sous garantie ? */ public function getIsUnderWarrantyAttribute(): bool { if (!$this->warranty_expiration_date) { return false; } return $this->warranty_expiration_date->isAfter(Carbon::today()); } /** * Accesseur : label en français du statut de garantie. */ public function getWarrantyStatusLabelAttribute(): string { if (!$this->warranty_expiration_date) { return 'Non spécifiée'; } if ($this->is_under_warranty) { $days = $this->warranty_remaining_days; return "Sous garantie ($days j. restants)"; } return 'Garantie expirée'; } /** * Accesseur : nombre de jours de garantie restants. */ public function getWarrantyRemainingDaysAttribute(): ?int { if (!$this->warranty_expiration_date) { return null; } if ($this->warranty_expiration_date->isBefore(Carbon::today())) { return 0; } return (int) Carbon::today()->diffInDays($this->warranty_expiration_date); } /** * Scope : Moteur de recherche multicritère */ public function scopeSearch($query, $search) { return $query->where(function ($q) use ($search) { $q->where('name', 'like', "%{$search}%") ->orWhere('brand', 'like', "%{$search}%") ->orWhere('model', 'like', "%{$search}%") ->orWhere('serial_number', 'like', "%{$search}%") ->orWhere('location', 'like', "%{$search}%") ->orWhere('ip_address', 'like', "%{$search}%"); }); } /** * Scope : Filtrer par type */ public function scopeByType($query, $type) { return $query->where('type', $type); } /** * Scope : Filtrer par statut */ public function scopeByStatus($query, $status) { return $query->where('status', $status); } }