- Add main application files (main.py, models.py, schemas.py, etc.) - Add routers for all features (waiting, attendance, members, etc.) - Add HTML templates for admin and user interfaces - Add migration scripts and utility files - Add Docker configuration - Add documentation files - Add .gitignore to exclude database and cache files 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
188 lines
6.3 KiB
Markdown
188 lines
6.3 KiB
Markdown
# 대기자 관리 화면 평일/주말 클래스 구분 수정 완료
|
|
|
|
## 문제점
|
|
|
|
평일/주말 클래스 구분이 적용된 후, 대기자 관리 화면에서 오늘 요일에 운영되지 않는 클래스도 표시되는 문제 발생
|
|
|
|
**예시:**
|
|
- 오늘이 토요일인데 평일 클래스(월-금)도 표시됨
|
|
- 오늘이 월요일인데 주말 클래스(토-일)도 표시됨
|
|
|
|
## 수정 내용
|
|
|
|
### 1. 백엔드 수정 - [routers/waiting.py](routers/waiting.py:343-363)
|
|
|
|
#### `/api/waiting/list/by-class` 엔드포인트 수정
|
|
**변경 전:**
|
|
```python
|
|
classes = db.query(ClassInfo).filter(
|
|
ClassInfo.is_active == True,
|
|
ClassInfo.store_id == current_store.id
|
|
).order_by(ClassInfo.class_number).all()
|
|
```
|
|
|
|
**변경 후:**
|
|
```python
|
|
# 모든 활성 클래스 조회
|
|
classes_raw = db.query(ClassInfo).filter(
|
|
ClassInfo.is_active == True,
|
|
ClassInfo.store_id == current_store.id
|
|
).order_by(ClassInfo.class_number).all()
|
|
|
|
# 헬퍼 함수를 사용하여 오늘 요일에 맞는 클래스만 필터링
|
|
classes = filter_classes_by_weekday(classes_raw, business_date)
|
|
```
|
|
|
|
**효과:**
|
|
- 대기자 관리 화면의 클래스 탭에 오늘 운영하는 클래스만 표시
|
|
- `filter_classes_by_weekday()` 함수는 이미 waiting.py에 정의되어 있음
|
|
|
|
### 2. 프론트엔드 수정 - [templates/manage.html](templates/manage.html)
|
|
|
|
#### 요일 필터링 함수 추가 (lines 472-501)
|
|
```javascript
|
|
// 요일 매핑
|
|
const WEEKDAY_MAP = {
|
|
0: "mon", // Monday
|
|
1: "tue", // Tuesday
|
|
2: "wed", // Wednesday
|
|
3: "thu", // Thursday
|
|
4: "fri", // Friday
|
|
5: "sat", // Saturday
|
|
6: "sun" // Sunday
|
|
};
|
|
|
|
// 오늘 요일에 맞는 클래스만 필터링
|
|
function filterClassesByToday(classList) {
|
|
const today = new Date();
|
|
const weekday = WEEKDAY_MAP[today.getDay()];
|
|
|
|
return classList.filter(cls => {
|
|
// weekday_schedule이 없으면 모든 요일 운영으로 간주
|
|
if (!cls.weekday_schedule) {
|
|
return true;
|
|
}
|
|
|
|
const schedule = typeof cls.weekday_schedule === 'string'
|
|
? JSON.parse(cls.weekday_schedule)
|
|
: cls.weekday_schedule;
|
|
|
|
// 해당 요일이 활성화되어 있으면 포함
|
|
return schedule[weekday] === true;
|
|
});
|
|
}
|
|
```
|
|
|
|
#### updateClassCounts() 함수 수정 (line 633-634)
|
|
**변경 전:**
|
|
```javascript
|
|
const allActiveClasses = await fetch('/api/classes/', { headers: getHeaders() }).then(r => r.json());
|
|
allActiveClasses.forEach(cls => {
|
|
```
|
|
|
|
**변경 후:**
|
|
```javascript
|
|
const allActiveClasses = await fetch('/api/classes/', { headers: getHeaders() }).then(r => r.json());
|
|
// 오늘 요일에 운영되는 클래스만 필터링
|
|
const todayClasses = filterClassesByToday(allActiveClasses);
|
|
todayClasses.forEach(cls => {
|
|
```
|
|
|
|
**효과:**
|
|
- 마감된 교시 중 대기자가 없는 클래스를 추가할 때도 오늘 운영하는 클래스만 추가
|
|
|
|
### 3. 프론트엔드 수정 - [templates/reception.html](templates/reception.html)
|
|
|
|
#### 요일 필터링 함수 추가 (lines 257-286)
|
|
동일한 `WEEKDAY_MAP`과 `filterClassesByToday()` 함수 추가
|
|
|
|
#### loadWaitingStatus() 함수 수정 (line 330-332)
|
|
**변경 전:**
|
|
```javascript
|
|
const classesResponse = await fetch('/api/classes/', {
|
|
headers: getHeaders()
|
|
});
|
|
const classes = await classesResponse.json();
|
|
```
|
|
|
|
**변경 후:**
|
|
```javascript
|
|
const classesResponse = await fetch('/api/classes/', {
|
|
headers: getHeaders()
|
|
});
|
|
const allClasses = await classesResponse.json();
|
|
// 오늘 요일에 운영되는 클래스만 필터링
|
|
const classes = filterClassesByToday(allClasses);
|
|
```
|
|
|
|
**효과:**
|
|
- 마지막 교시 정원 체크 시 오늘 운영하는 클래스 중에서만 마지막 교시 판단
|
|
- 주말에는 주말 클래스 중 마지막 교시, 평일에는 평일 클래스 중 마지막 교시
|
|
|
|
## 동작 방식
|
|
|
|
### 백엔드 필터링 (routers/waiting.py)
|
|
1. 데이터베이스에서 모든 활성 클래스 조회
|
|
2. `filter_classes_by_weekday(classes, business_date)` 호출
|
|
3. business_date의 요일을 확인 (월=0, 화=1, ..., 일=6)
|
|
4. 각 클래스의 `weekday_schedule` JSON 파싱
|
|
5. 해당 요일이 `true`인 클래스만 반환
|
|
|
|
### 프론트엔드 필터링 (manage.html, reception.html)
|
|
1. API에서 모든 활성 클래스 조회
|
|
2. `filterClassesByToday(classList)` 호출
|
|
3. 현재 날짜의 요일 확인
|
|
4. 각 클래스의 `weekday_schedule` 파싱
|
|
5. 해당 요일이 `true`인 클래스만 반환
|
|
|
|
## 검증 방법
|
|
|
|
### 1. 평일 테스트 (월-금)
|
|
```bash
|
|
# 데이터베이스에서 평일 클래스 확인
|
|
sqlite3 waiting_system.db "SELECT id, class_name, class_type, weekday_schedule FROM class_info WHERE is_active = 1;"
|
|
```
|
|
|
|
**예상 결과:**
|
|
- 대기자 관리 화면: 평일 클래스(weekday)와 전체 클래스(all)만 표시
|
|
- 주말 클래스(weekend)는 표시되지 않음
|
|
|
|
### 2. 주말 테스트 (토-일)
|
|
**예상 결과:**
|
|
- 대기자 관리 화면: 주말 클래스(weekend)와 전체 클래스(all)만 표시
|
|
- 평일 클래스(weekday)는 표시되지 않음
|
|
|
|
### 3. API 테스트
|
|
```bash
|
|
# 대기자 관리 화면에서 사용하는 API
|
|
curl -H "Cookie: access_token=..." http://localhost:8000/api/waiting/list/by-class
|
|
|
|
# 반환되는 클래스들의 weekday_schedule 확인
|
|
# 오늘 요일이 활성화된 클래스만 포함되어야 함
|
|
```
|
|
|
|
## 영향 범위
|
|
|
|
### 수정된 파일
|
|
1. ✅ `routers/waiting.py` - 백엔드 API 엔드포인트
|
|
2. ✅ `templates/manage.html` - 대기자 관리 화면
|
|
3. ✅ `templates/reception.html` - 대기 접수 화면
|
|
|
|
### 영향받지 않는 기능
|
|
- ✅ 대기 등록: 이미 `filter_classes_by_weekday()` 사용 중
|
|
- ✅ 대기 현황판: 이미 `filter_classes_by_weekday()` 사용 중
|
|
- ✅ 클래스 관리: class_type별 필터링 이미 지원
|
|
|
|
## 결론
|
|
|
|
**평일/주말 클래스 구분이 전체 시스템에 완벽하게 적용되었습니다:**
|
|
|
|
1. ✅ 데이터베이스: class_type과 weekday_schedule로 구분 저장
|
|
2. ✅ 클래스 관리: 평일/주말/전체 타입별 생성 및 조회
|
|
3. ✅ 대기 등록: 오늘 요일에 맞는 클래스에만 배정
|
|
4. ✅ 대기 현황판: 오늘 요일에 운영하는 클래스만 표시
|
|
5. ✅ 대기자 관리: 오늘 요일에 운영하는 클래스만 표시
|
|
6. ✅ 대기 접수: 오늘 요일에 운영하는 클래스만 고려
|
|
|
|
**모든 화면에서 오늘 요일에 맞는 클래스만 표시되고 작동합니다.**
|