'array', 'is_default' => 'boolean', ]; protected $fillable = [ 'tenant_id', 'name', 'steps', 'is_default', 'created_by', 'updated_by', 'deleted_by', ]; // ========================================================================= // 단계 유형 상수 // ========================================================================= public const STEP_TYPE_APPROVAL = 'approval'; public const STEP_TYPE_AGREEMENT = 'agreement'; public const STEP_TYPE_REFERENCE = 'reference'; public const STEP_TYPES = [ self::STEP_TYPE_APPROVAL, self::STEP_TYPE_AGREEMENT, self::STEP_TYPE_REFERENCE, ]; // ========================================================================= // 관계 정의 // ========================================================================= public function creator(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); } // ========================================================================= // 스코프 // ========================================================================= public function scopeDefault($query) { return $query->where('is_default', true); } // ========================================================================= // 헬퍼 메서드 // ========================================================================= public function getStepCountAttribute(): int { return count($this->steps ?? []); } public function getApproverIdsAttribute(): array { return collect($this->steps ?? []) ->pluck('user_id') ->filter() ->values() ->toArray(); } }