"""B08 수량 산출 라우터 — 셸 단계. 수량 본문은 미구현. 지금은 좌측 패널 [확정] 버튼이 워크플로 stage 5(QUANTITY)를 완료 처리해 B09 설계도서 진입을 여는 역할만 한다. 본문(B06 종횡단 기반 산출)을 구현할 때 이 라우터를 확장한다. """ import asyncio import logging from uuid import UUID from fastapi import APIRouter from fastapi.responses import JSONResponse from common_util.common_util_workflow_state import complete_stage from config.config_db import get_db_pool logger = logging.getLogger(__name__) router = APIRouter(prefix="/api/projects", tags=["B08 Quantity"]) @router.post("/{project_id}/quantity/confirm") async def confirm_quantity(project_id: UUID) -> JSONResponse: """수량 단계 확정 — stage 5(QUANTITY)를 COMPLETE로 전이한다 (본문 미구현). ⚠ 전이 전에 **아직 안 박힌 구조물도 양식을 프로젝트에 박음**(PLAN 4장) — 확정 뒤 프로그램 기본을 고쳐도 확정한 값이 안 흔들리게. 못 박으면 확정하지 않음. """ from B08_Quantity.B08_Quantity_Engine_StructureLibrary import pin_program_templates from B08_Quantity.B08_Quantity_Router_StructureSheet import _project_root project_root = await _project_root(project_id) try: if project_root is None: raise FileNotFoundError("프로젝트 저장 폴더 없음") await asyncio.to_thread(pin_program_templates, project_root) except Exception: logger.exception("B08 수량 확정 실패(양식 박기): project_id=%s", project_id) return JSONResponse( status_code=500, content={"status": "error", "message": "구조물도 양식을 프로젝트에 박지 못했습니다."}, ) pool = get_db_pool() async with pool.acquire() as connection: try: async with connection.cursor() as cursor: await complete_stage(cursor, str(project_id), 5) await connection.commit() except Exception: await connection.rollback() logger.exception("B08 수량 확정 실패: project_id=%s", project_id) return JSONResponse( status_code=500, content={"status": "error", "message": "수량 단계 확정에 실패했습니다."}, ) return JSONResponse(content={"status": "success", "project_id": str(project_id)})