"""별칭 장부 중앙 관리(PLAN 739-1 · `M02_Hopyo_Ledger` · `M01_MasterData_Alias`) — 자동 짝 = 마스터(승인) · 이 불러오기에서 이은 짝만 · 회사 · 개인 층 짝 = 「내 제안」(자동 0 · 꼬리표 · 고르기 맨 위 `제안`) · 이은 짝 → 층 장부(불러오기 표시) → M01 후보 · 승인 뒤 다음 불러오기 자동 · 장부 화면 승인 상태(대기 · 승인 · 반려) · master_data 원본 그대로. 층 · storage 는 임시 폴더. """ from M01_MasterData import M01_MasterData_Alias as alias from M02_MasterTemplete import M02_Hopyo_Ledger as ledger from M02_MasterTemplete import M02_Template_Layers as layers # 올리기 길 시험의 `client` 마당(임시 storage · 마스터 층)을 같이 씀 # ruff: noqa: F811 from resources.tester.test_m02_hopyo_excel import URL, _post, client, master_hash # noqa: F401 DIG = {"이름": "구조물터파기(인력100%)", "규격": "토사", "단위": "㎥"} DIG_KEY = "구조물터파기(인력100%)|토사|m3" WHO = {"id": 42, "이름": "갑"} ADMIN = {"id": 1, "이름": "관리자"} LEDGER = "/api/m02/layers/{}/hopyo-ledger" FROM_LEDGER = ("별칭", "뺌") # 장부가 자동으로 정한 줄 상태 def _pair(code): return ledger.check(DIG_KEY, {"갈래": "짝", "짝": [{"로직": code, "배": 1}]}) def _candidate(key, code): got = [ x for x in alias.gather()["후보"] if x["열쇠"] == key and x["종류"] == alias.ALIAS and x["짝"][0]["로직"] == code ] assert len(got) == 1, got return got[0] def test_장부_층_짝은_제안_이_불러오기_짝은_자동_승인_뒤_모두_자동(client): before = master_hash() mine = layers.personal_dir(7, 42) here = ledger.doc_id(mine, "HP-000001") assert here == "personal/7/42/HP-000001" ledger.write(mine, {DIG_KEY: _pair("GF000101")}, WHO, "가.xls", here) got = ledger.recall(DIG, mine, doc=here) assert (got["층"], got["제안"]) == ("personal", False) # 이 불러오기에서 이은 짝 = 바로 씀 later = ledger.doc_id(mine, "HP-000002") # 다음 불러오기 for doc in (later, None): got = ledger.recall(DIG, mine, doc=doc) assert (got["층"], got["짝"][0]["로직"], got["제안"]) == ("personal", "GF000101", True) ledger.put(mine, {DIG_KEY: {**_pair("GF000101"), "엑셀조항": []}}, WHO) # 장부 화면 고침 assert ledger.read(mine)[DIG_KEY]["불러오기"] == here # 이은 불러오기 표시는 남음 assert [r["상태"] for r in ledger.rows(mine, True)] == ["대기"] # M01 후보에 보임 → 승인 → 마스터 → 다음 불러오기 · 다른 회사 새 사용자도 자동 sig = _candidate(DIG_KEY, "GF000101")["서명"] alias.approve(alias.ALIAS, DIG_KEY, sig, ADMIN) for folder, doc in ((mine, later), (layers.personal_dir(9, 99), None)): got = ledger.recall(DIG, folder, doc=doc) assert (got["층"], got["짝"][0]["로직"], got["제안"]) == ("system", "GF000101", False) assert [(r["층"], r["상태"]) for r in ledger.rows(mine, True)] == [ ("personal", "승인"), ("system", "승인"), ] # 다른 짝 제안 → 반려 = 상태 반려 · 여전히 내 제안(자동 아님) other = layers.personal_dir(7, 43) ledger.write(other, {DIG_KEY: _pair("GF000103")}, {"id": 43}, "나.xls") alias.reject(alias.ALIAS, DIG_KEY, _candidate(DIG_KEY, "GF000103")["서명"], ADMIN) assert ledger.rows(other, True)[0]["상태"] == "반려" got = ledger.recall(DIG, other) assert (got["층"], got["짝"][0]["로직"]) == ("system", "GF000101") # 자동 = 마스터 assert master_hash() == before def _hopyo(client, no): res = client.get(f"{URL.format('personal')}/HP-000001/{no}") assert res.status_code == 200, res.text return res.json()["호표"] def _lines(client, no): return {one["이름"]: one["맞춤"] for one in _hopyo(client, no)["줄"]} def _auto(client, no): """장부가 자동으로 정한 줄 수.""" return sum(1 for m in _lines(client, no).values() if m["상태"] in FROM_LEDGER)