Magazzino

Giacenze, movimenti, lotti FIFO/FEFO, alert scorte, inventario fisico, analisi ABC e riordino

v 2.2Manuale Utente

Riferimenti normativi

Note operative e permessi configurabili

🗒️ Pannello Note: ogni scheda di movimento di magazzino, magazzino o ubicazione ha un pannello "post-it" giallo floating ancorato all'entità corrente. Si apre minimizzato come fascia centrata sulla topbar (sulla barra blu del modale per i documenti); cliccando la fascia o la freccia expand_more si espande al centro del viewport (ridimensionabile via handle in basso a destra). La fascia minimizzata è trascinabile e la sua posizione viene memorizzata in localStorage per ciascun record (es. ogni documento ha la sua posizione independente). Per scrivere una nota: testo nel box giallino + bottone + Aggiungi (o Cmd/Ctrl + Invio). Modifica/elimina riservate all'autore o agli amministratori. Cestino note con ripristino disponibile dal toggle delete_outline nell'header del pannello espanso (solo ADMIN/SUPERADMIN). Tutti i CRUD (create/update/delete/restore) sono tracciati in audit_log (consultabile da Amministrazione Sistema → Audit Log).

🔒 Permessi configurabili: alcune azioni di questa scheda (creazione, modifica, cancellazione, esportazione, stampa) possono essere bloccate per il ruolo del tuo workspace. Quando un bottone è bloccato, appare con icona "lucchetto" e tooltip "Permesso disabilitato dal Super Amministratore". La configurazione si fa in Amministrazione di Sistema » Permessi per Ruolo (solo SUPERADMIN).

1Panoramica e Tab

Il modulo Magazzino gestisce l'intero ciclo delle scorte. L'header mostra 4 KPI chip (articoli, valore stock, sotto scorta, in esaurimento), selettore magazzino, ricerca e scanner barcode.

10 Tab

TabContenuto
GiacenzeQuantità per articolo: totale, disponibile, riservata, scorta min, costo medio, valore
MovimentiRegistro cronologico carico/scarico con 12 tipi
LottiLotti con quantità residua, scadenza, fornitore
AlertSotto scorta + lotti in scadenza 30gg
DashboardKPI avanzati, valorizzazione FIFO/LIFO/Costo Medio, top 10
ABCClassificazione Pareto: A (80%), B (95%), C
RotazioneIndice rotazione, copertura gg, stato (obsoleto/lento/normale/veloce)
RiordinoROP automatico, quantità da ordinare
TrasferimentiMovimenti tra magazzini
Storico PrezziCronologia costi unitari per articolo
Accessibile da: Magazzino → Giacenze & Movimenti. Footer: + Movimento, Inventario fisico, Stampa etichette, Nuova ubicazione, Ricalcolo, Gestione magazzini.
2Magazzini Multipli

Il sistema supporta più magazzini indipendenti. Il selettore nell'header permette di cambiare.

  1. Premere “Gestione Magazzini” nel footer.
  2. Dialog con elenco magazzini. Compilare: codice, nome, tipo, indirizzo, CAP, provincia. Flag Default per il principale.
  3. Modificare: clic su un magazzino, editare, salvare. Eliminare: solo se vuoto.
Nel modulo Documenti il magazzino è selezionabile in testata o per singola riga, consentendo prelievi da magazzini diversi nella stessa fattura.
3Tab Giacenze
ColonnaDescrizione
Codice / DescrizioneArticolo dal catalogo
TipoFarmaco, Integratore, Articolo, ecc.
QuantitàGiacenza totale
DisponibileTotale − riservata
RiservataImpegnata in documenti non spediti
U.M.Unità di misura
UbicazioneCorridoio-Scaffale-Ripiano-Cella
Scorta min.Soglia alert sotto scorta
Costo medio / ValoreCosto medio ponderato × giacenza
StatoOK (verde), Sotto scorta (rosso), In esaurimento (arancione)

Filtri: ricerca testo, ubicazione, tipo voce, paginazione 50/pagina. Azioni riga: scheda catalogo, soglie, etichetta.

4Tab Movimenti

Registro cronologico. Colonne: data, tipo, articolo, segno (+/−), quantità, costo unit., valore, lotto, ubicazione, documento, giacenza post.

12 tipi di movimento

TipoSegnoDescrizione
CARICO_ACQUISTO+Merce da fornitore
CARICO_RESO+Reso da cliente
CARICO_PRODUZIONE+Prodotto finito interno
CARICO_TRASFERIMENTO+Da altro magazzino
SCARICO_VENDITAVendita/consegna
SCARICO_RESOReso a fornitore
SCARICO_TRASFERIMENTOVerso altro magazzino
SCARICO_CONSUMOConsumo interno
RETTIFICA_POSITIVA+Correzione manuale +
RETTIFICA_NEGATIVACorrezione manuale −
INVENTARIO±Da inventario fisico
STORNO+Annullamento scarico

Filtri: tipo, data dal/al, paginazione. Solo movimenti manuali eliminabili.

5Carico/Scarico Manuale
  1. Premere “+ Movimento” nel footer → dialog modale.
  2. Selezionare tipo (12 opzioni).
  3. Cercare articolo da catalogo (autocomplete).
  4. Selezionare ubicazione (opzionale).
  5. Inserire quantità e costo unitario.
  6. Opzionale: numero lotto, data scadenza, data, note.
  7. Premere Salva.
6Tab Lotti e Scadenze

Colonne: articolo, lotto, qta iniziale, qta residua, U.M., scadenza, giorni alla scadenza (rosso <30, arancione <90), data ricevimento, fornitore.

