import uuid from datetime import datetime from typing import Any, Optional from pydantic import ConfigDict from common.models.gmodel import Res_PageProtocol, Res_WebPacketProtocol, WebPacketProtocol class QuotationProtocol(WebPacketProtocol): pass class Req_CreateQuotation(QuotationProtocol): qt_setting_id: uuid.UUID version_id: uuid.UUID name: str = "" number: str = "" type: int = 0 status: int = 0 start_time: datetime end_time: datetime round: int = 1 manager_name: Optional[str] = None manager_email: Optional[str] = None manager_contact_number: Optional[str] = None memo: Optional[str] = None class QuotationData(WebPacketProtocol): model_config = ConfigDict(from_attributes=True) qt_id: uuid.UUID user_id: uuid.UUID qt_setting_id: uuid.UUID version_id: uuid.UUID name: str number: str type: int round: int = 1 status: int start_time: datetime end_time: datetime manager_name: Optional[str] = None manager_email: Optional[str] = None manager_contact_number: Optional[str] = None memo: Optional[str] = None iteration: int = 0 preferred_sp_yn: Optional[bool] = None preferred_sp_id: Optional[uuid.UUID] = None preferred_sp_name: Optional[str] = None equal_bid_yn: Optional[bool] = None equal_bid_data: Optional[Any] = None created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class Res_Quotation(Res_WebPacketProtocol): quotation: Optional[QuotationData] = None class Res_QuotationList(Res_PageProtocol): quotations: list[QuotationData] = [] class Res_DeleteQuotation(Res_WebPacketProtocol): pass class AsyncJob(WebPacketProtocol): status: str = "" message: str = "" class Res_CreateQuotation(Res_WebPacketProtocol): quotation: Optional[QuotationData] = None async_job: Optional[AsyncJob] = None class Res_QuotationStatus(Res_WebPacketProtocol): qt_id: Optional[uuid.UUID] = None job_status: int = 0 message: str = "" class SessionData(WebPacketProtocol): model_config = ConfigDict(from_attributes=True) session_id: uuid.UUID qt_id: uuid.UUID supplier_id: uuid.UUID item_id: uuid.UUID qt_number: str qt_round: int qt_type: int target_price: int status: int bid_price: Optional[int] = None bid_at: Optional[datetime] = None end_time: datetime reject_reason: Optional[str] = None reject_price: Optional[int] = None reject_delivery_type: Optional[int] = None class Res_QuotationSessions(Res_WebPacketProtocol): qt_id: Optional[uuid.UUID] = None sessions: list[SessionData] = [] total: int = 0 class ChatMessageData(WebPacketProtocol): model_config = ConfigDict(from_attributes=True) chat_id: uuid.UUID session_id: uuid.UUID card_id: Optional[uuid.UUID] = None index: int sender: int target_price: int card_used_yn: Optional[bool] = None indicator_value: Optional[float] = None card_type: Optional[int] = None class Res_SessionChat(Res_WebPacketProtocol): session_id: Optional[uuid.UUID] = None messages: list[ChatMessageData] = [] class Res_QuotationResult(Res_WebPacketProtocol): qt_id: Optional[uuid.UUID] = None winner_supplier_id: Optional[uuid.UUID] = None winner_supplier_name: Optional[str] = None is_equal_bid: Optional[bool] = None equal_bid_data: Optional[Any] = None result_count: int = 0 class QuotationCardData(WebPacketProtocol): session_card_id: uuid.UUID qt_id: Optional[uuid.UUID] = None nego_card_id: Optional[uuid.UUID] = None wild_card_id: Optional[uuid.UUID] = None type: Optional[int] = None name: Optional[str] = None script: Optional[str] = None class Res_QuotationCards(Res_WebPacketProtocol): qt_id: Optional[uuid.UUID] = None cards: list[QuotationCardData] = []