'array', 'tenant_id' => 'int', 'user_id' => 'int', 'department_id' => 'int', 'manager_user_id' => 'int', ]; protected $appends = [ 'hire_date', 'resign_date', 'position_label', 'job_title_label', ]; // ========================================================================= // 글로벌 스코프 + 이벤트 // ========================================================================= protected static function booted(): void { static::addGlobalScope('business_income', function (Builder $builder) { $builder->where('worker_type', 'business_income'); }); static::creating(function (self $model) { $model->worker_type = 'business_income'; }); } // ========================================================================= // 관계 정의 // ========================================================================= public function user(): BelongsTo { return $this->belongsTo(User::class, 'user_id'); } public function department(): BelongsTo { return $this->belongsTo(Department::class, 'department_id'); } public function manager(): BelongsTo { return $this->belongsTo(User::class, 'manager_user_id'); } // ========================================================================= // json_extra Accessor (Employee 동일) // ========================================================================= public function getHireDateAttribute(): ?string { return $this->json_extra['hire_date'] ?? null; } public function getResignDateAttribute(): ?string { return $this->json_extra['resign_date'] ?? null; } public function getAddressAttribute(): ?string { return $this->json_extra['address'] ?? null; } public function getEmergencyContactAttribute(): ?string { return $this->json_extra['emergency_contact'] ?? null; } public function getResidentNumberAttribute(): ?string { return $this->json_extra['resident_number'] ?? null; } public function getBankAccountAttribute(): ?array { return $this->json_extra['bank_account'] ?? null; } public function getDependentsAttribute(): array { return $this->json_extra['dependents'] ?? []; } // ========================================================================= // 사업장등록정보 Accessor (json_extra에서 읽기) // ========================================================================= public function getBusinessRegistrationNumberAttribute(): ?string { return $this->json_extra['business_registration_number'] ?? null; } public function getBusinessNameAttribute(): ?string { return $this->json_extra['business_name'] ?? null; } public function getBusinessRepresentativeAttribute(): ?string { return $this->json_extra['business_representative'] ?? null; } public function getBusinessTypeAttribute(): ?string { return $this->json_extra['business_type'] ?? null; } public function getBusinessCategoryAttribute(): ?string { return $this->json_extra['business_category'] ?? null; } public function getBusinessAddressAttribute(): ?string { return $this->json_extra['business_address'] ?? null; } // ========================================================================= // 직급/직책 레이블 // ========================================================================= public function getPositionLabelAttribute(): ?string { if (! $this->position_key || ! $this->tenant_id) { return $this->position_key; } $position = Position::where('tenant_id', $this->tenant_id) ->where('type', Position::TYPE_RANK) ->where('key', $this->position_key) ->first(); return $position?->name ?? $this->position_key; } public function getJobTitleLabelAttribute(): ?string { if (! $this->job_title_key || ! $this->tenant_id) { return $this->job_title_key; } $position = Position::where('tenant_id', $this->tenant_id) ->where('type', Position::TYPE_TITLE) ->where('key', $this->job_title_key) ->first(); return $position?->name ?? $this->job_title_key; } // ========================================================================= // json_extra 헬퍼 // ========================================================================= public function getJsonExtraValue(string $key, mixed $default = null): mixed { return $this->json_extra[$key] ?? $default; } public function setJsonExtraValue(string $key, mixed $value): void { $extra = $this->json_extra ?? []; if ($value === null) { unset($extra[$key]); } else { $extra[$key] = $value; } $this->json_extra = $extra; } // ========================================================================= // 스코프 // ========================================================================= public function scopeForTenant($query, ?int $tenantId = null) { $tenantId = $tenantId ?? session('selected_tenant_id'); if ($tenantId) { return $query->where('tenant_id', $tenantId); } return $query; } public function scopeActiveEmployees($query) { return $query->where('employee_status', 'active'); } public function scopeOnLeave($query) { return $query->where('employee_status', 'leave'); } public function scopeResigned($query) { return $query->where('employee_status', 'resigned'); } }