양식 편집기(폼 빌더) 스펙
개요
양식 편집기(폼 빌더)는 Simple HR 내에서 근로계약서 등 각종 문서 양식을 작성·편집하는 편집기 컴포넌트이다. 근로계약서 스펙 및 근로계약서 스펙(고용계약)과 연계되며, 편집된 양식은 직원 서명 및 관리자 승인 워크플로에 사용된다.
구현 완료 기능
1. PASTE_UPLOAD 제출방식 추가
| 항목 | 내용 |
|---|---|
| 기능 | 붙여넣기(PASTE)와 첨부파일 업로드를 동시에 허용하는 PASTE_UPLOAD 제출방식 추가 |
| 엑셀 붙여넣기 | 엑셀 자료를 그대로 붙여넣을 수 있도록 수정 |
| 초기화 확인 | 제출방식 전환 시 양식 내용 초기화 확인 팝업 추가 |
| 상태 | ✅ 완료 |
fix-task-0624 (26년 06월 24일 수정사항)
2. PASTE 유형 양식에 대한 관리자 템플릿 지원
| 항목 | 내용 |
|---|---|
| 기능 | 관리자가 admin/settings/forms에서 PASTE 유형 양식에 HTML 템플릿 저장 가능 |
| 직원 인터페이스 | 서류 신청(/user/applications) 또는 기안서 작성(/user/request) 모달 오픈 시 관리자 템플릿이 에디터에 미리 채워짐 |
| 변수 템플릿 | v2 JSON 형식 변수 템플릿도 PASTE 유형에서 지원 |
| 상태 | ✅ 완료 |
fix-task-0612.md
3. 표 편집 및 변수 적용
| 항목 | 내용 | |
|---|---|---|
| 기능 | 양식 편집기(WysiwygTemplateEditor)에서 표 변수 적용 지원 | |
| 저장 형식 | HTML <table> 형식으로 저장하여 열 너비·구조 보존 | |
| 변수 표기 | 변수 칩은 {{key}} 형식으로 마크다운 변환 | |
| 프리뷰 렌더링 | TemplatePreview.parseBlocks에서 HTML 표(<table) 파싱 지원 | |
| 하위호환성 | GFM(`\ | ) 및 HTML(<table`) 양쪽 형식 모두 파싱 가능 |
| 상태 | ✅ 완료 |
fix-task-0612.md
4. 기안서·서류 신청 모달 크기 확장
| 항목 | 내용 |
|---|---|
| 기능 | 기안서(/user/request)와 서류 신청(/user/applications) 모달 UI 확대 |
| 효과 | 더 큰 화면에서 양식 작성 및 편집 가능 |
| 상태 | ✅ 완료 |
fix-task-0612.md
5. 기안서 양식 목록 필터링 및 라벨 개선
| 항목 | 내용 |
|---|---|
| REQUIRED 양식 노출 버그 | 탄력근로제서면합의서(REQUIRED)가 기안서 목록에 노출되던 문제 수정. 기안서 페이지에 form_category: "OPTIONAL" 필터 적용, 서류신청 페이지에 form_category: "APPLICATION" 필터 적용 |
| CONTRACT 라벨 한글화 | 기안서 목록에서 CONTRACT 문서종류가 영문으로 노출되던 문제 수정. DOC_TYPE_CONFIG에 CONTRACT 라벨 매핑 추가 ("계약") |
| OPTIONAL 라벨 변경 | 양식 분류 OPTIONAL 라벨을 "양식"에서 "기안서"로 변경. 신청서(APPLICATION)와 구분 명확화 |
| 상태 | ✅ 완료 |
fix-task-0624 (26년 06월 24일 수정사항)
6. 근로계약서 contract_type 기반 양식 자동 매핑
| 항목 | 내용 |
|---|---|
| 기능 | 근로계약서 신규 생성 시 contract_type 기반 양식 자동 매핑 (_resolve_form_id_by_contract_type) 추가 |
| 버그 수정 | 계약직으로 생성 시 정규직 근로계약서가 표시되던 버그 수정 |
| 관리자 미리보기 | 관리자 미리보기에서도 contract_type에 맞는 양식으로 폴백 처리 |
| 서브쿼리 버그 수정 | per_employee 서브쿼리에 CONTRACT 카테고리 필터 적용 (REQUIRED 계약이 max를 점유해 CONTRACT 계약 누락되던 버그 수정) |
| 상태 | ✅ 완료 |
fix-task-0624 (26년 06월 24일 수정사항)
7. 필수서류(REQUIRED) 구조 변경 — EmployeeContract → Document 전환
| 항목 | 내용 |
|---|---|
| 처리 방식 변경 | REQUIRED 양식 제출 시 Document 생성 → approval-management-spec |
| 사이드이펙트 | 승인 시 EmployeeDocument 자동 생성 |
| 관리자 발송 경로 | EmployeeContract 관리자 발송 경로에서 REQUIRED 카테고리 제외 (CONTRACT 포함 시 허용) |
| 필수서류 목록 | Document 결재 상태 반영 |
| 서류 보관함 | doc_content/form_content 필드 추가 + 내용 보기 모달 |
| 기존 데이터 영향 | 이미 EmployeeContract로 생성된 REQUIRED 건은 기존 방식으로 승인 처리 후, 이후 건부터 Document로 전환 |
| 상태 | ✅ 완료 |
fix-task-0624 (26년 06월 24일 수정사항)
8. 모바일 결재 페이지 — 양식 렌더링 개선
9. 사직서(RESIGNATION) 양식 분류 추가
| 항목 | 내용 |
|---|---|
| 분류 추가 | 회사 양식 추가 시 사직서 분류(RESIGNATION) 선택 가능 |
| 기본 양식 생성 | 테넌트 생성 시 기본 사직서 양식 자동 생성 |
| 분류 기반 연동 | 기존 문자열 매칭 방식에서 form_category=RESIGNATION 기반으로 변경 |
| 상태 | ✅ 완료 |
fix-task-0703 (26년 07월 03일 수정사항) 참고: 사직서 처리 워크플로 스펙
10. 양식 변수 데이터 미등록 표시 및 사용자 지정 변수 이름 편집
11. 기안서·서류 신청 탭 통합 — "서류 신청"으로 일원화
| 항목 | 내용 |
|---|---|
| 통합 방식 | 사이드바/모바일 메뉴의 "기안서" 탭과 "서류 신청" 탭을 "서류 신청" 단일 탭으로 통합 |
| 기안서 작성 | 기안서 작성 모달에 양식 셀렉트 추가 — form_categories 기반 다중 분류 지원; 기안서 선택 시 결재선 선택 UI 노출 |
| 서류 신청 | 기존 서류 신청 기능은 동일하게 통합 탭 내에서 지원 |
| HTML 태그 처리 | 신청내역/결재하기 화면의 HTML 태그 스트리핑 적용 |
| 명칭 변경 | 신청결재 내 "기안서 작성" → "서류 작성"으로 변경; 서류 작성 리스트 선택 후 작성 |
| 상태 | ✅ 완료 |
fix-task-0709 참고: 결재 관리 스펙
12. 모바일 신청 양식 미등록 fallback 렌더링
| 항목 | 내용 |
|---|---|
| 대상 | 신청 양식에 관련 정보가 없는 경우 |
| 처리 방식 | 템플릿 미등록 시 fallback 렌더링에 fieldLabels 매핑 적용 |
| 미매핑 키 | 매핑되지 않은 필드 키는 "미등록" 으로 표시 |
| 상태 | ✅ 완료 |
fix-task-0709 참고: 모바일 앱 스펙
13. 모바일 결재 상세 영문 필드 한글화
| 항목 | 내용 |
|---|---|
| 대상 필드 | 출퇴근 필드(work_location_name, gps_address) 라벨 추가 |
| 값 번역 | CHECK_IN → 출근, FULL_DAY → 종일 등 영문 값 한글 번역 |
| 시각 포맷 | 시각 표기 형식 정리 |
| 폰트 | font-sans 적용 |
| 상태 | ✅ 완료 |
fix-task-0709 참고: 모바일 UI/UX 개선 작업 (기업 사용자)
| 항목 | 내용 |
|---|---|
| 미등록 표시 | 변수에 데이터가 등록되지 않은 경우 미등록 상태 표시 |
| 이름 편집 | 새 변수 추가 시 이름 직접 입력, 기존 변수는 연필 아이콘으로 이름 수정 가능 |
| 에디터 동기화 | 변수 이름 변경 시 에디터 칩과 동기화 |
| 상태 | ✅ 완료 |
fix-taskNew-0706 (26년 07월 06일 우선수정사항)
| 항목 | 내용 |
|---|---|
| TemplatePreview 렌더링 | 결재 상세 시트에서 v2 양식 JSON 대신 TemplatePreview 렌더링 지원 (전체 문서 fetch → form_id 기반 양식 스키마 로드 → TemplatePreview 렌더링) |
| 빈 values 처리 | PASTE_UPLOAD 등 빈 values 양식은 "입력된 내용이 없습니다." 안내 표시 |
| 카드 미리보기 | JSON 대신 텍스트 값 추출 표시 |
| 배지 한글화 | REQUIRED/CONTRACT 배지 한글화 ("필수서류"/"계약") |
| JSON 깜빡임 수정 | 상세 시트 로딩 시 JSON 깜빡임 수정 (templateLoading 초기값 개선) |
| 상태 | ✅ 완료 |
fix-task-0624 (26년 06월 24일 수정사항)
PASTE 유형 양식 처리 로직
구현 파일: applications/page.tsx, MobileFormSubmitSheet.tsx, user/request/page.tsx, admin/settings/forms/page.tsx fix-task-0612.md
주의사항
⚠️ HTML 표 저장 형식 변경
표는 이제 GFM(| 마크다운) 대신 <table> HTML 형식으로 저장된다. 이번 세션 이전 코드로 롤백 시 표가 텍스트로 깨져 표시될 수 있으나, parseBlocks와 markdownToHtml 모두 GFM 및 HTML 양쪽 파싱을 지원하므로 기존 GFM 데이터는 정상 표시된다. fix-task-0612.md
미완료 항목
- ~~기안서·서류 신청 탭 통합~~ → 해결 완료: 사이드바/모바일 메뉴를 "서류 신청" 단일 탭으로 통합, 기안서 작성 모달에 양식 셀렉트 추가. fix-task-0709
- 기안서·신청서 제출 후 조회 기능 — 기안서, 신청서 작성 후 결재/결재 완료 등 내용 조회 구현 확인 필요. fix-task-0612.md
- 기업사용자 결재 UI 개선 — 신청 결재 > 결재하기(
user/approval) UI 개선 필요. fix-task-0612.md - 페이징 처리 통일 — 양식 목록 및 관련 화면 전반에 걸쳐 통일된 페이징 방식 적용 필요. fix-task-0612.md- ~~문서 종류 선택 노출~~ → 해결 완료 (아래 항목으로 이동됨)- ~~문서 종류 선택 노출~~ → 해결 완료: 사용자가 신청서·기안서 신규 작성 시 문서 종류 선택 UI 제거. fix-task-0703 (26년 07월 03일 수정사항)
- ~~양식 삭제 실패 — 회사 양식 삭제 시 실패하는 버그 미해결.~~ → 해결 완료: hard delete → soft delete(
is_deleted,deleted_at) 전환으로 수정. fix-task-0625 (26년 06월 25일 수정사항)- ~~모바일 첨부파일 구현 — 사용자 모바일에서 신청서 제출방식이 첨부파일인 경우 첨부 가능하도록 구현 필요.~~ → 해결 완료:MobileFormSubmitSheet에 UPLOAD 타입 파일 선택 UI 및 업로드 로직 추가. fix-taskNew-0706 (26년 07월 06일 우선수정사항) - ~~양식 등록 안내 추가 — 회사 양식 등록 시 분류가 신청서인 경우, 사용자가 신청하면 관리자가 첨부파일을 첨부해서 보낼 수 있다는 안내 추가 필요.~~ → 해결 완료: 관리자 양식 등록 화면에 신청서 분류 안내 문구 추가. fix-taskNew-0706 (26년 07월 06일 우선수정사항)
연관 스펙 및 워크플로
- 근로계약서 스펙 — 폼 빌더로 작성된 양식이 사용되는 문서 유형
- 근로계약서 스펙(고용계약) — 직원 서명 및 관리자 승인 프로세스
- 결재 관리 스펙 — 완성된 양식에 대한 결재 흐름
- 직원 등록 플로우 — 근로계약서 발송 시점과의 연계