Files

74 lines
3.1 KiB
Python

"""Build read-only REA sample inputs and expected stored values; does not run EST."""
import json
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
ANALYSIS = ROOT / "resources/knowledge/original/경쟁사 프로그램/EST Plus 2/REA 분석"
SOURCE = ANALYSIS / "07_수치검증_작업자료_20261025"
DETAIL = ANALYSIS / "09_수식집계_변경저장_추적_20261029"
def read(path):
return json.loads(path.read_text(encoding="utf-8-sig"))
def convert(value):
if isinstance(value, dict) and "decimal" in value:
return float(value["decimal"])
return value
def build():
tables = {}
for path in SOURCE.glob("*.decoded_candidates.json"):
key = path.name.split(".")[0]
tables[key] = [r["values"] for r in read(path)["rows"]]
wonga = read(DETAIL / "WongaDat_memory_table_candidate_rows.json")
table = next(t for t in wonga["tables"] if t["source"].endswith("_1_decompressed.bin"))
tables["Wonga"] = [{k: convert(v) for k, v in row["values"].items()} for row in table["rows"]]
sample = {
"schema": "est-web-2",
"name": "EST REA 보관 샘플",
"tables": tables,
"options": {"TotalFix": True, "VerFormat": True, "SourceRefresh": False},
"quantities": [],
"progress": [],
"annual": [],
"drawings": [],
"evidence": "REA 저장 샘플. 물리 슬롯의 활성 여부 및 원본 실행 동등성은 별도 검증 대상.",
}
target = Path(__file__).parent / "sample.json"
target.write_text(json.dumps(sample, ensure_ascii=False, allow_nan=False), encoding="utf-8")
expected = {
"qualification": "기존 REA 분석의 저장값. 웹앱 계산값으로 정답을 만들지 않음.",
"machine": read(DETAIL / "machine_sample_formula_reconstruction_check.json"),
"head_est": read(DETAIL / "head_est_sample_rule_check.json"),
"linedata": read(DETAIL / "linedata_sample_precision_check.json"),
"wonga": read(DETAIL / "sample_wonga_Gubun_formula_candidate_check.json"),
}
for check in expected["head_est"]["head"]:
candidates = []
for slot, row in enumerate(tables["HeadMainDat"]):
if row.get("Name") != check.get("Name") or (
"Code" in check and row.get("Code") != check["Code"]
):
continue
if all(
abs((row.get(key) or 0) - value) < 1e-6 for key, value in check["stored"].items()
):
candidates.append(slot)
if not candidates:
raise ValueError(f"head sample identity not found: {check}")
check["source_slot"] = candidates[0]
fixture = ROOT / "resources/tester/fixtures/est_rea_expected.json"
fixture.write_text(json.dumps(expected, ensure_ascii=False, allow_nan=False), encoding="utf-8")
(Path(__file__).parent / "parity.json").write_text(
json.dumps(expected, ensure_ascii=False, allow_nan=False), encoding="utf-8"
)
print(f"sample: {sum(map(len, tables.values()))} records, {len(tables)} tables")
if __name__ == "__main__":
build()