Filtro “Solo in scadenza”: mostra solo lotti che scadono entro 30 giorni.

7Logica FIFO / FEFO

Alla conferma documento, scarico automatico:

MetodoCriterioUso
FEFOFirst Expired, First Out — prima lotti con scadenza vicinaFarmaci, integratori, alimenti
FIFOFirst In, First Out — prima lotti ricevuti primaArticoli senza scadenza

Split lotti: se un lotto non copre la quantità, lo scarico si distribuisce su più lotti. All'annullamento i movimenti vengono stornati e le quantità ripristinate.

Per i farmaci (D.Lgs. 219/2006) lo scarico FEFO è obbligatorio.
8Tab Alert Scorte

Due sezioni: Sotto scorta minima (card per articolo con giacenza, scorta min, deficit) e Lotti in scadenza 30gg (card con lotto, quantità, scadenza, giorni).

Il contatore alert è visibile anche nella Dashboard principale come card “Alert magazzino”.
9Tab Dashboard Magazzino

KPI: valore stock, articoli totali, sotto scorta, rotazione media. Metodo valorizzazione (art. 92 TUIR):

MetodoFormulaNormativa
Costo Medio(costo acquisti + rimanenze) / quantità totaleArt. 92 c.1 TUIR, OIC 13
FIFORimanenze valutate al costo ultimi acquistiArt. 92 c.2 TUIR
LIFORimanenze valutate al costo primi acquistiArt. 92 c.2 TUIR

Sotto i KPI: tabella categorie e top 10 articoli per valore stock.

10Tab Analisi ABC

Classificazione Pareto:

Classe% ValoreGestione
A0–80%Monitoraggio stretto, riordino frequente, scorte di sicurezza
B80–95%Monitoraggio periodico, riordino a soglia
C95–100%Gestione semplificata, ordini meno frequenti
11Tab Indice di Rotazione

Colonne: articolo, giacenza, mov/mese, indice rotazione, giorni copertura (giacenza / consumo medio), stato:

StatoIndiceSignificato
OBSOLETO< 1Meno di 1 scarico/anno — capitale immobilizzato
LENTO1–3Bassa rotazione, valutare promozioni
NORMALE3–10Rotazione nella norma
VELOCE> 10Alta rotazione, garantire scorte
12Tab Punto di Riordino (ROP)

Formula: ROP = (consumo medio giornaliero × lead time) + scorta di sicurezza

Colonne: giacenza, scorta min, consumo medio, lead time, ROP, da ordinare (ROP − giacenza). Articoli con “da ordinare” positivo richiedono riapprovvigionamento.

13Tab Trasferimenti
  1. Aprire dialog Trasferimento.
  2. Selezionare magazzino origine e destinazione.
  3. Selezionare articolo e quantità.
  4. Salva: genera SCARICO_TRASFERIMENTO nell'origine e CARICO_TRASFERIMENTO nella destinazione.
14Ubicazioni Granulari

Struttura a 4 livelli: Corridoio — Scaffale — Ripiano — Cella + barcode opzionale. Premere “Nuova Ubicazione” nel footer per crearne una.

15Tab Storico Prezzi

Cronologia costi unitari alimentata dai movimenti di carico. Colonne: data, articolo, tipo, costo unit., quantità, fornitore. Utile per monitorare l'andamento prezzi e negoziare.

16Barcode ed Etichette

Scanner: campo barcode nell'header per ricerca rapida EAN. Etichette: singola (icona nella riga giacenze) o batch (checkbox + “Stampa etichette” nel footer). Include: codice, descrizione, barcode, prezzo, ubicazione.

17Inventario Fisico

Creare un inventario

  1. Premere “+ Nuovo Inventario”.
  2. Descrizione (opzionale), ubicazione (opzionale = tutti).
  3. Crea: genera elenco articoli con giacenza teorica.

Conteggio

  1. Aprire l'inventario (stato IN_CORSO).
  2. Per ogni articolo inserire quantità contata.
  3. Differenza automatica: +N (verde surplus), −N (rosso ammanco), 0 (grigio ok).
  4. KPI: contati/totale, righe con differenze.

Filtri

Solo non contati (toggle), ricerca per codice/descrizione.

Chiusura

  1. Premere “Chiudi Inventario”.
  2. Il sistema genera movimenti INVENTARIO (rettifiche) per ogni differenza ≠ 0.
  3. Giacenze aggiornate ai valori contati. Stato → COMPLETATO.
Art. 2217 c.c.: l'inventario va redatto almeno annualmente. Le rettifiche devono essere documentate per la valutazione rimanenze (OIC 13).
18Novita Aprile 2026 (v2.1) — Audit, Storno, Cestino, Timeline

Aggiornamento strutturale del modulo Magazzino. Le novità sono pensate nel rispetto della natura contabile dei movimenti: i movimenti di magazzino sono cronologia e non si cancellano — si stornano. Il soft-delete e applicato solo alle anagrafiche (magazzini, ubicazioni), non alle registrazioni.

Storno dei movimenti (pattern contabilmente corretto)

Nel tab Movimenti, selezionando una o piu righe con le checkbox, compare una barra blu con le azioni di gruppo:

  • ↵ Storna: crea, per ogni movimento selezionato, un movimento di rettifica di segno opposto (CARICO_RETTIFICA per uno scarico, SCARICO_RETTIFICA per un carico). Il movimento originale rimane tracciato. Questo e il modo corretto per correggere un errore senza perdere lo storico. Se un movimento e gia stato stornato, viene bloccato.
  • 🗑 Elimina manuali: cancella fisicamente i movimenti selezionati che non hanno documento collegato (bolla, ordine, fattura, documento). I movimenti generati da documenti vengono ignorati e riportati come bloccati nella risposta. La giacenza viene riallineata automaticamente.

