Merge remote-tracking branches 'origin/sub_laptop_1', 'origin/sub_laptop_2' and 'origin/sub_laptop_3' into main_laptop_1

This commit is contained in:
2026-09-24 10:10:00 +09:00
5 changed files with 66 additions and 4 deletions
+21 -2
View File
@@ -352,11 +352,29 @@ def _shares(line: dict) -> list[tuple[str, Decimal]]:
return [(part, money) for part, money in parts if money != 0] or parts[:1]
def _loose(node, env: dict, master) -> bool:
"""수량식 맨 위가 덧셈·뺄셈이면(곱 뒤에 오면 괄호가 필요함) · 만약은 걸린 갈래 기준."""
if node[0] == "bin":
return _PREC[node[1]] < _PREC["*"]
if node[0] == "call" and node[1] == "만약":
try:
at = 1 if mf.evaluate(node[2][0], env, master, 0) else 2
except _CALC_ERRORS:
return False # 이름 꼴은 「만약(…)」 부르기 그대로라 괄호 불필요
return _loose(node[2][at], env, master)
return False
def _times(text: str, item: dict, env: dict, master) -> str:
"""「단가 * 수량식」 의 수량식 — 덧셈·뺄셈 묶음이면 괄호."""
return f"({text})" if _loose(mf.parse(item["수량"]), env, master) else text
def _line_text(item: dict, line: dict, env: dict, master, part: str | None) -> str:
"""「단가 * 수량식 = 금액」 — 비목이 나뉜 로직 줄은 그 비목 몫만 · 빈 줄(금액 null)은 빈 글."""
if line["금액"] is None:
return ""
qty = render(mf.parse(item["수량"]), env, master)
qty = _times(render(mf.parse(item["수량"]), env, master), item, env, master)
money = line["비목"][part] if part else line["금액"]
price = line["단가"] if part is None or line["수량"] == 0 else money / line["수량"]
return f"{fmt_money(price)} * {qty} = {fmt_money(money)}"
@@ -368,7 +386,8 @@ def _line_names(item: dict, line: dict, env: dict, master, part: str | None, nam
tail = PRICE_TAIL.get(str(item.get("종류") or ""), "단가")
price = f"{name}{part or ''}{tail}"
money = f"{name}{part}" if part else f"{name}비"
return f"{price} * {_names(item['수량'], env, master, name_of)} = {money}"
qty = _times(_names(item["수량"], env, master, name_of), item, env, master)
return f"{price} * {qty} = {money}"
def _extra_text(extra: dict, line: dict, env: dict, master) -> str: