﻿# PRD — 면접 시간표 자동 편성 앱

> **실습 방식**: 내 PC 안(로컬) · Claude 데스크톱 앱 **Code** 탭 · 다운로드 › **Test** 폴더 · 가상 데이터만 사용
> 이 문서를 Claude Code가 그대로 읽고 앱을 만듭니다. 고치고 싶은 곳은 직접 고쳐도 됩니다.

## 1. 한 줄 정의
지원자들이 회신한 가능 일정을 한 표로 합치고, **회의실 2곳·하루 15명·쉬는 시간·같은 학교 분리 규칙대로 30분 단위 면접 시간표를 앱이 자동으로 짜며**, 드래그로 고치고 엑셀로 내보내는 앱. 편성 결과 점검과 사유 설명은 Claude Code가 맡는다.

## 2. 누가 쓰나
| 역할 | 하는 일 |
|---|---|
| 채용 담당자(연 4회) | 가능 일정 CSV 불러오기 → 1차/2차 선택 → 자동 편성 → 드래그로 수정 → CSV 내보내기, 리마인더 문구 확인 |
| 면접관(1차 8명 · 2차 4명) | 완성된 시간표를 받아 봄 (오늘은 화면·CSV로 확인) |

## 3. 오늘 만들 기능 (필수)
- [ ] **일정 취합 화면**: 지원자 × 날짜(11/17~11/20) 가능/불가 합친 표, 회신·미회신 수, 날짜별 가능 인원, 미회신자 리마인더 미리보기(발송 안 함)
- [ ] **1차 시간표 자동 편성(다:1)**: 서울·인천 회의실 두 칸, 30분 간격, 칸마다 «09:30 홍길동» 형식으로 이름 표시, 날짜 버튼으로 하루씩 보기
- [ ] **2차 시간표(다:다)**: 면접 유형을 2차로 고르면 3명씩 한 조로 묶은 시간표로 모양이 바뀜
- [ ] **드래그로 자리 바꾸기**: 이름 칸을 끌어 다른 칸에 놓으면 두 사람 자리가 바뀌고, 바꾼 뒤 규칙 위반이면 빨간 테두리로 경고
- [ ] **엑셀(CSV) 내보내기 + Claude Code 점검 결과 보기**: 시간표 CSV 저장, `check.md` 를 «Claude Code 편성 점검» 카드에 표시

## 4. 화면 구성
1. **상단**: 앱 이름 · [1차 시간표 / 2차 시간표 / 일정 취합] 전환 탭 · 채용 차수
2. **1차 시간표**: 날짜 버튼 → 시간표(시각 | 서울 회의실 | 인천 회의실, 점심·쉬는 시간 줄 표시) → 오른쪽에 편성 완료 수·면접 일수, 날짜·회의실별 인원 막대, 규칙 진행 막대, Claude Code 점검 카드
3. **2차 시간표**: 면접관 4명 표시 → 시각별 조(3명) 카드 → 오른쪽에 1차·2차 모양 비교표, 학교 분포 막대, 연속 진행 게이지
4. **일정 취합**: KPI 4개(대상·회신·미회신·가장 많이 가능한 날) → 합친 가능 일정 표 → 날짜별 가능 인원 히트맵·회신 누적 선 그래프 → 회신 도넛·리마인더 미리보기
5. 그래프에 **마우스를 올리면 수치가 말풍선으로** 보이고, 카드에 마우스를 올리면 그래프가 다시 채워지는 애니메이션

## 5. 데이터 — 파일과 항목 (모두 가상 데이터)
| 파일 | 항목 |
|---|---|
| `data/applicants.csv` | 지원자ID, 이름, 학교, 학과, 지원직무, 면접지역(서울/인천), 이메일 (72행) |
| `data/availability.csv` | 지원자ID, 이름, 11/17(화), 11/18(수), 11/19(목), 11/20(금) (가능/불가), 회신일, 회신상태(회신/미회신) (72행) |
| `data/interviewers.csv` | 면접관ID, 이름, 부서, 직급, 면접차수(1차/2차), 면접지역 (12행) |

**편성 규칙** (앱이 계산 — 엑셀에서 손으로 하던 것)
1. 회의실 2곳: 서울 회의실 · 인천 회의실. 지원자는 자기 `면접지역` 회의실에, `가능`인 날에만 배정
2. 30분 간격, 회의실 하루 최대 **15명**: 오전 09:00~11:30 (6명) → 점심 12:00~13:00 → 오후 13:00~15:30 (6명) → 쉬는 시간 16:00~16:30 → 16:30~17:30 (3명)
   (연속 6명 = 3시간을 넘기지 않게 블록 사이에 반드시 휴식)
3. 같은 시각 두 회의실에 **같은 학교**가 겹치지 않게, **같은 학교·같은 학과**는 한 회의실의 같은 블록(오전/오후/늦은 오후)에 넣지 않음
4. 가능한 날이 적은 지원자부터 먼저 배정(나중에 자리가 없어지는 것을 막음)
5. **1차 = 다:1** — 칸 하나에 지원자 1명(면접관 3명). **2차 = 다:다** — 칸 하나에 3명씩 한 조(면접관 4명), 같은 조에 같은 학교 없음
- 저장 위치: 브라우저 저장공간(localStorage) + CSV 파일. **외부 서버·데이터베이스를 쓰지 않습니다.**

