Commit Graph

148 Commits

Author SHA1 Message Date
Hyungi Ahn
0c149673fb refactor: shared 모듈 추출 Phase 1~4 (notifyHelper, errors, logger, auth, dbPool)
Phase 1: notifyHelper.js → shared/utils/ (4개 서비스 중복 제거)
Phase 2: auth.js → shared/middleware/ (system1/system2 통합)
Phase 3: errors.js + logger.js → shared/utils/ (system1/system2 통합)
Phase 4: DB pool → shared/config/database.js (Group B 4개 서비스 통합)

- Docker 빌드 컨텍스트를 루트로 변경 (6개 API 서비스)
- 기존 파일은 re-export 패턴으로 consumer 변경 0개 유지
- .dockerignore 추가로 빌드 최적화

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 19:07:22 +09:00
Hyungi Ahn
84cf222b81 feat(tkuser): 알림 시스템 이관 system1-factory → tkuser
- Phase 1: tkuser에 알림 CRUD, Push/ntfy 발송, 내부 알림 API 추가
- Phase 2: notifyHelper URL을 tkuser-api:3000으로 전환 (system2, tkpurchase, tksafety, system1)
- Phase 3: notification-bell.js API 도메인 tkuser로 변경 + 캐시 버스팅 v=4
- Phase 4: system1에서 알림 코드 제거 (routes, controllers, models, utils)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 15:56:41 +09:00
Hyungi Ahn
afa10c044f fix: 미커밋 수정사항 정리 (purchase migration, 로컬네트워크 URL, 포트 수정)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 15:47:28 +09:00
Hyungi Ahn
862a2683d3 feat(tkuser): 탭 카테고리 그룹핑 + 설비 관리 탭 추가 + tkfb admin 페이지 통합
- 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>
2026-03-17 15:35:24 +09:00
Hyungi Ahn
f548a95767 feat(tkuser): 알림 수신자 탭에 ntfy 구독 관리 추가
- notificationRecipientModel에 ntfy CRUD 메서드 추가 (같은 DB 직접 쿼리)
- ntfy 라우트 3개 추가 (GET/POST/DELETE, /:type 위에 배치)
- 알림 수신자 탭 상단에 ntfy 구독 관리 카드 렌더링
- ntfy 추가 모달에 앱 설정 안내 문구 포함

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 15:16:14 +09:00
Hyungi Ahn
1cef745cc9 feat(ntfy): Phase 2 — sendPushToUsers() ntfy 연동 + 구독 관리 UI
- ntfy_subscriptions 테이블 마이그레이션 추가
- ntfySender.js 유틸 (ntfy HTTP POST 래퍼)
- sendPushToUsers() ntfy 우선 분기 (ntfy 구독자 → ntfy, 나머지 → Web Push)
- ntfy subscribe/unsubscribe/status API 엔드포인트
- notification-bell.js ntfy 토글 버튼 + 앱 설정 안내 모달
- docker-compose system1-api에 NTFY 환경변수 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 15:01:03 +09:00
Hyungi Ahn
e50ff3fb63 feat(ntfy): 푸시 알림 서버 Phase 1 인프라 구축
- docker-compose.yml에 ntfy 서비스 추가 (포트 30750)
- ntfy/etc/server.yml 서버 설정 (인증 deny-all, 72h 캐시)
- ntfy/README.md 운영 매뉴얼

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 10:24:09 +09:00
Hyungi Ahn
184cdd6aa8 fix(tkfb): project_code → job_no 컬럼명 수정 (500 에러 해결)
projects 테이블에 project_code 컬럼이 없고 job_no가 올바른 컬럼명.
백엔드 SQL에서는 pr.job_no AS project_code alias 사용,
프론트 드롭다운에서는 p.job_no로 직접 참조.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 08:18:49 +09:00
Hyungi Ahn
adf3a197fd fix(tkfb): pages INSERT에서 is_active 컬럼 제거
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 08:10:06 +09:00
Hyungi Ahn
49949bda62 fix(tkfb): 마이그레이션 FK 타입 불일치 수정 (signed/unsigned)
projects, sso_users 테이블은 signed int이므로 해당 FK에서 .unsigned() 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 08:09:04 +09:00
Hyungi Ahn
d7cc568c01 feat(tkfb): 공정표 + 생산회의록 시스템 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 08:05:18 +09:00
Hyungi Ahn
b5dc9c2f20 refactor(tkeg): 대시보드 프로젝트 생성 기능 제거 (tkuser로 통합)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 07:47:04 +09:00
Hyungi Ahn
0910f5d0a6 fix(tkeg): JWT 파싱 시 한글 이름 깨짐 수정 (UTF-8 디코딩)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 07:31:06 +09:00
Hyungi Ahn
9a2b682b18 fix(tkfb): TBM 완료 시 연차 작업자 작업보고서 생성 500 에러 수정
daily_work_reports INSERT에 NOT NULL 필수 컬럼 work_type_id 누락으로
연차 작업자 포함 TBM 완료 시 500 에러 발생. work_type_id=11(휴무) 추가.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:54:41 +09:00
Hyungi Ahn
1e1d2f631a feat(tkeg): tkeg BOM 자재관리 서비스 초기 세팅 (api + web + docker-compose)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:41:58 +09:00
Hyungi Ahn
2699242d1f feat(tkeg, gateway): tkeg 대시보드 리디자인 + gateway 구매관리 네이밍 수정
- tkeg: MUI 기반 대시보드 전면 리디자인 (theme, 메트릭 카드, 프로젝트 Autocomplete, Quick Action, 관리자 섹션)
- gateway: tkpurchase 카드 "소모품 관리" → "구매관리"로 복원

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:36:02 +09:00
Hyungi Ahn
9b586da720 feat(tkfb): TBM 카드에 완료 버튼 추가
draft 상태 카드에서 근무 현황 입력 모달을 열 수 있도록 완료 버튼 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:32:44 +09:00
Hyungi Ahn
5cc3191871 fix(tkfb): TBM 팀 구성 모달 기본 정보 바인딩 버그 수정
날짜/입력자/프로젝트/공정 필드가 모두 빈 값으로 표시되던 4건 수정:
- sessionDateDisplay.textContent로 날짜 표시
- leaderName .value → .textContent (div 요소)
- 프로젝트/공정 드롭다운 옵션 채우기 + 기존 값 선택

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:20:20 +09:00
Hyungi Ahn
ec59efcdb6 docs: CLAUDE.md + 슬래시 커맨드 + 워크플로우 가이드 추가
Claude Code 협업 효율화를 위한 문서 체계 구축:
- CLAUDE.md: 서비스 맵·코드 규칙·배포 정보 (매 세션 자동 로드)
- 슬래시 커맨드 5개: deploy, check-deploy, cache-bust, add-page, add-api
- WORKFLOW-GUIDE.md: Plan 모드·서브에이전트·검증 루프 활용 가이드

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:13:49 +09:00
Hyungi Ahn
c2e8b58849 fix(tkfb): TBM 팀 구성 모달 workerTaskList DOM 누락 버그 수정
tbmModal에 편집 모드용 workerTaskListSection/workerTaskList/workerListEmpty 요소 추가.
openTeamCompositionModal에서 생성↔편집 모드 전환 로직 추가, closeTbmModal에서 원복.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:09:59 +09:00
Hyungi Ahn
573ef74246 feat(tkfb): 모바일 전체 최적화 — 네비 수정 + 공통 기반 + 페이지별 개선
Phase 1: 기반 수정
- 햄버거 메뉴 .mobile-open 규칙 커밋 (네비 버그 수정)
- 36개 HTML 파일 tkfb.css 캐시 버스팅 ?v=2026031601
- tkfb.css 공통 모바일 기반: 터치 44px, iOS 줌 방지, 테이블 스크롤, 모달 최적화

