diff --git a/app/Http/Controllers/ESign/EsignApiController.php b/app/Http/Controllers/ESign/EsignApiController.php index fa8818d2..956b8034 100644 --- a/app/Http/Controllers/ESign/EsignApiController.php +++ b/app/Http/Controllers/ESign/EsignApiController.php @@ -114,6 +114,18 @@ public function searchEmployees(Request $request): JsonResponse $salaryInfo = $emp->getSalaryInfo(); + // 최신 연봉 정보 결정: 현재값 우선, 없으면 이력에서 최신 탐색 + $annualSalary = $salaryInfo['annual_salary'] ?? null; + $salaryEffectiveDate = $salaryInfo['effective_date'] ?? null; + + if ($annualSalary === null && ! empty($salaryInfo['history'])) { + $latest = collect($salaryInfo['history']) + ->sortByDesc('effective_date') + ->first(); + $annualSalary = $latest['annual_salary'] ?? null; + $salaryEffectiveDate = $latest['effective_date'] ?? null; + } + return [ 'id' => $emp->id, 'name' => $emp->user?->name, @@ -127,7 +139,8 @@ public function searchEmployees(Request $request): JsonResponse 'birth_year' => $birthYear, 'birth_month' => $birthMonth, 'birth_day' => $birthDay, - 'annual_salary' => $salaryInfo['annual_salary'] ?? null, + 'annual_salary' => $annualSalary, + 'salary_effective_date' => $salaryEffectiveDate, ]; }); diff --git a/resources/views/esign/create.blade.php b/resources/views/esign/create.blade.php index c1517bd3..01dd5679 100644 --- a/resources/views/esign/create.blade.php +++ b/resources/views/esign/create.blade.php @@ -952,22 +952,42 @@ className={`w-full text-left px-3 py-2.5 rounded-lg mb-1 transition-colors ${i = const handleEmployeeSelect = (emp) => { // 입사일에서 년/월/일 분리 let hireYear = '', hireMonth = '', hireDay = ''; - let endYear = '', endMonth = '', endDay = ''; + let hireEndYear = '', hireEndMonth = '', hireEndDay = ''; + // 연봉계약 시작/종료일 (최신 연봉 적용일 기준, 없으면 입사일 fallback) + let salaryStartYear = '', salaryStartMonth = '', salaryStartDay = ''; + let salaryEndYear = '', salaryEndMonth = '', salaryEndDay = ''; // 연봉 금액 포맷 const annualSalary = emp.annual_salary ? Number(emp.annual_salary).toLocaleString() : ''; const monthlySalary = emp.annual_salary ? Math.round(emp.annual_salary / 12).toLocaleString() : ''; + + // 입사일 파싱 if (emp.hire_date) { const hd = emp.hire_date.replace(/-/g, ''); if (hd.length >= 8) { hireYear = hd.substring(0, 4); hireMonth = hd.substring(4, 6); hireDay = hd.substring(6, 8); - // 1년 후 계산 const endDate = new Date(parseInt(hireYear), parseInt(hireMonth) - 1, parseInt(hireDay)); endDate.setFullYear(endDate.getFullYear() + 1); - endYear = String(endDate.getFullYear()); - endMonth = String(endDate.getMonth() + 1).padStart(2, '0'); - endDay = String(endDate.getDate()).padStart(2, '0'); + hireEndYear = String(endDate.getFullYear()); + hireEndMonth = String(endDate.getMonth() + 1).padStart(2, '0'); + hireEndDay = String(endDate.getDate()).padStart(2, '0'); + } + } + + // 연봉계약 기간: 최신 연봉 적용일 기준 (없으면 입사일 fallback) + const salaryBase = emp.salary_effective_date || emp.hire_date; + if (salaryBase) { + const sd = salaryBase.replace(/-/g, ''); + if (sd.length >= 8) { + salaryStartYear = sd.substring(0, 4); + salaryStartMonth = sd.substring(4, 6); + salaryStartDay = sd.substring(6, 8); + const se = new Date(parseInt(salaryStartYear), parseInt(salaryStartMonth) - 1, parseInt(salaryStartDay)); + se.setFullYear(se.getFullYear() + 1); + salaryEndYear = String(se.getFullYear()); + salaryEndMonth = String(se.getMonth() + 1).padStart(2, '0'); + salaryEndDay = String(se.getDate()).padStart(2, '0'); } } @@ -988,30 +1008,27 @@ className={`w-full text-left px-3 py-2.5 rounded-lg mb-1 transition-colors ${i = '근로자.*이름': emp.name, '근로자.*성명': emp.name, '입사.*일': emp.hire_date, - // 연봉계약 종료일 = 입사일 + 1년 (구체적 패턴 먼저 매칭) - '연봉계약.*종료.*년도': endYear, - '연봉계약.*종료.*월$': endMonth, - '연봉계약.*종료.*일$': endDay, - // 근로계약 종료일 = 입사일 + 1년 - '근로계약.*종료.*년도': endYear, - '근로계약.*종료.*월$': endMonth, - '근로계약.*종료.*일$': endDay, - // 계약 종료일 = 입사일 + 1년 - '계약.*종료.*년도': endYear, - '계약.*종료.*월$': endMonth, - '계약.*종료.*일$': endDay, - // 연봉계약 시작일 = 입사일 - '연봉계약.*시작.*년도': hireYear, - '연봉계약.*시작.*월$': hireMonth, - '연봉계약.*시작.*일$': hireDay, - // 근로계약 시작일 = 입사일 + // 연봉계약 시작/종료일 = 최신 연봉 적용일 기준 (매년 갱신 대응) + '연봉계약.*종료.*년도': salaryEndYear, + '연봉계약.*종료.*월$': salaryEndMonth, + '연봉계약.*종료.*일$': salaryEndDay, + '연봉계약.*시작.*년도': salaryStartYear, + '연봉계약.*시작.*월$': salaryStartMonth, + '연봉계약.*시작.*일$': salaryStartDay, + // 근로계약 시작/종료일 = 입사일 기준 + '근로계약.*종료.*년도': hireEndYear, + '근로계약.*종료.*월$': hireEndMonth, + '근로계약.*종료.*일$': hireEndDay, '근로계약.*시작.*년도': hireYear, '근로계약.*시작.*월$': hireMonth, '근로계약.*시작.*일$': hireDay, - // 계약일 = 입사일 (가장 일반적인 패턴, 마지막에 매칭) - '계약.*연도': hireYear, - '계약.*월$': hireMonth, - '계약.*일$': hireDay, + // 계약 종료일/시작일 = 연봉 적용일 기준 (일반 패턴) + '계약.*종료.*년도': salaryEndYear || hireEndYear, + '계약.*종료.*월$': salaryEndMonth || hireEndMonth, + '계약.*종료.*일$': salaryEndDay || hireEndDay, + '계약.*연도': salaryStartYear || hireYear, + '계약.*월$': salaryStartMonth || hireMonth, + '계약.*일$': salaryStartDay || hireDay, // 연봉 금액 (사원관리 연봉정보에서 자동 반영) '연봉.*총.*금액': annualSalary, '연봉.*금액': annualSalary,