- 새 M02_Hopyo_SkUnit: 줄 판정(Units 잇기 + 매개값 · 사용자 고름 {차례: 노임|기계|자재|기준|뺌} · 꼬리표 「내가 고름」) · 단가 = M01 지금 값으로 다시 셈(우리금액) · 엑셀 금액 차 = 참고 · 블록 판정 「옮길 수 있음」 | 「고를 줄 n」 · 단위 SK 더한줄 = 인력 · 기계경비 로직 줄 · 재료(손료율 든 수량 · 별도계상) · 율 줄(778-4 꼴 · 줄 목록 = 그 행 add:#k) · 하위 참조 · 값 고정 줄 · 저장 꼴로 다듬어 같은 내용 SK 지문 같음
- Sangeun: 기초 · SK · 고름 대기 갈림(SkPatch.plan) 걷고 단위 SK 하나 · 확인 [{번, 고름?}] 에 든 블록만 만듦 · 하위 단산 먼저 · 고를 줄 남으면 못만듦 · 일위대가 만들기가 부르는 Maker.plan(번) = 「확인 전」 고름 대기(자동 없음) · 별칭 제안 걷음(바탕 기초 없음)
- Router: sangeun 몸 바탕 → 확인(줄 수 그대로)
- 시험 새 뜻: test_729(기초 · SK · 고름 대기 · 계수 · 못옮김 잇기 · 729-5 차이 SK 바탕 길 = 바탕 없는 단위 SK 로 사라짐 → 확인 블록 단위 SK · 줄 고름 · 뺌으로 갈음) · test_718_1 · test_572 · test_779_2 · test_m02_hopyo_flow(확인 목록을 보내야 SK 생김 · 같은 파일 안 같은 내용 단위 SK 없을 수 있음 · 바탕 없는 SK = SC 에 참조 그대로)
- 새 test_778_5: 작업반장 = 건설업 · 규격 차례 무관 · 글자 규격 = 후보 · 손료율 · 설치비 · 제경비 율 줄 · 여덟 파일 줄 연결 표 · 확인 안 한 블록 안 만듦 · 고름 · 400 · 404 · 다시 올림 같은 SK 재사용 · 일위대가 확인 전 못 이음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
121 lines
6.5 KiB
Python
121 lines
6.5 KiB
Python
"""일위대가 불러오기 한시(PLAN 718-1 · 743-1) — 올림 지문 · [끝내기] 지움.
|
|
|
|
같은 엑셀 작업 중 다시 올림 = 그 파일 이어서(새 키 없음) · [끝내기] = HP · 격자 · 맞춤셈 캐시 0 ·
|
|
만든 일위대가 · 별칭 장부 그대로 · 끝낸 같은 엑셀 다시 올림 = 새 키(743-1 · 409 걷음) ·
|
|
옛 HP(지문 없음) = 파일 그대로 목록에서만 숨김 · 키 번 = 지운 뒤에도 다시 안 씀. 층 = 임시 폴더.
|
|
"""
|
|
|
|
import json
|
|
|
|
from M02_MasterTemplete import M02_Hopyo_Fit as fit
|
|
from M02_MasterTemplete import M02_Hopyo_Store as hs
|
|
from M02_MasterTemplete import M02_Template_Layers as layers
|
|
from resources.tester.test_m02_hopyo_excel import NORTH, URL, _post, client # noqa: F401
|
|
|
|
ALL = "/api/m02/layers/personal/hopyo-build-all"
|
|
|
|
|
|
def _keys(client):
|
|
return [r["키"] for r in client.get(URL.format("personal")).json()["줄"]]
|
|
|
|
|
|
def test_이어서_끝내기_지움_겹침_막음(client):
|
|
folder = layers.personal_dir(7, 42)
|
|
first = _post(client).json()
|
|
assert first["키"] == "HP-000001" and len(first["지문"]) == 64
|
|
again = _post(client).json()
|
|
assert again["키"] == "HP-000001" and again["이어서"] is True # 작업 중 같은 엑셀 = 새 키 없음
|
|
assert _keys(client) == ["HP-000001"]
|
|
made = client.post(ALL, json={"층": "personal", "키": "HP-000001"}).json()
|
|
n = len(made["만듦"]) # 729-2 — 남은 줄 있는 호표 = 실패(남은줄)
|
|
assert (
|
|
n
|
|
and n + len(made["실패"]) == 68
|
|
and all(x.get("남은줄") or x.get("하위") for x in made["실패"])
|
|
)
|
|
hs.remember(folder, {"장부 줄": {"갈래": "안 씀"}}) # 별칭 장부 = 끝내기 뒤 남음
|
|
cache = fit.cache_path(folder, "HP-000001")
|
|
cache.write_text("{}", encoding="utf-8")
|
|
old_cache = cache.with_name("_".join(cache.name.split("_")[:2]) + "_옛판_1.json")
|
|
old_cache.write_text("{}", encoding="utf-8")
|
|
sc_before = sorted((folder / "precombo").glob("SC-*.json"))
|
|
|
|
res = client.delete(URL.format("personal") + "/HP-000001")
|
|
assert res.status_code == 200 and res.json() == {"지움": "HP-000001", "만든": n}
|
|
assert not list((folder / hs.DIRNAME).glob("HP-*.json")) # 이번 HP 0
|
|
assert not list((folder / hs.DIRNAME / hs.GRID).glob("HP-*.json"))
|
|
assert not cache.exists() and not old_cache.exists()
|
|
assert hs.memory(folder) == {"장부 줄": {"갈래": "안 씀"}}
|
|
assert sorted((folder / "precombo").glob("SC-*.json")) == sc_before # 만든 일위대가 그대로
|
|
|
|
again = _post(client) # 743-1 — 끝낸 같은 엑셀 = 다시 올림 됨(새 키)
|
|
assert again.status_code == 200 and again.json()["키"] == "HP-000002"
|
|
assert _keys(client) == ["HP-000002"]
|
|
assert sorted((folder / "precombo").glob("SC-*.json")) == sc_before
|
|
|
|
|
|
def test_만든_것_없이_지움_다시_올림_키_번_안_되씀(client):
|
|
assert _post(client).json()["키"] == "HP-000001"
|
|
assert client.delete(URL.format("personal") + "/HP-000001").json()["만든"] == 0
|
|
got = _post(client) # 만든 것 없음 = 막지 않음 · 번은 이어서
|
|
assert got.status_code == 200 and got.json()["키"] == "HP-000002"
|
|
|
|
|
|
def test_옛_HP_목록에서만_숨김(client):
|
|
folder = layers.personal_dir(7, 42) / hs.DIRNAME
|
|
folder.mkdir(parents=True)
|
|
old = folder / "HP-000007.json"
|
|
old.write_text(json.dumps({"키": "HP-000007", "파일": "옛.xls", "호표": []}), encoding="utf-8")
|
|
assert _keys(client) == []
|
|
assert client.get("/api/m02/layers/personal/hopyo-picks").json()["줄"] == []
|
|
assert _post(client).json()["키"] == "HP-000008" # 옛 번 뒤로
|
|
assert old.is_file() and _keys(client) == ["HP-000008"]
|
|
|
|
|
|
def test_결과_단가산출_확인한_블록만_단위_SK_겹침_없음(client):
|
|
"""778-5 — 확인 없음 = 판정만 · 확인한 블록(옮길 수 있음)만 단위 SK · 같은 내용 한 벌 · 다시 = 그대로."""
|
|
folder = layers.personal_dir(7, 42)
|
|
assert _post(client).json()["키"] == "HP-000001"
|
|
url = URL.format("personal") + "/HP-000001/sangeun"
|
|
assert client.post(url).status_code == 409 # 729-1 — 맞춤 셈 전
|
|
fit.run_job(folder, "HP-000001")
|
|
got = client.post(url)
|
|
assert got.status_code == 200, got.text
|
|
got = got.json()
|
|
assert got["블록"] == len(got["판정"]) > 0 and got["만듦"] == [] and got["그대로"] == 0
|
|
good = [r["번"] for r in got["판정"] if not r["고를줄"]]
|
|
made = client.post(url, json={"확인": [{"번": n} for n in good]}).json()
|
|
assert sorted(x["번"] for x in made["만듦"]) == good and made["못만듦"] == []
|
|
docs = [json.loads(p.read_bytes()) for p in sorted((folder / "sangeun").glob("SK-*.json"))]
|
|
assert len(docs) + len(made["같은것씀"]) == len(made["만듦"]) # 같은 내용 SK 는 한 벌(733-1)
|
|
one = docs[0]
|
|
assert one["바탕"] is None and one["본뜬"]["키"].startswith("HP-000001 단산") # 단위 SK
|
|
assert one["구분"] == "실무자료" and one["단위"] and one["본뜬"]["갈래"] == "단위"
|
|
again = client.post(url).json() # 다시 = 그대로(겹침 없음)
|
|
assert again["만듦"] == [] and again["그대로"] == len(made["만듦"])
|
|
res = client.delete(URL.format("personal") + "/HP-000001").json()
|
|
assert res["만든"] == len(docs) # 같은 내용 SK 한 벌 — 사본 걷은 문서 수
|
|
assert len(list((folder / "sangeun").glob("SK-*.json"))) == len(docs) # 남음
|
|
assert _post(client).status_code == 200 # 743-1 — 다시 올림 됨
|
|
|
|
|
|
def test_판_다른_HP_지난_것():
|
|
"""776-2 — 읽기 꼴 판이 다르면(옛 판 · 판 없음) 막 올렸어도 지난 것(숨김 · 올림 때 끝냄)."""
|
|
now = {"올린때": "2999-01-01T00:00:00Z"}
|
|
assert hs.stale({**now, "판": hs.BOOK}, now=None) is False
|
|
assert hs.stale(now) and hs.stale({**now, "판": hs.BOOK - 1})
|
|
|
|
|
|
def test_판_다른_HP_열기_409_끝내기는_됨(client):
|
|
"""776-2 — 작업 중 옛 판 HP 를 열면 409 「다시 올림」 · [끝내기]는 옛 판도 지움."""
|
|
folder = layers.personal_dir(7, 42)
|
|
assert _post(client).json()["키"] == "HP-000001"
|
|
path = folder / hs.DIRNAME / "HP-000001.json"
|
|
doc = json.loads(path.read_bytes())
|
|
path.write_text(json.dumps({**doc, "판": hs.BOOK - 1}, ensure_ascii=False), encoding="utf-8")
|
|
res = client.get(URL.format("personal") + "/HP-000001")
|
|
assert res.status_code == 409 and res.json()["detail"] == hs.RELOAD
|
|
assert _keys(client) == [] # 목록 숨김
|
|
assert client.delete(URL.format("personal") + "/HP-000001").status_code == 200
|
|
assert not path.exists()
|