from typing import Optional, Dict, Any, List from pydantic import BaseModel, Field from datetime import datetime from enum import Enum class DocumentType(str, Enum): """Типы документов""" PDF = "pdf" EXCEL = "excel" WORD = "word" QR_CODE = "qr_code" class DocumentStatus(str, Enum): """Статусы документов""" PENDING = "pending" PROCESSING = "processing" COMPLETED = "completed" FAILED = "failed" class QRCodeRequest(BaseModel): """Запрос на генерацию QR-кода""" location_id: str = Field(..., description="ID места хранения") location_address: str = Field(..., description="Адрес места") organization_id: str = Field(..., description="ID организации") size: Optional[int] = Field(10, description="Размер QR-кода") border: Optional[int] = Field(2, description="Размер границы") class QRCodeResponse(BaseModel): """Ответ с QR-кодом""" document_id: str = Field(..., description="ID документа") qr_code_url: str = Field(..., description="URL для скачивания QR-кода") qr_code_data: str = Field(..., description="Данные QR-кода") expires_at: datetime = Field(..., description="Время истечения") class ReportRequest(BaseModel): """Запрос на генерацию отчета""" report_type: str = Field(..., description="Тип отчета") organization_id: str = Field(..., description="ID организации") filters: Optional[Dict[str, Any]] = Field({}, description="Фильтры для отчета") format: DocumentType = Field(DocumentType.PDF, description="Формат отчета") class ReportResponse(BaseModel): """Ответ с отчетом""" document_id: str = Field(..., description="ID документа") download_url: str = Field(..., description="URL для скачивания") file_size: int = Field(..., description="Размер файла в байтах") expires_at: datetime = Field(..., description="Время истечения") class DocumentStatusResponse(BaseModel): """Ответ со статусом документа""" document_id: str = Field(..., description="ID документа") status: DocumentStatus = Field(..., description="Статус документа") progress: Optional[int] = Field(None, description="Прогресс в процентах") error_message: Optional[str] = Field(None, description="Сообщение об ошибке") created_at: datetime = Field(..., description="Время создания") updated_at: datetime = Field(..., description="Время обновления") class GeneratePDFRequest(BaseModel): """Запрос на генерацию PDF""" template_name: str = Field(..., description="Название шаблона") data: Dict[str, Any] = Field(..., description="Данные для шаблона") filename: Optional[str] = Field(None, description="Имя файла") class GenerateExcelRequest(BaseModel): """Запрос на генерацию Excel""" data: List[Dict[str, Any]] = Field(..., description="Данные для таблицы") sheet_name: str = Field("Sheet1", description="Название листа") filename: Optional[str] = Field(None, description="Имя файла") class TemplateInfo(BaseModel): """Информация о шаблоне""" name: str = Field(..., description="Название шаблона") description: str = Field(..., description="Описание шаблона") variables: List[str] = Field(..., description="Переменные шаблона") created_at: datetime = Field(..., description="Время создания") updated_at: datetime = Field(..., description="Время обновления") class DocumentInfo(BaseModel): """Информация о документе""" id: str = Field(..., description="ID документа") type: DocumentType = Field(..., description="Тип документа") status: DocumentStatus = Field(..., description="Статус документа") filename: str = Field(..., description="Имя файла") file_size: int = Field(..., description="Размер файла") created_at: datetime = Field(..., description="Время создания") expires_at: datetime = Field(..., description="Время истечения")