Entrambe le azioni registrano un'entry nell'audit log del movimento.

Audit log dei movimenti

Ogni modifica o cancellazione di un movimento (manuale o automatica) viene registrata nella tabella log_modifiche_movimenti_magazzino con campo modificato, valore precedente, valore nuovo, utente e timestamp. Lo storico e accessibile via GET /api/magazzino/movimenti/:id/audit-log.

Audit log degli inventari

La chiusura di un inventario fisico (transizione IN_CORSO → COMPLETATO) viene registrata nella tabella log_modifiche_inventari con utente e data. Accesso via GET /api/magazzino/inventari/:id/audit-log.

Timeline voce magazzino

Nuovo endpoint GET /api/magazzino/voce/:id/timeline che aggrega in ordine cronologico decrescente: movimenti (con flag di storno), righe inventario (conteggiate e non) con giacenza attesa/contata/differenza. Utile per ricostruire la storia di un articolo dal punto di vista del magazzino.

Soft-delete + Cestino su Magazzini e Ubicazioni

Le anagrafiche (depositi e scaffali) sono ora soft-deletabili:

  • DELETE marca i campi cancellatoIl e cancellatoDa, disattiva automaticamente il record e lo rimuove dalla lista standard. Giacenze e movimenti storici restano intatti.
  • Lista cancellati via GET /api/magazzino/magazzini/_/cestino e GET /api/magazzino/ubicazioni/_/cestino (con counters di giacenze/movimenti collegati).
  • Ripristino via POST /api/magazzino/magazzini/:id/ripristina e POST /api/magazzino/ubicazioni/:id/ripristina.
  • Eliminazione definitiva via DELETE /api/magazzino/{tipo}/:id/definitivo: hard delete consentito solo se il record e gia soft-deletato e non ha giacenze ne movimenti collegati.

Perche NON c'e il cestino per movimenti, giacenze e inventari

  • Movimenti: sono cronologia contabile. La correzione corretta e lo storno, non la cancellazione logica.
  • Giacenze: sono snapshot calcolati (voce × ubicazione). Non ha senso “cancellarle”: si svuotano azzerando i movimenti.
  • Inventari: hanno gia un proprio lifecycle IN_CORSO / COMPLETATO / ANNULLATO. Lo stato ANNULLATO e il meccanismo corretto.
19Valorizzazione FIFO / LIFO / CMP

Quando emetti una fattura e scarichi merce dal magazzino, il gestionale deve decidere a che costo registrare quello scarico. I tre metodi riconosciuti fiscalmente sono CMP (Costo Medio Ponderato), FIFO (primo entrato, primo uscito) e LIFO (ultimo entrato, primo uscito).

Dove si imposta

  1. Apri Amministrazione → Parametri
  2. Scorri fino alla sezione “📦 Valorizzazione magazzino”
  3. Scegli il metodo dal menu a tendina:
    • CMP — il più comune per PMI. Media ponderata tra tutte le giacenze
    • FIFO — tipico per prodotti con obsolescenza (elettronica, alimentare non deperibile)
    • LIFO — usato con prezzi in crescita per “caricare” i costi recenti (risparmio fiscale immediato ma magazzino sottovalorizzato)
  4. Salva. Il cambio del metodo impatta solo i nuovi scarichi; i movimenti già registrati restano invariati.

Override per singolo prodotto

Nella scheda di un prodotto in Catalogo, se vuoi che quel singolo articolo usi un metodo diverso dal default aziendale, c'è un campo “Metodo valorizzazione” personalizzato. Lasciare vuoto per ereditare la scelta aziendale.

Simulazione rapida

Se prima di confermare una vendita vuoi vedere quanto ti costa con i 3 metodi, nella pagina Giacenze Magazzino → tab Lotti trovi per ogni articolo il costo/pz e il valore residuo. Così decidi se vendere questo o quello a parità di tipo prodotto.

Il metodo scelto ha valenza fiscale — una volta adottato, il cambio successivo richiede informativa nella nota integrativa del bilancio e rettifica dell'esercizio precedente. Concordare sempre con il commercialista.
20Tab Lotti — costo, valore residuo e scadenze

Il tab “🏷 Lotti” della pagina Giacenze Magazzino è stato potenziato per mostrare in un colpo d'occhio quanto hai in magazzino come valore, non solo come quantità.

Cosa vedi

  • Filtro ricerca testuale per codice articolo, descrizione o numero lotto
  • Toggle “Solo lotti in scadenza (30gg)”
  • Colonne: N° lotto, Q.tà iniziale, Q.tà residua, U.M., Costo/pz, Valore residuo, Data scadenza, Giorni rimanenti, Data ricevimento, Fornitore
  • Riga colorata:
    • rosso = lotto scaduto
    • giallo = scade entro 30 giorni
    • bianco = tutto ok

KPI in alto

Nella barra filtri vedi due numeri aggregati:

  • Lotti attivi: quanti lotti sono attualmente in magazzino
  • Valore residuo: quanto valgono complessivamente (Q.tà residua × costo unitario)

Quando filtri per articolo o per scadenze, i KPI si aggiornano. Utile per calcolare al volo quanto ti costerebbe uno smaltimento di merce scaduta.

21Alert scadenze lotti — badge Dashboard

Dal 2026 il gestionale ti segnala proattivamente i lotti scaduti o in scadenza, senza bisogno che vai a controllare manualmente.

Dove compare l'alert

