from pydantic import BaseModel, ConfigDict from typing import List, Optional, Union from datetime import datetime class TenderItem(BaseModel): correlative: Optional[int] = None product_code: Optional[str] = None category: Optional[str] = None name: str description: Optional[str] = None quantity: float unit: str class TenderAttachment(BaseModel): name: str url: str category: Optional[str] = None # Administrativo, Técnico, Económico, etc. file_type: Optional[str] = None # PDF, DOC, XLS, etc. class TenderDetailTab(BaseModel): """Detail tab information (Preguntas, Historial, Apertura, Adjudicación, etc.)""" tab_name: str tab_type: str # questions, history, opening, adjudication content_summary: Optional[str] = None metadata: Optional[dict] = None attachment_urls: Optional[List[str]] = None class Tender(BaseModel): model_config = ConfigDict(from_attributes=True) code: str name: str description: str buyer: str buyer_region: Optional[str] = None status: str status_code: Optional[int] = None type: Optional[str] = None # L1, LE, LP, etc. currency: Optional[str] = None # CLP, USD, etc. closing_date: Union[str, datetime, None] = None publication_date: Union[str, datetime, None] = None estimated_amount: Optional[float] = None source: str = "Mercado Público" region: Optional[str] = None sector: Optional[str] = None items: Optional[List[TenderItem]] = [] attachments: Optional[List[TenderAttachment]] = [] evaluation_criteria: Optional[List[dict]] = [] contract_duration: Optional[str] = None detail_tabs: Optional[List[TenderDetailTab]] = [] # Detail tab information detail_metadata: Optional[dict] = None # Aggregated detail metadata raw_data: Optional[dict] = None # Store the full response if needed