Cisterne, lotti, movimenti — tracciati real-time.
Cisterne con materiale e capacità. 7 tipi movimento (vendemmia, travaso, imbottigliamento, uscita vendita/degustazione, aggiustamento, scarto) registrati come append-only per audit completo. Lifecycle lotto 8 stati esplicito.
Cosa fa il modulo
Il modulo Cantina di Loogico Vino è il cuore operativo della piattaforma: tutto quello che si muove fisicamente in cantina diventa un record nel database, immutabile e auditabile.
- •Cisterne: anagrafica con codice univoco, materiale (8 tipi), capacità litri, locale, temperatura opzionale, lotto corrente.
- •Lotti: identità del vino (annata + vigneto + denominazione + volume) con lifecycle 8 stati esplicito.
- •Movimenti: append-only, 7 tipi, side-effect atomico in transaction (carico/scarico cisterne).
- •Riempimento real-time: saldo per cisterna calcolato automaticamente, alert oltre 95% / sotto 5%.
Cisterne con 8 materiali
Loogico riconosce 8 tipi di materiale, ognuno con comportamento specifico in fase di affinamento (es. evaporazione barrique vs ermeticità acciaio).
Prima — Brogliaccio + etichette adesive
- · Brogliaccio cartaceo aggiornato a fine giornata (o no)
- · Etichetta adesiva su cisterna che si stacca con umidità
- · Saldo calcolato a mano una volta a settimana
- · Nessun audit di chi ha fatto cosa, quando
Con Loogico — DB + UI real-time
- Cisterna è un record DB con saldo aggiornato real-time
- Lotto corrente sempre identificabile (no etichette fisiche)
- Saldo calcolato automatico ad ogni movimento
- Audit log: chi/cosa/quando/operatore per ogni travaso
7 tipi di movimento append-only
Ogni operazione fisica in cantina è registrata come movimento immutabile. Il VinoMovimentoController
applica side-effect atomici in transaction PostgreSQL: carico/scarico cisterne aggiornati con il movimento stesso.
Uva → mosto. Primo carico cisterna. Lotto creato automaticamente.
Cisterna A → cisterna B. Validazione: rank lotto ≤ rank cisterna.
Sfuso → bottiglie. Hook automatico consumo bollini Stato (1 bottiglia = 1 bollino).
Sfuso uscito commercialmente (raro, B2B sfuso).
Assaggio enologo / fiera / cliente.
Correzione (es. evaporazione, calo naturale).
Vino smaltito (deteriorato, non commerciabile).
Registrare un travaso in 4 step
Apri cisterna
/vino/cantina → cards cisterne con riempimento real-time
"+ Movimento"
Modale: tipo TRAVASO, lotto, volume, data
Origine + dest.
Cisterna corrente = origine, scegli destinazione dal dropdown
Conferma
Saldi origine -X / dest +X aggiornati istantanei. Audit log scrivi.
// app/Http/Controllers/Api/Vino/VinoMovimentoController.php (estratto)
DB::transaction(function () use ($req, &$movimento) {
$movimento = VinoMovimento::create($req->validated());
// Side-effect atomico: carico/scarico cisterne
if ($movimento->cisterna_origine_id) {
VinoCisterna::where('id', $movimento->cisterna_origine_id)
->decrement('contenuto_attuale_litri', $movimento->volume_litri);
}
if ($movimento->cisterna_destinazione_id) {
VinoCisterna::where('id', $movimento->cisterna_destinazione_id)
->increment('contenuto_attuale_litri', $movimento->volume_litri);
}
// Hook bollini su IMBOTTIGLIAMENTO (1 bottiglia 0.75L = 1 bollino)
if ($movimento->tipo === 'IMBOTTIGLIAMENTO') {
$bottiglie = floor($movimento->volume_litri / 0.75);
app(VinoBolliniSimulatorService::class)->consuma($movimento, $bottiglie);
}
}); Lifecycle lotto: 8 stati esplicitati
Il VinoLifecycleService implementa una state machine sugli stati del lotto.
Ogni transizione è validata: non puoi passare da "vendibile" a "vendemmia" per errore.
Le transizioni sono definite in un graph: vendemmia → fermentazione,
fermentazione → invecchiamento, ecc.
L'endpoint POST /api/vino/lotti/{id}/transizione valida prima di applicare.
Audit GDPR + Row-Level Security
Ogni movimento è automaticamente tracciato dall'AuditObserver:
chi ha registrato il movimento, quando, da quale IP, con diff old→new.
RLS PostgreSQL
Ogni query filtra automaticamente per tenant_id a livello DB. Impossibile leggere movimenti di un'altra cantina.
Audit log esteso
10 model critici (compreso VinoMovimento) tracciati: chi/cosa/quando/IP/diff old→new. Retention 30gg / 1 anno / illimitato per piano.
Append-only
I movimenti non possono essere modificati. Per correggere si registra un AGGIUSTAMENTO esplicito.
Vuoi vedere la tua cantina su Loogico?
Demo guidata 30 minuti su dataset reale (Rotte dei Mercanti, design partner).