Skip to content

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_membersn:m
40상태Radio• "재직" / "비활성" 선택. 안내 "비활성 상태로 등록돼요. 사용하기 위해서는 재직으로 변경해 주세요."
• 선택 시: 해당 상태 반영
 - CASE01 [비활성(기본)]: activation gate
employees.statusactivation 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_contracts2단계 개편 (코드 반영: c1b2158) · junk 데이터 존재
ㄴ51근무 유형 전체 보기 (참고 팝업)Button• 위저드에서 그룹별 등록 근무 유형을 열람하는 "근무 유형 전체 보기" 참고 팝업
• 클릭 시: 그룹별 등록 유형 목록 팝업 오픈(참고용)
shift_groups · 근무 유형신규 (코드 반영: c1b2158)

③ 자격증/면허 등록 사양표

번호항목/기능명타입사양 및 기능 설명연관/영향 범위비고
00섹션Section• 헤더 "자격증/면허 등록" — "자격 유형 선택"employee_certifications신설 섹션 · 생성물 ④
10안내 문구Info• 자격증 등록 안내 (원문 카피): "직원이 제출해야 할 자격증/면허를 선택해 주세요." / "선택한 항목은 자격증/면허 화면에 '파일 미제출' 상태로 등록돼요." / "입사 후 '문서 결재' > '자격증/면허' 탭에서 자격 정보를 등록할 수 있어요."원문 카피
20자격 유형 선택Checkbox• 자격 15종 + 커스텀 체크 선택: "테스트" / "ㅁㄴㅇㄹㅁㄴㅇㄹㅁㄴ"(커스텀/junk) / "간호사" / "간호조무사" / "물리치료사" / "작업치료사" / "언어치료사" / "방사선사" / "임상병리사" / "약사" / "영양사" / "사회복지사" / "의사" / "치과의사" / "응급구조사" / "요양보호사"
 - CASE01 [선택]: 해당 자격 "파일 미제출" 등록
employee_certifications15종+커스텀
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 / maxWeeklyHours52h 한도

공통 하단·이탈 가드 사양표

번호항목/기능명타입사양 및 기능 설명연관/영향 범위비고
90하단 버튼Button• 모달 하단 액션 버튼 묶음: "취소" / "미리보기" / "등록"
• "취소" 클릭 시: 이탈 가드 후 모달 닫기
• "미리보기" 클릭 시: 등록 내용 미리보기
• "등록" 클릭 시: "등록 중..." 표기 + 버튼 disabled → 4 생성물 트랜잭션, 기본 상태 비활성(activation gate)
 - CASE01 [저장 실패]: 트랜잭션 실패 시 처리(토스트/롤백)
sdk.employee.create()권한 "직원 관리" · TBU: 저장 실패 동작
91미저장 이탈 가드Alert• 변경 후 취소/닫기 시 노출되는 확인 얼럿 (원문 카피): "변경된 내용을 저장하지 않고 나가시겠어요?" (버튼 "계속 편집" / "나가기")원문 카피

4 생성물 · activation gate

생성물엔티티초기 상태
① Employeeemployees비활성 (activation gate)
② 소속·역할team_members (n:m)팀·역할 배정
③ 근로계약·급여 seedemployment_contracts급여 원천 (정본 아님)
④ 자격증 요건employee_certifications파일 미제출

권한 / 상태 요약

시나리오트리거결과비고
CASE01 [직원 생성]"등록""등록 중..." → 4 생성물 트랜잭션, 상태 비활성activation gate
CASE02 [전화번호 입력]저장 (전화번호 有)SMS 임시비밀번호 발송mustChangePassword
CASE03 [자격증 요구]자격증/면허 요구 선택자격증 화면 "파일 미제출" 등록
CASE04 [미저장 이탈]변경 후 취소/닫기"변경된 내용을 저장하지 않고 나가시겠어요?" (계속 편집/나가기)

Open Question

구분미확인 항목
하단·저장저장 실패(트랜잭션 실패) 시 처리(토스트/롤백) 동작