Files
plantillas-proyectos/backend/api/v1/modules/a24/inv/part_countries/dto.py

82 lines
3.5 KiB
Python

"""
DTOs (Data Transfer Objects) para relación entre partes y países - Anexo 24
"""
from typing import Optional
from datetime import datetime
from decimal import Decimal
from pydantic import BaseModel, Field
class PartCountryCreateDTO(BaseModel):
"""DTO para crear una relación entre parte y país"""
part_id: int = Field(..., description="Part ID")
country_code: str = Field(..., max_length=3, description="Country code (ISO 3166-1 alpha-3)")
fraction: Optional[str] = Field(None, max_length=20, description="Tariff fraction")
preference: str = Field(default="GENERAL", description="Trade preference: GENERAL, PROSEC, ALADI, TLCS")
has_certificate: bool = Field(default=False, description="Has certificate of origin")
certificate_number: Optional[str] = Field(None, max_length=50, description="Certificate of origin number")
end_date: Optional[datetime] = Field(None, description="Certificate expiration date")
previous_fractions_7m: bool = Field(default=False, description="Has fractions older than 7 months")
omission_import: bool = Field(default=False, description="Import omission flag")
omission_export: bool = Field(default=False, description="Export omission flag")
import_percentage: Optional[Decimal] = Field(None, description="Import tariff percentage")
export_percentage: Optional[Decimal] = Field(None, description="Export tariff percentage")
sector: Optional[str] = Field(None, max_length=10, description="Sector reference")
class Config:
from_attributes = True
class PartCountryUpdateDTO(BaseModel):
"""DTO para actualizar una relación entre parte y país"""
country_code: Optional[str] = Field(None, max_length=3, description="Country code")
fraction: Optional[str] = Field(None, max_length=20, description="Tariff fraction")
preference: Optional[str] = Field(None, description="Trade preference")
has_certificate: Optional[bool] = Field(None, description="Has certificate of origin")
certificate_number: Optional[str] = Field(None, max_length=50, description="Certificate number")
end_date: Optional[datetime] = Field(None, description="Certificate expiration date")
previous_fractions_7m: Optional[bool] = Field(None, description="Previous fractions flag")
omission_import: Optional[bool] = Field(None, description="Import omission flag")
omission_export: Optional[bool] = Field(None, description="Export omission flag")
import_percentage: Optional[Decimal] = Field(None, description="Import percentage")
export_percentage: Optional[Decimal] = Field(None, description="Export percentage")
sector: Optional[str] = Field(None, max_length=10, description="Sector reference")
class Config:
from_attributes = True
class PartCountryResponseDTO(BaseModel):
"""DTO para responder con datos de relación entre parte y país"""
id: int
part_id: int
country_code: str
fraction: Optional[str] = None
preference: str
has_certificate: bool
certificate_number: Optional[str] = None
end_date: Optional[datetime] = None
previous_fractions_7m: bool
omission_import: bool
omission_export: bool
import_percentage: Optional[Decimal] = None
export_percentage: Optional[Decimal] = None
sector: Optional[str] = None
class Config:
from_attributes = True
class PartCountriesBulkResponseDTO(BaseModel):
"""DTO para responder con lista de relaciones entre partes y países"""
data: list[PartCountryResponseDTO]
total: int
skip: int
limit: int