# Warehouse Operational Flow

Questo diagramma descrive il flusso operativo integrato tra:

- layout di magazzino;
- gestione picking list;
- movimentazione fisica dei pallet;
- viste SQL e stored procedure coinvolte;
- aggiornamento dell'interfaccia dopo ogni operazione.

## Vista d'insieme

```{mermaid}
flowchart TD
    UI["Operatore su interfaccia"] --> LAY["Gestione Layout"]
    UI --> PL["Gestione Picking List"]

    subgraph Layout["Flusso Layout"]
        LAY --> LC1["Caricamento corsie e metadati layout"]
        LC1 --> LC2["vViewMappaturaDescrizioneCorsia"]
        LC1 --> LC3["vViewMappaturaPosizCorsia"]
        LC1 --> LC4["MagLayout"]
        LC1 --> LC5["Celle / Magazzini"]
        LC2 --> GRID["Rendering griglia scaffale"]
        LC3 --> GRID
        LC4 --> GRID
        LC5 --> GRID
        GRID --> LX["Click su cella / ricerca UDC / menu contestuale"]
    end

    subgraph Picking["Flusso Picking List"]
        PL --> PC1["Caricamento elenco documenti"]
        PC1 --> PV1["XMag_ViewPackingList"]
        PV1 --> PGRID["Griglia documenti aggregata"]
        PGRID --> PSEL["Selezione documento"]
        PSEL --> PV2["vViewPackingListRestante"]
        PV2 --> PDET["Griglia dettaglio documento"]
        PDET --> PACT["Prenota / S-prenota / consultazione"]
    end

    subgraph Mov["Movimentazione pallet"]
        LX --> MOVE{"Operazione fisica?"}
        MOVE -->|Carico o spostamento| SP1["sp_xMagGestioneMagazziniPallet"]
        MOVE -->|Scarico pallet| SP1
        PACT -->|Prenota o s-prenota| SP2["sp_xExePackingListPallet"]
        SP1 --> M1["Aggiorna movimenti MagazziniPallet"]
        SP1 --> M2["Aggiorna cella destinazione / origine"]
        SP1 --> M3["Controlla prenotazione automatica"]
        M3 --> SP3["sp_ControllaPrenotazionePackingListPalletNew"]
        SP3 --> SP4["sp_xExePackingListPalletPrenota"]
        SP2 --> M4["Aggiorna Celle.IDStato"]
        SP2 --> M5["Scrive LogPackingList"]
        SP4 --> M4
    end

    subgraph Views["Ricostruzione contesto"]
        M1 --> GV["XMag_GiacenzaPallet"]
        M2 --> CV["Celle"]
        GV --> XP["XMag_ViewPackingList"]
        GV --> TP["vXTracciaProdotti"]
        CV --> XP
        XP --> RL1["Stato documento / pallet / ubicazione"]
        TP --> RL2["Articolo / lotto / descrizione"]
    end

    RL1 --> LREF["Refresh Layout / Picking List"]
    RL2 --> LREF
    LREF --> GRID
    LREF --> PGRID
    LREF --> PDET
```

## Flusso del layout

```{mermaid}
flowchart TD
    A["Apertura Gestione Layout"] --> B["Legge mappatura corsie"]
    B --> B1["vViewMappaturaDescrizioneCorsia"]
    B --> B2["vViewMappaturaPosizCorsia"]
    B --> B3["MagLayout"]
    B --> B4["Celle / Magazzini"]
    B1 --> C["Costruisce geometria scaffale"]
    B2 --> C
    B3 --> C
    B4 --> C
    C --> D["Query giacenza pallet per corsia"]
    D --> E["Colora celle: vuota / piena / multipla"]
    E --> F["Mostra UDC piu recente nella cella"]
    F --> G{"Interazione utente"}
    G -->|Ricerca UDC| H["Evidenzia cella in blu"]
    G -->|Tasto destro su cella rossa| I["Menu contestuale"]
    I --> J["Dialog scarico / analisi multi UDC"]
    J --> K["Movimentazione fisica pallet"]
    K --> L["Refresh layout"]
```

## Flusso della picking list

```{mermaid}
flowchart TD
    A["Apertura Gestione Picking List"] --> B["Query aggregata documenti"]
    B --> C["XMag_ViewPackingList"]
    C --> D["Una riga per documento"]
    D --> E["Utente seleziona il documento"]
    E --> F["Query dettaglio documento"]
    F --> G["vViewPackingListRestante"]
    G --> H["Mostra pallet ancora rilevanti per il documento"]
    H --> I{"Azione utente"}
    I -->|Prenota o s-prenota| J["sp_xExePackingListPallet"]
    I -->|Consulta dettaglio| H
    J --> K["Aggiorna IDStato delle celle del documento"]
    K --> L["LogPackingList"]
    K --> M["Refresh lista documenti"]
    K --> N["Refresh dettaglio documento"]
```

## Flusso della movimentazione pallet

```{mermaid}
flowchart TD
    A["Utente legge barcode pallet e cella"] --> B["sp_xMagGestioneMagazziniPallet"]
    B --> C{"Il pallet esiste gia in giacenza?"}
    C -->|No| D["Inserisce movimento V sulla nuova cella"]
    C -->|Si| E["Inserisce movimento P sulla vecchia cella"]
    E --> F["Inserisce movimento V sulla nuova cella"]
    D --> G["Aggiorna ricostruzione giacenza"]
    F --> G
    G --> H["XMag_GiacenzaPallet"]
    H --> I["XMag_ViewPackingList"]
    H --> J["vXTracciaProdotti"]
    I --> K["Ubicazione e stato documento"]
    J --> L["Dati articolo e lotto"]
    K --> M["Refresh interfaccia"]
    L --> M
```

## Significato delle viste e delle stored procedure

- `XMag_ViewPackingList`:
  ricostruisce il collegamento tra pallet, documento, ubicazione e stato
  logistico. E' la vista principale per la schermata picking list.
- `vViewPackingListRestante`:
  mostra il dettaglio operativo del documento, cioe' le righe ancora visibili
  e ordinate per ubicazione.
- `vXTracciaProdotti`:
  arricchisce il pallet con lotto, codice articolo e descrizione.
- `sp_xMagGestioneMagazziniPallet`:
  esegue il movimento fisico del pallet nel magazzino.
- `sp_xExePackingListPallet`:
  fa il toggle di prenotazione delle celle coinvolte in una picking list.
- `sp_xExePackingListPalletPrenota`:
  forza la prenotazione a `IDStato = 1`.
- `sp_ControllaPrenotazionePackingListPalletNew`:
  controlla se, dopo una movimentazione fisica, debba essere riapplicata una
  prenotazione automatica sulle celle coinvolte.

## Lettura pratica del sistema

- Il layout risponde alla domanda:
  "dove sono i pallet e come sono distribuiti nello scaffale?"
- La picking list risponde alla domanda:
  "quali pallet fanno parte di un documento e quali celle sono prenotate?"
- La movimentazione pallet risponde alla domanda:
  "cosa succede nel tracciato quando un pallet viene caricato, spostato o
  scaricato?"
- Le viste vengono rilette dopo l'operazione per riportare la UI in uno stato
  coerente con il database.
