File size: 1,850 Bytes
1d48b2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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: List[TenderItem] = []
    attachments: List[TenderAttachment] = []
    evaluation_criteria: List[dict] = []
    contract_duration: Optional[str] = None
    detail_tabs: List[TenderDetailTab] = []  # Detail tab information
    detail_metadata: Optional[dict] = None  # Aggregated detail metadata
    raw_data: Optional[dict] = None # Store the full response if needed