Phase 2: 페이지별 최적화
- 그룹 A (심각): daily.html, work-status.html JS 카드 뷰 변환
- 그룹 A: monthly.html 모바일 컨트롤 스택 + No열 숨김 + 범례 그리드
- 공통 CSS: 페이지 헤더/컨트롤/필터 스택, 탭 가로 스크롤,
  폼 2열→1열, 요약 바 wrap, 저장 바 sticky, 작업자 칩 터치 최적화,
  2열 레이아웃→세로 스택, 테이블 래퍼 오버플로, 모달 풀스크린
- 개별 페이지: checkin, vacation-management, vacation-approval,
  projects, repair-management, annual-overview 인라인 모바일 스타일

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:39:19 +09:00
Hyungi Ahn
65839e94a4 fix(tkfb): 모바일 대시보드 레이아웃 깨짐 — mobile.css 누락 수정
dashboard.html에 mobile.css 링크가 없어 모바일 대시보드 뷰가
스타일 없이 평문으로 표시되던 문제 수정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:11:17 +09:00
Hyungi Ahn
0a05bd8d76 feat(consumable): 소모품 마스터에 "규격(spec)" 필드 추가
품목의 규격 정보(예: 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>
2026-03-16 13:34:43 +09:00
Hyungi Ahn
cc47d25851 refactor(tkfb): "구매 관리" → "소모품 관리" 리네이밍 — UI 라벨을 실제 기능에 맞게 변경
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 13:19:31 +09:00
Hyungi Ahn
817002f798 fix(tkuser): 권한 기반 탭 자동 라우팅 — 제한 사용자 진입 시 첫 허용 탭 표시
users 권한 없는 일반 사용자가 빈 화면(비밀번호 변경 폼만) 보이던 문제 수정.
허용된 탭으로 자동 전환하고, 탭 버튼에 data-tab 속성 추가하여 프로그래밍적
switchTab() 호출 시 active 버튼도 정확히 갱신되도록 개선.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 12:08:48 +09:00
Hyungi Ahn
4108a6e64a feat(tkuser): 부서 마스터 + 개인 추가 부여 권한 시스템 구현
부서 권한을 바닥(마스터)으로 설정하고 개인은 추가 부여만 가능하도록 변경.
부서 허용 항목은 개인 페이지에서 잠금(해제 불가) 표시되며,
부서 이동 시 기존 개인 권한이 자동 초기화됨.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 11:49:25 +09:00
Hyungi Ahn
f711a721ec feat(tkuser): 협력업체 CRUD 권한을 permission 시스템으로 확장
tkuser.partners 권한이 부여된 일반 사용자도 업체/작업자 등록·수정·비활성화 가능.
완전삭제는 admin 전용 유지.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 11:23:17 +09:00
Hyungi Ahn
5a911f1d4b fix(tkuser): 협력업체 삭제 시 sso_users 컬럼명 오류 수정 (id → user_id)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 09:13:04 +09:00
Hyungi Ahn
457c74084f fix(tkpurchase): 테이블 첫 행 가림 버그 수정 — sticky 헤더 제거
position: sticky 테이블 헤더가 첫 번째 데이터 행을 가려서 데이터 누락으로 보이던 문제 해결.
overflow-x-auto 래퍼와 sticky 조합의 브라우저 불일치 문제도 함께 제거.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 08:41:26 +09:00
Hyungi Ahn
509691eebb feat(tkpurchase): 협력업체 포털/이력에 프로젝트 정보 배지 추가
- 포털 스케줄 카드에 프로젝트명·job_no 초록 배지 표시
- 이력 카드에 프로젝트명·job_no 초록 배지 표시
- checkinModel.findHistoryByCompany에 LEFT JOIN projects 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 08:34:56 +09:00
Hyungi Ahn
5d24584553 fix(tkpurchase): API 요청에 _t= 타임스탬프 캐시버스터 추가
디버깅 결과 서버(DB→Model→API) 모두 정상 3건 반환 확인.
브라우저/프록시 레벨 캐싱이 원인으로 추정되어
api() 함수에 Date.now() 기반 캐시버스터 파라미터 추가.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 08:27:06 +09:00
Hyungi Ahn
8ed0b832ab feat(tkuser): 협력업체 완전삭제 기능 추가 (admin 전용)
- 관련 데이터 cascade 삭제 (workers, schedules, checkins, reports, SSO 계정 등)
- 구매 이력 있는 업체는 삭제 차단
- 프론트엔드: 목록/상세에 완전삭제 버튼 + prompt("삭제") 안전장치

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:58:39 +09:00
Hyungi Ahn
73bd13a7cd fix(tkpurchase): fetch에 cache:no-store 추가 — 브라우저 캐시 완전 우회
이전 응답이 브라우저에 캐시된 상태에서 서버 Cache-Control만으로는
기존 캐시를 무효화할 수 없음. fetch() 호출 시 cache:'no-store'로
브라우저가 항상 네트워크 요청하도록 강제.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:46:41 +09:00
Hyungi Ahn
5398581b87 feat(tkpurchase/tkuser): 사이드바에 협력업체 관리 외부 링크 추가 + tkuser ?tab= 라우팅
tkpurchase 사이드바에 tkuser 협력업체 관리 페이지로 이동하는 링크 추가.
tkuser에 URL ?tab= 파라미터 기반 탭 자동 전환 지원 (화이트리스트 + replaceState).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:37:44 +09:00
Hyungi Ahn
54bb26dbd6 fix(tkpurchase): 일정 목록 미표시 버그 수정 — 캐시·타임존·페이지네이션
- API에 Cache-Control: no-store 미들웨어 추가 (304 캐시 문제 해결)
- toLocalDate() 유틸 추가, 전체 8개 JS의 toISOString 타임존 버그 수정
- scheduleModel.findAll에 total COUNT 추가, 컨트롤러에서 total 반환
- HTML 캐시 버스팅 ?v=2026031601

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 07:34:40 +09:00
Hyungi Ahn
17f7c6f3b0 fix(tksafety): uploads/risk 디렉토리 생성을 lazy로 변경 — 볼륨 권한 충돌 해결
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 08:07:13 +09:00
Hyungi Ahn
e9b69ed87b feat(tksafety): 위험성평가 모듈 Phase 1 구현 — DB·API·Excel·프론트엔드
5개 테이블(risk_projects/processes/items/mitigations/templates) + 마스터 시딩,
프로젝트·항목·감소대책 CRUD API, ExcelJS 평가표 내보내기,
프로젝트 목록·평가 수행 페이지, 사진 업로드(multer), 네비게이션·CSS 추가.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 08:05:19 +09:00
Hyungi Ahn
fe5f7cd155 feat(ux): 전체 시스템 모바일 UX 개선 — 햄버거메뉴·필터반응형·터치타겟·iOS줌방지
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>
2026-03-14 17:57:47 +09:00
Hyungi Ahn
2d8ac92404 fix(ux): 데스크탑 UX 일괄 개선 — fade-in·ESC·스크롤잠금·z-index·sticky
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>
2026-03-14 09:51:40 +09:00
Hyungi Ahn
e42a08e74d fix(tkfb): 작업 분석 페이지 백지 현상 — 내부 요소 fade-in 클래스 제거
tkfb.css의 .fade-in(opacity:0)이 내부 요소에도 적용되어
.visible 클래스가 추가되지 않는 내부 요소들이 영구 투명 상태였음.
외부 wrapper의 fade-in만 유지하고 내부 4개 요소에서 제거.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 22:22:09 +09:00
Hyungi Ahn
cc626a408e feat(tkfb): navigation.js 모듈 추가 — api-config.js import 404 해결
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 22:09:40 +09:00
Hyungi Ahn
cea72b1858 fix(purchase): year_month 예약어 백틱 처리
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:58:54 +09:00
Hyungi Ahn
aacd18be1c fix(purchase): purchase_requests 테이블 스키마 — item_id NULL + 직접입력/사진 컬럼
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:57:49 +09:00
Hyungi Ahn
cae735f243 feat(purchase): 구매신청 검색/직접입력/사진첨부/HEIC 지원/마스터 자동등록
- 소모품 select → 검색형 드롭다운 (debounce + 키보드 탐색)
- 미등록 품목 직접 입력 + 분류 선택 지원
- 사진 첨부 (base64 업로드, HEIC→JPEG 프론트 변환)
- 구매 처리 시 미등록 품목 소모품 마스터 자동 등록
- item_id NULL 허용, LEFT JOIN, custom_item_name/custom_category/photo_path 컬럼
- DB 마이그레이션 필요: ALTER TABLE purchase_requests

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:49:41 +09:00
Hyungi Ahn
13e177e818 fix(tkuser): uploads/consumables 디렉토리 권한 — Dockerfile에서 미리 생성
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:23:21 +09:00
Hyungi Ahn
3623551a6b feat(purchase): 생산소모품 구매 관리 시스템 구현
tkuser: 업체(공급업체) CRUD + 소모품 마스터 CRUD (사진 업로드 포함)
tkfb: 구매신청 → 구매 처리 → 월간 분석/정산 전체 워크플로
설비(equipment) 분류 구매 시 자동 등록 + 실패 시 admin 알림

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:21:59 +09:00
Hyungi Ahn
1abdb92a71 fix(tksafety): 작업별 항목 표시 안 되는 버그 — check_type 'task' vs 'work_type' 불일치 수정
DB에 저장된 check_type='task'를 프론트에서 'work_type'으로 필터링하여 매칭 0건.
HTML option value와 JS 필터를 모두 'task'로 통일.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:13:20 +09:00
Hyungi Ahn
07aac305d6 feat(tksafety): 체크리스트 작업별 항목에 tkuser 작업(task) 참조 연동
- getAllChecks: tasks/work_types/weather_conditions JOIN + 프론트엔드 필드명 alias
- createCheck/updateCheck: item_type→check_type 등 프론트-DB 필드 매핑
- 모달에 작업(task) 드롭다운 추가, 공정 선택 시 동적 로드
- renderWorktypeItems: work_type → task 2단 그룹핑
- openEditItem: async/await로 task 목록 로드 후 값 설정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:07:29 +09:00
Hyungi Ahn
e8076a8550 fix(purchase): 작업일정 삭제 시 관련 데이터 캐스케이드 삭제 (admin 전용)
- 삭제 권한을 admin 전용으로 변경 (requireAdmin)
- 트랜잭션으로 reports → checkins → safety_education → schedule 순서 삭제
- 프론트엔드: admin만 삭제 버튼 표시, 종속 데이터 삭제 경고 추가
- 404 처리 및 한국어 에러 메시지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:03:27 +09:00
Hyungi Ahn
3e50639914 feat(training): 안전교육 실시 페이지 수정/삭제 기능 추가
대기 목록·완료 이력 양쪽에 수정/삭제 버튼 추가.
교육 기록 삭제 시 트랜잭션으로 출입 신청 상태를 approved로 복원.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 20:31:29 +09:00