from datetime import date, datetime from pydantic import BaseModel, ConfigDict, Field class MachineEventIn(BaseModel): model_config = ConfigDict(extra="allow") machine_id: str event_type: str timestamp: datetime cycle_time_sec: float | None = None source: str | None = "digital_input" input_name: str | None = None input_value: bool | int | str | None = None class ProductionOrderCreate(BaseModel): order_number: str machine_id: int article_ref: str article_name: str mold_ref: str | None = None material_ref: str | None = None planned_qty: int = Field(gt=0) cavities: int = Field(default=1, gt=0) theoretical_cycle_time_sec: float = Field(gt=0) class DowntimeQualify(BaseModel): reason_code: str comment: str | None = None qualified_by: str class ScrapCreate(BaseModel): machine_id: str production_order_id: int | None = None quantity: int = Field(gt=0) reason_code: str comment: str | None = None operator_name: str timestamp: datetime | None = None class DailyOeeQuery(BaseModel): date: date class MachineConfigUpdate(BaseModel): name: str | None = None brand: str | None = None model: str | None = None is_active: bool | None = None cycle_signal_edge: str | None = None debounce_ms: int | None = Field(default=None, ge=0) min_cycle_time_sec: int | None = Field(default=None, ge=1) max_cycle_time_sec: int | None = Field(default=None, ge=1) stop_detection_delay_sec: int | None = Field(default=None, ge=1) class SimulatorEventCreate(BaseModel): machine_id: str event_type: str timestamp: datetime | None = None input_name: str | None = None input_value: bool | int | str | None = None cycle_time_sec: float | None = Field(default=None, gt=0) class SimulatorScenarioCreate(BaseModel): machine_id: str scenario: str cycle_time_sec: float | None = Field(default=None, gt=0) count: int = Field(default=1, ge=1, le=100) input_name: str | None = None input_value: bool | int | str | None = None