"""M02 단가산출(SK) 셈 길(PLAN 715-1b) — `POST /api/m02/layers/{층}/sangeun/calc` · [단가산출로 저장](715-3) `POST /api/m02/layers/{층}/sangeun/from-line`(층 쓰기 권한). 저장 안 함 · 로그인 사용자 · 층 읽기 권한(`Router_Items._root`) · 화면은 최신 응답만. 몸 = `문서`(저장 전 화면 문서) 또는 `키`(그 층 저장본) + `입력값`(열린입력 · 시험 값). 문서 읽기 · 쓰기 · 새로 · 복사 · 지우기는 양식 길 · 서고 길 그대로(종류 `sangeun`). ⚠ 등록은 `main.py`(로그인만). """ from __future__ import annotations from typing import Any from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from common_util.common_util_auth import verify_session from M02_MasterTemplete import M02_MasterTemplete_Store as store from M02_MasterTemplete import M02_Sangeun_Calc as calc from M02_MasterTemplete import M02_Sangeun_Doc as sd from M02_MasterTemplete.M02_MasterTemplete_Router_Items import Layer, Session, _call, _root router = APIRouter(prefix="/api/m02", tags=["M02 MasterTemplete Sangeun"]) class SangeunCalcBody(BaseModel): 문서: dict[str, Any] | None = None 키: str | None = None 입력값: dict[str, Any] | None = None def _calc(body: SangeunCalcBody) -> dict[str, Any]: doc = body.문서 if doc is None: if not sd.KEY.match(str(body.키 or "")): raise store.StoreError(400, "문서 또는 키(SK-######)") doc = store.read(sd.KIND, str(body.키))["문서"] return calc.calc_doc(doc, body.입력값) class FromLineBody(BaseModel): 줄: dict[str, Any] 이름: str 단위: str @router.post("/layers/{layer}/sangeun/from-line") def sangeun_from_line( layer: Layer, body: FromLineBody, owner: str | None = None, session: Session = Depends(verify_session), ) -> dict: """[단가산출로 저장](715-3) — 일위대가 줄 → 그 층 새 단가산출 · 답 = 새 키 + 바꿀 참조 줄.""" folder = _root(session, layer, owner, write=True) return _call(folder, calc.from_line, body.줄, body.이름, body.단위) @router.post("/layers/{layer}/sangeun/calc") def calc_sangeun( layer: Layer, body: SangeunCalcBody, owner: str | None = None, session: Session = Depends(verify_session), ) -> dict: """단가산출 셈 — 줄(cid · 덮개 · 원값) · 기준 · 1단위 · 짝잃음(저장 안 함).""" if body.문서 is None and body.키 is None: raise HTTPException(status_code=400, detail="문서 또는 키") return _call(_root(session, layer, owner), _calc, body)