media()->get()->each->delete(); }); } const STATUSES = ['pending', 'in_progress', 'completed', 'approved', 'rejected']; const RESULTS = ['pass', 'fail', 'conditional']; protected $fillable = [ 'project_id', 'layer_id', 'feature_id', 'template_id', 'user_id', 'data', 'status', 'inspector_user_id', 'completed_at', 'result', 'notes', 'uuid', 'client_updated_at', ]; protected $casts = [ 'data' => 'array', 'completed_at' => 'datetime', ]; public function project() { return $this->belongsTo(Project::class); } public function layer() { return $this->belongsTo(Layer::class); } public function template() { return $this->belongsTo(InspectionTemplate::class); } public function user() { return $this->belongsTo(User::class); } public function inspector() { return $this->belongsTo(User::class, 'inspector_user_id'); } public function media() { return $this->morphMany(Media::class, 'mediable'); } public function feature() { return $this->belongsTo(Feature::class, 'feature_id'); } public function issues() { return $this->hasMany(Issue::class); } public function scopePending($q) { return $q->where('status', 'pending'); } public function scopeCompleted($q) { return $q->where('status', 'completed'); } public function scopeRejected($q) { return $q->where('status', 'rejected'); } public function toSearchableArray(): array { return [ 'id' => $this->id, 'project_id' => $this->project_id, 'layer_id' => $this->layer_id, 'feature_id' => $this->feature_id, 'template_id' => $this->template_id, 'user_id' => $this->user_id, 'inspector_user_id' => $this->inspector_user_id, 'status' => $this->status, 'result' => $this->result, 'notes' => $this->notes, ]; } public function getScoutKey(): string { return (string) $this->id; } }