Commit Graph

1847 Commits

Author SHA1 Message Date
김보곤
efebd1e1f8 fix: [leave] 근속 기간 표시 형식 개선
- 소수점 float 대신 "1년 3개월", "2개월" 형태로 표시
- 1개월 미만인 경우 "1개월 미만" 표시
2026-02-27 11:20:40 +09:00
김보곤
efc133bd78 fix: [payroll] 식대 비과세 처리 + 국민연금 상한/하한 적용 개선
- 식대(bonus)를 과세표준에서 제외하여 4대보험/세금 산출 시 비과세 처리
- 라벨 '식대' → '식대(비과세)'로 변경 (등록/수정/상세/엑셀)
- 합계 영역에 과세표준(식대 제외) 표시 추가
- 국민연금은 기존대로 settings의 상한액/하한액 적용 (과세표준 기준으로 변경)
2026-02-27 11:17:17 +09:00
김보곤
c2edef2253 feat: [leave] 잔여연차 탭 전체 직원 자동 표시 + 연차일수 자동 산출
- 사원관리 재직/휴직 직원 전체가 잔여연차 탭에 자동 표시
- balance 레코드 없는 직원은 insertOrIgnore로 자동 생성
- 입사일 기반 근속년수로 연차일수 자동 산출 (근로기준법 제60조)
- 테이블에 입사일/근속 컬럼 추가 (6→8컬럼)
2026-02-27 11:09:07 +09:00
김보곤
e45df999aa fix: [payroll] 급여 수정 모달에 공제항목 데이터 전달 누락 수정
- table.blade.php의 수정 버튼에서 pension, health_insurance, long_term_care,
  employment_insurance, income_tax, resident_tax 필드를 json_encode에 추가
