"""협상 기준가 판정 — 회사 설정에서 '이 회사가 관리하는 지불 단가' 컬럼을 고른다. 이 값은 협상 인하율 멘트의 분모이자 RL 가격 수용률의 기준가이고, 인터넷 최저가 검색의 가격 힌트로도 나간다. 회사마다 다르다 — 매입해서 되파는 곳은 공급가(items.price)가, 매입만 하는 곳은 매입가(items.purchase_price)가 실제 지불 단가다. 같은 규칙을 agent(negotiation/chat/infra/repository/nego_context_crud.py `_resolve_baseline`)와 루트 backend(services/chat_service.py)도 쓴다. 세 곳이 어긋나면 화면값과 협상 멘트가 갈리므로 판정식을 바꿀 때는 반드시 같이 고친다. """ from typing import Optional NEGO_BASELINE_FIELDS = ("price", "purchase_price") DEFAULT_NEGO_BASELINE_FIELD = "price" def resolve_baseline_field(settings: Optional[dict]) -> str: """회사 설정 → 협상 기준가로 쓸 items 컬럼명. 1순위는 관리자가 설정 화면에서 고른 값(features.nego_baseline_field). 미설정 회사는 공급가가 기본이되, 공급가를 화면에서 감췄다면(hidden_fields) 그 회사는 공급가를 관리하지 않는다는 뜻이므로 매입가로 폴백한다 — 설정 화면이 생기기 전에 만들어진 회사를 위한 안전망. """ settings = settings or {} chosen = (settings.get("features") or {}).get("nego_baseline_field") if chosen in NEGO_BASELINE_FIELDS: return chosen hidden = set(settings.get("hidden_fields") or []) if "price" in hidden and "purchase_price" not in hidden: return "purchase_price" return DEFAULT_NEGO_BASELINE_FIELD def resolve_baseline_price(item, settings: Optional[dict]) -> int: """상품의 협상 기준가(원). 값이 없으면 0.""" return int(getattr(item, resolve_baseline_field(settings), None) or 0)