"""말레이시아 TikTok 출고관리(dispatch) 모듈. 라우터/저장소/파서/템플릿을 한 디렉토리에서 관리한다. - 라우터: `router.py` (FastAPI APIRouter, prefix=/dispatch) - 저장소: `db.py` (dispatch_db / PostgreSQL 전용) - 파서: `parser.py` (TikTok Order Export XLSX → 박스 묶기, openpyxl) - 순수 로직: `store.py` (컬럼 정규화/박스 묶기/SKU 합산/상태 상수) - 템플릿: `templates/dispatch/` 데이터 저장은 dispatch_db 전용이다. DISPATCH_DB_URL 미설정 시 build_dispatch_store 는 None 을 반환하고, 라우터가 "설정 필요" 안내 페이지를 보여준다(앱은 죽지 않음). 업로드 원본 파일은 DATA_DIR/dispatch/<날짜>/<배치>/ 아래에 저장하고, DB 에는 경로만 기록한다. 고객 이름/주소/전화 등 개인정보는 저장하지 않는다. """ from typing import Any from . import store from .parser import ParseError, parse_order_export from .router import router from .store import STATUS_FIELDS, STATUS_LABELS, group_parcels, sku_summary __all__ = [ "router", "store", "STATUS_FIELDS", "STATUS_LABELS", "group_parcels", "sku_summary", "parse_order_export", "ParseError", "build_dispatch_store", ] def build_dispatch_store(*, dsn: str | None) -> Any: """DISPATCH_DB_URL 이 있으면 DispatchStore, 없으면 None. JSON 폴백을 두지 않는다(운영 데이터 분기 방지). None 이면 라우터가 안내 표시. """ if not dsn: return None from .db import DispatchStore # 지연 import (개발 환경 deps 없을 수 있음) return DispatchStore(dsn)