from typing import List, Optional from pydantic import Field from common.models.gmodel import Res_WebPacketProtocol, WebPacketProtocol class RenegotiationProtocol(WebPacketProtocol): pass class RenegotiationData(RenegotiationProtocol): session_id: str = "" quotation_id: str = "" qt_number: str = "" qt_round: int = 0 qt_name: str = "" item_id: str = "" item_name: str = "" supplier_id: str = "" supplier_name: str = "" owner_name: str = "" # 견적 담당자(작성자) 이름 — 누구 견적인지 리스트 표시용 status: int = 0 reason: str = "" desired_price: Optional[int] = None requested_at: str = "" decided_at: Optional[str] = None decided_by_name: Optional[str] = None memo: Optional[str] = None next_quotation_id: Optional[str] = None close_reason: Optional[int] = None target_price: Optional[int] = None bid_price: Optional[int] = None can_act: bool = True # 조회자가 이 요청을 승인/반려할 수 있는지(견적 소유자∪OWNER). 리스트는 전체가 보이되 처리는 이걸로 게이팅 class Res_RenegotiationList(Res_WebPacketProtocol): requests: List[RenegotiationData] = [] total: int = 0 page: int = 0 size: int = 0 class Req_ApproveRenegotiation(RenegotiationProtocol): supplier_ids: List[str] = Field(default_factory=list, description="다음 라운드에 함께 넣을 공급사. 비우면 요청자만") memo: str = Field("", max_length=255, description="승인 메모") class Req_RejectRenegotiation(RenegotiationProtocol): memo: str = Field("", max_length=255, description="반려 사유 — 공급사에게 그대로 노출된다") class Res_RenegotiationDecision(Res_WebPacketProtocol): session_id: str = "" status: int = 0 next_quotation_id: Optional[str] = None