""" Schemi Pydantic per la Dashboard e Reportistica (Fase 7). """ from datetime import date, datetime from typing import Optional import uuid from pydantic import BaseModel, Field class KpiSummary(BaseModel): """Contatori KPI principali del tenant.""" # Oggi received_today: int = Field(0, description="PEC ricevute oggi") sent_today: int = Field(0, description="PEC inviate oggi (outbound)") # Ultimi 7 giorni received_7d: int = Field(0, description="PEC ricevute negli ultimi 7 giorni") sent_7d: int = Field(0, description="PEC inviate negli ultimi 7 giorni") # Ultimi 30 giorni received_30d: int = Field(0, description="PEC ricevute negli ultimi 30 giorni") sent_30d: int = Field(0, description="PEC inviate negli ultimi 30 giorni") # Stato anomalie_attive: int = Field(0, description="Messaggi outbound in stato anomaly") tasso_consegna: float = Field(0.0, description="Percentuale consegna (0-100)") caselle_in_errore: int = Field(0, description="Caselle con status=error") messaggi_non_letti: int = Field(0, description="Messaggi inbound non letti") # Totali assoluti totale_messaggi: int = Field(0, description="Totale messaggi nel tenant") class DailyStat(BaseModel): """Statistiche giornaliere per il grafico a barre.""" day: date = Field(..., description="Data (YYYY-MM-DD)") received: int = Field(0, description="PEC ricevute in quel giorno") sent: int = Field(0, description="PEC inviate in quel giorno") class OutboundStateStat(BaseModel): """Conteggio messaggi outbound per stato (per il grafico a torta).""" state: str count: int class MailboxStat(BaseModel): """Statistiche per singola casella.""" mailbox_id: uuid.UUID email_address: str display_name: Optional[str] = None status: str received_total: int = 0 sent_total: int = 0 anomalie: int = 0 non_letti: int = 0 last_sync_at: Optional[datetime] = None class ReportSummaryResponse(BaseModel): """Risposta completa dell'endpoint /reports/summary.""" generated_at: datetime period_days: int = Field(..., description="Numero di giorni del periodo selezionato") kpi: KpiSummary daily_stats: list[DailyStat] = Field(default_factory=list) outbound_states: list[OutboundStateStat] = Field(default_factory=list) mailbox_stats: list[MailboxStat] = Field(default_factory=list)