## 6. AI 일은 Claude Code가 합니다
앱 안에서 AI를 부르지 않습니다(사내 기준: 별도 API 키 없음). 시간표 계산은 앱이 규칙으로 하고, Claude Code는:
1. 앱에서 내보낸 시간표 CSV와 `applicants.csv` 를 읽어 **규칙 위반 여부·인원이 적은 날 정리 방법·편성 사유**를 `check.md` 로 저장
2. 미회신자 8명에게 보낼 이름별 리마인더 문구를 `reminder.csv` (이름·이메일·제목·본문)로 저장 → 아웃룩에 붙여넣어 사용
3. 앱이 `check.md`·`reminder.csv` 를 읽어 «Claude Code 편성 점검» 카드와 리마인더 미리보기에 표시 — **메일은 실제로 보내지 않음**

## 7. 기술 원칙 (로컬 실행)
- 폴더 하나: `Test/interview-scheduler/` 안에 `index.html`, `style.css`, `app.js`, `data/`
- 순수 HTML·CSS·JavaScript. 외부 인터넷 주소(CDN·글꼴)를 불러오지 않음 — 드래그는 브라우저 기본 기능(드래그 앤 드롭)으로
- 실행: `python -m http.server 8765` → 브라우저에서 `http://localhost:8765`
- 결과물은 폴더째 zip으로 묶어 가져감. 인터넷에 올리지(배포하지) 않음

## 8. 원래 요청에서 조정한 부분
| 원래 요청 | 오늘은 이렇게 | 이유 |
|---|---|---|
| 일정 확인 메일·리마인더 자동 발송 | 메일 미리보기 + `reminder.csv` → 아웃룩에 붙여넣기 | 메일 발송에는 메일 서버 연동이 필요 |
| 회신을 자동으로 모아 합치기 | 회신을 모았다고 가정한 `availability.csv` 를 불러와 합친 표로 보기 | 메일함을 읽는 기능은 외부 연동이 필요 |
| AI가 최적 시간표를 짜기 | 앱이 규칙으로 편성 + Claude Code가 결과 점검·사유 설명 | 규칙 계산은 앱이 빠르고 정확, 앱 안 AI 호출에는 API 키가 필요 |

## 9. 완료 기준 (테스트)
- [ ] 일정 취합 탭에 대상 **72명**, 회신 **64명**, 미회신 **8명**(회신율 **88.9%**)이 표시되고, 11/17 가능 인원이 **52명**(서울 36 · 인천 16)이다
- [ ] 1차 자동 편성 후 회신자 **64명 전원**이 배정되고, 어느 회의실·날짜도 **15명을 넘지 않는다**(11/17 서울 15명 · 인천 15명)
- [ ] 같은 시각 두 회의실에 같은 학교가 **0건**, 한 회의실의 같은 블록에 같은 학교·학과가 **0건**이다
- [ ] 점심(12:00)과 쉬는 시간(16:00) 줄이 있고, 쉬지 않고 이어지는 면접은 **6명 이하**다
- [ ] 이름을 끌어 다른 칸에 놓으면 자리가 바뀌고, 새로고침(F5)해도 바뀐 자리가 남아 있다
- [ ] [2차]를 고르면 **3명씩 한 조** 시간표로 모양이 바뀌고, CSV로 내보낸 파일을 엑셀에서 열 수 있다

## 10. 다음 단계 (집에서 더 키울 것)
- 아웃룩 일정 초대 파일(.ics) 만들기
- 면접관별 평가표·지원자 안내문 자동 생성
- 엑셀 온라인 공유 문서·메일 연동은 사내 IT 검토 후

## 11. 웹앱·서버 버전 (교육 후, 사내 기준 확인 뒤)

편성 계산은 로컬판으로 충분합니다. 면접관 12명이 같은 시간표를 보거나 지원자가 가능 일정을 직접 입력하게 할 때만 웹앱으로 옮깁니다. **실제 지원자 정보는 사내 IT 승인 전에는 넣지 않습니다.**

| 구분 | 로컬판 | 웹앱판 |
|---|---|---|
| 입력 | 회신을 모은 CSV 불러오기 | 지원자가 링크로 가능 일정 직접 체크 |
| 저장 | 브라우저 저장공간 + CSV | Supabase 표 4개(지원자·가능 일정·면접관·시간표) |
| 화면 주소 | localhost (내 PC) | Vercel 주소 (모두 같은 주소) |
| 권한 | 없음 | 담당자만 편성·수정, 면접관은 보기만 |

- 로그인: Supabase 이메일 로그인. 담당자 계정은 «담당자» 역할 표시
- 잠금 설정: 로그인한 사람만 시간표 보기, 편성·수정은 담당자만, 지원자는 자기 가능 일정만 입력
- 편성 규칙(회의실 2곳·하루 15명·6명마다 휴식·30분 간격·같은 학교 분리)과 1차/2차 모양은 로컬판과 같게 유지
- 메일 발송·아웃룩 연동은 사내 IT 검토 후. 가상 데이터(data 폴더 CSV)로 먼저 시험

### 웹앱판 완료 기준
- [ ] 담당자 계정으로 자동 편성하면 회신자 64명 전원이 배정되고 하루 15명을 넘지 않는다
- [ ] 면접관 계정으로 로그인하면 시간표는 보이지만 자리를 바꿀 수 없다
- [ ] 담당자가 자리를 바꾸면 다른 PC(또는 휴대폰)의 시간표에도 바로 반영된다
- [ ] 로그인하지 않으면 지원자 이름·시간표가 보이지 않는다
