feat(validation): add editing versioning revalidation and aligned reports

This commit is contained in:
Schubert Ferenc 2026-07-11 10:26:18 +02:00
parent f73a24df13
commit 302e542fda
28 changed files with 2691 additions and 406 deletions

View file

@ -1,8 +1,9 @@
from __future__ import annotations
from datetime import date
from uuid import UUID
from pydantic import EmailStr, Field
from pydantic import EmailStr, Field, field_validator
from app.models.customer import CustomerType
from app.models.equipment import EquipmentKind, EquipmentStatus
@ -108,12 +109,12 @@ class EquipmentUpdate(EquipmentCreate):
class ValidationCreate(ORMModel):
report_number: str
customer_id: str
location_id: str | None = None
contact_id: str | None = None
device_id: str | None = None
validation_type: str
report_number: str | None = None
customer_id: UUID | None = None
location_id: UUID | None = None
contact_id: UUID | None = None
device_id: UUID | None = None
validation_type: str | None = None
project: str | None = None
test_location: str | None = None
examiner_name: str | None = None
@ -122,8 +123,12 @@ class ValidationCreate(ORMModel):
scheduled_on: date | None = None
performed_on: date | None = None
next_validation_on: date | None = None
examiner_id: str | None = None
status: ValidationStatus = ValidationStatus.draft
revalidation_interval_months: int = 24
next_validation_manually_overridden: bool = False
version: int = 1
previous_validation_id: UUID | None = None
examiner_id: UUID | None = None
status: ValidationStatus | str = ValidationStatus.draft
result: str | None = None
notes: str | None = None
equipment_ids: list[str] = Field(default_factory=list)
@ -137,6 +142,21 @@ class ValidationCreate(ORMModel):
recommendations: list[dict] = Field(default_factory=list)
attachments: list[dict] = Field(default_factory=list)
@field_validator(
"customer_id",
"location_id",
"contact_id",
"device_id",
"examiner_id",
"previous_validation_id",
mode="before",
)
@classmethod
def empty_string_to_none(cls, value):
if value == "":
return None
return value
class ValidationRead(ValidationCreate, EntityRead):
pass
@ -144,3 +164,45 @@ class ValidationRead(ValidationCreate, EntityRead):
class ValidationUpdate(ValidationCreate):
pass
class ValidationIssue(ORMModel):
field: str
message: str
section: str
class ValidationReview(ORMModel):
status: str
errors: list[ValidationIssue]
warnings: list[ValidationIssue]
complete_sections: list[str]
class ValidationImportPreviewRow(ORMModel):
row_number: int
data: dict
errors: list[str]
duplicate: bool
resolved_customer_id: str | None = None
resolved_location_id: str | None = None
resolved_device_id: str | None = None
class ValidationImportPreview(ORMModel):
rows: list[ValidationImportPreviewRow]
valid_rows: int
invalid_rows: int
duplicates: int
class ValidationImportRequest(ORMModel):
rows: list[dict]
duplicate_strategy: str = "skip"
class ValidationImportSummary(ORMModel):
successful: int
skipped: int
failed: int
errors: list[str] = Field(default_factory=list)