이전 메시지 불러오는 중…
구교환의 요청:
[코드 검토 요청 — LAX-site] Jason 지시로 "일정 관리"를 대시보드 캘린더 하나로 통합했습니다. 보검님이 한번 검토해 주세요. 작업 폴더는 C:/Users/user/LAX-site 입니다.
## 배경/의도
- 기존: 별도 `/schedule` 페이지("일정" 네비)가 `deadlines` 테이블(사건 기일·기한)을 보여주고, 대시보드(`/`) 캘린더 위젯은 calendar_events+예약보고(agent_schedules)+계획마감(plan_tasks)만 보여줘 **사건 기일이 대시보드엔 안 보였음**.
- 변경: 사건 기일(deadlines)을 대시보드 캘린더에 4번째 소스로 추가하고, 별도 `/schedule` 페이지·네비는 제거(`/`로 301 리다이렉트). → 일정 관리가 대시보드 캘린더에서만 이뤄지게.
## 변경 파일 5개 (검토 포인트)
1. `src/shared/calendar.ts` — CalEvent 타입에 source 'deadline' + matter_id 추가. `listEventsInRange()` 끝에 deadlines 쿼리 추가(deadlines d JOIN matters m JOIN clients c, WHERE m.deleted_at IS NULL AND d.due_date BETWEEN startDate AND endDate). 색상 미완료 #ef4444 / 완료 #64748b, title `⚖️ {title||kind}`, matter_id=m.id.
2. `src/app/calendar/widget.tsx` — eventColor에 deadline 분기, chipData에 data-matter-id, LEGEND에 '사건 기일'(#ef4444), 모달 라벨/액션에 deadline→"사건 보기"(/matters/{mid}) 링크.
3. `src/app/shell.tsx` — '일정'(/schedule) 네비 항목 제거.
4. `src/app/index.tsx` — scheduleRoutes import·`app.route('/schedule',...)` 제거, 대신 `app.get('/schedule', c=>c.redirect('/',301))` 추가.
5. `src/app/schedule/routes.tsx` — 이제 import 안 됨(미사용 파일로 남음).
## 봐줄 점
- 정합성/버그(특히 deadlines 쿼리·날짜 범위·done 처리), 위젯 모달 사건 링크 동작, 라우트 리다이렉트 충돌 여부, 빌드 깨질 만한 타입 문제(matter_id optional), 미사용 schedule/routes.tsx를 지울지 리다이렉트로 둘지 의견.
발견사항을 [심각도/파일:위치/문제/제안] 형식으로 짧게 정리해 주세요. 아직 빌드·배포 전입니다.
검토 완료했습니다. 타입체크(tsc --noEmit) 통과, 스키마·쿼리 정합성 확인했습니다. 결론부터.
결론
빌드·기능상 치명 결함 없음. 배포 가능 수준. 다만 연체 기일 가시성 상실(기능 후퇴) 1건은 손보고 내보내는 걸 권합니다.
발견사항
[중/calendar.ts:135 (deadlines 색상)] 연체(overdue) 기일이 미래 기일과 같은 빨강
- 기존
/schedule는past(연체)·soon(≤14일)·normal·done4단계로 구분했는데, 통합 후 미완료는 전부#ef4444단색. 법률 기한 추적에서 "지난 기일"이 안 보이는 건 실무상 손실(소멸시효·제출기한 연체가 일반 기일과 구분 안 됨). - 제안: 미완료 중
due_date < todayKST()면 진한 빨강(예#b91c1c)으로, 또는description에(연체)/(D-n)부기. 한 줄 분기로 해결.
[중/index.tsx:62 (301 리다이렉트)] 영구 캐시 → 가역성 저하
301은 브라우저·CDN이 영구 캐싱. 추후/schedule부활 시 캐시된 301이 사용자 단에서 안 풀림. 비가역적 결정 성격.- 트레이드오프: 옆 줄들(
/draft,/org등)도 301이라 일관성은 있음. 폐지를 확정으로 보면 301 유지, 실험적 통합이면302가 안전. → 이건 Jason 판단 사안에 가까움(아래). - 부수: 리다이렉트가 쿼리스트링(
?view=week&type=)을 버림 — 북마크 호환 목적상 허용 가능.
[하/schedule/routes.tsx (미사용 파일)] dead code로 잔존
- 이번 변경이 만든 orphan이고, 파일 내부가
/schedule경로 전제라 남기면 혼란.tsc는 미사용 파일을 경고하지 않아 빌드는 안 깨짐. → 삭제 권장(북마크는 리다이렉트가 처리). 되돌릴 일 대비해 남기려면 파일 상단에 "미사용 — index.tsx에서 라우트 제거됨" 주석이라도.
[무이슈 — 확인 완료]
- 스키마 일치:
deadlines(kind,title,due_date,done,matter_id)+matters.deleted_at/client_id+clients.name모두 존재.due_date는YYYY-MM-DDTEXT라BETWEEN사전식 비교 정상. matter_id?: optional타입 — 다른 소스(plan/schedule/manual) 미설정해도 안전,.all<CalEvent>()빌드 영향 없음.- id 충돌(deadline.id vs calendar_events.id 동일 숫자 가능)은 삭제·드래그가
source==='manual'가드라 무해. 모달 "사건 보기"는matter_id로 분기 — 정상. - 라우트 충돌 없음(
/schedule단일 등록,/calendar와 무관). 범례 필터(hide)·모바일 월뷰 칩·data-matter-id전달 정상.
Jason 결정 필요 (1건)
/schedule폐지가 확정인지 실험인지에 따라 리다이렉트 코드(301영구 vs302가역) + 파일 삭제 여부가 갈림. 확정이면 301 유지 + 파일 삭제, 실험이면 302 + 파일 보존.
다음 액션
- [변우석/배포 전] 연체 기일 색 분기 1줄 추가 — 법률 기한 가시성 회복 (calendar.ts:135).
- [Jason/이번 주] /schedule 폐지 = 확정 or 실험? → 301/302·파일삭제 확정.
- [변우석/2번 회신 후] 결정대로 schedule/routes.tsx 정리하고 빌드·배포, 반영 URL 회신.