'array', 'is_default' => 'boolean', ]; protected $fillable = [ 'tenant_id', 'name', 'steps', 'is_default', 'created_by', 'updated_by', 'deleted_by', ]; protected $attributes = [ 'is_default' => false, ]; // ========================================================================= // 단계 유형 상수 // ========================================================================= 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 updater(): BelongsTo { return $this->belongsTo(User::class, 'updated_by'); } // ========================================================================= // 스코프 // ========================================================================= /** * 기본 결재선만 */ public function scopeDefault($query) { return $query->where('is_default', true); } // ========================================================================= // 헬퍼 메서드 // ========================================================================= /** * 결재선 단계 수 */ public function getStepCountAttribute(): int { return count($this->steps ?? []); } /** * 결재자 목록 (user_id만) */ public function getApproverIdsAttribute(): array { return collect($this->steps ?? []) ->pluck('user_id') ->filter() ->values() ->toArray(); } }