WMS Locazioni¶
Panoramica¶
Il modulo WMS Locazioni estende le funzionalita' di magazzino dell'ERP Area con una APP mobile per la gestione fisica delle ubicazioni. L'obiettivo e' tracciare ogni spostamento di merce tra locazioni (arrivo, stock, spedizione) in modo sincronizzato tra gestionale e APP.
L'ERP e' sviluppato in AcuCOBOL-GT su archivi ISAM Vision; l'APP e' sviluppata con Framework-7
e JavaScript. Le due basi dati comunicano tramite un DB di frontiera PostgreSQL (tabelle DF*).
Architettura generale¶
ERP Area (ISAM Vision)
|
| export/import (demone sync + programmi DFN*)
v
DB Frontiera PostgreSQL (tabelle DF*)
|
| accesso diretto online
v
APP WMS (Framework-7 / JS)
Le tabelle del DB frontiera si dividono in due categorie:
- Tabelle sincronizzate: scritte dall'ERP ed esportate sul frontiera (anagrafiche, documenti)
- Tabelle condivise: scritte sia da ERP che da APP, nessuna sincronizzazione aggiuntiva necessaria (locazioni, giacenze per locazione, movimenti per locazione)
Mapping tabelle ERP / DB frontiera¶
Anagrafiche e catalogo¶
| Tabella ERP (Vision) | Tabella DB frontiera | Contenuto |
|---|---|---|
| COGGEANA | DFANAGR | Anagrafiche clienti/fornitori |
| COGMERCI | DFMERCIPREST | Anagrafica articoli (con descrizione estesa e tabelle CMA) |
| COGMAGAZ | — | Magazzini (non sincronizzato) |
| COGSLMAG | — | Giacenze di magazzino contabili (non sincronizzato) |
Documenti di magazzino e ordini¶
| Tabella ERP (Vision) | Tabella DB frontiera | Classe df_dtes_classe |
Contenuto |
|---|---|---|---|
| COGTESBO (testata) | DFDOCTES | DM | Documento di carico/movimento magazzino |
| COGMOMAG (dettaglio) | DFDOCDET | — | Righe documento di magazzino |
| COGTESOR (testata) | DFDOCTES | OV | Ordine di vendita |
| COGRIGOR (dettaglio) | DFDOCDET | — | Righe ordine di vendita |
| — | DFDOCTES | COV | Consegna ordine di vendita |
| COGTESBP (testata) | DFDOCTES | BDP / BDPP | Buono di prelievo (definitivo / provvisorio) |
| COGRIGBP (dettaglio) | DFDOCDET + DFDOCRAC | — | Righe BDP; DFDOCRAC raccorda BDP con l'ordine evaso |
Tabelle esclusive del DB frontiera (gestione fisica locazioni)¶
| Tabella | Gestore | Contenuto |
|---|---|---|
| DFLOCAZIONI | YFLOCAZI | Anagrafica ubicazioni/locazioni |
| DFGIACENZELOC | YFGIALOC | Giacenze per articolo/locazione |
| DFMOVIMENTILOC | YFMOVLOC | Log movimenti per locazione |
| DFTABLOCAZIONI | YFTABLOC | Tabelle dei valori di posizione (stanza, corsia, posto, piano, cella) |
| DFDOCRAC | — | Raccordo tra documenti (BDP-ordine, BDP-consegna, INV-inventario) |
Struttura tabelle chiave (PostgreSQL)¶
DFLOCAZIONI — anagrafica locazioni¶
Chiave primaria: (loc_mag_tip, loc_mag_cod, loc_locazione) — char(20)
| Campo | Formato | Note |
|---|---|---|
| loc_mag_tip | char(1) | Tipo magazzino: I=interno, V=viaggiante |
| loc_mag_cod | char(5) | Codice magazzino |
| loc_locazione | char(20) | Codice locazione (concatenazione dei 5 elementi) |
| loc_stanza/corsia/posto/piano/cella | char(2) ciascuno | Posizioni componenti |
| loc_classe | char(1) | A=Arrivo, M=Magazzino/Stock, P=Partenza/Spedizione |
| loc_priorita | char(1) | Priorita' di picking (0=picking, 1=stock, ...) |
| loc_monoprodotto | char(1) | S/N: la locazione accetta un solo codice merce |
| loc_ana | char(6) | Chiave cliente/fornitore associato alla locazione |
| loc_capacita | num(13,3) | Capacita' in dm3 |
| loc_fl_canc | char(1) | C = cancellato logicamente |
DFGIACENZELOC — giacenze per locazione¶
Chiave primaria: (gloc_mag_tip, gloc_mag_cod, gloc_classe, gloc_locazione, gloc_merce)
| Campo | Formato | Note |
|---|---|---|
| gloc_merce | char(9) | Codice merce |
| gloc_giacenza | num(13,3) | Quantita' fisica presente |
| gloc_prenotato | num(13,3) | Quantita' prenotata durante evasione ordine in corso |
| gloc_qta_in_uscita | num(13,3) | Quantita' in prelievo da operatore (BDP non ancora confermato) |
| gloc_data_arrivo | date | Data primo versamento sulla locazione (da giacenza = 0) |
| gloc_data_check | date | Data ultimo controllo inventario fisico sulla locazione |
DFMOVIMENTILOC — movimenti per locazione¶
Chiave primaria: (mloc_mag_tip, mloc_mag_cod, mloc_classe, mloc_locazione, mloc_prog)
| Campo | Formato | Note |
|---|---|---|
| mloc_merce | char(9) | Codice merce |
| mloc_tipo_mov | char(1) | Tipo: A=Arrivo, P=Prelievo/Partenza, R=prenotazione, ... |
| mloc_segno | char(1) | E=Entrata, U=Uscita |
| mloc_doc_key | char(30) | Chiave documento gestionale collegato |
| mloc_doc_riga | num(8) | Riga documento gestionale |
| mloc_qta_doc | num(7,3) | Quantita' totale della riga documento |
| mloc_qta_loc | num(7,3) | Quantita' relativa alla locazione (una riga puo' essere ripartita) |
| mloc_doc_key_orig | char(30) | Chiave documento originale (es. carico da cui e' nato un BDP da arrivo) |
DFDOCTES — testata documenti (estratto campi WMS)¶
Chiave primaria: df_dtes_key (sequence PostgreSQL)
| Campo | Note |
|---|---|
| df_dtes_key_host | Chiave testata nel gestionale host |
| df_dtes_classe | Classe documento: OV, COV, DM, BDP, BDPP, ... |
| df_dtes_locazione | Locazione assegnata al documento |
| df_dtes_fl_lavorato | N = da lavorare su APP (es. BDP da arrivo) |
| df_dtes_stato_doc | Stato: blank=aperto, C=chiuso/evaso |
| df_dtes_ope_assegnato | Operatore che ha preso in carico il documento su APP |
Tipi di locazione¶
| Classe | Prefisso codice | Scopo |
|---|---|---|
| A (Arrivo) | es. A01.... |
Area a terra dove viene appoggiata la merce in entrata, in attesa di smistamento |
| M (Magazzino/Stock) | es. 1.A.A.0.A |
Scaffalature di stoccaggio definitivo, identificate dai 5 livelli gerarchici |
| P (Partenza/Spedizione) | es. P01.... |
Aree di raccolta merce preparata per la spedizione al cliente |
Il codice locazione e' composto da 5 posizioni: stanza.corsia.posto.piano.cella.
Le locazioni di Arrivo e Partenza usano tipicamente solo il primo campo.
La gerarchia dei valori ammessi per ciascuna posizione e' definita in DFTABLOCAZIONI.
Flussi principali¶
Flusso 1 — Arrivo merce da fornitore¶
Lato ERP:
- Ufficio acquisti inserisce documento di carico (COGTESBO/COGMOMAG), assegnandolo a una locazione di Arrivo
- All'inserimento, ERP scrive su
DFMOVIMENTILOCil movimento di entrata sulla locazione A (tipoA, segnoE) e aggiornaDFGIACENZELOC - Addetto esegue "controllo residui": verifica se la merce in arrivo puo' coprire ordini clienti scoperti
- Se si': genera BDP da arrivo (COGTESBP); esportato su DFDOCTES con
df_dtes_fl_lavorato = Ne assegnato a una locazione di Spedizione - Il BDP da arrivo e' raccordato al carico in
DFDOCRAC - Il residuo del carico (non diretto a BDP) rimane sulla locazione di Arrivo e viene esportato come documento DM su DFDOCTES
Lato APP:
- APP mostra gli arrivi gia' elaborati da "controllo residui"
- Operatore prende in carico l'arrivo, si muove in magazzino e posiziona i prodotti sulle locazioni di Stock (M)
- Per ogni spostamento:
DFMOVIMENTILOCriceve un'uscita dalla locazione A e un'entrata sulla locazione M;DFGIACENZELOCviene aggiornato - Quando la somma algebrica dei movimenti sulla locazione A scende a 0, la locazione e' libera
Logica di verifica evasione arrivo: La riga di carico e' completamente stoccata quando la somma algebrica di tutti i movimenti (segno E - segno U) sulla locazione A per quella riga documento = 0.
Flusso 2 — BDP da arrivo (merce diretta a cliente)¶
Lato APP:
- APP mostra i BDP da arrivo con
df_dtes_fl_lavorato = N - Operatore prende in carico il BDP, preleva la merce dalla locazione di Arrivo
- Porta la merce sulla locazione di Spedizione assegnata al cliente
- APP scrive su
DFMOVIMENTILOC: uscita da locazione A, entrata su locazione P - APP aggiorna
DFGIACENZELOCsu entrambe le locazioni - Il BDP viene marcato come lavorato; ERP lo rendera' evadibile rimuovendo il flag provvisorio
(
TBP-FL-PROVVISORIO = ' ')
Flusso 3 — Evasione ordini (prelievo da magazzino)¶
Lato APP:
- APP mostra gli ordini aperti su DFDOCTES (classe OV/COV), filtrabili per cliente o barcode consegna
- Un ordine non e' piu' visibile quando tutte le quantita' sono: uscite oppure presenti in un BDP di spedizione gia' preparato
- Operatore seleziona ordine: il sistema calcola le quantita' da prelevare per ogni articolo (qta ordine - qta evasa - qta in BDP aperti) e individua le locazioni M da visitare, ordinate per percorso logico (ordine alfabetico locazione)
- Per ogni locazione/articolo: APP inserisce movimento di prenotazione su
DFMOVIMENTILOC(tipoR) e aggiornagloc_prenotatosuDFGIACENZELOC - Operatore percorre il magazzino; per ogni prelievo conferma con lettura barcode prodotto + locazione + quantita'
- Al termine: APP crea un BDP provvisorio (BDPP) su DFDOCTES/DFDOCRAC, scarica le locazioni M prelevate, carica la locazione di Spedizione P
Lato ERP (programma DFN109):
- Sync DFN109 individua i BDPP da importare (query su DFDOCRAC con
DF_DRAC_DF_CLASSE = 'BDPP'eDF_DRAC_AGG_HOST = 1) - Per ciascuno: crea COGTESBP + COGRIGBP, aumenta
qta prenotatasu COGSLMAG, aggiorna DFDOCRAC con chiave BDP definitivo, impostaTOR-FL-LAVORATO = Ssull'ordine - Il BDP provvisorio viene sostituito dal definitivo; APP lo vede come classe BDP
Lato ERP — emissione DDT:
- Addetto spedizioni seleziona i BDP (da arrivo e da magazzino) nella funzione emissione DDT
- Viene generato il DDT di vendita; la locazione di Spedizione viene svuotata (movimento U, aggiornamento DFGIACENZELOC, liberazione locazione se vuota)
- La chiusura del BDP aggiorna
DF_DTES_STATO_DOC = 'C'su DFDOCTES tramite WMSW01
Programmi ERP coinvolti¶
| Programma | Ruolo |
|---|---|
| WMSW01 | Subroutine: aggiorna stato BDP su DFDOCTES alla chiusura |
| WMSW02 | (vedi codebase) |
| WMSW04 | Strumento diagnostico: visualizzazione movimenti magazzino (Vision) e movimenti APP (DFMOVIMENTILOC) da una data specificata; utile per riconciliazione e debug discrepanze |
| DFN101 | Sync ordini di vendita: esporta ordini modificati su DB frontiera con quantita' evasa |
| DFN109 | Sync BDP: importa BDP provvisori creati da APP; importa BDP movimentati da APP (da arrivo) |
Sincronizzazioni batch¶
| Direzione | Tabelle ERP | Tabelle frontiera | Programma | Note |
|---|---|---|---|---|
| ERP → frontiera | COGTESOR/COGRIGOR | DFDOCTES/DFDOCDET | DFN101 | Ordini vendita + consegne |
| ERP → frontiera | COGTESBP/COGRIGBP | DFDOCTES/DFDOCDET/DFDOCRAC | — | BDP definitivi |
| frontiera → ERP | DFDOCRAC (BDPP) | COGTESBP/COGRIGBP | DFN109 | BDP provvisori da APP |
| frontiera → ERP | DFDOCTES (BDP lavorati) | COGTESBP | DFN109 | Rimozione flag provvisorio |
| c00000 → frontiera | arpanagr/arpmerci/... | DFANAGR/DFMERCIPREST/... | demone Webcon | Anagrafiche e catalogo |
Strumento diagnostico: WMSW04¶
WMSW04 permette di confrontare i movimenti magazzino lato ERP con i movimenti lato APP (DFMOVIMENTILOC) a partire da una data specificata. Viene usato per:
- Individuare discrepanze tra giacenze contabili (COGSLMAG) e giacenze per locazione (DFGIACENZELOC)
- Verificare movimenti doppi su BDP (query di riferimento in basso)
- Identificare giacenze negative su locazioni
- Controllare locazioni di Partenza non assegnate che non dovrebbero avere giacenza
Query diagnostiche di riferimento:
-- Movimenti doppi: stessa merce, stesso BDP, stessa locazione, stesso giorno
SELECT mloc_locazione, mloc_doc_key, mloc_merce, mloc_qta_loc, mloc_di_data, count(*) AS cnt
FROM dfmovimentiloc
JOIN dfdoctes ON (df_dtes_classe = 'BDPP' AND df_dtes_key_host = mloc_doc_key)
WHERE mloc_tipo_mov = 'P' AND mloc_di_data >= '2025-09-01'
GROUP BY mloc_locazione, mloc_doc_key, mloc_merce, mloc_qta_loc, mloc_di_data
HAVING count(*) > 1
ORDER BY mloc_di_data ASC, cnt DESC;
-- Giacenze negative per locazione
SELECT loc_classe, gloc_locazione, count(*)
FROM dfgiacenzeloc
JOIN dflocazioni ON (gloc_locazione = loc_locazione)
WHERE gloc_giacenza < 0
GROUP BY loc_classe, gloc_locazione;
-- Locazioni di Partenza non assegnate con giacenza non nulla (anomalia)
SELECT loc_classe, gloc_locazione, count(*)
FROM dfgiacenzeloc
JOIN dflocazioni ON (gloc_locazione = loc_locazione)
WHERE gloc_giacenza <> 0 AND loc_ana = ' ' AND loc_classe = 'P' AND gloc_fl_canc <> 'C'
GROUP BY loc_classe, gloc_locazione;
Casi particolari di gestione documentale¶
| Caso | Effetto ERP | Effetto locazioni |
|---|---|---|
| Cancellazione riga BDP diretto | Qta prenotata COGSLMAG diminuisce; ordine ritorna evadibile | Locazione P diminuisce; locazione M di origine aumenta |
| Cancellazione riga BDP da arrivo | Qta prenotata diminuisce; carico puo' essere stoccato o riassegnato | Locazione P diminuisce; locazione A di origine aumenta |
| Cancellazione riga DDT con BDP diretto | Giacenza+impegno+prenotato aumentano; riga dissociata dal BDP originale, creato nuovo BDP | Locazione P rimane invariata |
| BDP da completamento lotti | Creato con TBP-FL-PROVVISORIO = P; non evadibile fino a conferma APP |
Locazione M scaricata, locazione P caricata; DFN109 rimuovera' flag provvisorio dopo conferma |
Note implementative¶
- Il campo
RMER-LOCAZIONE-DEFAULTsu ARPMERCI contiene la locazione di default proposta per un articolo non ancora presente in nessuna locazione; non viene sincronizzato sul frontiera - Le operazioni di inventario manuale da APP scrivono su DFDOCRAC con classe
INVper permettere al programma di inventario gestionale di elaborare solo le merci gia' contate - Profilazione APP: profilo "Direzione" puo' accedere alle funzioni di inventario/adeguamento giacenze; profilo "utente standard" ha accesso solo alle funzioni operative
- La cancellazione di una riga DDT deve separare le righe rimosse in un nuovo BDP per evitare che le locazioni di Partenza rimangano scaricate erroneamente