- IncomeTaxBracket 모델 생성 (DB 조회 방식)
- PayrollService: calculateIncomeTax DB 기반으로 리팩토링
- 10,000천원 초과 구간 공식 계산 (calculateHighIncomeTax)
- 지방소득세 10원 단위 절삭 적용
- 공제대상가족수(1~11명) 반영 (본인 + 피부양자)
- calculate API에 user_id 파라미터 추가
- 사원 select에 data-dependents 속성 추가
- 모달에 공제대상가족수 표시
- BusinessIncomeEarner 모델 생성 (worker_type 글로벌 스코프)
- Employee 모델에 worker_type 글로벌 스코프 추가 (기존 사원 격리)
- BusinessIncomeEarnerService 생성 (등록/수정/삭제/조회)
- Web/API 컨트롤러 생성 (CRUD + 파일 업로드)
- 라우트 추가 (web.php, api.php)
- View 5개 생성 (index, create, show, edit, partials/table)
- 사업장등록정보 6개 필드 (사업자등록번호, 상호, 대표자명, 업태, 종목, 소재지)
- hx-put → hx-post + _method=PUT (method spoofing) 변경
서버 Nginx/PHP-FPM에서 PUT body 파싱 이슈 방지
- dependents_submitted 히든 마커 추가
모든 부양가족 삭제 시 dependents 키가 폼에 없어도 서버에서 인식
- Controller에서 마커 확인 후 빈 배열로 처리하여 삭제 반영
- Alpine.js :value 반응형 바인딩 대신 hidden+checkbox 표준 패턴 적용
- hidden input value=0 (기본값) + checkbox name+value=1 (체크 시 덮어쓰기)
- HTMX form 직렬화 시 Alpine.js 동기화 타이밍 문제 해결
- Alpine x-model + hidden input 패턴 개선 (동적 :value 바인딩)
- JSON 로드 시 boolean 정규화로 체크 상태 정확히 복원
- 서비스 레이어에서 filter_var BOOLEAN 캐스팅 추가
- show 페이지 표시 로직 filter_var로 강화
- 휴가관리가이드.md 마크다운 콘텐츠 작성 (연차 산출 방식, 촉진 제도 등)
- 잔여연차 탭 헤더에 도움말(?) 버튼 추가
- help-modal.blade.php 생성 (sales 패턴 재사용)
- LeaveController에 helpGuide() 메서드 추가
- 도움말 라우트 등록
- resolveTemplateName() 헬퍼 메서드 추가 (두 컨트롤러)
- production 환경: 전자계약_서명요청, 전자계약_완료, 전자계약_리마인드
- 개발 환경: 전자계약_서명요청_DEV, 전자계약_완료_DEV, 전자계약_리마인드_DEV
- config('app.url')은 이미 환경별 도메인 자동 사용
- 식대(bonus)를 과세표준에서 제외하여 4대보험/세금 산출 시 비과세 처리
- 라벨 '식대' → '식대(비과세)'로 변경 (등록/수정/상세/엑셀)
- 합계 영역에 과세표준(식대 제외) 표시 추가
- 국민연금은 기존대로 settings의 상한액/하한액 적용 (과세표준 기준으로 변경)
- 공제 6개 항목(국민연금/건강보험/장기요양/고용보험/소득세/지방소득세) 수동 수정 가능
- 수동 수정 시 노란색 배경으로 시각적 구분, 재계산 버튼으로 초기화
- 서버사이드 deduction_overrides 유효성 검증 및 적용 로직 추가
- 수정 모달에서 기존 공제값 복원 및 자동계산 비교로 수동 표시
- 상여금 → 식대 라벨 변경 (등록/상세/CSV)
- session('selected_tenant_id')에 기본값 1 추가
- PayrollSetting::getOrCreate, scopeForTenant 수정
- PayrollService 전체 tenant_id 조회에 기본값 적용
- Payroll 모델 scopeForTenant 동일 패턴 적용
- session('selected_tenant_id')에 기본값 1 추가
- PayrollSetting::getOrCreate, scopeForTenant 수정
- PayrollService 전체 tenant_id 조회에 기본값 적용
- Payroll 모델 scopeForTenant 동일 패턴 적용
- Payroll, PayrollSetting 모델 생성
- PayrollService 구현 (CRUD, 자동계산, 간이세액표, 일괄생성)
- Web/API 컨트롤러 생성 (HTMX/JSON 이중 응답)
- 급여 목록, 통계 카드, 급여 설정 뷰 생성
- 라우트 추가 (web.php, api.php)
- 상태 흐름: draft → confirmed → paid
- CAST(... AS UNSIGNED)에서 음수값 시 2^64-1로 오버플로우되던 버그
- CAST(... AS SIGNED) + COALESCE + GREATEST(0, ...)로 안전하게 변경
- getOvertimeAlerts(), getEmployeeMonthlySummary() 두 곳 수정
- EmployeeService에 근속기간 조회/통계/CSV 내보내기 메서드 추가
- API 컨트롤러에 tenure/tenureExport 엔드포인트 추가
- EmployeeTenureController 뷰 컨트롤러 생성
- 통계 카드 6개 (전체/재직/퇴직/평균근속/올해입사/올해퇴사)
- HTMX 테이블 (사원/부서/직책/상태/입사일/퇴사일/근속기간/근속일수)
- 필터: 이름검색, 부서, 상태, 입사기간 범위, 정렬
- CSV 엑셀 다운로드 기능
- dispatchNotification: 상대방(counterpart)만 알림톡, 본사(creator)는 이메일
- 순차 서명 시 다음 서명자 알림도 동일 역할 기반 분기 적용
- 다음 서명자 알림에서 getKakaotalkChannelId/getTemplateData 헬퍼 활용
- 알림톡 실패 시 이메일 자동 폴백 로직 통일
- sendCompletionAlimtalk: 승인된 '전자계약_완료' 템플릿 조회 후 변수 치환 발송
- 버튼 URL에 PDF 다운로드 링크(/api/document) 포함
- 상대방(counterpart)만 알림톡 발송, 본사(creator)는 이메일 유지
- 알림톡 실패 시 이메일 자동 폴백 처리
- 발송 후 3초 대기하여 전달 결과 확인 로직 추가
- getKakaotalkChannelId, getTemplateData 헬퍼 메서드 추가