Vai al contenuto

API Giacenze

Il modulo giacenze espone due gruppi di endpoint su path distinti, ciascuno con propria tabella di riferimento e chiave di aggregazione:

  • /v1/giacenze-cap -- giacenze per capoarea (tabella ARPSLMAG, chiave: agenzia)
  • /v1/giacenze -- giacenze per magazzino (tabella ARPARMAG, chiave: magazzino)

Entrambi i gruppi condividono la stessa struttura operativa: lettura, lettura incrementale e aggiornamento batch.


1. Giacenze Capoarea (/v1/giacenze-cap)

Tabella principale: ARPSLMAG JOIN: ARPAGENZ (agenzie), ARPMERCI (merci)

1.1 Endpoint disponibili

Metodo Path Descrizione
GET /v1/giacenze-cap Lettura giacenze (filtri: codice_host_merce, codice_host_agenzia, paginazione)
GET /v1/giacenze-cap/up Lettura giacenze aggiornate da un sync id
POST /v1/giacenze-cap Aggiornamento batch giacenze

1.2 Schema output -- GET

Campo Tipo Note
gruppo string Gruppo merce interno (rpmsalc_gru)
sottogruppo string Sottogruppo merce interno (rpmsalc_sot)
codice integer Codice merce interno (rpmsalc_cod)
codice_interno_agenzia string Codice interno agenzia (rpmsalc_age)
giacenza number Quantita' in giacenza
impegnato number Quantita' impegnata
ordinato number Quantita' ordinata
prenotato number Quantita' prenotata
disponibile number Quantita' disponibile
codice_host_merce string Codice merce nel sistema host (rmer_cma)
codice_host_agenzia string Codice agenzia nel sistema host (rmag_codice_host)
sync integer ID di sincronizzazione

1.3 Query string -- GET /v1/giacenze-cap

Parametro Tipo Obbligatorio Note
codice_host_merce string NO Filtra per codice merce host
codice_host_agenzia string NO Filtra per codice agenzia host
limit integer NO Max risultati (default/max: 2000)
page integer NO Pagina (paginazione offset-based)

1.4 Query string -- GET /v1/giacenze-cap/up

Parametro Tipo Obbligatorio Note
sync integer SI Restituisce record con sync maggiore di questo valore

1.5 Schema input -- POST

Il body e' un array di oggetti (max 2000 elementi).

Campo Tipo Obbligatorio Note
codice_host_merce string SI Codice merce nel sistema host (max 30 char)
codice_host_agenzia string SI Codice agenzia nel sistema host (max 10 char)
giacenza number NO Quantita' in giacenza (default 0)
impegnato number NO Quantita' impegnata (default 0)
ordinato number NO Quantita' ordinata (default 0)
prenotato number NO Quantita' prenotata (default 0)
disponibile number NO Quantita' disponibile (default 0)

1.6 Logica POST

  1. Raccordi: traduce codice_host_merce -> codice interno (getRaccordiMerci), codice_host_agenzia -> codice interno (getRaccordiAgenzie)
  2. Confronto con esistenti: query su ARPSLMAG per i record con le stesse chiavi (gru, sot, cod, age)
  3. Classificazione:
    • Nuovi: record non esistente con almeno un valore diverso da 0 -> INSERT su ARPSLMAG
    • Modificati: record esistente con valori diversi -> UPDATE su ARPSLMAG
    • Record esistenti con valori invariati -> ignorati
    • Record non esistenti con tutti i valori a 0 -> ignorati
  4. Sincronizzazione: ogni INSERT/UPDATE riceve un id_sincro progressivo da getNextIdSincro

1.7 Endpoint interni (non documentati)

  • DELETE /v1/giacenze-cap -- Azzera tutte le giacenze non nulle (rpmsalc_giacenza, rpmsalc_impegnato, ecc.) aggiornando l'id_sincro. Richiede authProcPermission
  • POST /v1/giacenze-cap/sum_stock -- Calcola le giacenze aggregate per merce su ARPARMAG sommando da ARPSLMAG. Usa INSERT ... ON CONFLICT DO UPDATE. Richiede authProcPermission

2. Giacenze per Magazzino (/v1/giacenze)

Tabella principale: ARPARMAG JOIN: APCOGMAGAZ (magazzini), ARPMERCI (merci)

2.1 Endpoint disponibili

Metodo Path Descrizione
GET /v1/giacenze Lettura giacenze (filtri: codice_host_merce, codice_host_magazzino, paginazione)
GET /v1/giacenze/up Lettura giacenze aggiornate da un sync id
POST /v1/giacenze Aggiornamento batch giacenze

2.2 Schema output -- GET

