"""M02 단가산출(SK) 수식 탭 화면 몫(PLAN 802-4b-2 · 요구 660~665) — M01 수식 문서 화면과 같은 꼴. - 연결 기록 `record(사본)` — 사본 셈이 쓴 요소 값 · 표 · 단가산출 문서(끊음 먼저)를 화면 캐시로 (화면 = 같은 계산기로 즉시 셈 · `M02_Doc_Sk_Path.answer` 가 `연결` 칸으로 붙임) - 연결 후보 · 표 하나 = M01 수식 문서 화면 것(`M01_MasterData_Doc`) 그대로 — 로그인 · 층 읽기 권한 POST /api/m02/layers/{층}/sangeun/{키}/doc/links {갈래, 검색, 분류} → {후보, 더있음} GET /api/m02/layers/{층}/sangeun/{키}/doc/table?key=<표 키> → 표(조건 · 칸)(M01 길 꼴) - 줄 쌓기 복사(804-4) — M01 단가산출 · 위 층 SK · SC 를 복사할 조각(`M02_Doc_Take.take`) GET /api/m02/layers/{층}/sangeun/{키}/doc/take?src= → {이름, 출처, 조각, 계?} ⚠ 등록은 `main.py`(로그인만 · 층 권한은 길 안에서). """ from __future__ import annotations import json 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_Doc_Copy as dc from M02_MasterTemplete.M02_MasterTemplete_Router_Items import Layer, Session, _call, _root router = APIRouter(prefix="/api/m02", tags=["M02 MasterTemplete Sangeun Doc Screen"]) def record(copy: dict) -> dict[str, Any]: """사본 문서 셈이 쓴 연결 기록 — 값 사본 색인 위 · 부름(끊음 먼저) 문서.""" import master_doc_record as mr # `M02_Doc_Copy` 가 scripts 를 길에 둔 뒤 rec = mr.Rec(dc.ml.Links(dc.over(copy), dc.docs_of(copy))) try: rec.prefetch(copy["문서"]) dc.mc.calc(copy["문서"], rec) except dc._ERR: # 셈 틀림 = 셈 답 표지(`dc.run`) — 기록은 모은 데까지 pass return rec.out() class LinksBody(BaseModel): 갈래: str 검색: str = "" 분류: str = "인력" def _m01_doc(): from M01_MasterData import M01_MasterData_Doc as m01_doc return m01_doc @router.post("/layers/{layer}/sangeun/{sk}/doc/links") def doc_links( layer: Layer, sk: str, body: LinksBody, owner: str | None = None, session: Session = Depends(verify_session), ) -> dict: return _call(_root(session, layer, owner), _m01_doc().candidates, body.model_dump()) @router.get("/layers/{layer}/sangeun/{sk}/doc/table") def doc_table( layer: Layer, sk: str, key: str, owner: str | None = None, session: Session = Depends(verify_session), ) -> dict: return _call(_root(session, layer, owner), _m01_doc().table, key) @router.get("/layers/{layer}/sangeun/{sk}/doc/take") def doc_take( layer: Layer, sk: str, src: str, owner: str | None = None, session: Session = Depends(verify_session), ) -> dict: from M02_MasterTemplete import M02_Doc_Take as take got = _call(_root(session, layer, owner), take.take, src) return json.loads(json.dumps(dc.ml._norm(got), ensure_ascii=False, default=str))