Nella Dashboard, tra le schede statistica colorate, trovi una card dedicata “Lotti in scadenza” che compare solo se hai almeno uno scaduto/critico/warning:

  • Rosso — ci sono lotti già scaduti: URGENTE, rischio sanitario/fiscale
  • Arancio — ci sono lotti critici (scadono entro 7 giorni)
  • Neutro — solo warning (scadenza fra 8-30 giorni)

Al centro della card vedi il numero (scaduti + critici) e il valore a rischio in euro. Un click ti porta direttamente al tab Lotti filtrato sui lotti interessati.

Email automatica giornaliera

Ogni mattina alle 07:00 il sistema invia una mail riepilogativa a tutti gli admin aziendali con gli alert del giorno. Se non hai configurato l'SMTP aziendale, l'alert resta comunque visibile in dashboard.

Per configurare l'invio email chiedere al tecnico di impostare le variabili SMTP del server (host, porta, user, password). Non richiesto per il funzionamento base: la Dashboard mostra gli alert anche senza mail configurata.
?Domande Frequenti (FAQ)
Lo scarico è automatico alla conferma del documento?
Sì. Al passaggio a CONFERMATO/EMESSO, il sistema genera movimenti di scarico con logica FEFO/FIFO. All'annullamento, storno automatico.
Cosa succede se la giacenza è insufficiente?
Il documento viene salvato comunque. Il sistema segnala l'insufficienza ma non blocca l'operazione.
Differenza tra FIFO e FEFO?
FIFO: prima i lotti ricevuti prima (per data ricevimento). FEFO: prima i lotti con scadenza più vicina. FEFO per deperibili, FIFO per gli altri.
Come imposto la scorta minima?
Tab Giacenze → icona ⚙ Soglie sulla riga. Compilare “Scorta minima”. Sotto la soglia scatta l'alert.
Posso avere costi diversi per lo stesso articolo?
Sì. Ogni carico registra il proprio costo. Tab Storico Prezzi mostra la cronologia. La dashboard offre valorizzazione FIFO/LIFO/Costo Medio.
Come funziona il ricalcolo automatico?
Rigenera tutti i movimenti dai documenti confermati. Utile dopo import massivi. Le giacenze vengono ricalcolate da zero.
Posso eliminare un movimento automatico?
No. Solo i movimenti manuali sono eliminabili. Per annullare quelli automatici, annullare il documento che li ha generati.
Quale metodo di valorizzazione per il bilancio?
Art. 92 TUIR ammette FIFO, LIFO e Costo Medio. Il metodo deve essere coerente tra gli esercizi (OIC 13). Costo Medio è il più usato nelle PMI.
Quanto spesso fare l'inventario?
Art. 2217 c.c.: almeno annualmente. Per molti articoli, consigliato inventario a rotazione (una categoria/mese).
Cosa significa “OBSOLETO” nella rotazione?
Indice < 1: l'articolo è stato scaricato meno di una volta nell'anno. Capitale immobilizzato: valutare promozioni, svalutazione (OIC 13) o rimozione.
L'analisi ABC si aggiorna automaticamente?
Sì, si ricalcola ogni volta che si apre il tab in base a giacenze e valori correnti.
Come gestisco i trasferimenti tra magazzini?
Tab Trasferimenti: selezionare origine, destinazione, articolo, quantità. Il sistema genera due movimenti (scarico + carico) automaticamente.
Ho sbagliato la quantita di un carico: elimino o storno?
Storna. Seleziona il movimento errato, premi “↵ Storna”: il sistema crea un movimento di rettifica di segno opposto che azzera l'effetto sulla giacenza. Il movimento originale resta tracciato. Poi registra il movimento corretto. Questo preserva la cronologia ed e il metodo contabilmente corretto. L'eliminazione e consentita solo sui movimenti manuali (non da documenti) e va usata per errori di inserimento immediati.
Posso eliminare un magazzino che ha giacenze?
Si, ma diventa un soft-delete: il magazzino viene nascosto dalle liste e disattivato, le giacenze e i movimenti storici restano intatti nel database. Se vuoi l'eliminazione fisica (definitiva), devi prima svuotarlo (le giacenze vanno trasferite altrove e i movimenti collegati eliminati/stornati); solo allora il bottone “Definitivo” nel cestino riuscira ad eliminarlo.
Chi ha chiuso l'inventario del mese scorso?
L'audit log degli inventari traccia la chiusura (transizione IN_CORSO → COMPLETATO) con utente e timestamp. Via API GET /api/magazzino/inventari/:id/audit-log, oppure osservando il campo utente sui movimenti di rettifica generati alla chiusura.
Come ricostruisco la storia di un articolo dal punto di vista del magazzino?
Nuovo endpoint GET /api/magazzino/voce/:id/timeline: restituisce in ordine cronologico decrescente tutti i movimenti dell'articolo (marcati con il flag di storno se applicabile) e le righe di inventario fisico in cui compare (attesa, contata, differenza). E la visione completa per capire carichi, scarichi, storni e rettifiche di inventario.
Selezione multipla: posso stornare 50 movimenti di un colpo?
Si. Nel tab Movimenti spunta le righe (o usa la casella in testa per tutti i visibili), compare una barra blu con Storna e Elimina manuali. Lo storno genera 50 movimenti inversi in una sola operazione; i movimenti gia stornati vengono bloccati e riportati come tali. L'elimina-manuali cancella solo i movimenti senza documento collegato (gli altri restano intatti).
Certificazione v 2.2 — Presidi di compliance
🔑 Visibilità condizionata (certificazione v 2.2) — Questo modulo è accessibile solo se:
Pacchetto MAGAZZINO attivo sul workspace (configurabile da SUPERADMIN in /admin/pacchetti)
Profilo attività compatibile: Studio dentistico, Farmacia, Ferramenta, Elettronica, Verniciatura, Generico
Permesso utente abilitato in Modifica Utente → Moduli
I tre livelli si applicano in intersezione. Dettagli completi in Gerarchia Pacchetti+Profilo+Utente.

