"""M02 일위대가 계산 · 알약 길(PLAN 39-1a · 설계_정함 1장) — `/api/m02/layers/{층}/labor/{열}/…`. 문서 읽기 · 쓰기는 양식 길(`GET/PUT /api/m02/layers/{층}/templates/labor/{열}`) 그대로 · 여기는 저장하지 않는 셈만. 층 권한 = `Router_Items._root`(읽기 권한 · `M02_Layer_Access` 한 벌). ⚠ 등록은 `main.py`(로그인만). """ from __future__ import annotations from typing import Any from fastapi import APIRouter, Depends from pydantic import BaseModel from common_util.common_util_auth import verify_session from M02_MasterTemplete import M02_Labor_Doc as labor from M02_MasterTemplete import M02_MasterTemplete_Store as store from M02_MasterTemplete.M02_MasterTemplete_Router_Items import Layer, Session, _call, _root router = APIRouter(prefix="/api/m02", tags=["M02 MasterTemplete Labor"]) class CalcBody(BaseModel): """`doc` = 저장 전 화면 문서(없으면 저장본) · `수량` = {알약 키: 값}(없으면 저장된 면적산출).""" doc: dict[str, Any] | None = None 수량: dict[str, Any] | None = None def _doc(column: str, sent: dict[str, Any] | None) -> dict[str, Any]: got = sent if sent is not None else store.read("labor", column)["문서"] return labor.clean({**got, "열": column}) def _calc(column: str, body: CalcBody) -> dict[str, Any]: doc = _doc(column, body.doc) return {**labor.calc(doc, body.수량), "알약": labor.pills(doc)} def _pills(column: str) -> dict[str, Any]: return {"열": column, "알약": labor.pills(_doc(column, None))} @router.post("/layers/{layer}/labor/{column}/calc") def calc_labor( layer: Layer, column: str, body: CalcBody, owner: str | None = None, session: Session = Depends(verify_session), ) -> dict: """줄마다 기준 · 반영 · 합 + 알약(저장 안 함 · 화면은 최신 응답만).""" return _call(_root(session, layer, owner), _calc, column, body) @router.get("/layers/{layer}/labor/{column}/pills") def labor_pills( layer: Layer, column: str, owner: str | None = None, session: Session = Depends(verify_session), ) -> dict: """면적산출 알약 — 로직 물량 알약 「이름|단위」 + 자재 알약 「자재|MT키」(저장본).""" return _call(_root(session, layer, owner), _pills, column)