from __future__ import annotations import uuid from datetime import datetime from pydantic import BaseModel from typing import Any class ParsedComponent(BaseModel): part_name: str | None = None material: str | None = None component_type: str | None = None column_index: int class ParsedRow(BaseModel): row_index: int ebene1: str | None = None ebene2: str | None = None baureihe: str | None = None pim_id: str | None = None produkt_baureihe: str | None = None gewaehltes_produkt: str | None = None name_cad_modell: str | None = None gewuenschte_bildnummer: str | None = None lagertyp: str | None = None medias_rendering: bool | None = None components: list[ParsedComponent] = [] class ParsedExcelResponse(BaseModel): filename: str excel_path: str | None = None # server-side path of the saved file category_key: str | None = None template_name: str | None = None row_count: int column_headers: list[str] rows: list[ParsedRow] warnings: list[str] = [] class StepUploadResponse(BaseModel): cad_file_id: str original_name: str file_hash: str status: str matched_items: list[str] = [] # ── Import Validation ────────────────────────────────────────────────────── class ValidationIssue(BaseModel): type: str # "missing_material" | "material_suggestion" | "no_step" | "duplicate" field: str | None = None value: str | None = None suggestion: str | None = None message: str class ImportValidationOut(BaseModel): id: uuid.UUID tenant_id: uuid.UUID | None excel_path: str status: str summary: dict | None rows: list | None created_at: datetime completed_at: datetime | None model_config = {"from_attributes": True}