From b007fdbcb088fb4b49e2283c394a4f8b8455fe0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Wed, 11 Mar 2026 14:17:50 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[esign]=20=EA=B7=BC=EB=A1=9C=EA=B3=84?= =?UTF-8?q?=EC=95=BD=EC=84=9C=20=EB=B2=88=EA=B0=9C=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EC=BD=98=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20=EB=9E=9C=EB=8D=A4?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EC=9E=85=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 직원주소, 직종구분, 업무내용, 업무기간, 출생년도, 급여, 계약자이름 등 매핑 - 라벨 부분 매칭(정규식)으로 유연하게 처리 - 매칭 안 되는 변수는 '테스트_라벨명'으로 기본값 입력 - 기존 영업파트너/고객 계약서 매핑 유지 --- resources/views/esign/create.blade.php | 59 ++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/resources/views/esign/create.blade.php b/resources/views/esign/create.blade.php index 17c31586..de0a5858 100644 --- a/resources/views/esign/create.blade.php +++ b/resources/views/esign/create.blade.php @@ -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;