'date', 'amount_ht' => 'decimal:2', 'amount_ttc' => 'decimal:2', 'exclude_vat' => 'boolean', ]; /** * Relation avec l'historique des changements de statut. */ public function statusLogs() { return $this->hasMany(OrderStatusLog::class)->orderBy('changed_at', 'desc'); } /** * Relation avec les pièces jointes. */ public function attachments() { return $this->hasMany(Attachment::class); } /** * Scope par statut(s). */ public function scopeByStatus($query, $status) { if (empty($status)) { return $query; } if (is_array($status)) { return $query->whereIn('status', $status); } return $query->where('status', $status); } /** * Scope par demandeur(s). */ public function scopeByDemandeur($query, $demandeur) { if (empty($demandeur)) { return $query; } if (is_array($demandeur)) { return $query->whereIn('requested_by', $demandeur); } return $query->where('requested_by', $demandeur); } /** * Scope pour les commandes en retard de livraison (date dépassée et non livrée/clôturée). */ public function scopeOverdue($query) { return $query->where('delivery_deadline', '<', now()->toDateString()) ->whereNotIn('status', ['delivered', 'closed']); } }