feat: [esign] 근로계약서 번개 아이콘 클릭 시 랜덤 테스트 데이터 자동 입력
- 직원주소, 직종구분, 업무내용, 업무기간, 출생년도, 급여, 계약자이름 등 매핑 - 라벨 부분 매칭(정규식)으로 유연하게 처리 - 매칭 안 되는 변수는 '테스트_라벨명'으로 기본값 입력 - 기존 영업파트너/고객 계약서 매핑 유지
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user