approveRequest()에서 상태만 변경하고 used_days 차감 누락.
deductByPriority 호출 추가 (특별휴가→이월→기본 순서).
기존 데이터 46건 출퇴근 기록 기반 동기화 완료.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 분류 로직: balance_type 대신 type_code 우선 체크 (LONG_SERVICE 등이 경조사로 분류되는 버그)
- 0일 경조사 레코드 필터링 추가
- 잘못된 COMPANY_GRANT 레코드 DELETE 마이그레이션 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- getVacTypeId(): vacTypes 미로딩 시 DB 고정 ID fallback
(ANNUAL_FULL→1, CARRYOVER→6, LONG_SERVICE→7)
- form submit: vacation_type_id NaN이면 balance_type 기반 자동 결정
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- "휴가 유형" 드롭다운 → hidden (vacation_type_id 자동 설정)
- "배정 유형"이 메인 셀렉터: 기본연차/이월/장기근속/경조사
- balance_type별 vacation_type_id 자동 매핑:
AUTO/MANUAL→ANNUAL_FULL, CARRY_OVER→CARRYOVER, LONG_SERVICE→LONG_SERVICE
- 경조사(COMPANY_GRANT) 선택 시 서브 드롭다운 표시
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
vacation_balance_details에 쓰고 sp_vacation_balances에서 읽는
테이블 불일치 수정. 경조사 등 특별휴가 저장 후 반영 안 되던 문제 해결.
- bulkUpsert: vacation_balance_details → sp_vacation_balances
- balance_type 전달: CARRY_OVER, AUTO, LONG_SERVICE, COMPANY_GRANT
- 기존 경조사 데이터 21건 sp_vacation_balances로 마이그레이션
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 사용자 이름 클릭 → 월별 요약 테이블 (연차/반차/반반차/합계)
- 상세 내역: 일자별 사용 기록
- 기존 /attendance/records API 활용 (별도 백엔드 불필요)
- 경조사 모달과 동일 패턴 (overlay, ESC, 배경 클릭 닫기)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
axios 토큰과 사용자 정보를 localStorage에서만 읽어서
쿠키 기반 인증 시 API 호출이 안 되던 문제.
getSSOToken()/getSSOUser() 사용하여 쿠키 우선으로 전환.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 날짜+조회 좌측, 휴무일+Excel 우측 분리 배치
- 보조 버튼에 아이콘 추가 + 크기 축소
- 불필요한 요약 통계 카드 제거 (전체인원/총근무시간 등)
- flex-wrap 적용으로 모바일 대응
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
대시보드 + 연간 연차 현황 페이지의 읽기를 tksupport 정본 테이블로 전환.
- dashboardModel: getVacationBalance worker_id → user_id, sp_vacation_balances
- dashboardController: worker_id 전달 제거, user_id 직접 사용
- vacationBalanceModel: 읽기 함수 3개 sp_vacation_balances로 전환
(쓰기 함수 deductByPriority 등은 vacation_balance_details 유지)
- remaining_days: STORED GENERATED 대신 (total_days - used_days) AS 계산
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
users 테이블과 sso_users 테이블의 user_id가 다른 문제 해결.
- 모든 사용자 조회를 sso_users로 전환
- admin 체크를 req.user.role(JWT)로 간소화 → DB 쿼리 제거
- POST/DELETE에 UPSERT 패턴 적용
- is_admin_only 참조 완전 제거
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
과거 권한 시스템 잔재인 is_admin_only 필터를 모든 런타임 코드에서 제거.
현재 체계: admin=모든 페이지, 일반 사용자=권한 부여된 페이지만.
DB에서도 is_admin_only = 0으로 통일 (22건 갱신).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- department_page_permissions JOIN 추가 (s1. 접두사 자동 매칭)
- 부서/개인 명시적 권한 있으면 is_admin_only 제한 해제
- 우선순위: 개인 권한 > 부서 권한 > is_default_accessible
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SYSTEM1_PAGES에 소모품(2), 근태(7), 작업(4), 시스템(2) 항목 추가.
기존 '공장 관리' 그룹에서 근태 항목 분리하여 별도 그룹 구성.
캐시 버스팅 갱신.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
20260330_add_proxy_input_fields.sql이 startup 마이그레이션에
등록 안 되어 tbm_sessions.is_proxy_input 컬럼 없어서 500 에러.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- permissionModel: s1.purchase.request, s1.purchase.analysis 추가
- pages 테이블: dash→underscore 통일 (report-create→report_create 등)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- dashboardModel: department_page_permissions의 s1. 접두사 제거하여
pages.page_key와 매칭 (두 테이블 명명규칙 차이 처리)
- permissionModel: 신규 페이지 13개 추가 (공정표, 생산회의록,
대리입력, 입력현황, 근태관리 7종, 부서/알림 관리)
- pages 테이블: 누락 16개 페이지 INSERT (DB 직접 실행)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 상단 오렌지 헤더 (사용자명/아바타/로그아웃/홈 버튼)
- 프로필 카드 그라데이션 blue→orange (#9a3412→#ea580c)
- 기존 tkfb 페이지들과 일관된 UI
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
page_id(없음) → page_name으로 조회, pages.page_key로 매칭.
실제 DB 구조와 shared/middleware/pagePermission.js 패턴 일치.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
dashboard, proxy-input, monthly-comparison 라우트가
실제 사용되는 config/routes.js가 아닌 루트 routes.js에만
등록되어 있어 404 발생. config/routes.js에 추가.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- monthly-comparison.html: 작업자 뷰 + 관리자 뷰 통합 페이지
- monthly-comparison.js: 일별 비교 카드(7상태), 확인/반려 워크플로우,
관리자 진행바+필터+엑셀, Mock 데이터 포함
- monthly-comparison.css: 모바일 우선 스타일
- tkfb-core.js: NAV_MENU에 월간 비교·확인 추가
- 권한: role 기반 mode 자동 결정, 일반 작업자 admin 접근 차단
- 상태 전이: pending→confirmed/rejected, rejected→confirmed 재확인 가능
- 엑셀: pending 0명일 때 활성화
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tkfb.css의 .data-table thead th { position: sticky; top: 56px }가
첫 번째 데이터 행을 가리는 원인. 이 페이지에서는 sticky 불필요하므로
position: static !important로 오버라이드.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
preflight의 border-style:solid가 border-collapse 테이블에서
빈 행을 생성하는 문제. preflight:false로 비활성화하고
유틸리티 클래스만 사용. 이전 CSS override(!important) 제거.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tailwind CDN preflight가 table/thead/tbody/tr에 border-style:solid를
넣어 border-collapse 모드에서 보이지 않는 border가 공간을 차지함.
table 구조 요소에 border:none !important로 명시적 제거,
th/td에만 border 적용.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- border-collapse/spacing !important 적용
- table-layout: fixed로 컬럼 안정화
- border-top 제거 후 thead 첫 행만 복원
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- DB: vacation_balance_details DECIMAL(4,1) → DECIMAL(5,2)로 변경 (0.25 단위 지원)
- 표시: fmtNum() — 정수면 소수점 없이 (17), 소수면 2자리 (0.75)
- onblur 포맷팅도 동일 규칙 적용
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- input value에 .toFixed(2) 적용 (이월/정기연차/장기근속/경조사)
- onblur 핸들러로 수정 후에도 소수점 2자리 유지
- step 0.5 → 0.25로 변경 (0.25일 단위 입력 가능)
- 총 사용 '-' 표시 → 0.00으로 통일
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ADD COLUMN IF NOT EXISTS 사용, FK ADD CONSTRAINT 제거
(이전 배포에서 이미 생성됨, 재실행 시 errno 121 발생)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
routes/ 하위 파일에서 ../../../shared/는 /usr/shared를 참조.
기존 /usr/src/shared 심링크만으로 부족. /usr/shared 추가.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>