HBAD201_직원 추가·수정 모달
(Hereby) 관리자 패널 > App Shell > 인사 관리 > 직원 관리 > 직원 추가·수정 모달
| 메타 | 앱: 관리자 패널 (App Shell)대상 사용자: 조건1 [직원 관리 권한 보유 역할]프로토타입: TBU관련 정책: [[POL_급여정본경계]] · [[POL_권한(RBAC)]]Status: reviewOwner: 카나 |
개요
직원 추가·수정은 단일 모달 + 4단계 스텝(① 기본정보 / ② 인사정보 / ③ 자격증/면허 등록 / ④ 근로계약)이다. 1회 저장으로 4개 생성물이 동시 생성된다: ① Employee ② 소속(팀·역할 n:m) ③ 근로계약·급여 seed ④ 자격증 요건. 하단 버튼은 "취소" / "미리보기" / "등록"(저장 중 "등록 중..." disabled). 기본 상태는 비활성이다 (activation gate — 안내 "비활성 상태로 등록돼요. 사용하기 위해서는 재직으로 변경해 주세요."). 전화번호 입력 시 SMS 임시비밀번호 안내가 발송된다. 자격증/면허 요구를 선택하면 자격증 화면에 "파일 미제출" 상태로 등록된다. 급여 seed는 계약·호봉·수당·근무시간을 급여 원천으로 넘긴다 (POL_급여정본경계 — 정본 변환은 HR 시트 commit에서).
문서 히스토리
- 2026-07-06 최초 작성 - 카나/콸
- 2026-07-10 라이브 기능 검토 반영 - 카나/콸
- 2026-07-13 버튼 행동 명세 보강 - 카나/콸
- 2026-07-17 코드 변경 반영(de57b65·0125f00) - 카나/콸
- 2026-07-21 GC700 깊이 재작성 (라이브 재검증 7/20 — 4단계 전 필드·안내 원문·이탈 가드·등록 중 상태) - 카나/콸
- 2026-07-21 가독성 패스 (GUIDE §7) - 카나/PM
- 2026-07-21 셀 스타일 확정판 적용 (콸 승인) - 카나/PM
- 2026-07-24 코드 변경 반영(c1b2158) - 카나/콸
Data I/O
Client → Server
액션
| 메타 | 직원 추가 (1회, 4 생성물) |
| 메타 | ㄴ ① employees |
| 메타 | ㄴ ② team_members |
| 메타 | ㄴ ③ employment_contracts |
| 메타 | ㄴ ④ employee_certifications |
| 메타 | 미리보기 |
Server side 효과
| 효과 | 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
| SMS 임시비밀번호 발송 | login_otp_codes 계열 (추정) + mustChangePassword=true | 전화번호 미입력 시 미발송 | 안내 "전화번호를 입력해야, 임시 비밀번호를 SMS로 발송을 할 수 있어요." |
| 기본 상태 비활성 | employees.status = 비활성 | - | activation gate |
| 출근 기록 방식 | employees.attendanceMethod | 조직 기본값 사용 | 앱/Secom/수동 4옵션 |
① 기본정보 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | • 목록에서 이 모달을 여는 두 진입 경로 - CASE01 [직원 추가]: "직원 추가" 클릭 → "직원 추가" 모달 - CASE02 [편집]: 목록 행 "편집" 클릭 → "직원 정보 수정" 모달 | [[HBAD200_직원 관리]] | |
| 01 | 초기 상태 | - | • STEP1 [기본정보] 섹션 노출 | employees | |
| 10 | 성 * / 이름 * / 사번 * | Input | • 성·이름·사번 입력. 사번에 "자동 생성" 체크박스 • 입력 시: 각 값 반영 - CASE01 [자동 생성 체크]: 사번 자동 채움 | employees.employeeNumber | 사번 자동 생성 |
| 11 | 이메일 / 생년월일 | Input | • 이메일 / 생년월일 입력 ("음력" 체크박스) | employees | |
| 12 | 주민등록번호 | Input | • 마스킹 입력(password) - CASE01 [생년월일 선입력 게이트]: 생년월일 입력 후 활성 | employees | 마스킹 · 선입력 게이트 |
| 13 | 전화번호 | Input | • 국가코드 선택(+82 / +1 / +81 / +86 / +44) + 번호 입력. 안내 "전화번호를 입력해야, 임시 비밀번호를 SMS로 발송을 할 수 있어요." - CASE01 [값 없음]: 미입력 시 SMS 미발송 | SMS 임시비밀번호 | |
| 14 | 주소 | Search | • 주소 검색(도로명·지번) + 상세주소 입력 • 입력 시: 선택 주소 반영 | employees |
② 인사정보 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 섹션 | Section | • 헤더 "인사정보" — "필수 인사정보" + "기타 인사정보" 그룹 • 연차 자격 판정이 그룹 근무형태까지 확장(mergeGroupShiftsToWorkPattern) — 그룹 배정 시 그룹 근무형태가 자격 산정에 병합 (코드 반영: c1b2158) | employees · team_members · 연차 자격 판정 | 자격 판정 그룹 확장(c1b2158) |
| 10 | 입사일 * | Date | • "입사일 *" 날짜 입력 ("오늘" 단축 버튼). 필수 • 입력 시: 선택 날짜 반영 | employees.joinedAt | 필수 |
| 20 | 출근 기록 방식 | Dropdown | • 근태 원천 방식 선택 (안내 "조직 기본값 또는 개별 설정"). 옵션 4종: "조직 기본값 사용" / "앱 (Web/Mobile)" / "지문 단말기 (Secom)" / "관리자 수동 입력" • 선택 시: 해당 방식 반영 - CASE01 [미선택]: 조직 기본값 사용 | employees.attendanceMethod | 근태 원천 |
| 30 | 소속 (팀 · 역할) | Button | • "소속 (팀 · 역할)" + "소속 추가" 버튼. 팀·역할 멀티 배정. 모달(large)에서는 "+ 소속 추가" 라벨 버튼 유지 (7/16 변경 유지) • 클릭 시: 소속(팀·역할) 배정 행 추가 | team_members | n:m |
| 40 | 상태 | Radio | • "재직" / "비활성" 선택. 안내 "비활성 상태로 등록돼요. 사용하기 위해서는 재직으로 변경해 주세요." • 선택 시: 해당 상태 반영 - CASE01 [비활성(기본)]: activation gate | employees.status | activation gate |
| 50 | 근무 배정 (근무 그룹 → 근무형태) | Dropdown | • 근무 배정을 '근무 그룹 → 근무형태' 2단계로 개편 (코드 반영: c1b2158) - STEP1 [근무 그룹]: 근무 그룹 선택 — employees.shiftGroupId(FK shift_groups, nullable). 근무형태 없이 그룹만 배정 가능- STEP2 [근무형태]: 근무형태 필드는 그룹 선택 시에만 노출(폭 50%). 근무 유형 목록 연동 선택 (예: "미지정" / "일반근무" / "3교대 주간" / "3교대 오후" / "3교대 야간" / "스케줄 근무" 등 — junk 데이터 관찰) • 선택 시: 그룹·근무형태 반영. 안내 문구 "추가/수정 가능"으로 갱신 | employees.shiftGroupId (FK shift_groups, nullable) · employment_contracts | 2단계 개편 (코드 반영: c1b2158) · junk 데이터 존재 |
| ㄴ51 | 근무 유형 전체 보기 (참고 팝업) | Button | • 위저드에서 그룹별 등록 근무 유형을 열람하는 "근무 유형 전체 보기" 참고 팝업 • 클릭 시: 그룹별 등록 유형 목록 팝업 오픈(참고용) | shift_groups · 근무 유형 | 신규 (코드 반영: c1b2158) |
③ 자격증/면허 등록 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 섹션 | Section | • 헤더 "자격증/면허 등록" — "자격 유형 선택" | employee_certifications | 신설 섹션 · 생성물 ④ |
| 10 | 안내 문구 | Info | • 자격증 등록 안내 (원문 카피): "직원이 제출해야 할 자격증/면허를 선택해 주세요." / "선택한 항목은 자격증/면허 화면에 '파일 미제출' 상태로 등록돼요." / "입사 후 '문서 결재' > '자격증/면허' 탭에서 자격 정보를 등록할 수 있어요." | 원문 카피 | |
| 20 | 자격 유형 선택 | Checkbox | • 자격 15종 + 커스텀 체크 선택: "테스트" / "ㅁㄴㅇㄹㅁㄴㅇㄹㅁㄴ"(커스텀/junk) / "간호사" / "간호조무사" / "물리치료사" / "작업치료사" / "언어치료사" / "방사선사" / "임상병리사" / "약사" / "영양사" / "사회복지사" / "의사" / "치과의사" / "응급구조사" / "요양보호사" - CASE01 [선택]: 해당 자격 "파일 미제출" 등록 | employee_certifications | 15종+커스텀 |
| 30 | 자격증 요청 안함 | Option | • "자격증 제출을 요청하지 않아요." 옵션 - CASE01 [선택]: 자격증 요건 미생성 | employee_certifications |
④ 근로계약 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 섹션 | Section | • 헤더 "근로계약" — "계약 정보" / "급여 기준" / "근무 시간" | employment_contracts (급여 원천) | POL_급여정본경계 |
| 10 | 계약유형 | Dropdown | • 계약 유형 선택: "정규직" / "임시직" / "계약직" / "인턴" / "파트타임" (5종) • 선택 시: 해당 유형 반영 | employment_contracts | |
| 20 | 급여형태 | Dropdown | • 급여 형태 선택: "월급" / "시급" / "일급" / "연봉" (4종) • 선택 시: 해당 형태 반영 | employment_contracts | |
| 30 | 급여 기준 | Input | • 급여 원천 6필드 입력: "기본급 (원)" / "호봉 (원)" / "근속수당 (원)" / "식대 (원)" / "교통비 (원)" / "직책수당 (원)" | employment_contracts (급여 원천) | |
| 40 | 근무 시간 | Input | • 근무 시간 2필드 입력: "주당 기본근무시간" / "주당 최대근무시간" | standardWeeklyHours / maxWeeklyHours | 52h 한도 |
공통 하단·이탈 가드 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 90 | 하단 버튼 | Button | • 모달 하단 액션 버튼 묶음: "취소" / "미리보기" / "등록" • "취소" 클릭 시: 이탈 가드 후 모달 닫기 • "미리보기" 클릭 시: 등록 내용 미리보기 • "등록" 클릭 시: "등록 중..." 표기 + 버튼 disabled → 4 생성물 트랜잭션, 기본 상태 비활성(activation gate) - CASE01 [저장 실패]: 트랜잭션 실패 시 처리(토스트/롤백) | sdk.employee.create() | 권한 "직원 관리" · TBU: 저장 실패 동작 |
| 91 | 미저장 이탈 가드 | Alert | • 변경 후 취소/닫기 시 노출되는 확인 얼럿 (원문 카피): "변경된 내용을 저장하지 않고 나가시겠어요?" (버튼 "계속 편집" / "나가기") | 원문 카피 |
4 생성물 · activation gate
| 생성물 | 엔티티 | 초기 상태 |
|---|---|---|
| ① Employee | employees | 비활성 (activation gate) |
| ② 소속·역할 | team_members (n:m) | 팀·역할 배정 |
| ③ 근로계약·급여 seed | employment_contracts | 급여 원천 (정본 아님) |
| ④ 자격증 요건 | employee_certifications | 파일 미제출 |
권한 / 상태 요약
| 시나리오 | 트리거 | 결과 | 비고 |
|---|---|---|---|
| CASE01 [직원 생성] | "등록" | "등록 중..." → 4 생성물 트랜잭션, 상태 비활성 | activation gate |
| CASE02 [전화번호 입력] | 저장 (전화번호 有) | SMS 임시비밀번호 발송 | mustChangePassword |
| CASE03 [자격증 요구] | 자격증/면허 요구 선택 | 자격증 화면 "파일 미제출" 등록 | |
| CASE04 [미저장 이탈] | 변경 후 취소/닫기 | "변경된 내용을 저장하지 않고 나가시겠어요?" (계속 편집/나가기) |
Open Question
| 구분 | 미확인 항목 |
|---|---|
| 하단·저장 | 저장 실패(트랜잭션 실패) 시 처리(토스트/롤백) 동작 |