다크모드
인사 조직·직원 디렉터리 — 프론트엔드 메인테이너
화면
- 조직:
src/components/human-capital/personnel/organization/general/MainOrg.vue - 직원:
src/components/human-capital/personnel/employee/general/MainOrg.vue - 조직 생성:
organization/general/overlays/SheetCreateUnitArt.vue - 직원 생성:
employee/general/overlays/SheetCreateEmployeeArt.vue - 직원 상세 read↔edit:
employee/general/overlays/SheetReadEmployeeArt.vue - 배치 생성:
employee/general/overlays/SheetCreateAssignmentArt.vue - 종료·취소:
employee/general/overlays/DialogEndAssignmentArt.vue,DialogCancelAssignmentArt.vue - 퇴직·보관:
employee/general/overlays/DialogTerminateEmployeeArt.vue,DialogArchiveEmployeeArt.vue
두 페이지는 Company 원장이다. useAccountContext().company.id를 조회·mutation scope로 사용한다.
모듈 내비게이션
humanCapitalNav.js의 정본 순서는 인사 → 근태 → 휴가 → 보상 → 인사 문서다. 입사 처리는 인사 모듈이 소유하고, 근태 상품에는 근태 현황·정정과 근무 설정만 남긴다. 기존 근로계약·문서센터 라우트는 유지하지만 메뉴에서는 인사 문서 아래 근로계약서 발행과 증명서 발급으로 묶는다. 업무일지 라우트는 호환을 위해 유지하되 최상위 메뉴에서는 제거한다.
셸의 메뉴와 탭 활성 판정은 모두 isHumanCapitalModuleActive()를 사용한다. broad prefix를 가진 인사·인사 문서보다 구체적인 근태·휴가·보상 prefix를 먼저 판정해 복수 활성 상태를 만들지 않는다.
persistence seam
src/composables/humanCapitalDirectoryRepo.js가 유일한 인사 디렉터리 persistence 경계다.
- 목록은
makeSupabaseOperationalSubjectRepo의listOrganizations,listEmployees,listAssignments를 소비한다. - mutation은
create_workforce_organization,create_workforce_employee,update_workforce_employee,create_workforce_assignment,end_workforce_assignment,cancel_workforce_assignment,transition_workforce_employee_lifecycleRPC만 호출한다. - 퇴직·보관 이력은 RLS가 적용된
workforce_employee_lifecycle_events를 Company 범위로 읽는다. - 컴포넌트에서
supabase.from()또는supabase.rpc()를 직접 호출하지 않는다. - Supabase 설정이 없거나 테스트 모드이면 동일 계약의 메모리 mock을 사용한다.
데이터 흐름
text
MainOrg
→ resolveHumanCapitalDirectoryRepo()
→ employee + organization + assignment + lifecycle event Promise.all SELECT
→ Human Capital command RPC
→ normalizeOperationalOrganization|Employee|Assignment
→ 목록 갱신생성 시트는 열릴 때 유지되는 request key를 payload에 포함한다. 실패 후 같은 내용을 다시 누르면 같은 키로 재시도하고, 성공하면 complete()가 시트를 닫고 새 request key로 폼을 초기화한다.
직원 행의 이름 클릭은 selectedEmployeeId를 먼저 갱신하고 단일 sheet-read-workforce-employee-art를 연다. 상세은 id로 현재 employee를 다시 찾으므로 항상 클릭한 정확한 행을 표시한다. 배치 end/cancel도 selectedAssignment를 먼저 설정한 뒤 전용 dialog를 연다.
Company·Office scope 변경 시 기존 직원·조직·배치·lifecycle 목록, 선택 employee/assignment, 열린 상세·명령 sheet/dialog를 즉시 비운 뒤 새 범위를 조회한다. loadSequence와 currentScopeKey()는 늦게 도착한 이전 목록 응답도 버린다. mutation도 시작 scope key를 캡처하며, 완료 시 현재 scope와 다르면 목록·성공 메시지·시트 complete를 반영하지 않는다.
모든 mutation은 saving으로 중복 제출을 막는다. 실패 시 시작 Company·Office scope가 여전히 같을 때 디렉터리 네 projection을 다시 조회한 후 오류를 표시한다. scope가 바뀌었으면 이전 응답·오류·complete를 버린다.
UI·SSOT 규칙
- EDS 0.10.0의
card,table,field,input,select,sheet,alert,button만 사용한다. - 조직·직원 목록은 타입/상태 → 이름/사번 → 속성 순서를 따른다.
- 관리코드는 목록에 표시하지 않고 검색 키로만 사용한다.
- 직원명은
font-medium + hover:underline버튼이며 전용 상세 컬럼을 두지 않는다. - 상세은
sheet-width-3xl, 관리코드는 zone-top 우측에만 미니멀 표시한다. - 직원 속성 edit는 단일 외곽 card 안에 모든 필드를 펼치며
valid && dirty일 때만 저장한다. - 배치는 독립 생명주기의 연결 컬렉션이며 자체 create sheet·end/cancel dialog를 사용한다.
- employee normalizer는 raw
status와 날짜 파생lifecycleStatus를 분리한다. 목록 badge, 상세 상태, 배치 생성 게이트는 lifecycleStatus를 우선해 미래 퇴직일 경과 후에도 재직으로 보이지 않는다. - 상태 badge는 재직 success, 초대 info, 휴직·퇴직예정 warning, 퇴직·보관 neutral tone이다.
- 직원 lifecycleStatus가
terminated|archived이면 배치 생성 액션을 숨기고 서버의 동일 불변식과 맞춘다. - 퇴직 dialog는 입사일이 있는
active|on_leave에서만 열고 KST 오늘 이후 퇴직 효력일·사유를 요구한다. 효력일은 첫 비재직일이며 현재 배치는 전날까지, 효력일 이후 예정 배치는 취소된다고 안내한다. - 보관 dialog는 KST 기준 퇴직 효력이 발생하고 현재·예정 배치가 없는 직원에서만 열며 사유와 정확한 확인 문구
보관을 요구한다. - 두 dialog는 실패 시 request key를 유지해 exact retry하고 성공/새 진입 시에만 새 key를 만든다.
- 상세의 접힌 퇴직·보관 이력 컬렉션은 처리, 적용일, 사유, 변경차수를 보여준다. 관리코드·사번 정책과 별개로 내부 UUID는 표시하지 않는다.
- 배치 create는 단일 외곽 card, 2단 field grid, 모든 필드 펼침을 사용한다.
- dirty 직원 edit/create를 취소하거나 닫을 때 명시 확인한다.
- 직원 생성 시트에는 비PII 최소 필드만 둔다. PII 필드를 UI에 추가하려면 먼저 제한 저장소와 권한 계약이 필요하다.
- 직원·배치 생성과 상세 시트 폭은
sheet-width-3xl집중 폭이다.
현재 지원·후속 경계
지원:
- Company 조직·직원 목록 조회
- 이름·사번·관리코드 검색
- 조직 생성과 선택적 상위 조직 연결
- 비PII 직원 생성
- 선택 직원 실제 상세과 직원명·입사일 read↔edit
- 서버-backed Office·조직 배치 목록·생성
- 날짜 파생 예정/현재/종료/취소 표시
- 미래 종료 예약·당일 즉시 종료·예정 배치 취소
- 미래 퇴직 예정·당일 퇴직과 배치 일괄 종료/취소
- 퇴직 후 보관, append-only 이력 조회
- Company·Office stale response 방어, 실패 후 projection 재조회, pending 중복 방지
- 새로고침, 로딩·오류·성공 상태
후속:
- 조직 비활성화·이동
- 퇴직 예정일 변경·취소, 재입사
- 근태·급여·전자결재 outbox consumer
- 로그인 identity 연결
- 별도 PII vault
테스트
- repo/mock/RPC payload:
src/composables/__tests__/humanCapitalDirectoryRepo.spec.js - migration contract:
src/composables/__tests__/humanCapitalDirectoryMigration.spec.js - assignment lifecycle migration:
src/composables/__tests__/workforceAssignmentLifecycleMigration.spec.js - 컴포넌트 persistence·PII 경계:
src/components/human-capital/personnel/HumanCapitalDirectoryUi.spec.js