feat: [esign] 근로계약서 번개 아이콘 클릭 시 랜덤 테스트 데이터 자동 입력

- 직원주소, 직종구분, 업무내용, 업무기간, 출생년도, 급여, 계약자이름 등 매핑
- 라벨 부분 매칭(정규식)으로 유연하게 처리
- 매칭 안 되는 변수는 '테스트_라벨명'으로 기본값 입력
- 기존 영업파트너/고객 계약서 매핑 유지
This commit is contained in:
김보곤
2026-03-11 14:17:50 +09:00
parent 2a19c7108c
commit b007fdbcb0

View File

@@ -632,6 +632,9 @@ className={`w-full text-left px-3 py-2.5 rounded-lg mb-1 transition-colors ${i =
// 개발용: 주소/사업자등록번호/상호 랜덤 입력
const fillRandomVariables = () => {
const pick = arr => arr[Math.floor(Math.random() * arr.length)];
const randInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
const addresses = [
'서울특별시 강남구 테헤란로 123, 4층',
'서울특별시 서초구 서초대로 456, 7층',
@@ -647,17 +650,65 @@ className={`w-full text-left px-3 py-2.5 rounded-lg mb-1 transition-colors ${i =
'(주)테스트컴퍼니', '(주)블루오션', '(주)스마트솔루션',
'(주)넥스트웨이브', '(주)그린테크',
];
const pick = arr => arr[Math.floor(Math.random() * arr.length)];
const labelMap = {
const names = ['김민수', '이서연', '박지훈', '최예린', '정우성', '한소희', '강동원', '윤세아'];
const jobTypes = ['생산직', '사무직', '영업직', '기술직', '관리직', '연구직'];
const jobContents = [
'블라인드 제조 및 품질관리', '영업 관리 및 고객 응대',
'생산라인 운영 및 관리', '소프트웨어 개발 및 유지보수',
'경영지원 및 총무업무', '물류 관리 및 배송 업무',
];
const depts = ['생산부', '영업부', '관리부', '개발부', '총무부', '물류부'];
const positions = ['사원', '주임', '대리', '과장', '차장', '부장'];
// 근로계약서용 label 매핑 (부분 매칭)
const laborMap = {
'직원.*주소': pick(addresses),
'직종.*구분': pick(jobTypes),
'업무.*내용': pick(jobContents),
'업무.*기간': `2026.03.11 ~ 2027.03.10`,
'출생.*년도': `${randInt(1970, 2000)}`,
'근무.*시간': `09:00 ~ 18:00`,
'휴게.*시간': `12:00 ~ 13:00`,
'급여': `${pick(['2,200,000', '2,500,000', '2,800,000', '3,000,000', '3,500,000'])}원`,
'급여.*지급일': `매월 ${pick(['10', '15', '25'])}일`,
'부서': pick(depts),
'직책': pick(positions),
'직위': pick(positions),
'계약자.*이름': pick(names),
'연락처': `010-${randInt(1000,9999)}-${randInt(1000,9999)}`,
'전화.*번호': `010-${randInt(1000,9999)}-${randInt(1000,9999)}`,
};
// 기본 label 매핑 (기존 — 정확 매칭)
const baseMap = {
'주소': pick(addresses),
'사업자등록번호': pick(bizNos),
'상호': pick(companies),
'파트너명': pick(names),
};
const isLabor = form.title === '근로계약서';
setMetadata(prev => {
const updated = { ...prev };
templateVars.forEach(v => {
if (labelMap[v.label] !== undefined) {
updated[v.key] = labelMap[v.label];
// 1. 정확 매칭
if (baseMap[v.label] !== undefined) {
updated[v.key] = baseMap[v.label];
return;
}
// 2. 근로계약서: 부분 매칭 (정규식)
if (isLabor) {
for (const [pattern, value] of Object.entries(laborMap)) {
if (new RegExp(pattern, 'i').test(v.label)) {
updated[v.key] = value;
return;
}
}
// 3. 매칭 안 되면 라벨 기반 기본값
if (!updated[v.key]) {
updated[v.key] = `테스트_${v.label}`;
}
}
});
return updated;