Campo Tipo Note
codice_interno_magazzino string Codice interno magazzino (a_armag_mag)
codice_host_magazzino string Codice magazzino nel sistema host (a_magz_codice_host)
codice_host_merce string Codice merce nel sistema host (rmer_cma)
codice_interno_merce string Codice merce interno (a_armag_merce)
giacenza number Quantita' in giacenza
impegnato number Quantita' impegnata
ordinato number Quantita' ordinata
prenotato number Quantita' prenotata
id_sincro integer ID di sincronizzazione
sn string[] Lista numeri seriali associati effettivamente in giacenza nell'ubicazione (arpsnmag con a_snm_fl_canc = ' ' AND a_snm_stato <> 'U')

Visibilita' magazzini

Il GET restituisce solo magazzini con codice_host valorizzato (trim(a_magz_codice_host) <> ''). Magazzini senza codice host non compaiono nei risultati.

2.3 Query string -- GET /v1/giacenze

Parametro Tipo Obbligatorio Note
codice_host_merce string NO Filtra per codice merce host
codice_host_magazzino string NO Filtra per codice magazzino host
limit integer NO Max risultati (default/max: 2000)
page integer NO Pagina (paginazione offset-based)

2.4 Query string -- GET /v1/giacenze/up

Parametro Tipo Obbligatorio Note
sync integer SI Restituisce record con id_sincro maggiore di questo valore

2.5 Schema input -- POST

Il body e' un array di oggetti (max 2000 elementi).

Campo Tipo Obbligatorio Note
codice_host_merce string SI Codice merce nel sistema host (max 30 char)
codice_host_magazzino string SI Codice magazzino nel sistema host (max 16 char)
giacenza number NO Quantita' in giacenza (default 0)
sn string NO Numero seriale (max 30 char, default "")
cancellato boolean NO Cancellazione logica (default false)

2.6 Logica POST

Il POST gestisce due flussi separati in base alla presenza del numero seriale.

Flusso senza seriale (sn vuoto)

  1. Raccordi: traduce codice_host_merce -> codice interno (getRaccordiMerci), codice_host_magazzino -> codice interno (getRaccordiMagazzini)
  2. Controllo duplicati: checkDuplicati verifica che non ci siano coppie (magazzino, merce) duplicate nel payload
  3. Confronto con esistenti: query su ARPARMAG
  4. Classificazione:
    • Nuovi: record non esistente -> INSERT su ARPARMAG
    • Modificati: record esistente con giacenza diversa -> UPDATE su ARPARMAG
    • Cancellati: record esistente con cancellato = true -> UPDATE con giacenza = 0

Flusso con seriale (sn valorizzato)

  1. Vincolo: giacenza deve essere 0 o 1
  2. Confronto con esistenti: query su ARPSNMAG per chiave (merce, sn)
  3. Casistiche:
    • SN non esistente + giacenza 1 -> INSERT su ARPSNMAG, incremento giacenza su ARPARMAG
    • SN esistente + cancellato -> UPDATE flag cancellazione su ARPSNMAG, decremento giacenza su ARPARMAG
    • SN esistente + cambio magazzino -> UPDATE magazzino su ARPSNMAG, aggiornamento giacenze su ARPARMAG (decremento vecchio, incremento nuovo)
    • SN non esistente + giacenza 0 o cancellato -> ignorato
  4. Aggiornamento ARPARMAG: le variazioni di giacenza vengono accumulate in un contatore per coppia (magazzino, merce) e applicate in batch (INSERT per nuovi record, UPDATE per esistenti)

2.7 Tabelle coinvolte

Tabella Ruolo
ARPARMAG Giacenze aggregate per magazzino/merce
ARPSNMAG Numeri seriali per merce/magazzino
APCOGMAGAZ Anagrafica magazzini (raccordo codice host)
ARPMERCI Anagrafica merci (raccordo codice host)

3. Note implementative

  • Tutte le operazioni POST sono eseguite in transazione (db.begin). In caso di errore, nessun dato viene scritto
  • Ogni INSERT/UPDATE aggiorna l'id_sincro progressivo, usato dagli endpoint /up per la sincronizzazione incrementale
  • Le UPDATE batch usano la sintassi FROM (VALUES ...) as updated_data (...) con TO_NUMBER per la conversione dei tipi
  • I raccordi (merci, magazzini, agenzie) vengono caricati una sola volta all'inizio della transazione
  • Il limite massimo per ogni chiamata e' 2000 elementi (GIACENZE_LIMIT)

4. Risposta

200 OK

{
  "message": "OK"
}

400 Bad Request

Errore di validazione (codice merce o magazzino/agenzia non trovato, duplicati nel payload).