API Documenti — Specifica Tecnica¶
Panoramica¶
API REST per l'inserimento e la consultazione di documenti su Areagate da parte di sistemi esterni (gestionali host). Supporta diverse classi di documento con gestione automatica della deduplicazione.
Endpoint disponibili¶
| Metodo | Path | Descrizione |
|---|---|---|
| POST | /v1/documenti |
Inserimento batch di documenti generici |
| GET | /v1/documenti |
Lettura lista documenti (filtri: id, cliente, paginazione) |
| GET | /v1/documenti/up |
Lettura documenti aggiornati a partire da un sync id |
Schema input — POST /v1/documenti¶
Il body e' un array di oggetti DocumentoInput (max 200 elementi).
Testata (DocumentoInput)¶
| Campo | Tipo | Obbligatorio | Note |
|---|---|---|---|
key_doc_host |
string | SI | Chiave univoca del documento nel sistema host (max 30 char) — usata per deduplicazione |
classe_documento |
string | SI | Classe documento (max 4 char). Valori ammessi: vedi Classi supportate |
ana_area |
string | NO* | Codice interno anagrafica AREA (max 30 char). Alternativo a ana_host |
ana_host |
string | NO* | Codice anagrafica nel sistema host esterno (max 30 char). Alternativo a ana_area |
data_doc |
integer | NO | Data documento in formato YYYYMMDD (es. 20260504 = 4 maggio 2026). Default: data odierna se 0 o omesso |
doc_interlocutore |
string | NO** | Riferimento documento dell'interlocutore (max 15 char). Ammesso solo per classe DMEF |
data_doc_interlocutore |
integer | NO** | Data del documento dell'interlocutore in YYYYMMDD. Ammessa solo per classe DMEF |
mag_host |
string | NO | Codice magazzino nel sistema host esterno (max 16 char) |
note |
string | NO | Note libere sulla testata (max 2000 char) |
padri |
array | NO | Array di PadreDocumentoInput — raccordi padre a livello testata |
righe |
array | SI | Array di RigaDocumentoInput (minimo 1 elemento) |
* ana_area e ana_host sono mutuamente esclusivi: esattamente uno dei due deve essere presente (non e' possibile specificarli entrambi). La regola specifica dipende dalla classe documento (vedi Validazione anagrafica).
** doc_interlocutore e data_doc_interlocutore sono ammessi solo per la classe DMEF: per altre classi vengono rifiutati con 400 body/{i}: doc_interlocutore e data_doc_interlocutore sono ammessi solo per la classe DMEF. Mappano sui campi DB a_dotes_doc_interlocutore e a_dotes_data_doc_interlocutore.
Riga (RigaDocumentoInput)¶
| Campo | Tipo | Obbligatorio | Note |
|---|---|---|---|
riga_doc |
integer | SI | Progressivo riga nel sistema host (>= 1) |
segno_mov |
string | SI | Segno movimentazione: U = uscita/vendita, E = entrata |
merce |
string | SI | Codice merce nel sistema host esterno (max 30 char) |
qta |
number | SI | Quantita' (max +/-9.999.999,999) |
prezzo_lordo |
number | NO | Prezzo unitario lordo (default 0) |
sconto_1 |
number | NO | Primo sconto percentuale (default 0) |
sconto_2 |
number | NO | Secondo sconto percentuale (default 0) |
sconto_3 |
number | NO | Terzo sconto percentuale (default 0) |
prezzo_netto |
number | NO | Prezzo netto dopo sconti (default 0) |
importo |
number | NO | Importo totale della riga (default 0) |
note |
string | NO | Note di riga (max 2000 char). Non ammessa se serial_numbers e' valorizzato |
serial_numbers |
array | NO | Elenco serial number movimentati in uscita. Solo BDPC. Vedi sezione dedicata |
padre |
object | NO | PadreRigaDocumentoInput — raccordo padre riga |
Raccordo testata (PadreDocumentoInput)¶
| Campo | Tipo | Obbligatorio | Note |
|---|---|---|---|
classe_padre |
string | SI | Classe del documento padre (solo ORC ammesso) |
key_doc_host_padre |
string | NO* | Codice host del documento padre (max 30 char) |
key_doc_area_padre |
string | NO* | Codice area del documento padre (max 30 char) |
* key_doc_host_padre e key_doc_area_padre sono mutuamente esclusivi: esattamente uno dei due deve essere presente.
Raccordo riga (PadreRigaDocumentoInput)¶
| Campo | Tipo | Obbligatorio | Note |
|---|---|---|---|
classe_padre |
string | SI | Classe del documento padre (solo ORC ammesso) |
key_doc_host_padre |
string | NO* | Codice host del documento padre (max 30 char) |
key_doc_area_padre |
string | NO* | Codice area del documento padre (max 30 char) |
riga_padre |
integer | SI | Progressivo riga del documento padre (>= 1) |
* key_doc_host_padre e key_doc_area_padre sono mutuamente esclusivi: esattamente uno dei due deve essere presente.
Classi supportate¶
classe_documento |
Descrizione | Anagrafica | Puo' avere padri |
|---|---|---|---|
BDPC |
Buoni di prelievo cliente | Cliente (ARPANAGR) |
SI (solo ORC, solo testata) |
DMEF |
Documenti di entrata da fornitore | Fornitore (TBFORNITORI) |
NO |
DMG |
Documenti generici di magazzino (prima nota) | Nessuna (ignorata) | NO |
DMUF |
Documenti di uscita a fornitore | Fornitore (TBFORNITORI) |
NO |
Tutte le classi inseriscono in ARPDOCTES / ARPDOCDET.
Nota: La classe
ORC(ordini clienti) e' supportata solo come padre nei raccordi, non come documento da inserire tramite questo endpoint. Gli ordini risiedono inARPORTES/ARPORDETe vengono gestiti dall'endpoint/v1/ordini.
Regole di validazione¶
Deduplicazione¶
- Nel payload: non sono ammessi
key_doc_hostduplicati nello stesso array (errore immediato) - Nel database: se un documento con lo stesso
key_doc_hoste' gia' presente, non viene reinserito e viene riportato nella risposta - I documenti nuovi vengono inseriti normalmente anche se nella stessa chiamata esistono duplicati sul DB
Validazione anagrafica¶
La validazione dell'anagrafica dipende dalla classe documento:
Classi cliente (BDPC):
ana_areaeana_hostsono mutuamente esclusivi: specificarne entrambi produce un errore- Almeno uno dei due deve essere presente
ana_area: verificata suARPANAGR(rana_codana)ana_host: cercato il raccordo host -> codice interno tramitegetRaccordiClienti
Documenti generici (DMG):
- L'anagrafica e' ignorata. Se presente viene comunque salvata, ma non viene validata
Classi fornitore (DMEF, DMUF):
- E' ammesso solo
ana_area(codice interno).ana_hostnon e' supportato - Verificato su
TBFORNITORI(a_for_codana)
Documenti padre¶
- Solo la classe
BDPCpuo' avere documenti padre - Il raccordo BDPC -> ORC e' gestito solo a livello testata (campo
padri[]). Non e' ammessopadrea livello riga per BDPC - La classe padre ammessa e' esclusivamente
ORC - Il documento padre viene cercato tramite
key_doc_host_padreokey_doc_area_padre:- ORC:
key_doc_host_padrecerca sua_ortes_codice_host,key_doc_area_padrecerca sua_ortes_tor_chia - Altri:
key_doc_host_padrecerca sua_dotes_key_host,key_doc_area_padrecerca sua_dotes_key_area
- ORC:
- La logica raccordo riga e' mantenuta nel codice per future tipologie di raccordo
Righe¶
- Ogni
mercedeve avere un raccordo valido inARPMERCI segno_movdeve essereU(uscita) oE(entrata)- L'unita' di misura (
a_dodet_um_area) viene recuperata automaticamente daARPMERCI
Serial number (serial_numbers)¶
Array opzionale di stringhe (min 1 char, max 30 char per ogni s/n) che elenca i serial number movimentati dalla riga.
Vincoli:
- Ammesso solo per la classe
BDPC. Su altre classi produce errorebody/{i}/righe/{j}/serial_numbers: ammessi solo per la classe BDPC - La merce di riga deve avere il flag gestione s/n attivo (
arpmerci.rmer_fl_sn = 'T'), altrimenti errorela merce {merce} non prevede la gestione s/n - Se valorizzato, il campo
notedi riga non e' ammesso (errorela nota verrebbe sovrascritta): la nota verrebbe persa - I s/n non vengono validati contro
apasnmatri— e' responsabilita' del gestionale gestire eventuali s/n inesistenti
Effetto sulla scrittura:
- Il campo
a_dodet_noteviene sovrascritto con l'elenco dei s/n trimmati e separati da"; "(es."SN001; SN002; SN003") - Se la lunghezza totale della stringa risultante supera 2000 caratteri (limite di
a_dodet_note), errorel'elenco s/n eccede 2000 caratteri (N)
Raccordi (ARPDOCRAC)¶
La tabella ARPDOCRAC collega documenti padre-figlio, sia a livello di testata che di riga.
Struttura tabella¶
CREATE TABLE arpdocrac (
a_dorac_azi char(3) NOT NULL,
a_dorac_padre_id_pub integer NOT NULL, -- id_pub del documento padre
a_dorac_padre_riga integer NOT NULL, -- 0 = testata, >0 = riga
a_dorac_figlio_id_pub integer NOT NULL, -- id_pub del documento figlio
a_dorac_figlio_riga integer NOT NULL, -- 0 = testata, >0 = riga
PRIMARY KEY (azi, padre_id_pub, padre_riga, figlio_id_pub, figlio_riga)
);
Raccordo testata -> testata¶
Inserire nella padri[] della testata, usando key_doc_area_padre o key_doc_host_padre:
{
"padri": [
{
"classe_padre": "ORC",
"key_doc_area_padre": "ORD-2024-001"
}
]
}
Genera un record in ARPDOCRAC con padre_riga = 0 e figlio_riga = 0.
Raccordo riga -> riga¶
Inserire nell'oggetto padre della riga:
{
"riga_doc": 1,
"segno_mov": "U",
"merce": "ART001",
"qta": 10,
"padre": {
"classe_padre": "ORC",
"key_doc_area_padre": "ORD-2024-001",
"riga_padre": 1
}
}
Genera un record in ARPDOCRAC con padre_riga = riga_padre e figlio_riga = id_prog (progressivo riga figlio).
Risoluzione padre¶
La ricerca del documento padre avviene in base alla classe e al campo compilato:
| Classe padre | key_doc_host_padre |
key_doc_area_padre |
|---|---|---|
ORC |
a_ortes_codice_host |
a_ortes_tor_chia |
| Altre | a_dotes_key_host |
a_dotes_key_area |
Il campo riga_padre nel payload corrisponde direttamente al numero riga usato nel raccordo — non e' necessaria nessuna traduzione.
Campi auto-assegnati¶
I seguenti campi vengono valorizzati automaticamente dall'endpoint:
| Campo DB | Valore |
|---|---|
a_dotes_id_pub |
Progressivo auto-incrementato |
a_dotes_origine |
"H" (host) |
a_dotes_causale |
Derivata dalla classe |
a_dotes_currency |
"E" (Euro) |
a_dotes_agg_app |
"A" (flag aggiornamento lato web) |
a_dotes_agg_host |
1 |
a_dotes_di_prog |
"API-DOC" (programma di inserimento) |
a_dotes_id_sincro |
Progressivo da getNextIdSincro |
a_dodet_um_area |
Unita' di misura da ARPMERCI |
a_dodet_merce |
Codice merce interno da raccordo |
a_dodet_id_prog |
Indice riga (1-based) |
Formato date¶
Tutte le date nel payload (input e output) sono integer YYYYMMDD (es. 20260504 = 4 maggio 2026), coerentemente con altri moduli del progetto (fatture, matricole, chiamata, intervento).
Conversione lato server: integerToDate per input -> DB, to_char(..., 'YYYYMMDD')::integer con CASE per output -> client.
Se data_doc e' 0 o omesso, viene usata la data odierna.
data_doc_interlocutore, se omessa o 0, viene salvata come 0001-01-01 su DB (segnaposto "non valorizzata"). In output viene restituito il valore grezzo del DB convertito in YYYYMMDD (es. 10101 per il segnaposto), senza normalizzazione a 0.
Risposta¶
200 OK¶
Tutti i documenti inseriti:
{
"message": "OK",
"scartati": []
}
Inserimento parziale (alcuni documenti gia' presenti):
{
"message": "OK",
"scartati": ["DOC-001", "DOC-002"]
}
Nessun documento inserito (tutti gia' presenti):
{
"message": "Nessun documento inserito",
"scartati": ["DOC-001", "DOC-002"]
}
Il campo scartati contiene i key_doc_host dei documenti gia' presenti nel database che non sono stati reinseriti.
400 Bad Request¶
Errore di validazione (schema TypeBox o logica di business).
Esempio payload completo¶
[
{
"key_doc_host": "BDP-2024-001",
"classe_documento": "BDPC",
"ana_host": "CLI001",
"data_doc": 20240101,
"mag_host": "MAG01",
"note": "Buono di prelievo gennaio",
"padri": [
{
"classe_padre": "ORC",
"key_doc_area_padre": "ORD-2024-010"
}
],
"righe": [
{
"riga_doc": 1,
"segno_mov": "U",
"merce": "ART001",
"qta": 10,
"prezzo_lordo": 25.50,
"sconto_1": 5,
"sconto_2": 0,
"sconto_3": 0,
"prezzo_netto": 24.225,
"importo": 242.25
},
{
"riga_doc": 2,
"segno_mov": "U",
"merce": "ART002",
"qta": 5,
"prezzo_lordo": 100.00,
"prezzo_netto": 100.00,
"importo": 500.00
}
]
},
{
"key_doc_host": "DDT-FORN-2024-007",
"classe_documento": "DMEF",
"ana_area": "F00123",
"data_doc": 20240301,
"doc_interlocutore": "DDT-789/2024",
"data_doc_interlocutore": 20240228,
"mag_host": "MAG01",
"righe": [
{
"riga_doc": 1,
"segno_mov": "E",
"merce": "ART001",
"qta": 100,
"prezzo_lordo": 12.00,
"prezzo_netto": 12.00,
"importo": 1200.00
}
]
}
]
Note implementative¶
- Tutte le operazioni di inserimento sono eseguite in una singola transazione (
db.begin). In caso di errore, nessun dato viene scritto - L'INSERT avviene su tre tabelle in sequenza:
ARPDOCTES(testate),ARPDOCDET(righe),ARPDOCRAC(raccordi) - I raccordi testata e riga vengono unificati in un singolo INSERT su
ARPDOCRAC - L'unita' di misura (
a_dodet_um_area) viene recuperata automaticamente daARPMERCItramite il codice merce host - I campi di aggiornamento (
*_da_*) vengono valorizzati come quelli di inserimento (*_di_*) - Il campo
a_dotes_agg_app = "A"segnala ai processi di sync (come SWN139) che il record e' stato aggiornato lato web
Integrazione lato gestionale¶
I documenti inseriti tramite questa API vengono importati nel gestionale dal processo SWN139 - Importazione documenti Areagate, che legge ARPDOCTES/ARPDOCDET e crea i corrispondenti documenti tramite COGS26 (documenti magazzino) e COGSA0 (buoni prelievo).
Specifica aggiornata sulla base del documento di import API_Documenti_Schema.md — 2026-03-20