from datetime import date, datetime from pydantic import BaseModel, ConfigDict, Field class ShipmentBase(BaseModel): reference: str | None = Field(None, max_length=40) quote_id: int | None = None service_request_id: int | None = None account_id: int | None = None operation_type: str | None = Field(None, max_length=20) transport_mode: str | None = Field(None, max_length=20) service_type: str | None = Field(None, max_length=20) incoterm: str | None = Field(None, max_length=10) origin: str | None = Field(None, max_length=160) destination: str | None = Field(None, max_length=160) status: str = Field("abierta", max_length=20) booking_number: str | None = Field(None, max_length=60) carrier_supplier_id: int | None = None customs_agent_id: int | None = None destination_agent_id: int | None = None cutoff_date: datetime | None = None etd: date | None = None eta: date | None = None vessel_flight: str | None = Field(None, max_length=120) container_number: str | None = Field(None, max_length=60) notes: str | None = None owner_user_id: str | None = Field(None, max_length=64) class ShipmentCreate(ShipmentBase): pass class ShipmentUpdate(BaseModel): reference: str | None = Field(None, max_length=40) account_id: int | None = None operation_type: str | None = Field(None, max_length=20) transport_mode: str | None = Field(None, max_length=20) service_type: str | None = Field(None, max_length=20) incoterm: str | None = Field(None, max_length=10) origin: str | None = Field(None, max_length=160) destination: str | None = Field(None, max_length=160) status: str | None = Field(None, max_length=20) booking_number: str | None = Field(None, max_length=60) carrier_supplier_id: int | None = None customs_agent_id: int | None = None destination_agent_id: int | None = None cutoff_date: datetime | None = None etd: date | None = None eta: date | None = None vessel_flight: str | None = Field(None, max_length=120) container_number: str | None = Field(None, max_length=60) notes: str | None = None owner_user_id: str | None = Field(None, max_length=64) class ShipmentResponse(ShipmentBase): model_config = ConfigDict(from_attributes=True) id: int created_by: str | None = None updated_by: str | None = None tenant_id: int company_id: int created_at: datetime updated_at: datetime class ShipmentEventBase(BaseModel): shipment_id: int event_type: str | None = Field(None, max_length=60) title: str = Field(..., min_length=1, max_length=160) status: str = Field("pendiente", max_length=20) position: int = Field(0, ge=0) planned_date: datetime | None = None actual_date: datetime | None = None notes: str | None = None class ShipmentEventCreate(ShipmentEventBase): pass class ShipmentEventUpdate(BaseModel): event_type: str | None = Field(None, max_length=60) title: str | None = Field(None, min_length=1, max_length=160) status: str | None = Field(None, max_length=20) position: int | None = Field(None, ge=0) planned_date: datetime | None = None actual_date: datetime | None = None notes: str | None = None class ShipmentEventResponse(ShipmentEventBase): model_config = ConfigDict(from_attributes=True) id: int tenant_id: int company_id: int created_at: datetime updated_at: datetime class ShipmentDocumentBase(BaseModel): shipment_id: int doc_kind: str = Field("otro", max_length=10) doc_type: str = Field(..., max_length=30) number: str | None = Field(None, max_length=80) issue_date: date | None = None file_url: str | None = Field(None, max_length=1024) file_key: str | None = Field(None, max_length=512) notes: str | None = None class ShipmentDocumentCreate(ShipmentDocumentBase): pass class ShipmentDocumentUpdate(BaseModel): doc_kind: str | None = Field(None, max_length=10) doc_type: str | None = Field(None, max_length=30) number: str | None = Field(None, max_length=80) issue_date: date | None = None file_url: str | None = Field(None, max_length=1024) file_key: str | None = Field(None, max_length=512) notes: str | None = None class ShipmentDocumentResponse(ShipmentDocumentBase): model_config = ConfigDict(from_attributes=True) id: int tenant_id: int company_id: int created_at: datetime updated_at: datetime