A partire dalla versione 2.2, il modulo Magazzino adotta lo standard di certificazione NOX con i seguenti presidi:

Cestino e soft-delete

Gli elementi cancellati non vengono rimossi fisicamente ma spostati in un cestino interno (campi cancellatoIl / cancellatoDa). Dalla toolbar il pulsante Cestino alterna tra vista attivi e vista cestino. Dal cestino è possibile:

  • Ripristinare l'elemento (riportarlo nella lista attiva) — operazione riservata ad amministratori.
  • Eliminare definitivamente con motivazione obbligatoria — azione irreversibile, riservata ad amministratori, tracciata nell'audit log.

Azioni massive (bulk)

È possibile selezionare più elementi con le checkbox della prima colonna. Appare una barra inferiore con le azioni disponibili: Per i movimenti si esegue STORNO contabile (inserimento movimento opposto) invece di cancellazione. La risposta indica N operazioni riuscite / M fallite; i dettagli delle fallite compaiono nella console browser (F12).

Guard periodo IVA chiuso (v 2.2)

La creazione di un movimento di magazzino (POST /api/magazzino/movimenti) con dataMovimento che cade in un periodo IVA chiuso viene bloccata con HTTP 409.

  • Il guard verifica la data rispetto alle chiusure attive del registro vendite (tipo DDT)
  • Impedisce di alterare giacenze di un periodo già consolidato contabilmente
  • Per eventuali correzioni: riapertura periodo (admin + motivazione) oppure movimento di storno nel periodo corrente
Riferimento: art. 2220 c.c. — le scritture ausiliarie di magazzino concorrono alla determinazione del reddito e soggiacciono agli stessi obblighi di conservazione.

Storico modifiche (audit log)

L'icona history nelle azioni di riga apre un modal con la storia completa delle modifiche: data, campo, valore precedente, valore nuovo, operatore, eventuale motivazione. I record di audit non sono modificabili né eliminabili via UI. Conservazione: indefinita (art. 2220 c.c. — 10 anni minimo).

Mascheramento dati sensibili (GDPR art. 32)

Se i campi modificati contengono dati sensibili (IBAN, Codice Fiscale, Partita IVA, password/token), l'audit log salva il valore mascherato anziché in chiaro:

CampoEsempio originaleNel log
IBANIT60X0542811101000000123456IT60****3456
Codice Fiscale (PF)RSSMRA80A01H501ZRSSMRA****501Z
Partita IVA12345678901123****901
Password / token(qualsiasi)***REDACTED***

Timeline aggregata

Per ciascun elemento è disponibile una vista Timeline che aggrega in ordine cronologico audit, eventi del ciclo di vita ed eventuali entità collegate (es. documenti, movimenti, storni).

RBAC uniforme

Tutte le azioni distruttive o massive (soft-delete, ripristino, eliminazione definitiva, bulk, storno) richiedono il ruolo ADMIN o superiore. Gli operatori possono continuare a creare / modificare / consultare secondo le proprie abilitazioni.

Il DOCX di certificazione formale per questo modulo è disponibile: certificazione-magazzino.docx (cartella manuali).

Integrazione automatica DDT → movimenti magazzino (v 2.2 wave 9)

Trigger automatico che genera i movimenti di magazzino a partire dalle righe di un DDT con il tipo di movimento corretto in funzione della causale. Previene la doppia esecuzione tramite log di tracciamento.

Mapping DDT → tipo movimento

Scenario DDTTipo movimento generatoSegno quantità
DDT di vendita (causale VENDITA)SCARICO_VENDITAnegativo (scarica)
DDT reso cliente (resoTipo RESO_CLIENTE)CARICO_RESO_CLIENTEpositivo (carica)
DDT reso fornitore (resoTipo RESO_FORNITORE)SCARICO_RESO_FORNnegativo (scarica)

Endpoint

  • POST /api/bollettazione/magazzino-auto/ddt/:docId [ADMIN] body {magazzinoId, forza?}
  • Scandisce documento_righe.voceCatalogoId e genera un record movimenti_magazzino per ogni riga con articolo di catalogo
  • Traccia l'esecuzione in log_magazzino_auto con array movimenti_generati[], esito (OK/ERRORE/SKIP), eventuale errore testuale
  • Il flag forza: true permette di rieseguire il trigger anche se un log OK esiste già (utile dopo correzioni)
Le righe senza voceCatalogoId (es. righe di testo libero, spese accessorie) vengono saltate silenziosamente perché non rappresentano giacenze. Il costo unitario applicato al movimento è il prezzoUnitario della riga, e il valore totale è il totaleRiga.

MAGAZZINO v 2.2 — 11ª ondata (ALTA + MEDIA priorità)

