- DB: consumable_categories 테이블 생성, ENUM→VARCHAR 변환, 시드 4개
- API: GET/POST/PUT/DEACTIVATE /api/consumable-categories
- 프론트: 3개 JS 하드코딩 CAT_LABELS 제거 → API loadCategories() 동적 로드
- tkuser: 카테고리 관리 섹션 추가, select 옵션 동적 생성
- 별칭 시드 SQL (INSERT IGNORE 기반)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- purchase.request_mobile(소모품 신청) 누락 → 추가 (def:true)
- purchase.request 명칭 "소모품 신청" → "소모품 구매 관리" 수정
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- permissionModel.js: s1.attendance.my_monthly_confirm 추가 (default_access: true)
- tkuser-users.js: 권한 관리 UI에 "월간 근무 확인" 항목 추가
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>
SYSTEM1_PAGES에 소모품(2), 근태(7), 작업(4), 시스템(2) 항목 추가.
기존 '공장 관리' 그룹에서 근태 항목 분리하여 별도 그룹 구성.
캐시 버스팅 갱신.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Backend:
- product_types 참조 테이블 + projects.product_type_id FK (tkuser 마이그레이션)
- schedule_entries에 work_type_id, risk_assessment_id, source 컬럼 추가
- schedule_phases에 product_type_id 추가 (phase 오염 방지)
- generateFromTemplate: tksafety 템플릿 기반 공정 자동 생성 (트랜잭션)
- phase 매칭 3단계 우선순위 (전용→범용→신규)
- 간트 데이터 NULL 날짜 guard 추가
- system1 startup 마이그레이션 러너 추가
Frontend:
- tkuser 프로젝트 추가/수정 폼에 제품유형 드롭다운 추가
- 프로젝트 목록에 제품유형 뱃지 표시
- 공정표 툴바에 "표준공정 생성" 버튼 + 모달 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tkuser.users 권한이 있는 일반 사용자에게 adminSection과
passwordChangeSection이 동시 표시되던 문제 수정.
비밀번호 변경 폼은 아무 권한 없는 사용자 fallback으로만 표시.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 사용자 추가 시 hire_date 전송 (서울 오늘날짜 기본값)
- resigned_date 컬럼 마이그레이션 + CRUD 지원
- 비활성화(삭제) 시 resigned_date 자동 설정 (COALESCE)
- 활성/비활성 사용자 목록 분리, 퇴사자 접기/펼치기
- 퇴사자 재활성화 기능 (resigned_date 초기화)
- 편집 모달에 퇴사일 필드 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- findAll()에 hire_date 추가, update()에 hire_date 처리
- 사용자 편집 모달에 입사일 input 추가
- 사용자 목록에 입사일 뱃지 표시 (미등록 시 주황 경고)
- 부서 팀장 드롭다운: 전체 사용자 optgroup 방식으로 변경
- u.id → u.user_id 버그 수정
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
컨테이너 재생성 시 502 Bad Gateway 방지:
- 모든 nginx proxy_pass를 set $upstream 변수 방식으로 전환 (9개 파일, 24개 location)
- resolver 127.0.0.11 valid=10s ipv6=off 통합 선언
- ai-api location의 개별 resolver 8.8.8.8 제거 (server-level로 통합)
- 10개 API 서비스에 healthcheck 추가 (Node: wget, Python: urllib)
- 모든 web/gateway depends_on을 condition: service_healthy로 강화
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- setLongServiceExclusion: affectedRows 체크 추가 (존재하지 않는 user_id → 404)
- ACCESS_LEVELS: user: 1 키 추가 (role='user' 사용자 레벨 0 방지)
- escapeHtml → escHtml 통일 (tkuser-vacations.js 라인 381)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- tkuser 탭을 5개 카테고리로 그룹핑 (인력/현장/업무/거래/시스템)
- 설비 관리 탭 신규 추가 (CRUD, 필터, 상세 보기)
- tkfb 사이드바 admin 메뉴 6개를 tkuser 외부 링크로 교체
- tkfb admin HTML 6개를 tkuser 리다이렉트로 변경
- gateway 알림 벨 링크를 tkuser로 변경
- _tkuserBase 헬퍼로 개발/운영 환경 자동 분기
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- notificationRecipientModel에 ntfy CRUD 메서드 추가 (같은 DB 직접 쿼리)
- ntfy 라우트 3개 추가 (GET/POST/DELETE, /:type 위에 배치)
- 알림 수신자 탭 상단에 ntfy 구독 관리 카드 렌더링
- ntfy 추가 모달에 앱 설정 안내 문구 포함
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
품목의 규격 정보(예: 4" 용접, M16)를 분리 저장할 수 있도록 spec 컬럼 추가.
DB ALTER 필요: ALTER TABLE consumable_items ADD COLUMN spec VARCHAR(200) DEFAULT NULL AFTER item_name;
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
users 권한 없는 일반 사용자가 빈 화면(비밀번호 변경 폼만) 보이던 문제 수정.
허용된 탭으로 자동 전환하고, 탭 버튼에 data-tab 속성 추가하여 프로그래밍적
switchTab() 호출 시 active 버튼도 정확히 갱신되도록 개선.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
부서 권한을 바닥(마스터)으로 설정하고 개인은 추가 부여만 가능하도록 변경.
부서 허용 항목은 개인 페이지에서 잠금(해제 불가) 표시되며,
부서 이동 시 기존 개인 권한이 자동 초기화됨.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
tkpurchase 사이드바에 tkuser 협력업체 관리 페이지로 이동하는 링크 추가.
tkuser에 URL ?tab= 파라미터 기반 탭 자동 전환 지원 (화이트리스트 + replaceState).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
7개 시스템(tkpurchase/tksafety/tksupport/tkuser/system1/system2/system3)의
모바일 사용성 일괄 개선. system1(tkfb)의 모바일 메뉴 패턴을 3개 신규 시스템에 적용.
주요 변경:
- 모바일 햄버거 메뉴: tkpurchase/tksafety/tksupport에 toggleMobileMenu+overlay 추가
- 필터 반응형: 768px 이하 2열 그리드 전환 (filter-bar/filter-actions 클래스)
- 터치 타겟 44px: 테이블 액션 버튼 36px+gap, tksafety ±버튼 w-11
- iOS 줌 방지: input/select/textarea font-size 16px
- tkuser: 탭 가로스크롤+fade힌트, 사이드바·grid·드롭다운 반응형
- system1: 대시보드 인라인 width 제거, 이동설비 그리드 1열
- system2: 사진그리드 4열, 유형버튼 2열 (480px 이하)
- system3: 카드 내 액션 버튼 stopPropagation 추가
- 캐시 무효화: 전체 HTML ?v=2026031401
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
A1: fade-in querySelectorAll 전환 (5개 core.js) — 복수 요소 모두 표시
A2: 모달 ESC 키 닫기 (5개 core.js)
A3: 모바일 메뉴 body 스크롤 잠금 (tkfb-core.js)
A4: Gateway 대시보드 max-width 800→1080px
B1: 모달 z-index 50→60 — 헤더 위에 표시 (4개 CSS)
B3: 테이블 sticky header (tkfb.css, tkpurchase.css)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
tkuser: 업체(공급업체) CRUD + 소모품 마스터 CRUD (사진 업로드 포함)
tkfb: 구매신청 → 구매 처리 → 월간 분석/정산 전체 워크플로
설비(equipment) 분류 구매 시 자동 등록 + 실패 시 admin 알림
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 상위부서(parent_id) 필드 UI/API 전체 제거
- 부서 비활성화(soft delete) → 진짜 삭제(hard delete) 전환 (트랜잭션)
- 소속 인원 있는 부서 삭제 시 department_id=NULL 처리
- 편집 모달에서 활성/비활성 필드 제거
- 휴가 발생 입력 작업자 select를 부서별 optgroup으로 표시
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
대시보드를 gateway(tkfb)에서 분리하여 독립 서비스 tkds로 이동.
- tkds/web: nginx + dashboard.html 신규 서비스 (port 30780)
- gateway: /login 복원, /dashboard → tkds 301 리다이렉트
- 전체 시스템 getLoginUrl() → tkds.technicalkorea.net/dashboard로 변경
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- equipment/maintenance 삭제, partner_work/day_labor 신규 추가
- 알림 수신자 관리 UI: 카테고리별 그룹 렌더링 (생산/안전/구매/시스템)
- tkpurchase 컨트롤러 알림 타입 변경
- notification-bell 라벨 및 notifications.html 아이콘 업데이트
- 전 서비스 cache busting 갱신
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 1: tksafety에 출입신청/체크리스트 API·웹 추가, tkfb 안전 코드 삭제
Phase 2: 사용자 관리 페이지 삭제, API 축소, 알림 수신자 tkuser 이관
Phase 3: tkuser 권한 페이지 정의 업데이트
Phase 4: 전체 34개 페이지 Tailwind CSS + tkfb-core.js 전환,
미사용 CSS 20개·인프라 JS 10개·템플릿·컴포넌트 삭제
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DEFAULT_PAGES에 tkuser 시스템 10개 페이지 권한 정의 추가
- 권한 관리 UI에 tkuser 섹션 추가 (개인/부서 권한 모두)
- 비admin 사용자 로그인 시 effective-permissions 기반 탭 표시 제어
- switchTab()에 권한 guard 추가하여 비허용 탭 접근 차단
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
쿠키를 단일 진실 출처로 만들어 서브도메인 간 로그아웃 불일치 해결:
- login.html: logout=1 파라미터 시 localStorage+쿠키 전부 정리 후 토큰 체크 스킵
- 각 시스템 logout 함수에 &logout=1 추가 (6개 파일)
- 각 시스템 initAuth에 쿠키 우선 검증 추가 (7개 파일)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 1: tkuser 협력업체 CRUD 이관 (읽기전용 → 전체 CRUD)
Phase 2: tkpurchase 개편 — 일용공 신청/확정, 작업일정, 업무현황, 계정관리, 협력업체 포털
Phase 3: tksafety 신규 시스템 — 방문관리 + 안전교육 신고
Phase 4: SSO 인증 보강 (partner_company_id JWT, 만료일 체크), 권한 테이블 기반 접근 제어
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
atob()가 UTF-8 멀티바이트 문자를 Latin-1로 처리하여 한글 이름이
깨지는 문제 수정. Uint8Array + TextDecoder 패턴으로 교체.
tkpurchase, tkuser nginx에 charset utf-8 추가.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
신규 독립 시스템 tkpurchase (구매/방문 관리) 구축:
- 협력업체 CRUD + 소속 작업자 관리 (마스터 데이터 소유)
- 당일 방문 등록/체크인/체크아웃 + 일괄 마감
- 업체 자동완성, CSV 내보내기, 집계 통계
- 자정 자동 체크아웃 (node-cron)
- tkuser 협력업체 읽기 전용 탭 + 권한 그리드(tkpurchase-perms) 추가
- docker-compose에 tkpurchase-api/web 서비스 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 부적합 라이프사이클 전 과정에서 Qdrant 임베딩 자동 동기화
- 관리함 5개 저장 함수 + 수신함 상태 변경 시 fire-and-forget sync
- 30분 주기 전체 재동기화 안전망 (FastAPI lifespan 백그라운드 태스크)
- build_document_text에 카테고리(final_category/category) 포함
- RAG 질의에 DB 통계 집계 지원 (카테고리별/부서별 건수)
- Qdrant client.search → query_points API 마이그레이션
- AI 어시스턴트 페이지 권한 추가 (tkuser)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Chrome은 secure 쿠키 삭제 시 삭제 문자열에도 secure 플래그가 필요함.
6개 파일의 cookieRemove 함수에 '; secure; samesite=lax' 추가.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- System2 신고: SSO JWT 인증 전환, API base 정리
- System3 부적합: SSO 인증 매니저 통합, 권한 체계 정비
- User Management: SSO 토큰 기반 사용자 관리 API 연동
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>