'date', 'install_date' => 'date', 'disposed_date' => 'date', 'purchase_price' => 'decimal:2', 'is_active' => 'boolean', ]; public function manager(): BelongsTo { return $this->belongsTo(\App\Models\User::class, 'manager_id'); } public function subManager(): BelongsTo { return $this->belongsTo(\App\Models\User::class, 'sub_manager_id'); } /** * 해당 유저가 이 설비의 점검 권한이 있는지 확인 */ public function canInspect(?int $userId = null): bool { $userId = $userId ?? auth()->id(); if (auth()->user()?->isAdmin()) { return true; } return $this->manager_id === $userId || $this->sub_manager_id === $userId; } public function inspectionTemplates(): HasMany { return $this->hasMany(EquipmentInspectionTemplate::class, 'equipment_id')->orderBy('sort_order'); } public function inspections(): HasMany { return $this->hasMany(EquipmentInspection::class, 'equipment_id'); } public function repairs(): HasMany { return $this->hasMany(EquipmentRepair::class, 'equipment_id'); } public function photos(): HasMany { return $this->hasMany(File::class, 'document_id') ->where('document_type', 'equipment') ->orderBy('id'); } public function processes(): BelongsToMany { return $this->belongsToMany(\App\Models\Process::class, 'equipment_process') ->withPivot('is_primary') ->withTimestamps(); } public function scopeActive($query) { return $query->where('status', 'active'); } public function scopeByLine($query, string $line) { return $query->where('production_line', $line); } public function scopeByType($query, string $type) { return $query->where('equipment_type', $type); } public function getStatusLabelAttribute(): string { return match ($this->status) { 'active' => '가동', 'idle' => '유휴', 'disposed' => '폐기', default => $this->status, }; } public function getStatusColorAttribute(): string { return match ($this->status) { 'active' => 'bg-green-100 text-green-800', 'idle' => 'bg-yellow-100 text-yellow-800', 'disposed' => 'bg-gray-100 text-gray-800', default => 'bg-gray-100 text-gray-800', }; } public static function getEquipmentTypes(): array { return ['포밍기', '미싱기', '샤링기', 'V컷팅기', '절곡기', '프레스', '드릴', '기타']; } public static function getProductionLines(): array { return ['스라트', '스크린', '절곡', '기타']; } public static function getStatuses(): array { return [ 'active' => '가동', 'idle' => '유휴', 'disposed' => '폐기', ]; } }