HBEA430_인센티브
(Hereby) 직원 앱 > 결재 허브([[HBEA400_결재 허브]]) > 인센티브
| 앱 | 직원 앱 Hereby Works (포트 4002) |
| 대상 사용자 | 조건1 [직원 인증] (self scope) |
| 프로토타입 | TBU |
| 관련 정책 | [[POL_결재워크플로우]] · [[POL_인센티브산정]] (참조만) |
| Status | review |
| Owner | 카나 |
개요
- 인센티브는 결재 허브([[HBEA400_결재 허브]]) "인센티브" 서브탭으로, 본인 인센티브를 월별 조회하는 self scope 표면이다.
- 월별 헤더("2026년 7월" 당월 + "합계 0건") + 상태 필터("전체 / 대기중 / 승인 / 반려 / 취소") + 내역 리스트(Empty "인센티브 내역이 없어요.")로 구성된다.
- 인센티브 원천은 HR 인센티브 세션 시트([[HBHR250_인센티브 세션 시트]]) 확정 결과 및 치료일 인센티브(treatment)다. 본인 등록(write) 경로는 API 레벨에 실재한다 — 직원 본인이
fixedIncentive.create({splitRatio, unitCount, unitPrice, workDate, ...})로 self scope 등록 가능(권한 토큰incentive:create.self, EMPLOYEE 롤 — TC 확정: 01:1.10). 단 UI 등록 진입점(등록 버튼·FAB)은 라이브에서 미관찰(2026-07-10 관리자 계정) — "조회 전용" 단정은 🔴 정정: UI 미노출 ≠ write 경로 부재. 공통 서브탭 골격은 [[HBEA400_결재 허브]]을 참조한다(중복 정의 금지).
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 2026-07-06 | 카나 | PM | 최초 작성 |
| 2026-07-10 | 카나 | PM | 라이브 기능 검토 반영 (FAB 없음·조회 전용 확정) |
| 2026-07-21 | 카나 | PM | GC700 깊이 재작성 |
| 2026-07-21 | 카나 | PM | 셀 스타일 확정판 적용 (콸 승인) |
| 2026-07-21 | 카나 | PM | 🔴 정정: self-register API 실재(fixedIncentive.create) — "조회 전용" 폐기 (TC 정본, 콸 승인) |
Data I/O
Server → Client
| 변수 | DB 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
| $ | 조회 월 (YYYY-MM) | 당월 기본값 ("2026년 7월") | 헤더 좌측 월 표기 |
| $ | COUNT(IncentiveRecord, self·당월) | "합계 0건" | 헤더 우측 총건수 |
| $ | IncentiveRecord[] / treatment (self) | Empty "인센티브 내역이 없어요." | 당월 본인 인센티브 행 |
| $ | GROUP BY IncentiveRecord.status | 라벨만 (카운트 0 숫자 미표기, 추정) | 상태 필터 칩 카운트 |
| ㄴ항목: 인센티브 이름 | IncentiveRecord.name (추정) | hide | 행 라벨 (approval.md 정책) |
| ㄴ항목: 승인 상태 | IncentiveRecord.status | hide | 행 배지 (approval.md 정책) |
| ㄴ항목: 날짜 | IncentiveRecord.date (추정) | hide | 행 일자 (approval.md 정책) |
Client → Server
| 액션 | 전달 값 | tRPC procedure | 권한 토큰 |
|---|---|---|---|
| 월 변경 (당월 고정 여부 TBU) | period (YYYY-MM) | sdk.incentive.listSelf() (추정) | incentive:read.self |
| 상태 필터 선택 | statusKey (전체/대기중/승인/반려/취소) | 클라이언트 필터 (재조회 여부 TBU) | incentive:read.self |
| 본인 등록 (self-register) | splitRatio, unitCount, unitPrice, workDate 등 | fixedIncentive.create — self scope 등록 실재 (version 관리 포함). UI 진입점은 미관찰(동선 TBU) | incentive:create.self (EMPLOYEE 롤 실토큰 — TC 확정: 01:1.10 / 02:2.10) |
외부 통합 (cross-app)
| 외부 시스템 | 데이터 | 동기/비동기 | 비고 |
|---|---|---|---|
| HR 인센티브 세션 시트 ([[HBHR250_인센티브 세션 시트]]) | 인센티브 원천·taxonomy·확정 결과 | 비동기 (HR confirm 후 self 반영) | 산정·확정은 HR 소관 |
| Medical treatment ([[HBMD_치료일 인센티브]]) | 치료일 인센티브 source (fixed_incentive taxonomy) | 비동기 | treatment 원천 |
화면 플로우 (Mermaid 의무)
인센티브 산정·확정은 HR/treatment 원천 소관 — 직원앱은 self scope 표면. 본인 등록 write는 API 실재(fixedIncentive.create), UI 진입 동선만 TBU
인센티브 서브탭 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 화면 진입 조건 | - | 조건1 [직원 인증] · 결재 허브 "인센티브" 서브탭 선택 시 노출. 조건2 [관리자 계정]도 동일 조회 표면 | 인증 세션 (self) | 2026-07-10 라이브(관리자 djcola814) 확정 |
| ㄴ00-1 | 미인증 분기 | - | CASE01 [미인증] /employee-app/signin 리다이렉트 | 인증 세션 | |
| 01 | 초기 상태 | Output | 서브탭 진입 시 당월(${period}) 기준 헤더 + 상태 필터 + 리스트 렌더 | ${period} / $ | 값없음: ${incentives} 부재 시 30-E |
| 10 | 월별 조회 헤더 | Output | 좌측 월 표기 + 우측 합계 표기. 당월(${period}) 기본 | ${period} · $ | census "2026년 7월 합계 0건". TBU: 월 네비게이터 유무(당월 고정 vs 스피너 이동) |
| ㄴ11 | 월 표기 | Text | "2026년 7월" 원문. 당월 자동 표기 | $ | 원문 카피 |
| ㄴ12 | 합계 | Output | "합계 0건" 원문. 당월 총건수 | $ | census 원문. TBU: 산정 기준(건수 vs 금액) |
| 20 | 상태 필터 칩 | Filter | • 리스트를 승인 상태별로 거르는 가로 칩 5종. 원문 "전체" / "대기중" / "승인" / "반려" / "취소" • 클릭 → 리스트 상태 필터 적용 - CASE01 [전체]: 전체 표시(기본) - CASE02 [대기중·승인·반려·취소]: 해당 상태 행만 - CASE03 [필터 결과 0건]: 30-E Empty 문구 노출(추정) | IncentiveRecord.status (self) | census 원문 5종. TBU: enum 원문값(pending 등) |
| 30 | 인센티브 내역 리스트 | List | 본인 당월 인센티브 행 목록. 상태 필터 결과에 종속 | IncentiveRecord[] / treatment (self) | census = 0건 |
| ㄴ31 | 항목 행 | Row | • 1행 = {인센티브 이름} / {승인 상태} / {날짜} • 클릭 → TBU (라이브 0건이라 행 상세·취소 인터랙션 미관찰) | IncentiveRecord (name·status·date, 추정) | [[POL_인센티브산정]] 항목 구성 (정책 출처) |
| 30-E | ㄴ Empty | Text | 리스트 0건 시 "인센티브 내역이 없어요." 원문 노출 | ${incentives} 부재 | census Empty 원문 |
| 40 | 본인 등록 (self-register) | - | • write 경로는 API 레벨에 실재 — fixedIncentive.create(self scope, splitRatio·unitCount·unitPrice·workDate, version 관리) 정상 동작 (TC 확정: 01:1.10)- CASE01 [UI]: 등록 버튼·FAB는 라이브 미관찰(2026-07-10 관리자 계정) — 진입 동선 TBU (숨김/타 표면/미구현 중 무엇인지) - CASE02 [권한]: incentive:create.self — self scope, cross-employee 등록은 차단 (TC 확정: 02:2.10) | fixedIncentive.create | 🔴 정정: 구 "조회 전용·write 미제공 확정" 폐기 |
연동·플로우
- 인센티브 원천: HR 인센티브 세션 시트([[HBHR250_인센티브 세션 시트]]) 확정 결과 + 치료일 인센티브(treatment) → 직원 self 조회로 노출. 직원앱은 산정·확정에 관여하지 않는다.
- 정본 경계: 인센티브 산정·확정은 HR/treatment 소관. 직원 본인 등록은
fixedIncentive.create(self)로 API 레벨 실재하며 생성 record는 status=pending → 팀장fixedIncentive.approve(ids[])승인 게이트를 거친다 (TC 확정: 01:1.10 / 02:2.5).
권한 · 상태 요약
| 시나리오 | 트리거 | 결과 | 비고 |
|---|---|---|---|
| CASE01 [미인증 진입] | 인센티브 서브탭 직접 | /employee-app/signin 리다이렉트 | |
| CASE02 [직원/관리자 진입] | 인증 세션 (self) | 당월 인센티브 조회 표면 (헤더+필터+리스트) | 관리자 계정도 동일 조회 표면 |
| CASE03 [내역 0건] | 당월 인센티브 없음 | Empty "인센티브 내역이 없어요." | census 상태 |
| CASE04 [등록 시도] | UI 등록 진입점 탐색 | UI 진입점 미관찰 — 단 API fixedIncentive.create(self)는 실재 | 동선 TBU (TC 확정: 01:1.10) |
Open Question
self-register 없음→ API 실재 확정(fixedIncentive.createself, TC 01:1.10). 남는 OQ: UI 등록 진입 동선(숨김/타 표면/미구현 여부) = TBU.- 인센티브 상태 필터 enum 원문 값 및 "합계" 산정 기준(건수 vs 금액). TBU.
- 월 이동 네비게이터 유무(당월 고정 vs 스피너 이동). TBU.
- 인센티브 조회 원천 엔티티(IncentiveRecord vs treatment 별도 테이블) 및 self 필터 방식. TBU.
- 인센티브 행 상세 진입·본인 취소 버튼 유무: 라이브 캡처가 0건이라 행 인터랙션 미관찰. 실데이터 확보 후 재검증 필요. TBU.