Tutti i 3 verticali (Vino · Energia & Gas · Fonia & IT) sono live. Prenota la tua demo →
Loogico
Modulo Cantina & movimenti in produzione

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).

ACCIAIO_INOX
Fermentazione neutra, controllo T°
CEMENTO
Affinamento neutro, micro-ossigenazione
LEGNO_BARRIQUE
225L · note tostate · evapora 2-3%/anno
LEGNO_TONNEAU
500L · note delicate · evapora 1-2%/anno
LEGNO_BOTTE_GRANDE
1000-3000L · grandi rossi italiani
ANFORA
Terracotta · fermentazione naturali
VETRORESINA
Storage neutro economico
ALTRO
Custom (es. tini in legno)

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
Cisterne con riempimento bar
Lista cisterne — Materiale, volume, locale, riempimento bar, lotto corrente

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.

VENDEMMIA

Uva → mosto. Primo carico cisterna. Lotto creato automaticamente.

TRAVASO

Cisterna A → cisterna B. Validazione: rank lotto ≤ rank cisterna.

IMBOTTIGLIAMENTO

Sfuso → bottiglie. Hook automatico consumo bollini Stato (1 bottiglia = 1 bollino).

USCITA_VENDITA

Sfuso uscito commercialmente (raro, B2B sfuso).

USCITA_DEGUSTAZIONE

Assaggio enologo / fiera / cliente.

AGGIUSTAMENTO

Correzione (es. evaporazione, calo naturale).

SCARTO

Vino smaltito (deteriorato, non commerciabile).

Registrare un travaso in 4 step

1
Apri cisterna

/vino/cantina → cards cisterne con riempimento real-time

2
"+ Movimento"

Modale: tipo TRAVASO, lotto, volume, data

3
Origine + dest.

Cisterna corrente = origine, scegli destinazione dal dropdown

4
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.

vendemmia
Uva conferita
fermentazione
Tumultuosa/malolattica
invecchiamento
Affinamento cisterna
travaso
Spostamento contenitori
imbottigliamento
Sfuso → bottiglia
vendibile
Pronto per vendita
in_uscita
Spedito/distribuito
esaurito
Stock zero

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).