feat(804-7): 줄 쌓기 「수식」 탭 수정 2차(요구 687 · 688)
- 로직 삭제 = 서버 정본에서 바로(로직 줄 + 수식 문서 · `/logic/remove`) → 로직 목록 · 부르는 곳(다른 수식 문서 · 일위대가 조합 · M02 단가산출 바탕)이 있으면 확인 창 전에 막고 까닭(`/logic/users`) - 머리 단추 다섯 — [신규 로직] · [로직 복사/생성] · [로직 삭제] · [되돌림] · [저장] · [저장] 한 번 = 기본정보 + 수식 · [되돌림] = 둘 다 저장 뒤 상태 · 줄 쌓기 [고침 버림] · [수식 저장]은 M01 에서 걷음(M02 사본은 그대로) - 합계 상자 화면 아래 고정 · 원문 손잡이 브라우저 오른쪽 끝 - 왼쪽: 그룹 머리 한 줄(접어도 [+] · X 자리 그대로) · 「비우면 번호 없음」 · 가나다 체크 걷음 · 금액 줄 한 줄 배치 · 이름 단추 = 그 이름 찾은 찾기 창 · 수량 기호 = 값 + 출처 꼬리표 · [+] 메뉴(단가산출 · 율 · 식 · 근거 글 · 틀 찾기 걷음) · 식 글 눌러 그 자리 고침([식 고치기] 걷음) · 단위 = 공용 단위 고르기(친 글도 씀) · 만약 안 탄 갈래 숨김 - 오른쪽 기계 줄: 비목 수 링크 걷음 · 제목 줄 누름 = 시간당 경비 펼침 · 펼친 제목 보통 글 - 요소 키가 기호 이름으로 샌 것(`k_EQ0006`) — 변환기가 자원 이름으로(`k_하베스터`) · 수식 문서 다시 빌드(10 파일 · 78 기호 · 금액 같음) - 시험 페이지 `tools/line-stack-test` · main.py 마운트 · vite 프록시 · M01 왼쪽 「시험: 줄 쌓기」 걷음 - 단위 표준 표 읽기 = 로그인만(M02 일반 사용자 단위 목록) - 시험: test_804_7 새로 · 804_2 · 804_4 이음 글 고침(createStackScreen 줄 나뉨) · 552_3 여는 단추 기본 ⋯ 꼴로 고침(부르는 쪽이 [+] 로 바꿀 수 있음) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -143,3 +143,57 @@ def table(key: str) -> dict:
|
||||
rec = mr.Rec(ml.Links(store.loaded()[1], {}))
|
||||
rec.see_table(key)
|
||||
return rec.표[key]
|
||||
|
||||
|
||||
# ── 로직 지우기(804-7 · 요구 687-1) — 로직 줄 + 수식 문서를 서버 정본에서 함께 ──
|
||||
def users(key: str) -> list[str]:
|
||||
"""이 로직을 부르는 곳 — 다른 수식 문서(단가산출 연결) · 일위대가 조합 · M02 단가산출(바탕).
|
||||
다른 로직 줄이 부르는 것은 로직 저장 검사(422)가 막음."""
|
||||
from M01_MasterData import M01_MasterData_Store_Combo as combo_store
|
||||
from M02_MasterTemplete import M02_Template_Layers as layers # M02 가 M01 을 부름 — 늦게
|
||||
|
||||
out = []
|
||||
for k, d in docs().items():
|
||||
if k != key and any(
|
||||
(v.get("연결") or {}).get("갈래") == "단가산출"
|
||||
and str((v.get("연결") or {}).get("키")) == key
|
||||
for v in d.get("변수") or []
|
||||
):
|
||||
out.append(f"단가산출 {k} {d.get('이름') or ''}".strip())
|
||||
for c in combo_store.combos_of_logic(key)["combos"]:
|
||||
out.append(f"일위대가 조합 {c.get('키')} {c.get('이름') or ''}".strip())
|
||||
for where, path in layers.layer_files("sangeun"):
|
||||
try:
|
||||
sk = json.loads(path.read_bytes())
|
||||
except (OSError, ValueError):
|
||||
continue
|
||||
if str((sk.get("바탕") or {}).get("로직") or "") == key:
|
||||
out.append(f"M02 단가산출 {where} {sk.get('이름') or path.stem}")
|
||||
return out
|
||||
|
||||
|
||||
def drop(key: str) -> None:
|
||||
"""수식 문서 줄 하나 지움(없으면 그냥)."""
|
||||
name = _where(key)
|
||||
if not name:
|
||||
return
|
||||
path = folder() / name
|
||||
data = ml.load_file(path)
|
||||
data["줄"] = [d for d in data.get("줄") or [] if str(d.get("키")) != key]
|
||||
path.write_text(ml.dump(data), encoding="utf-8", newline="\n")
|
||||
_memo.clear()
|
||||
|
||||
|
||||
def remove(key: str, file: str, version: str, confirmed: bool) -> dict:
|
||||
"""로직 지우기 — 부르는 곳이 있으면 409 {쓰는곳} · 로직 저장 길(개정 확인 · 판 · 검사) 뒤 문서도."""
|
||||
from M01_MasterData import M01_MasterData_Store_Make as make
|
||||
|
||||
used = users(key)
|
||||
if used:
|
||||
raise store.StoreError(409, {"쓰는곳": used})
|
||||
got = make.save(
|
||||
[{"file": file, "version": version, "changes": [{"op": "delete", "key": key}]}],
|
||||
confirmed,
|
||||
)
|
||||
drop(key)
|
||||
return got
|
||||
|
||||
Reference in New Issue
Block a user