Skip to content

HR·전자결재 Prototype 전면 감사 — FE 핸드오프

페이지별 판정

흐름/페이지현재 판정후속 연결
직원·조직 마스터표·시트 UX 존재, 데모 데이터Company 원장 API, 로딩/오류/빈 상태 통일
근무 일정서버/로컬 repo, 월 초안·확정·겹침 gate수정·취소, 휴가/예외/급여 계산 연결
출퇴근 기록예정근무 연동·야간 익일 퇴근·5종 예외·마감 gate위치·기기·수정요청 승인·급여 시간 계산
직원 온보딩필수값·동의·저장 직전 검토 보강암호화 업로드·승인→직원 생성
휴가서버/로컬 repo, 인사 자체 승인·선택 근태 충돌·연차 잔액자동 법정 발생·이월·전자결재 adapter
업무일지목업 흐름 존재Office 권한·근태마감 연결
급여payroll 입력→확정→이체 CSV→지급완료 존재선택 근태 adapter·실 이체/신고는 별도 계약
문서센터명세서·재직/경력증명·퇴직정산 프리뷰서버 보관·송달·열람 감사로그
퇴직정산추정 계산·정산서 발급 존재상여/무급기간/IRP·공식 세액 대사
전자결재별도 상품의 기안→상신→검토→완료/반려 흐름인사 subject 선택 연결 adapter

이번 보강

  • hrWorkflowPolicy.js: HR 생애주기, 결재 생애주기, Company/Office 범위, 급여 준비 조건과 종결 전이 계약.
  • WorkflowBoundaryMol.vue: 인사·전자결재 모든 하위 페이지에서 Prototype/비전송 상태와 데이터 범위를 지속 표시.
  • 출퇴근 페이지: 정적 폼을 실제 로컬 상태 흐름과 빈 상태·상태 메시지·모바일 1열 UI로 교체.
  • 온보딩 페이지: 필수값·동의 게이트와 저장 직전 검토를 추가하고 주민번호·첨부 입력을 의도적으로 차단.

근태 마감 구현

  • 라우트: /human-capital/time/workforce-mgmt/time-attendance-view(기존 라우트 유지).
  • 페이지: TimeAttendanceView.vueuseAccountContext()의 Company와 선택 Office를 사용한다.
  • repository: attendanceCloseRepo.js는 Supabase adapter와 상태 전이 parity를 가진 mock fallback을 제공한다.
    • loadPeriod / listEvents
    • recordEvent
    • closePeriod(expectedRevision, requestKey)
    • reopenPeriod(expectedRevision, reason, requestKey)
  • DB 오류는 attendanceCloseErrorMessage가 닫힌 기간, 퇴근 누락, 권한, version conflict, 직원/Office 배정 누락으로 구분한다.
  • 화면의 revision은 동시 변경 충돌을 사용자에게 새로고침으로 안내하기 위한 값이며, 클라이언트가 임의 증가시키지 않는다.
  • 마감과 재오픈은 파급 큰 커밋이므로 EDS 0.10 dialog 확인을 사용한다. 재오픈은 사유가 5자 이상일 때만 실행 버튼이 활성화된다.
  • 마감 상태에서는 출근/퇴근이 비활성화되지만, 보안 경계는 UI가 아니라 DB insert trigger와 RPC 재검증이다.

테스트는 attendanceCloseRepo.spec.js, attendanceCloseMigration.spec.js, 기존 TimePrototypeViews.spec.js가 mock 상태 전이, SQL 권한/불변식, 화면 출근→퇴근 회귀를 각각 고정한다.

근무 일정 구현

  • 기존 라우트와 TimeAttendanceView.vue를 유지하고 페이지 첫 탭을 근무 일정, 둘째 탭을 출퇴근·마감으로 구성했다.
  • ShiftSchedulePanelOrg.vue가 Account Context에서 받은 Company/Office와 현재 월을 기준으로 근무표, 근무 목록, 유효 직원 배치를 병렬 조회한다.
  • SheetCreateScheduledShiftArt.vue는 EDS 0.10 sheet-width-3xl, field, native select anatomy를 사용한다. 익일 종료와 최대 36시간, 휴게가 총 근무보다 짧은지를 저장 전 검증한다.
  • shiftScheduleRepo.js Supabase adapter:
    • loadSchedule(scope) / listShifts(scope) / listEligibleEmployees(scope)
    • createShift(scope, expectedRevision, requestKey, ...)
    • publishSchedule(scope, expectedRevision, requestKey)
  • repository는 DB snake_case와 employee join을 화면 모델로 정규화한다. local adapter도 요청키 payload 충돌, revision, 겹침, 확정 gate를 동일하게 흉내 낸다.
  • 목록은 근무일, 직원, 역할, 시작/종료, 휴게를 표시한다. 페이지 로컬 CSS·!important·비공식 EDS 클래스는 추가하지 않았다.
  • 확정은 파급 큰 커밋이므로 확인 dialog를 사용한다. 확정 뒤 근무 추가와 재확정 버튼은 비활성화한다.

테스트는 shiftScheduleMigration.spec.js, shiftScheduleRepo.spec.js, shiftScheduleUiContract.spec.js, SQL rollback smoke가 담당한다.

