"""B02_ProjRegister FastAPI 라우터.""" from typing import Any from fastapi import APIRouter, Depends, HTTPException, Request from B01_Dashboard.B01_Dashboard_Repository_Members import check_project_refs from common_util.common_util_auth import require_company from .B02_ProjRegister_Repository import create_project from .B02_ProjRegister_Schema import CreateProjectRequest, CreateProjectResponse router = APIRouter(prefix="/api/b02", tags=["B02_ProjRegister"]) @router.post("/project", response_model=CreateProjectResponse) async def post_project( request: Request, payload: CreateProjectRequest, session: dict[str, Any] = Depends(require_company), ) -> CreateProjectResponse: """신규 프로젝트를 생성한다.""" company_id = session.get("company_id") if company_id is None: raise HTTPException(status_code=403, detail="회사 연결이 필요합니다.") title_block = payload.model_dump( include={ "client_org", "project_number", "work_amount", "design_date", "pm_user_id", "field_lead_user_id", "designer_user_id", "logo_asset_id", "route_start_m", "route_end_m", } ) # 시작이 종료보다 뒤면 남는 구간이 없다 — 저장 전에 막는다 (2026-09-04 사용자 지시). start_m, end_m = payload.route_start_m, payload.route_end_m if start_m is not None and end_m is not None and start_m >= end_m: raise HTTPException( status_code=400, detail="노선 시작 누가거리는 종료 누가거리보다 작아야 합니다.", ) # 담당자·로고는 같은 회사 것만 (B01 프로젝트 수정과 같은 규칙). await check_project_refs(int(company_id), title_block) try: result = await create_project( request=request, user_id=int(session["user_id"]), company_id=int(company_id), name=payload.name.strip(), region=payload.region.strip(), road_type=payload.road_type, project_year=payload.project_year, estimated_length_m=payload.estimated_length_m, memo=payload.memo.strip() if payload.memo else None, title_block=title_block, ) return CreateProjectResponse(**result) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc except Exception as exc: raise HTTPException( status_code=500, detail="프로젝트 생성 처리 중 오류가 발생했습니다." ) from exc