269e779129
- vacation_db 전용 저장소(VacationDBStore), VACATION_DB_URL 미설정 시 '설정 필요' 안내 - 월간 달력: 구글식 휴가 bar(주 단위 lane 배정), 일/공휴일 빨강·토요일 파랑 - 신청 폼: 종류/기간/시작·종료 구분(종일/오전/오후)/사유 + 예상 일수 미리보기 - 일수 계산은 서버(compute_days)에서 주말+공휴일(is_red) 제외 재계산 - 워크플로: 작성중/반려→제출→승인|반려, 취소 soft delete, 본인만 수정(작성중/반려) - 권한: vacation(접근)/vacation_approver(승인), admin 통과. 설정은 admin 전용 - 공휴일(vacation_holidays) DB 기반 provider + settings CRUD, 연차잔여(vacation_balances) - 엑셀 내보내기(openpyxl), scripts/sql/vacation_db_init.sql(멱등, 2026 공휴일 seed) - main.py 등록, 메뉴 ready 전환, docs/.env.example/CLAUDE.md 갱신 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
"""휴가 관리(vacation) 모듈.
|
|
|
|
라우터/저장소/템플릿을 한 디렉토리에서 관리한다.
|
|
- 라우터: `router.py` (FastAPI APIRouter, prefix=/vacation)
|
|
- 저장소: `db.py` (vacation_db / PostgreSQL 전용) + `store.py` (상수/일수 계산)
|
|
- 템플릿: `templates/vacation/`
|
|
|
|
데이터 저장은 vacation_db 전용이다. VACATION_DB_URL 미설정 시 build_vacation_store 는
|
|
None 을 반환하고, 라우터가 "설정 필요" 안내 페이지를 보여준다(앱은 죽지 않음).
|
|
|
|
권한:
|
|
- `vacation` : 휴가 관리 접근
|
|
- `vacation_approver` : 승인/반려 (admin 은 항상 통과)
|
|
"""
|
|
|
|
from typing import Any
|
|
|
|
from .router import router
|
|
from .store import HALF_LABELS, HALVES, STATUSES, VACATION_TYPES, compute_days
|
|
|
|
__all__ = [
|
|
"router",
|
|
"VACATION_TYPES",
|
|
"STATUSES",
|
|
"HALVES",
|
|
"HALF_LABELS",
|
|
"compute_days",
|
|
"build_vacation_store",
|
|
]
|
|
|
|
|
|
def build_vacation_store(*, dsn: str | None) -> Any:
|
|
"""VACATION_DB_URL 이 있으면 VacationDBStore, 없으면 None.
|
|
|
|
JSON 폴백을 두지 않는다(운영 데이터 분기 방지). None 이면 라우터가 안내 페이지 표시.
|
|
"""
|
|
if not dsn:
|
|
return None
|
|
from .db import VacationDBStore # 지연 import (개발 환경 deps 없을 수 있음)
|
|
|
|
return VacationDBStore(dsn)
|