Scadenzario aggiunta pratiche
This commit is contained in:
@@ -3,7 +3,7 @@ Service per la gestione dei Fascicoli (fascicolazione pratiche).
|
||||
"""
|
||||
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta, timezone
|
||||
|
||||
from sqlalchemy import delete, func, select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
@@ -268,3 +268,57 @@ class FascicoloService:
|
||||
.order_by(Fascicolo.titolo)
|
||||
)
|
||||
return list(result.scalars().all())
|
||||
|
||||
# ─── Scadenzario fascicoli ────────────────────────────────────────────────
|
||||
|
||||
async def list_fascicoli_scadenzario(
|
||||
self,
|
||||
tenant_id: uuid.UUID,
|
||||
days_ahead: int = 30,
|
||||
include_overdue: bool = True,
|
||||
) -> list[tuple[Fascicolo, int, bool]]:
|
||||
"""
|
||||
Restituisce lista di (Fascicolo, message_count, is_overdue) per lo scadenzario.
|
||||
|
||||
Filtra fascicoli con scadenza impostata nel range richiesto.
|
||||
Ordinati: scaduti prima (ASC scadenza), poi futuri (ASC scadenza).
|
||||
"""
|
||||
now = datetime.now(timezone.utc)
|
||||
future_limit = now + timedelta(days=days_ahead)
|
||||
|
||||
count_sub = (
|
||||
select(
|
||||
FascicoloMessage.fascicolo_id,
|
||||
func.count(FascicoloMessage.message_id).label("cnt"),
|
||||
)
|
||||
.group_by(FascicoloMessage.fascicolo_id)
|
||||
.subquery()
|
||||
)
|
||||
|
||||
stmt = (
|
||||
select(Fascicolo, func.coalesce(count_sub.c.cnt, 0).label("message_count"))
|
||||
.outerjoin(count_sub, Fascicolo.id == count_sub.c.fascicolo_id)
|
||||
.where(
|
||||
Fascicolo.tenant_id == tenant_id,
|
||||
Fascicolo.scadenza.is_not(None),
|
||||
)
|
||||
.order_by(Fascicolo.scadenza.asc())
|
||||
)
|
||||
|
||||
if include_overdue:
|
||||
# Scaduti (qualsiasi data passata) + futuri fino al limite
|
||||
stmt = stmt.where(Fascicolo.scadenza <= future_limit)
|
||||
else:
|
||||
# Solo scadenze future entro il limite
|
||||
stmt = stmt.where(
|
||||
Fascicolo.scadenza > now,
|
||||
Fascicolo.scadenza <= future_limit,
|
||||
)
|
||||
|
||||
result = await self.db.execute(stmt)
|
||||
rows = result.all()
|
||||
|
||||
return [
|
||||
(fascicolo, int(cnt), fascicolo.scadenza < now if fascicolo.scadenza else False)
|
||||
for fascicolo, cnt in rows
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user