2026-02-27 11:07:24 +09:00
김보곤
e6eb1d7691 feat: [payroll] 공제항목 수동 수정 기능 추가 및 상여금→식대 변경
- 공제 6개 항목(국민연금/건강보험/장기요양/고용보험/소득세/지방소득세) 수동 수정 가능
- 수동 수정 시 노란색 배경으로 시각적 구분, 재계산 버튼으로 초기화
- 서버사이드 deduction_overrides 유효성 검증 및 적용 로직 추가
- 수정 모달에서 기존 공제값 복원 및 자동계산 비교로 수동 표시
- 상여금 → 식대 라벨 변경 (등록/상세/CSV)
2026-02-27 10:58:13 +09:00
김보곤
bbdad75468 feat: [leave] 잔여연차 탭 도움말 기능 추가
- 휴가관리가이드.md 마크다운 콘텐츠 작성 (연차 산출 방식, 촉진 제도 등)
- 잔여연차 탭 헤더에 도움말(?) 버튼 추가
- help-modal.blade.php 생성 (sales 패턴 재사용)
- LeaveController에 helpGuide() 메서드 추가
- 도움말 라우트 등록
2026-02-27 10:42:21 +09:00
김보곤
5e61d20231 feat: [payroll] 급여 설정 상한액/하한액 콤마 포맷팅 적용
- 국민연금 상한액/하한액 입력에 콤마 자동 표시
- 0일 때 포커스 시 공백, blur 시 0 복원
- 설정 저장 시 콤마 제거하여 서버 전송
2026-02-27 10:07:07 +09:00
김보곤
bd85a902ad feat: [payroll] 장기요양보험 공제항목 추가
- 건강보험에서 장기요양보험 분리하여 별도 항목으로 표시
- 급여등록/수정/일괄생성/상세보기/CSV 내보내기 모두 반영
- 공제순서: 국민연금-건강보험-장기요양보험-고용보험-근로소득세-지방소득세
2026-02-27 10:06:28 +09:00
김보곤
c8cea0b67f feat: [payroll] 급여 등록 모달 금액 입력 콤마 자동 포맷팅
- 숫자 입력 시 천단위 콤마 자동 표시
- 0인 필드에 포커스 시 공백으로 표시, blur 시 0으로 복원
- 수당/공제 동적 행에도 동일하게 적용
2026-02-27 10:00:37 +09:00
김보곤
9c14f1df25 fix: [attendance] 근태현황 HTMX 부분 로드 시 스크립트 미실행 오류 수정
- index 메서드에 HX-Redirect 추가하여 전체 페이지 로드 보장
- 근태관리→근태현황 이동 시 switchTab null 참조 에러 해결
2026-02-27 09:53:27 +09:00
김보곤
11b2c0ec17 fix: [payroll] soft-deleted 레코드로 인한 중복 등록 에러 수정
- withTrashed()로 삭제된 레코드 포함하여 중복 체크
- 삭제된 레코드 존재 시 forceDelete 후 재등록 허용
2026-02-27 09:51:00 +09:00
김보곤
8d78a1ee69 fix: [payroll] 급여 등록 500 에러 수정
- 중복 급여 등록 시 유니크 제약 위반 대신 422 응답 반환
- tenant_id null 방어 처리 (세션 값이 null인 경우 기본값 적용)
2026-02-27 09:48:16 +09:00
김보곤
af17880246 fix: [payroll] tenant_id null 오류 수정
- session('selected_tenant_id')에 기본값 1 추가
- PayrollSetting::getOrCreate, scopeForTenant 수정
- PayrollService 전체 tenant_id 조회에 기본값 적용
- Payroll 모델 scopeForTenant 동일 패턴 적용
2026-02-27 09:42:58 +09:00
김보곤
1f81e6672d fix: [payroll] 급여등록 용어 및 공제항목 순서 변경
- 초과근무수당 → 고정연장근로수당 명칭 변경
- 소득세 → 근로소득세, 주민세 → 지방소득세 명칭 변경
- 공제항목 순서: 국민연금-건강보험-고용보험-근로소득세-지방소득세
- CSV 내보내기 헤더 및 데이터 순서 동일 적용
2026-02-27 09:37:05 +09:00
김보곤
43917fe486 revert: [attendance] MNG 마이그레이션 정책 변경 되돌림
- MNG 마이그레이션 파일 삭제 (API에서 관리)
- CLAUDE.md DB 아키텍처 규칙 원래대로 복원
- 마이그레이션은 API 프로젝트에서만 관리
2026-02-27 09:30:06 +09:00
김보곤
e9454d2232 feat: [attendance] attendance_requests 마이그레이션 MNG에 추가
- API 운영 배포 중지 기간 동안 MNG에서 마이그레이션 관리
- Schema::hasTable() 가드로 중복 실행 방지
- CLAUDE.md DB 아키텍처 정책 업데이트
2026-02-27 09:24:04 +09:00
김보곤
fc1efba9fd feat: [hr] 입퇴사자 현황 페이지 구현
- EmployeeService에 근속기간 조회/통계/CSV 내보내기 메서드 추가
- API 컨트롤러에 tenure/tenureExport 엔드포인트 추가
- EmployeeTenureController 뷰 컨트롤러 생성
- 통계 카드 6개 (전체/재직/퇴직/평균근속/올해입사/올해퇴사)
- HTMX 테이블 (사원/부서/직책/상태/입사일/퇴사일/근속기간/근속일수)
- 필터: 이름검색, 부서, 상태, 입사기간 범위, 정렬
- CSV 엑셀 다운로드 기능
2026-02-27 08:24:26 +09:00
김보곤
3c3e0f8141 feat: [esign] 알림톡 템플릿명 환경별 분기 (운영: 원본, 개발: _DEV)
- resolveTemplateName() 헬퍼 메서드 추가 (두 컨트롤러)
- production 환경: 전자계약_서명요청, 전자계약_완료, 전자계약_리마인드
- 개발 환경: 전자계약_서명요청_DEV, 전자계약_완료_DEV, 전자계약_리마인드_DEV
- config('app.url')은 이미 환경별 도메인 자동 사용
2026-02-27 08:15:54 +09:00
김보곤
3f1c5ead73 fix: [esign] 완료 알림톡 버튼 URL 및 이메일 PDF 서명 누락 수정
- 완료 알림톡 버튼이 서명페이지로 연결되던 문제 → 문서 다운로드 URL로 강제 변경
- 계약 완료 상태에서 signed_file_path 없을 때 서명 PDF 재생성 로직 추가
- mergeSignatures 실패 시 상세 trace 로그 추가
2026-02-26 23:28:20 +09:00
김보곤
fbbc4ba385 fix: [esign] MNG EsignSigner 모델에 역할/상태 상수 추가
- ROLE_CREATOR, ROLE_COUNTERPART 상수 추가
- STATUS_WAITING~STATUS_REJECTED 상수 추가
- 운영서버 Undefined constant 오류 수정
2026-02-26 23:15:17 +09:00
김보곤
9676f0409e fix: [esign] 서명 요청/다음 서명자 알림에 역할 기반 분기 적용
- dispatchNotification: 상대방(counterpart)만 알림톡, 본사(creator)는 이메일
- 순차 서명 시 다음 서명자 알림도 동일 역할 기반 분기 적용
- 다음 서명자 알림에서 getKakaotalkChannelId/getTemplateData 헬퍼 활용
- 알림톡 실패 시 이메일 자동 폴백 로직 통일
2026-02-26 23:03:43 +09:00
김보곤
50c43b52b0 fix: [leave] 휴가 신청 422 에러 메시지 표시 개선 2026-02-26 22:58:36 +09:00
김보곤
c26ede01b5 fix: [leave] HTMX 사이드바 네비게이션 시 HX-Redirect 적용 2026-02-26 22:56:57 +09:00
김보곤
0b19728fef feat: [esign] 서명 완료 시 상대방에게 카카오톡 알림톡으로 PDF 계약서 전달
- sendCompletionAlimtalk: 승인된 '전자계약_완료' 템플릿 조회 후 변수 치환 발송
- 버튼 URL에 PDF 다운로드 링크(/api/document) 포함
- 상대방(counterpart)만 알림톡 발송, 본사(creator)는 이메일 유지
- 알림톡 실패 시 이메일 자동 폴백 처리
- 발송 후 3초 대기하여 전달 결과 확인 로직 추가
- getKakaotalkChannelId, getTemplateData 헬퍼 메서드 추가
2026-02-26 22:54:59 +09:00
김보곤
06fb6b42be feat: [payroll] 급여관리 기능 구현
- Payroll, PayrollSetting 모델 생성
- PayrollService 구현 (CRUD, 자동계산, 간이세액표, 일괄생성)
- Web/API 컨트롤러 생성 (HTMX/JSON 이중 응답)
- 급여 목록, 통계 카드, 급여 설정 뷰 생성
- 라우트 추가 (web.php, api.php)
- 상태 흐름: draft → confirmed → paid
2026-02-26 22:49:44 +09:00
김보곤
a70df1cc2d fix: [settlement] Alpine @click에서 clearAllCheckboxes 참조 오류 수정 2026-02-26 22:45:17 +09:00
김보곤
fe739431ca fix: [esign] OTP SMS 발송 조건을 tenant_id 대신 서명자 역할 기반으로 변경
- 기존: tenant_id != 1 조건으로 본사 테넌트 전체 SMS 차단
- 변경: signer->role === counterpart 조건으로 상대방만 SMS 수신
- 본사(creator)는 이메일 OTP 유지, 상대방(counterpart)은 SMS OTP 수신
2026-02-26 22:37:13 +09:00
김보곤
684bba105f feat: [leave] 휴가관리 Phase 1 구현
- Leave, LeavePolicy, LeaveGrant 모델 생성
- LeaveBalance 헬퍼 메서드 추가 (useLeave, restoreLeave, canUse)
- LeaveService 핵심 로직 (신청, 승인, 반려, 취소, 잔여연차, 통계)
- API 컨트롤러 (목록, 등록, 승인/반려/취소, 잔여연차, 통계, CSV 내보내기)
- 뷰 컨트롤러 + 라우트 등록 (web, api)
- Blade 뷰 (index + 3개 탭 partials: table, balance, stats)
2026-02-26 22:34:31 +09:00
김보곤
b17979f412 feat: [attendance] 근태현황/근태관리 메뉴 분리
- 근태현황(/hr/attendances): 조회 전용 (목록/캘린더/요약)
- 근태관리(/hr/attendances/manage): CRUD + 승인 관리
- table-manage.blade.php: 관리용 테이블 (체크박스/수정/삭제)
- table.blade.php: 조회용 테이블 (GPS 포함, CRUD 제거)
- API 컨트롤러 view 파라미터로 테이블 분기
2026-02-26 22:20:48 +09:00
김보곤
7f5bb43372 fix: [attendance] 주간 근무시간 계산 UNSIGNED 오버플로우 수정
- CAST(... AS UNSIGNED)에서 음수값 시 2^64-1로 오버플로우되던 버그
- CAST(... AS SIGNED) + COALESCE + GREATEST(0, ...)로 안전하게 변경
- getOvertimeAlerts(), getEmployeeMonthlySummary() 두 곳 수정
2026-02-26 21:59:47 +09:00
김보곤
1bc77f94ff fix: [settlement] 구독료 수당(매니저/파트너) 로직 3가지 버그 수정
- 매니저 미지정 시 구독료가 소실되던 버그 → 파트너 수당으로 편입
- deposit/balance 양쪽에서 구독료 이중 계상 → deposit에서만 1회 기록
- 파트너별 결산 탭에 +구독 배지 추가, select에 manager_user_id 포함
2026-02-26 21:55:59 +09:00
김보곤
4398d5e27c fix: [attendance] User 모델에 tenantProfiles 관계 추가로 500 에러 수정
- User 모델에 tenantProfiles() HasMany 관계 추가 (tenant_user_profiles 테이블)
- eager loading에 department 관계도 포함하여 N+1 방지
2026-02-26 21:55:27 +09:00
김보곤
7b2300e1be fix: [attendance] cal_days_in_month → Carbon endOfMonth 대체로 500 에러 수정
- PHP calendar 확장 미설치 환경에서 cal_days_in_month 함수 호출 시 500 에러 발생
- getMonthlyStats, getMonthlyCalendarData, getEmployeeMonthlySummary 3곳 수정
2026-02-26 21:51:22 +09:00
김보곤
2550c16894 feat: [attendance] 근태관리 2차 고도화 8개 기능 구현
- 월간 캘린더 뷰 (사원별 필터, 날짜 클릭 등록, HTMX 월 이동)
- 일괄 등록 (다수 사원 체크박스 선택 후 일괄 등록, upsert 처리)
- 사원별 월간 요약 (상태별 카운트 + 총 근무시간 집계 테이블)
- 초과근무 알림 (주 48h 경고 / 52h 위험 배너)
- 근태 승인 워크플로우 (신청→승인→근태 레코드 자동 생성)
- 자동 결근 처리 (매일 23:50 스케줄러, 주말 제외)
- 연차 관리 연동 (휴가 등록 시 leave_balances 자동 차감)
- GPS 출퇴근 UI (테이블 GPS 아이콘 + 상세 모달)
- 탭 네비게이션 (목록/캘린더/요약/승인) HTMX 기반 전환
2026-02-26 20:56:25 +09:00
김보곤
94000d965d feat: [journal] 일반전표입력에 카드사용내역 분개 기능 추가
- JournalEntryController에 cardTransactions/storeFromCard/cardJournals/deleteCardJournal 메서드 추가
- 카드거래 분개 라우트 4개 추가 (card-transactions, store-from-card, card-journals, delete-card-journal)
- JournalEntryList에 카드거래 탭/필터/통계 통합
- CardJournalEntryModal 컴포넌트 추가 (공제/불공제에 따른 기본 분개 라인 자동 생성)
- source_type=ecard_transaction 호환 (기존 ecard 페이지 분개와 동일 키)
2026-02-26 20:52:44 +09:00
김보곤
474165ff67 feat: [attendance] 근태현황 Phase 1 구현
- 1-1: 등록/수정 버그 수정 (created_by 덮어쓰기 방지)
- 1-2: 엑셀(CSV) 다운로드 기능 추가
- 1-3: 체크박스 일괄 삭제 기능 추가
- 1-4: 월간 통계 연/월 선택 기능 추가
2026-02-26 20:45:19 +09:00
김보곤
fb92348a9d refactor: [hr] 사원 첨부파일을 GCS 듀얼 저장 방식으로 변경
- 업로드: 로컬 + GCS 동시 저장 (gcs_object_name, gcs_uri 기록)
- 다운로드: GCS Signed URL 우선, 로컬 폴백
- 삭제: GCS + 로컬 모두 삭제, soft delete 처리
- DashboardCalendarController 패턴 준용
2026-02-26 20:13:26 +09:00
김보곤
c5d5d0c3ab feat: [hr] 사원등록 기능 확장
- 기본정보에 주민등록번호 필드 추가
- 급여이체정보 섹션 추가 (이체은행, 예금주, 계좌번호)
- 부양가족 정보 섹션 추가 (동적 행 추가/삭제)
- 첨부파일 업로드/다운로드/삭제 기능 추가
- 은행 목록 config/banks.php 설정 파일 생성
- show 페이지 주민등록번호 뒷자리 마스킹 처리
2026-02-26 19:59:15 +09:00
김보곤
84985ceab6 feat: [employee] 입사일/퇴직일 컬럼 헤더에 정렬 아이콘 추가
- 입사일/퇴직일 컬럼 클릭 시 오름차순/내림차순 토글
- 현재 정렬 상태를 아이콘으로 표시 (↑ 오름차순, ↓ 내림차순, ↕ 미선택)
- 기본 정렬: 입사일 빠른순(오름차순)
2026-02-26 19:41:54 +09:00
김보곤
4fa163397a feat: [employee] 사원관리 정렬 기능 추가 (입사일/퇴직일)
- 정렬 드롭다운 추가: 입사일 빠른순/최신순, 퇴직일 최신순/빠른순, 상태순
- 기본 정렬을 입사일 빠른순으로 설정
- JSON 컬럼(json_extra.hire_date, resign_date) 기반 정렬
2026-02-26 19:37:07 +09:00
김보곤
e8d38953d0 feat: [hr] 근태현황 MNG 프론트엔드 구현
- Attendance 모델 (attendances 테이블, 상태/색상 매핑, check_in/check_out accessor)
- AttendanceService (목록/월간통계/CRUD, 부서/사원 드롭다운)
- API 컨트롤러 (HTMX+JSON 이중 응답, stats/index/store/update/destroy)
- 페이지 컨트롤러 (index 페이지 렌더링)
- 웹/API 라우트 등록 (hr/attendances, api/admin/hr/attendances)
- index.blade.php (통계카드+필터+등록/수정 모달)
- partials/table.blade.php (HTMX 부분 로드 테이블)
2026-02-26 19:34:07 +09:00
김보곤
b9a4a6b835 feat: [hr] 사원 목록 테이블에 퇴직일 컬럼 추가 2026-02-26 19:07:06 +09:00
김보곤
b6220810cf feat: [hr] 사원 등록/수정 - 비밀번호 제거 및 퇴직일 추가
- 비밀번호 필드 제거 (등록 폼, validation, 서비스)
- 퇴직일(resign_date) 필드 추가 (등록/수정/상세 화면)
- json_extra에 resign_date 저장/수정 지원
- Model에 resign_date accessor 추가
2026-02-26 18:59:15 +09:00
김보곤
a1ca8b7e46 refactor: [hr] 사번(employee_code) 필드 전체 제거
- Model: appends, accessor 제거
- Service: 검색 필터, json_extra 저장/수정 로직 제거
- Controller: validation 규칙 제거
- View: create, edit, show, table에서 사번 UI 제거
2026-02-26 18:50:12 +09:00
김보곤
442533e7c8 fix: [hr] searchUsers에서 q 파라미터 null 처리
- ConvertEmptyStringsToNull 미들웨어로 인해 빈 q= 가 null로 변환되는 문제
2026-02-26 17:41:47 +09:00
김보곤
9623256386 feat: [hr] 사원 등록 - 기존 직원 불러오기 기능 추가
- 검색 API (GET /api/admin/hr/employees/search-users)
- 테넌트 소속 + 사원 미등록 사용자 검색
- 기존 사용자 선택 시 Employee만 생성 (User 생성 건너뜀)
- Alpine.js 검색 UI (포커스시 목록, debounce 검색, 선택/해제)
2026-02-26 17:35:54 +09:00
김보곤
446b8787de fix: [hr] 사원 등록/수정 에러 메시지 화면 표시 개선
- API 컨트롤러 store/update/destroy에 try-catch 추가
- debug 모드에서 상세 에러 메시지 포함 응답
- create/edit 뷰에 showToast 기반 에러 표시 추가
- 422 validation 에러 필드별 메시지 표시
- 500 서버 에러 시 사용자 친화적 메시지 표시
2026-02-26 17:25:00 +09:00
김보곤
e8d4803590 fix: [hr] 사원 등록 시 users 테이블 NOT NULL 제약 오류 수정
- email 미입력 시 임시 이메일 생성 (NOT NULL 제약 대응)
- user_id 자동 생성 및 중복 방지 로직 추가
- role 필드 'ops' 기본값 설정
- Hash::make 사용으로 통일 (기존 패턴 준수)
2026-02-26 17:22:50 +09:00
김보곤
8d0dee2bb2 feat: [hr] 직급/직책 인라인 추가 기능 구현
- Position 생성 API 엔드포인트 추가 (POST /admin/hr/positions)
- 직급/직책 select 옆 "+" 버튼으로 모달 열기
- 모달에서 이름 입력 → API 저장 → 드롭다운에 자동 추가 및 선택
- 중복 key 방지 (기존 값이면 그대로 반환)
- create/edit 뷰 모두 적용
2026-02-26 17:07:12 +09:00
김보곤
ba24034020 fix: [hr] 사원 등록 시 user_tenants pivot 연동 추가
- User 생성 후 tenants()->attach() 호출 (멀티테넌트 필수)
- user_id, must_change_password, created_by 필드 추가
- 기존 UserService 패턴과 동일하게 맞춤
2026-02-26 16:53:32 +09:00