o2o-negosium-original/backend/router/v1/negotiation/protocol.py
민헌 d199c1dec1 feat(backend): 협상 거부(reject) 기능
- POST /v1/negotiation/sessions/{session_id}/reject (Req_Reject/Res_Reject)
- 참여와 공통 검증(인증/소유/세션상태/견적마감/마감시간)을
  _load_actionable_session 헬퍼로 추출해 participate·reject 재사용
- 거부 불가 상태: 협상완료/미참여/협상거부 → NEGO_NOT_PARTICIPABLE
- 성공 시 세션을 협상거부(5)로 전이하고 reject_reason 저장(최대 255자)
- 빈 사유는 INVALID_REQUEST_DATA

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 13:20:29 +09:00

34 lines
1.0 KiB
Python

from common.models.gmodel import Res_WebPacketProtocol, WebPacketProtocol
# 협상 세션 목록 행. status/qt_type 은 정수 코드로 내려가고 라벨 매핑은 프론트가 한다.
class ListItem(WebPacketProtocol):
session_id: str = ""
session_status: int = 0 # SessionStatus 코드
qt_type: int = 0 # QtType 코드 (1=재협상, 2=재견적)
qt_number: str = ""
qt_end_time: str = "" # ISO 8601 (마감 시각)
item_code: str = ""
item_name: str = ""
model_name: str = ""
maker_name: str = ""
class Res_SessionList(Res_WebPacketProtocol):
items: list[ListItem] = []
total: int = 0
page: int = 0
page_size: int = 0
class Res_Participate(Res_WebPacketProtocol):
session_id: str = "" # 참여 성공한 세션 (채팅 진입용)
class Req_Reject(WebPacketProtocol):
reject_reason: str = "" # 거부 사유 (단종/품절 프리셋 라벨 또는 기타 직접 입력)
class Res_Reject(Res_WebPacketProtocol):
session_id: str = "" # 거부 처리된 세션