Estensione del pacchetto MAGAZZINO con 8 macro-funzionalità avanzate richieste dal mercato enterprise. Tutti gli endpoint sono montati sotto /api/magazzino-v11/* (router magazzino-v22-wave11.routes.js). 8 nuove tabelle DB + estensioni schema.

A. Causali rettifica classificate (14 codici seed)

Sostituisce il campo causale a testo libero con un elenco strutturato e parametrizzabile di causali standard.

CodiceTipoFotoSoglia approvazione
DANNEGGIATOSCARICO€ 100,00
OBSOLETOSCARICO€ 500,00
FURTOSCARICOsempre (€ 0,01)
FURTO_ASSICURATOSCARICOsempre
SCADUTOSCARICO€ 100,00
SOTTOINVENTARIOSCARICO€ 200,00
SOVRAINVENTARIOCARICO€ 200,00
CAMBIO_LOTTOCARICO
RESO_CLIENTECARICO
OMAGGIOSCARICO€ 50,00
AUTOCONSUMOSCARICO€ 100,00
DISTRUZIONE_CERTIFICATASCARICOsempre
PRODUZIONE_CARICO/SCARICOBI
  • GET /api/magazzino-v11/causali-rettifica — elenco
  • PUT /api/magazzino-v11/causali-rettifica/:id [ADMIN] — modifica soglia/foto/attivo
  • POST /api/magazzino-v11/movimenti/rettifica body {voceCatalogoId, magazzinoId, quantita, causaleRettificaId, motivazione, costoUnitario}
  • Se sogliaApprovazioneEur impostata e valore ≥ soglia, il movimento nasce in stato IN_ATTESA_APPROVAZIONE

B. Workflow approvazione movimenti

Stato movimento: BOZZAIN_ATTESA_APPROVAZIONEAPPROVATO / RIFIUTATO. Ogni movimento in attesa richiede firma ADMIN.

  • GET /api/magazzino-v11/movimenti/in-approvazione — coda approvazione
  • POST /api/magazzino-v11/movimenti/:id/approva [ADMIN]
  • POST /api/magazzino-v11/movimenti/:id/rifiuta [ADMIN] body {motivo}
  • Campi: statoApprovazione, approvatoDa, approvatoIl, rifiutatoMotivo, richiestaApprovazioneDa

C. Allegati foto/documenti giustificativi

Upload di foto, verbali, certificati di distruzione allegati al singolo movimento. Salvataggio disco con hash SHA-256.

  • Tabella movimento_allegati con tipo (FOTO/DOCUMENTO/CERTIFICATO_DISTRUZIONE/VERBALE)
  • POST /api/magazzino-v11/movimenti/:id/allegati form-data file + tipoAllegato + note
  • GET /api/magazzino-v11/movimenti/:id/allegati, /allegati/:allegId/download
  • Cartella: /app/magazzino-allegati/, max 15 MB per file

D. Giacenza retrospettiva a data

Ricostruzione della giacenza a qualunque data storica sommando i movimenti approvati fino a quel giorno. Utile per export periodo d'imposta, confronti storici, analisi stagionalità.

  • GET /api/magazzino-v11/giacenza-a-data?data=2026-12-31&voceCatalogoId=X&magazzinoId=Y
  • Per performance su dataset grandi: snapshot giornaliero opzionale con POST /api/magazzino-v11/giacenza-snapshot/genera
  • Tabella giacenze_snapshot: UNIQUE (data, magazzino, voce, ubicazione, numLotto)

E. Valorizzazione FIFO / LIFO / CMP selezionabile

Nuovo campo metodoValorizzazione su voci_catalogo: default CMP (costo medio ponderato), selezionabile FIFO o LIFO per articolo.

  • PATCH /api/magazzino-v11/valorizzazione/:voceCatalogoId body {metodo: 'CMP'|'FIFO'|'LIFO'}
  • GET /api/magazzino-v11/valorizzazione/:voceCatalogoId/preview-scarico?quantita=N — mostra strati (movimenti sorgente) che verranno prelevati e costo medio risultante
  • FIFO: strati ordinati per data ASC (primi entrati primi usciti)
  • LIFO: strati ordinati per data DESC (ultimi entrati primi usciti)
  • Se giacenza insufficiente: HTTP 409 con dettaglio strati analizzati

F. Seriali univoci + RMA

Gestione del numero di serie per beni singoli (elettronica, strumenti, beni strumentali) con tracciabilità completa dall'ingresso alla dismissione.

  • Tabella seriali_magazzino: numero, voce, lotto, magazzino, stato (ATTIVO/VENDUTO/IN_RMA/IN_RIPARAZIONE/RESO/SCARTATO/SMARRITO), data garanzia
  • UNIQUE (voce_catalogo_id, numero_seriale) — stesso numero può esistere per articoli diversi
  • POST /api/magazzino-v11/seriali [ADMIN], GET /seriali?stato=ATTIVO&voceCatalogoId=X
  • PATCH /seriali/:id/stato [ADMIN] — transizioni di stato con data uscita, cliente, documento vendita

G. RMA (Return Merchandise Authorization)

Workflow completo resi tecnici con link al seriale, documento vendita, diagnosi, soluzione applicata.

  • Tabella rma_pratiche: numero, seriale, voce, cliente, stato (APERTA/IN_ANALISI/IN_RIPARAZIONE/RIPARATA/NON_RIPARABILE/SOSTITUITA/RIMBORSATA/CHIUSA)
  • POST /api/magazzino-v11/rma [ADMIN] body {numeroRma, serialeId?, voceCatalogoId, clienteId?, motivoReso, difettoDescrizione}
  • PATCH /api/magazzino-v11/rma/:id/avanzamento [ADMIN] — aggiorna stato + diagnosi + costo + seriale sostituzione + NC
  • L'apertura RMA con seriale imposta automaticamente il seriale in stato IN_RMA

H. MRP — Material Requirements Planning

Generazione automatica di proposte d'ordine per articoli sotto scorta minima, con calcolo quantità suggerita basata su scorta_massima o quantita_riordino.

  • Tabella mrp_proposte_ordine: voce, magazzino, quantità suggerita, giacenza attuale, scorta minima, costo stimato, stato (NUOVA/IN_VALUTAZIONE/ORDINATA/ANNULLATA/IGNORATA)
  • Tabella mrp_config: scheduler attivo, cron expression, email destinatario alert, giorni copertura target
  • GET/PUT /api/magazzino-v11/mrp/config [ADMIN PUT]
  • POST /api/magazzino-v11/mrp/genera-proposte [ADMIN] — analizza tutte le giacenze sotto scorta e crea proposte (evita duplicati)
  • GET /api/magazzino-v11/mrp/proposte?stato=NUOVA, PATCH /mrp/proposte/:id [ADMIN] — valuta e transiziona

I. Batch import movimenti CSV

Upload CSV per carichi iniziali, rettifiche massive, importazione da sistemi legacy. Mapping colonne automatico, validazione riga per riga, report dettagliato errori.

  • Tabella movimenti_import_batch: righe totali/importate/scartate, errori JSONB, esito (OK/ERRORE/PARZIALE)
  • POST /api/magazzino-v11/import-movimenti [ADMIN] form-data file (max 15 MB) + query tipoDefault + magazzinoDefaultId
  • Colonne accettate (case-insensitive, flessibili): codice_voce | voce_codice | sku | codice, quantita | qty | qta, costo_unitario | costo | prezzo, data, tipo_movimento | tipo, lotto | numLotto, note
  • Delimitatori supportati: , ; \t
  • GET /api/magazzino-v11/import-movimenti/batch — storico import

J. Carico automatico da fattura passiva

Integrazione con il ciclo passive SDI (wave 8): a partire dalle righe parsed della fattura passiva crea automaticamente i movimenti CARICO_ACQUISTO con costo unitario = prezzo unitario fattura.

  • Prerequisito: fattura passiva con righe parsed in fattura_passiva_righe (eseguire prima POST /api/fatturazione/sdi-passive/:id/parse-xml)
  • POST /api/magazzino-v11/carico-da-fattura-passiva/:id [ADMIN] body {magazzinoId, forza?}
  • Matching voce via codice_articolo_valore del XML FatturaPA → voci_catalogo.codice
  • Righe senza corrispondenza catalogo vengono silenziosamente saltate (non bloccante)
  • Flag caricoMagazzinoGeneratoIl + array caricoMovimentiIds[] su fatture_passive per tracciabilità
Il pacchetto MAGAZZINO è ora completo sul fronte ALTA + MEDIA priorità. I residui BASSA sono stati chiusi nella 12ª ondata (vedere sezione sottostante).

MAGAZZINO v 2.2 — 12ª ondata (chiusura residui BASSA)

Chiusura dei 4 residui aperti: listini multi-magazzino, workflow trasferimenti inter-magazzino, regole approvazione granulari per ruolo/categoria, link bidirezionale DDT ↔ RMA. Tutti gli endpoint sotto /api/magazzino-v12/*.

A. Listini multi-magazzino (prezzi per ubicazione)

Nuovo campo magazzinoId su voci_listino (NULL = prezzo globale valido per tutti, valore specifico = prezzo solo per quel magazzino). Utile per aziende multi-sede con politiche commerciali differenziate.

  • GET /api/magazzino-v12/listini-multi?listinoId=X&voceCatalogoId=Y&magazzinoId=Z — lista con fallback globale
  • GET /api/magazzino-v12/listini-multi/best-price?voceCatalogoId=X&magazzinoId=Y&data=2026-04-19 — ritorna il miglior prezzo applicabile: specifico magazzino vince su globale, a parità priorità listino decide
  • POST /api/magazzino-v12/listini-multi [ADMIN] — crea/duplica prezzo per magazzino specifico
  • PUT /api/magazzino-v12/listini-multi/:id [ADMIN] — modifica prezzo/date/magazzino
  • Response include matchType: SPECIFICO_MAGAZZINO o GLOBALE

B. Trasferimenti inter-magazzino con workflow

Gestione strutturata delle richieste di trasferimento merce tra magazzini con approvazione, tracking trasporto e rilevazione differenze in consegna. Sostituisce l'uso diretto dei movimenti TRASFERIMENTO_IN/OUT con un flusso governato.

Workflow stati
StatoEventoChi può eseguire
RICHIESTOCreazione richiesta con righequalunque utente
APPROVATO/approvaADMIN
IN_TRANSITO/avvia — genera TRASFERIMENTO_OUToperatore
COMPLETATO/completa — genera TRASFERIMENTO_IN + rileva differenzeoperatore destinazione
RIFIUTATO/rifiuta con motivoADMIN
ANNULLATO/annulla (non da COMPLETATO)ADMIN
Tabelle e campi
  • Tabella trasferimenti_magazzino: numero progressivo annuale, magazzino origine/destinazione, priorità (BASSA/NORMALE/ALTA/URGENTE), vettore, tracking number, date approva/avvia/completa, motivi
  • Tabella trasferimento_righe: quantità richiesta / inviata / ricevuta, differenza, motivo differenza, lotto, costo unitario
  • Collegamento automatico ai movimenti generati (movimento_out_id, movimento_in_id)
Endpoint
  • POST /api/magazzino-v12/trasferimenti body {magazzinoOrigineId, magazzinoDestinazioneId, priorita, motivazione, righe:[{voceCatalogoId, quantitaRichiesta, costoUnitario, numLotto}]}
  • POST /trasferimenti/:id/approva [ADMIN]
  • POST /trasferimenti/:id/rifiuta [ADMIN] body {motivo}
  • POST /trasferimenti/:id/avvia body {trackingNumber?, vettoreId?} — genera TRASFERIMENTO_OUT con quantità negative
  • POST /trasferimenti/:id/completa body {righeRicevute:[{rigaId, quantitaRicevuta, motivoDifferenza}]} — genera TRASFERIMENTO_IN con quantità effettivamente ricevute; conteggio automatico righe con differenza
  • POST /trasferimenti/:id/annulla [ADMIN]
  • GET /trasferimenti?stato=IN_TRANSITO&magazzinoOrigineId=X
  • GET /trasferimenti/:id — dettaglio con righe + progress

C. Regole approvazione granulari

Sostituisce la singola soglia globale configurata sulle causali rettifica con un sistema di regole configurabili con priorità. Ogni movimento candidato viene valutato contro le regole attive e la regola con priorità minore (match più specifico) vince.

Parametri regola
  • tipoMovimento (opzionale) — es. SCARICO_RETTIFICA, CARICO_INIZIALE
  • causaleRettificaId (opzionale) — causale specifica da causali_rettifica
  • categoriaVoceId (opzionale) — articoli di una categoria
  • magazzinoId (opzionale) — magazzino specifico
  • sogliaValoreEur (opzionale) — soglia €
  • ruoloMinimoApprovatore: UTENTE | OPERATORE | MANAGER | ADMIN | SUPERADMIN
  • emailNotificaApprovatori: lista email separata da virgola per notifiche push
  • priorita: numero intero — più basso vince (specificità maggiore)
Seed regole default
NomeTipoSogliaRuolo richiestoPriorità
Furti (qualsiasi importo)SCARICO_RETTIFICA€ 0,01ADMIN10
Carichi manuali > 5000 €CARICO_INIZIALE€ 5.000ADMIN30
Rettifiche > 1000 €SCARICO_RETTIFICA€ 1.000MANAGER50
Endpoint
  • GET/POST /api/magazzino-v12/regole-approvazione [ADMIN POST]
  • PUT /api/magazzino-v12/regole-approvazione/:id [ADMIN]
  • DELETE /api/magazzino-v12/regole-approvazione/:id [ADMIN] — soft-delete (attivo = false)
  • POST /api/magazzino-v12/regole-approvazione/check body {tipoMovimento, causaleRettificaId, categoriaVoceId, magazzinoId, valoreEur} — verifica se un movimento candidato richiede approvazione e quale ruolo la può concedere

D. DDT reso ↔ RMA link bidirezionale

Collegamento robusto tra pratica RMA (wave 11) e i DDT coinvolti (reso dal cliente + eventuale sostituzione). Navigazione bidirezionale: da RMA ai suoi documenti, da documento alla RMA.

Campi aggiunti
  • rma_pratiche.ddt_reso_id — DDT con cui il cliente ha restituito il bene
  • rma_pratiche.ddt_sostituzione_id — DDT con cui è stato spedito il bene sostitutivo
  • documenti.rmaPraticaId — riferimento inverso per navigazione rapida
Endpoint
  • POST /api/magazzino-v12/ddt-rma-link [ADMIN] body {rmaId, ddtResoId?, ddtSostituzioneId?} — crea link bidirezionale
  • GET /api/magazzino-v12/ddt-rma-link/rma/:rmaId — restituisce RMA + documenti collegati (ddtReso, ddtSostituzione, documentoOrigine, notaCredito) con numero, data, tipo, stato
  • GET /api/magazzino-v12/ddt-rma-link/documento/:docId — dato un documento trova la RMA collegata
  • POST /api/magazzino-v12/rma/:id/log-transizione — registra transizione di stato in rma_log_transizioni per audit
  • GET /api/magazzino-v12/rma/:id/log — storico transizioni di stato
Il pacchetto MAGAZZINO è ora completo end-to-end (ALTA + MEDIA + BASSA). I residui rimasti sono solo integrazioni esterne tipicamente facoltative: MES (Manufacturing Execution System) per produzione, WMS (Warehouse Management System) dedicato per grandi magazzini, scanner RFID fisici. Tutte le funzionalità applicative richieste dalla normativa italiana e dagli scenari commerciali standard sono coperte.
Back-Order

Voce sidebar Magazzino > Back-Order. Pagina dedicata agli articoli in attesa di evasione: quando un DDT esce con quantità minori di quanto richiesto (per scarsa giacenza, conversione parziale ordine, ecc.) le righe non spedite finiscono qui, da consegnare appena disponibili.

Come si crea un back-order

Modo principale: dal dialog di conversione ORD → DDT con il toggle «Genera back-order per le quantità non spedite» (acceso di default). Per ogni riga con qta non trasferita nel DDT viene creata automaticamente una riga di back-order, collegata al DDT origine.

Pagina Back-Order

Mostra in cima 3 stat card (Pendenti / Parziali / Totale attivi). Filtro per stato in alto (default mostra solo PENDENTI e PARZIALI, escludendo evasi/annullati).

Per ogni riga vedi: descrizione articolo, cliente, DDT origine, quantità attesa, fornita, residuo, stato, data creazione. Azioni:

  • Matita: edit inline della quantitaFornita; lo stato si aggiorna automaticamente (PENDENTE / PARZIALE / EVASO)
  • ✓ Marca evaso: imposta quantità fornita = quantità attesa, stato → EVASO
  • ✕ Annulla: stato → ANNULLATO (es. cliente ha rinunciato)

Stati

  • PENDENTE: nessuna fornitura ancora registrata
  • PARZIALE: quantità fornita parziale, in attesa del resto
  • EVASO: completamente fornito (chiuso)
  • ANNULLATO: cancellato senza evasione