예정 근무 연동·근태 예외 구현

  • attendanceCloseRepo.js의 서버 recordEventrecord_scheduled_attendance_event를 호출하고 scheduledShiftId를 정규화한다. listPublishedShifts는 현재 Office·월의 확정 근무를 불러오며 local fallback은 기존 무예정 출퇴근 흐름을 유지한다. Payroll store는 이 repo를 import하지 않고 payroll-owned readiness만 조회한다.
  • TimeAttendanceView.vue의 출퇴근 카드에서 확정 예정 근무 또는 예정 외 출퇴근을 선택한다. 야간 익일 퇴근은 서버가 원 출근을 찾아 근무일을 승계한다.
  • 셋째 근태 예외 탭의 AttendanceExceptionPanelOrg.vue는 Company·Office·월 기준 live projection을 읽고 미해결 수와 결근/퇴근누락/지각/조퇴/예정 외 출근을 표시한다.
  • attendanceExceptionRepo.js는 overview 조회와 fingerprint 기반 resolve RPC, 오류 매핑, mock parity를 캡슐화한다.
  • SheetResolveAttendanceExceptionArt.vue는 EDS 0.10 sheet-width-3xl 집중 폭에서 확인 완료/사유 인정과 5자 이상 근거를 입력한다. 페이지 로컬 CSS·override는 없다.
  • 마감 오류는 미해결 예외 탭으로 안내하고, payroll 오류는 예외 0건 마감본만 확정할 수 있음을 안내한다. UI 비활성화는 편의이며 실제 close/payroll 경계는 DB trigger가 재검사한다.

테스트는 attendanceExceptionMigration.spec.js, attendanceExceptionRepo.spec.js, attendanceExceptionUiContract.spec.js, 기존 근태 repo/UI 회귀, SQL rollback smoke가 담당한다.

휴가 요청·승인 구현

  • 기존 /human-capital/leave/general 라우트와 화면 구조를 유지했다. router·i18n·package·Design SSOT은 수정하지 않았다.
  • leaveRequestRepo.jsworkforce_leave_request_overview 목록, 승인 근로계약+Office 배치 직원, HR local create/decide RPC를 캡슐화한다. approvalRepo를 import하지 않는다.
  • RequestPanelOrg.vue는 Company/선택 Office의 목록과 직원을 로드한다. 승인 근로계약/배치가 없을 때만 신청을 막으며 결재자 directory 상태와 무관하다.
  • 신청 sheet는 직원+assignment, 휴가 종류·기간·0.5일 단위·사유를 전달한다. 결재선 필드는 없고 성공할 때만 닫는다.
  • create_workforce_leave_request는 즉시 HR 검토 대기 상태를 만들고 decide_workforce_leave_request는 request revision을 사용해 승인·반려한다.
  • 목록과 상세는 timeAvailability와 nullable publishedShiftConflictCount를 보여준다. Time available+충돌이면 승인 버튼을 비활성화하고 HR RPC가 재검사한다. unavailable이면 미연결 안내를 표시하고 승인 자체는 허용한다.
  • integrationStatus는 후속 Approval adapter seam이며 신규 row는 not_connected다. UI는 provider 문서를 직접 읽거나 명령하지 않는다.
  • 페이지 로컬 CSS, !important, 비공식 EDS class는 추가하지 않았다. 상세·생성은 EDS 집중 폭 sheet-width-3xl을 사용한다.

테스트는 leaveRequestMigration.spec.js, leaveRequestRepo.spec.js, leaveRequestUiContract.spec.js, workforce_local_decision_ledgers_smoke.sql이 HR-only 신청·승인·잔여·optional Time 범위를 담당한다.

휴가 잔액 구현

  • leaveBalanceRepo.jsworkforce_leave_balance_overview를 현재 Company·Office·귀속연도로 조회하고, 승인 근로계약과 현재 assignment가 있는 직원에게 서버 합계가 없으면 revision 0 잔액을 합성한다.
  • grantBalanceadjustBalance는 일수·expected revision·사유·요청키를 각각 public RPC에 전달한다. local fallback도 revision, 0.5일, 음수 잔액, 요청키 payload 충돌을 같은 오류로 흉내 낸다.
  • BalancePanelOrg.vue는 기존 leaveMock 직접 소비를 제거하고 서버/로컬 backend, 로딩·오류·빈 상태, 귀속연도, 부여·사용·조정·잔여 합계를 표시한다.
  • SheetCreateLeaveBalanceEntryArt.vue는 EDS 0.10 집중 폭 sheet-width-3xl에서 부여 또는 signed 조정을 입력한다. 성공할 때만 닫히며 기존 ledger row를 편집하는 UI는 없다.
  • 기존 mock/UI의 반차 ID half를 서버 enum half_day로 정규화했다. public RPC도 과거 half caller를 half_day로 변환한다.

테스트는 leaveBalanceMigration.spec.js, leaveBalanceRepo.spec.js, leaveBalanceUiContract.spec.js, SQL rollback smoke가 원장·RPC payload·UI seam을 고정한다. 자동 법정 발생과 설정 페이지 서버화는 이번 범위가 아니다.

통합 필요 사항

공통 pageHelpCatalog, assistantFeatureCatalog, router, locale은 수정하지 않았다. 기존 라우트와 상위 도움말 연결을 그대로 사용한다. docs-proto 미러는 이번 독립 worktree 범위에서 건드리지 않았다.