1. Scopo e architettura
Il presente documento descrive il protocollo HTTP/JSON esposto dal Trading Partner e utilizzato da OB1 per lo scambio di dati contabili e anagrafici. La specifica è rivolta allo sviluppatore del sistema esterno e descrive esclusivamente il contratto di integrazione, senza dettagli implementativi interni di OB1.
| Direzione | Metodo | Funzione |
|---|---|---|
| Trading Partner → OB1 | GET | Dati da importare/elaborare in OB1 |
| OB1 → Trading Partner | POST | Esito dell’elaborazione dei dati ricevuti |
| OB1 → Trading Partner | POST | Piano dei conti e Centri di costo |
| OB1 → Trading Partner | POST | Incassi clienti e Pagamenti fornitori |
Il mandante viene identificato da id_ow. Per questa integrazione l’identificativo univoco esterno utilizzato negli esiti è id_teleutias. Il nome identifica l’ID del record nel sistema esterno e non modifica la struttura o il funzionamento del protocollo.
2. GET - richiesta dati a OB1
OB1 esegue una GET verso l’endpoint configurato del Trading Partner. La richiesta è incrementale e comprende il contesto del mandante e l’intervallo dei due esercizi aperti.
| Parametro | Significato |
|---|---|
| last-sync-datetime | Data/ora dell’ultima sincronizzazione registrata da OB1. |
| first-date | Data iniziale dell’esercizio corrente. |
| last-date | Data finale dell’esercizio successivo. |
| id_ow | Identificativo del mandante presso il Trading Partner. |
GET <base-url><get-url><last-sync-datetime>&first-date=<YYYY-MM-DD>&last-date=<YYYY-MM-DD>&id_ow=<ID> Nota: I nomi first-date, last-date e id_ow fanno parte del contratto corrente. L’endpoint e la parte iniziale della URL sono configurabili. L’autenticazione utilizza l’header HTTP Authorization: Bearer <token>.
2.1 Risposta GET
La risposta è un oggetto JSON. I metadati seguenti sono riconosciuti da OB1; le collection possono essere presenti solo quando contengono dati.
{
"version": "1.0",
"message": "",
"sync-datetime": "01/10/2026@07:00:00",
"debug": "",
"ok": true,
"login": true,
"customers": [],
"customers_deleted": [],
"vendors": [],
"vendors_deleted": [],
"services": [],
"services_deleted": [],
"products": [],
"products_deleted": [],
"invoices": [],
"invoices_deleted": [],
"creditnotes": [],
"creditnotes_deleted": [],
"cinvoices": [],
"cinvoices_deleted": [],
"ccreditnotes": [],
"ccreditnotes_deleted": [],
"financial_transactions": [],
"financial_transactions_deleted": [],
"payments": [],
"payments_deleted": []
}| Campo | Tipo | Uso |
|---|---|---|
| version | string | Versione del payload. Se assente OB1 usa 1.0. |
| message | string | Messaggio informativo del Trading Partner. |
| sync-datetime | string | Timestamp di sincronizzazione restituito dal TP; se assente OB1 assegna data/ora corrente. |
| debug | string | Informazione diagnostica opzionale. |
| ok | boolean | Esito generale della risposta. |
| login | boolean | Esito autenticazione/autorizzazione. |
3. Anagrafiche GET
3.1 customers - Clienti
| Campo | Tipo | Presenza | Descrizione |
|---|---|---|---|
| id_customer | string | Sì | ID esterno cliente |
| nr_customer | string | Sì | Numero cliente |
| name | string | Sì | Nome |
| company | string | Sì | Ragione sociale |
| surname | string | Sì | Cognome |
| adresse | string | Sì | Indirizzo |
| adresse2 | string | Sì | Indirizzo 2 |
| cap | string | Sì | CAP |
| location | string | Sì | Località |
| tel1 | string | Sì | Telefono |
| tel2 | string | Sì | Telefono 2 |
| fax | string | Sì | Fax |
| string | Sì | ||
| web | string | Sì | Sito web |
| cust_currency | string | Sì | Valuta |
| acct_code | string | Sì | Conto contabile |
| cust_title | string | Sì | Titolo |
| cust_status | string | Sì | Stato |
| cust_lang | string | Sì | Lingua |
| resp1 | string | Sì | Contatto/responsabile |
| cust_exempt_iva | string | Sì | Indicatore esenzione IVA |
| email_invoice | array[string] | No | Indirizzi e-mail fattura |
| cust_country_code | string | No | Codice paese |
| vat_number | string | No | Numero IVA |
| tax_id | string | No | Identificativo fiscale |
3.2 vendors - Fornitori
| Campo | Tipo | Presenza | Descrizione |
|---|---|---|---|
| id_customer | string | Sì | ID esterno fornitore |
| nr_customer | string | Sì | Numero fornitore |
| name | string | Sì | Nome |
| surname | string | Sì | Cognome |
| company | string | Sì | Ragione sociale |
| adresse | string | Sì | Indirizzo |
| adresse2 | string | Sì | Indirizzo 2 |
| cap | string | Sì | CAP |
| location | string | Sì | Località |
| tel1 | string | Sì | Telefono |
| tel2 | string | Sì | Telefono 2 |
| fax | string | Sì | Fax |
| string | Sì | ||
| web | string | Sì | Sito web |
| cust_currency | string | Sì | Valuta |
| acct_code | string | Sì | Conto contabile |
| cust_title | string | Sì | Titolo |
| cust_status | string | Sì | Stato |
| cust_lang | string | Sì | Lingua |
| resp1 | string | Sì | Contatto/responsabile |
| cust_exempt_iva | string | Sì | Indicatore esenzione IVA |
| cust_country_code | string | No | Codice paese |
| vat_number | string | No | Numero IVA |
| tax_id | string | No | Identificativo fiscale |
| cf_acct_vendor_bank_name | string | No | Nome banca |
| cf_acct_vendor_bank_zip | string | No | CAP banca |
| cf_acct_vendor_bank_city | string | No | Località banca |
| cf_acct_vendor_bank_post_account | string | No | Conto postale |
| cf_acct_vendor_bank_pvbr_code | string | No | Codice PVBR |
| cf_acct_vendor_bank_iban | string | No | IBAN fornitore |
{
"vendors": [
{
"id_customer": "V250",
"nr_customer": "250",
"name": "",
"surname": "",
"company": "Fornitore SA",
"adresse": "Via Esempio 20",
"adresse2": "",
"cap": "6900",
"location": "Lugano",
"tel1": "",
"tel2": "",
"fax": "",
"email": "vendor@example.com",
"web": "",
"cust_currency": "CHF",
"acct_code": "2000",
"cust_title": "",
"cust_status": "",
"cust_lang": "IT",
"resp1": "",
"cust_exempt_iva": "0",
"cust_country_code": "CH",
"vat_number": "",
"tax_id": "",
"cf_acct_vendor_bank_name": "Banca Esempio",
"cf_acct_vendor_bank_zip": "6900",
"cf_acct_vendor_bank_city": "Lugano",
"cf_acct_vendor_bank_post_account": "",
"cf_acct_vendor_bank_pvbr_code": "",
"cf_acct_vendor_bank_iban": ""
}
]
}3.3 services - Servizi
| Campo | Tipo | Presenza | Descrizione |
|---|---|---|---|
| id_se | string | Sì | ID servizio |
| code | string | Sì | Codice |
| name | string | Sì | Descrizione |
| se_status | string | Sì | Stato |
| acct_code_sale | string | Sì | Conto vendita |
| acct_code_purchase | string | Sì | Conto acquisto |
| price | decimal/string | Sì | Prezzo vendita |
| price_buy | decimal/string | Sì | Prezzo acquisto |
| iva_perc_sell | decimal/string | Sì | Percentuale IVA vendita |
3.4 products - Prodotti
| Campo | Tipo | Presenza | Descrizione |
|---|---|---|---|
| id_pr | string | Sì | ID prodotto |
| code | string | Sì | Codice |
| name | string | Sì | Descrizione |
| pr_status | string | Sì | Stato |
| acct_code_sale | string | Sì | Conto vendita |
| acct_code_purchase | string | Sì | Conto acquisto |
| price_sell | decimal/string | Sì | Prezzo vendita |
| price_buy | decimal/string | Sì | Prezzo acquisto |
| iva_perc | decimal/string | Sì | Percentuale IVA |
4. Documenti e partite aperte
Per l’integrazione contabile, invoices rappresenta i documenti/partite clienti e cinvoices i documenti/partite fornitori. Le rispettive note di credito sono creditnotes e ccreditnotes.
4.1 invoices - Partite/documenti clienti
| Campo | Tipo | Presenza | Descrizione |
|---|---|---|---|
| id_invoice | string | Sì | ID esterno documento |
| num_invoice | string | Sì | Numero documento |
| cf_acct_voucher | string | Sì | Voucher contabile |
| date_invoice | date | Sì | Data documento |
| currency | string | Sì | Valuta |
| inv_exch_rate | decimal/string | Sì | Cambio |
| nr_customer | string | Sì | Numero cliente |
| inv_pvbr_ref | string | Sì | Riferimento PVBR |
| acct_code | string | Sì | Conto collettivo/contabile |
| inv_title | string | Sì | Titolo/riferimento |
| action | string | Sì | Azione richiesta |
| id_bank | string | Sì | Identificativo banca |
| is_iva | string | Sì | Indicatore IVA |
| payment_condition_code | string | No | Condizione pagamento |
| due_date | date | No | Scadenza |
| date_expiration | date | No | Scadenza alternativa; se presente prevale |
| company/name/surname | string | No | Dati anagrafici cliente |
| adresse/cap/location | string | No | Indirizzo cliente |
| cust_country_code | string | No | Paese |
| tel1/tel2/email/web/resp1 | string | No | Contatti |
| email_invoice | array[string] | No | E-mail fattura |
| doc_wiva | string | Sì | 1 = importi IVA inclusa |
| inv_total | decimal/string | Sì | Totale documento |
| total_no_iva | decimal/string | Sì | Totale imponibile |
| iva_total | decimal/string | Sì | Totale IVA |
| inv_total_main_currency | decimal/string | Sì | Totale in valuta base |
| rows | array | Sì | Righe documento |
Righe invoices.rows
| Campo | Tipo | Presenza | Descrizione |
|---|---|---|---|
| id_invoice | string | Sì | ID documento |
| description | string | Sì | Descrizione riga |
| ordering | string | Sì | Ordinamento |
| qt_accounting | decimal/string | Sì | Quantità contabile |
| total_row | decimal/string | Sì | Totale riga |
| acct_code | string | Sì | Conto contabile |
| cc_code | string | Sì | Centro di costo |
| iva_row | decimal/string | Sì | Percentuale IVA numerica della riga (es. 8.1, 2.6, 0). Non inviare il codice IVA interno del sistema contabile; la relativa conversione è gestita da OB1. |
| discount_real | decimal/string | No | Sconto reale |
| discount_row | decimal/string | No | Sconto riga |
| id_pr | string | Sì | ID prodotto; usare 0 se non applicabile |
| id_se | string | Sì | ID servizio; usare 0 se non applicabile |
{
"invoices": [
{
"id_invoice": "100001",
"num_invoice": "2026-00125",
"cf_acct_voucher": "125",
"date_invoice": "2026-09-15",
"currency": "CHF",
"inv_exch_rate": "1",
"nr_customer": "1001",
"inv_pvbr_ref": "",
"acct_code": "1100",
"inv_title": "Fattura 2026-00125",
"action": "CU",
"id_bank": "",
"is_iva": "1",
"payment_condition_code": "30",
"due_date": "2026-10-15",
"company": "Cliente SA",
"name": "",
"surname": "",
"adresse": "Via Esempio 10",
"cap": "6900",
"location": "Lugano",
"cust_country_code": "CH",
"tel1": "",
"tel2": "",
"email": "billing@example.com",
"web": "",
"resp1": "",
"email_invoice": [
"billing@example.com"
],
"doc_wiva": "1",
"inv_total": "1081.00",
"total_no_iva": "1000.00",
"iva_total": "81.00",
"inv_total_main_currency": "1081.00",
"rows": [
{
"id_invoice": "100001",
"description": "Prestazione",
"ordering": "1",
"qt_accounting": "1",
"total_row": "1000.00",
"acct_code": "3200",
"cc_code": "",
"iva_row": "8.1",
"discount_real": "0",
"discount_row": "0",
"id_pr": "0",
"id_se": "0"
}
]
}
]
}4.2 cinvoices - Partite/documenti fornitori
| Campo | Tipo | Presenza | Descrizione |
|---|---|---|---|
| id_invoice | string | Sì | ID esterno documento |
| num_invoice | string | Sì | Numero documento |
| date_invoice | date | Sì | Data documento |
| currency | string | Sì | Valuta |
| inv_exch_rate | decimal/string | Sì | Cambio |
| nr_customer | string | Sì | Numero fornitore; può essere vuoto nel flusso di risoluzione/creazione fornitore |
| acct_code | string | Sì | Conto contabile |
| payment_condition_code | string | No | Condizione pagamento |
| due_date | date | No | Scadenza |
| date_expiration | date | No | Scadenza alternativa; se presente prevale |
| qrcode | string | Sì | Contenuto QR se disponibile |
| qr_iban | string | Sì | Indicatore QR-IBAN: 0 = IBAN normale; 1 = QR-IBAN. Il valore dell’IBAN è in cf_acct_vendor_bank_iban. |
| company/name/surname | string | No | Dati anagrafici fornitore |
| adresse/cap/location/cust_country_code | string | No | Indirizzo e paese |
| vat_number | string | No | Numero IVA |
| tax_id | string | No | Identificativo fiscale |
| cf_acct_vendor_bank_name | string | No | Nome banca |
| cf_acct_vendor_bank_zip | string | No | CAP banca |
| cf_acct_vendor_bank_city | string | No | Località banca |
| cf_acct_vendor_bank_post_account | string | No | Conto postale |
| cf_acct_vendor_bank_pvbr_code | string | No | Codice PVBR |
| cf_acct_vendor_bank_iban | string | No | IBAN |
| cf_acct_vendor_bank_bic | string | No | BIC |
| vendor_num | string | Sì | Numero/riferimento fornitore |
| action | string | Sì | Azione richiesta |
| is_iva | string | Sì | Indicatore IVA |
| id_bank | string | Sì | Identificativo banca |
| doc_wiva | string | Sì | 1 = importi IVA inclusa |
| inv_total | decimal/string | Sì | Totale documento |
| total_no_iva | decimal/string | Sì | Totale imponibile |
| iva_total | decimal/string | Sì | Totale IVA |
| inv_total_main_currency | decimal/string | Sì | Totale in valuta base |
| rows | array | Sì | Righe documento |
Righe cinvoices.rows
| Campo | Tipo | Presenza | Descrizione |
|---|---|---|---|
| id_invoice | string | Sì | ID documento |
| description | string | Sì | Descrizione |
| ordering | string | Sì | Ordinamento |
| qt_accounting | decimal/string | Sì | Quantità contabile |
| total_row | decimal/string | Sì | Totale riga |
| acct_code | string | Sì | Conto contabile |
| cc_code | string | Sì | Centro di costo |
| iva_row | decimal/string | Sì | Percentuale IVA numerica della riga (es. 8.1, 2.6, 0). Non inviare il codice IVA interno del sistema contabile; la relativa conversione è gestita da OB1. |
| only_vat | string | Sì | Indicatore sola IVA |
| id_pr | string | Sì | ID prodotto; 0 se non applicabile |
| id_se | string | Sì | ID servizio; 0 se non applicabile |
{
"cinvoices": [
{
"id_invoice": "200001",
"num_invoice": "RE-2026-7845",
"date_invoice": "2026-09-20",
"due_date": "2026-10-20",
"currency": "CHF",
"inv_exch_rate": "1",
"nr_customer": "250",
"acct_code": "2000",
"payment_condition_code": "30",
"qrcode": "",
"qr_iban": "1",
"company": "Fornitore SA",
"name": "",
"surname": "",
"adresse": "Via Fornitore 20",
"cap": "6900",
"location": "Lugano",
"cust_country_code": "CH",
"vat_number": "",
"tax_id": "",
"cf_acct_vendor_bank_name": "Banca Esempio",
"cf_acct_vendor_bank_zip": "6900",
"cf_acct_vendor_bank_city": "Lugano",
"cf_acct_vendor_bank_post_account": "",
"cf_acct_vendor_bank_pvbr_code": "",
"cf_acct_vendor_bank_iban": "",
"cf_acct_vendor_bank_bic": "",
"vendor_num": "",
"action": "CU",
"is_iva": "1",
"id_bank": "",
"doc_wiva": "1",
"inv_total": "2162.00",
"total_no_iva": "2000.00",
"iva_total": "162.00",
"inv_total_main_currency": "2162.00",
"rows": [
{
"id_invoice": "200001",
"description": "Acquisto materiale",
"ordering": "1",
"qt_accounting": "1",
"total_row": "2000.00",
"acct_code": "4200",
"cc_code": "100",
"iva_row": "8.1",
"only_vat": "0",
"id_pr": "0",
"id_se": "0"
}
]
}
]
}4.3 creditnotes e ccreditnotes
Le note di credito seguono lo stesso principio delle fatture. Per i clienti la chiave documento è id_cn / num_cn e i totali sono cn_total e cn_total_main_currency. Per i fornitori ccreditnotes supporta inoltre i dati fiscali e bancari analoghi a cinvoices, compreso cf_acct_vendor_bank_bic. Il campo qr_iban, quando previsto, è un indicatore 0/1 e non contiene il valore dell’IBAN. Le righe utilizzano la stessa struttura contabile di base.
4.4 Cancellazioni
Le collection *_deleted trasmettono la cancellazione di un oggetto già sincronizzato. Per anagrafiche e documenti il modello base è:
{
"invoices_deleted": [
{
"id": "100001",
"action": "D"
}
]
}Per financial_transactions_deleted sono presenti id, type e action. Per payments_deleted sono presenti id_invoice, id e action.
5. financial_transactions - Giornale Dare/Avere
| Campo | Tipo | Presenza | Descrizione |
|---|---|---|---|
| id | string | Sì | ID esterno registrazione |
| type | string | Sì | Tipo registrazione |
| action | string | Sì | Azione |
| text | string | Sì | Testo registrazione |
| date | date | Sì | Data registrazione |
| currency_rate | decimal/string | No | Cambio generale; se assente può essere ricavato dalle righe |
| debits | array | Sì | Righe Dare |
| credits | array | Sì | Righe Avere |
Righe debits[] / credits[]
| Campo | Tipo | Presenza | Descrizione |
|---|---|---|---|
| date | date | Sì | Data riga |
| text | string | Sì | Testo riga |
| amount | decimal/string | Sì | Importo della riga. Interpretato come lordo o netto in funzione di doc_wiva. |
| acct_code | string | Sì | Conto contabile |
| cc_code | string | Sì | Centro di costo; può essere vuoto se non applicabile. Disponibile sia in debits[] sia in credits[]. |
| currency | string | Sì | Valuta |
| vat_perc | decimal/string | Sì | Percentuale IVA numerica della riga contabile (es. 8.1, 2.6, 0). Non inviare il codice IVA interno del sistema contabile; la conversione è gestita da OB1. |
| amount_base | decimal/string | No | Importo in valuta base |
| doc_wiva | string | Sì | Indicatore modalità IVA: 1 = amount IVA inclusa (lordo); 0 = amount IVA esclusa (netto). |
{
"financial_transactions": [
{
"id": "FT-2026-000125",
"type": "GL",
"action": "CU",
"text": "Registrazione contabile",
"date": "2026-09-30",
"currency_rate": "1",
"debits": [
{
"date": "2026-09-30",
"text": "Costo materiale",
"amount": "1081.00",
"acct_code": "4200",
"cc_code": "100",
"currency": "CHF",
"vat_perc": "8.1",
"amount_base": "1081.00",
"doc_wiva": "1"
}
],
"credits": [
{
"date": "2026-09-30",
"text": "Contropartita",
"amount": "1081.00",
"acct_code": "2000",
"cc_code": "",
"currency": "CHF",
"vat_perc": "",
"amount_base": "1081.00",
"doc_wiva": "0"
}
]
}
]
}6. payments - Incassi ricevuti tramite GET
| Campo | Tipo | Presenza | Descrizione |
|---|---|---|---|
| VoucherNbr | string | Sì | Numero voucher |
| id_payment | string/integer | Sì | ID esterno pagamento; se 0 OB1 può assegnare una sequenza |
| VoucherDate | date | Sì | Data |
| ClientNbr | string | Sì | Numero cliente |
| Currency | string | Sì | Valuta |
| CurrencyRate | decimal/string | Sì | Cambio |
| TotalBc | decimal/string | Sì | Importo |
| TotalMc | decimal/string | Sì | Importo valuta principale |
| VoucherText | string | Sì | Testo |
| VoucherType | string | Sì | Tipo voucher |
| CounterAccountCode | string | Sì | Conto contropartita |
| PaymentType | string | No | Tipo pagamento |
| Company | string | No | Ragione sociale |
La collection payments consente di trasmettere a OB1 un incasso cliente proveniente dal sistema esterno e di associarlo alla relativa fattura. OB1 individua internamente la partita da chiudere sulla base del riferimento al documento ricevuto; il Trading Partner non deve conoscere gli identificativi interni del sistema contabile.
7. POST - Esito elaborazione
Regola IVA. Nei campi iva_row e vat_perc il Trading Partner deve trasmettere la percentuale IVA numerica, ad esempio 8.1, 2.6 oppure 0. Non deve trasmettere i codici IVA interni di sistema contabile: la conversione verso tali codici è gestita dalla mappatura configurata in OB1. Nelle righe di financial_transactions, doc_wiva="1" indica che amount è IVA inclusa (lordo), mentre
doc_wiva="0" indica che amount è IVA esclusa (netto). Non è necessario generare una riga IVA separata quando l’IVA è gestita tramite vat_perc e doc_wiva. Dopo l’elaborazione, OB1 invia al Trading Partner un JSON di esito. In questa integrazione l’identificativo esterno è id_teleutias. La struttura data può contenere le stesse collection gestite dalla GET.
{
"data": {
"invoices": [
{
"id_accounting": "F20260000125",
"id_teleutias": "100001",
"ok": true,
"message": "",
"total": "1081.00",
"voucher_acct": "125"
}
],
"cinvoices": [
{
"id_accounting": "A20260000200",
"id_teleutias": "200001",
"ok": true,
"message": "",
"total": "2162.00",
"voucher_acct": "200"
}
],
"financial_transactions": [
{
"id_accounting": "FT2026000125",
"id_teleutias": "FT-2026-000125",
"ok": true,
"message": "",
"total": "1000.00",
"type": "GL",
"voucher_acct": "300"
}
]
}
}| Campo | Descrizione |
|---|---|
| id_accounting | Identificativo assegnato/gestito dal sistema contabile. |
| id_teleutias | Identificativo univoco esterno dell’oggetto ricevuto. Viene restituito da OB1 per correlare l’esito al record originario. |
| ok | Esito elaborazione. |
| message | Messaggio di elaborazione/errore. |
| total | Totale, per gli oggetti che lo prevedono. |
| voucher_acct | Voucher contabile, per gli oggetti che lo prevedono. |
| type | Tipo, per financial_transactions. |
8. POST - Piano dei conti e Centri di costo
OB1 invia il Piano dei conti completo e i Centri di costo. Questo flusso corrisponde all’AccountStructure richiesto dal Trading Partner.
{
"data": {
"accounts": [
{
"id_ow": "95",
"AccCode": "1100",
"DescrIt": "Debitori",
"DescrEn": "Accounts receivable",
"DescrDe": "Debitoren",
"DescrFr": "Débiteurs",
"Class": "110",
"Type": "0",
"Currency": "CHF"
}
],
"costcenters": [
{
"id_ow": "95",
"Code": "100",
"DescrIt": "Amministrazione",
"DescrEn": "Administration",
"DescrDe": "Verwaltung",
"DescrFr": "Administration",
"Type": "1"
}
]
}
}accounts[]
| Campo | Descrizione |
|---|---|
| id_ow | ID mandante |
| AccCode | Codice conto |
| DescrIt | Descrizione italiana |
| DescrEn | Descrizione inglese |
| DescrDe | Descrizione tedesca |
| DescrFr | Descrizione francese |
| Class | Codice della classe/gruppo di appartenenza; consente di ricostruire la gerarchia del Piano dei conti. |
| Type | 0 = conto movimentabile; 1 = classe/gruppo. |
| Currency | Valuta |
costcenters[]
| Campo | Descrizione |
|---|---|
| id_ow | ID mandante |
| Code | Codice centro di costo |
| DescrIt | Descrizione italiana |
| DescrEn | Descrizione inglese |
| DescrDe | Descrizione tedesca |
| DescrFr | Descrizione francese |
| Type | Tipo |
Nota: I nomi dei campi JSON sono case-sensitive. Le descrizioni multilingua utilizzano uniformemente DescrIt, DescrEn, DescrDe e DescrFr. Per accounts[], Type="0" identifica un conto movimentabile e Type="1" una classe/gruppo. Class contiene il codice della classe/gruppo di appartenenza e consente di ricostruire la gerarchia del Piano dei conti.
9. POST - Incassi clienti e Pagamenti fornitori
{
"data": {
"client_payments": [
{
"id_ow": "95",
"VoucherNbr": "15025",
"VoucherDate": "2026-09-30",
"ClientNbr": "1001",
"Currency": "CHF",
"CurrencyRate": 1,
"TotalBc": 1081.0,
"TotalMc": 1081.0,
"VoucherText": "Incasso fattura 2026-00125",
"VoucherType": "Z",
"CounterAccountCode": "1020",
"HeaderId": "12345",
"PaidHeaderId": "98765",
"IdAdjustement": "0",
"DocumentType": "I"
}
],
"vendor_payments": [
{
"id_ow": "95",
"VoucherNbr": "16020",
"VoucherDate": "2026-09-30",
"supplierNbr": "250",
"Currency": "CHF",
"CurrencyRate": 1,
"TotalBc": 2162.0,
"TotalMc": 2162.0,
"VoucherText": "Pagamento fattura RE-2026-7845",
"VoucherType": "Z",
"CounterAccountCode": "1020",
"HeaderId": "22345",
"PaidHeaderId": "88765",
"IdAdjustement": "0",
"DocumentType": "I"
}
]
}
}| Campo | Descrizione |
|---|---|
| id_ow | ID mandante |
| VoucherNbr | Numero voucher |
| VoucherDate | Data voucher |
| ClientNbr / supplierNbr | Cliente o fornitore |
| Currency | Valuta |
| CurrencyRate | Cambio |
| TotalBc | Importo BC |
| TotalMc | Importo MC |
| VoucherText | Testo voucher |
| VoucherType | Tipo voucher |
| CounterAccountCode | Conto contropartita |
| HeaderId | ID testata |
| PaidHeaderId | ID documento pagato |
| IdAdjustement | ID rettifica/compensazione |
| DocumentType | Tipo documento collegato; I = invoice, C = credit note |
10. Regole HTTP e sincronizzazione
• La GET è eseguita da OB1 verso il servizio del Trading Partner; il Trading Partner non deve chiamare OB1 per ottenere i dati della GET.
• L’autenticazione del collegamento utilizza un header HTTP dedicato. Per questa integrazione il token viene trasmesso come Authorization: Bearer <token> e non viene inserito nella URL.
• OB1 invia Accept: application/json.
• I POST standard inviano un body JSON. Nel connettore corrente il Content-Type dei POST standard è application/x-www-form-urlencoded (per incassi/pagamenti: application/x-www-form-urlencoded;charset=UTF-8). Il servizio del Trading Partner deve quindi accettare il body JSON con questo Content-Type.
• Per le date JSON si raccomanda il formato ISO YYYY-MM-DD, compatibile con il parser data utilizzato da OB1.
• I valori monetari/cambi possono essere trasmessi come rappresentazione numerica testuale con punto decimale; OB1 ne valida la convertibilità.
• Le collection non interessate possono essere omesse; quando presenti, devono essere array JSON.
• last-sync-datetime consente la sincronizzazione incrementale. Il valore sync-datetime restituito dal Trading Partner viene memorizzato da OB1 per la sincronizzazione successiva. Le date documento utilizzano il formato YYYY-MM-DD; sync-datetime è invece un timestamp tecnico del protocollo e utilizza il formato DD/MM/YYYY@HH:MM:SS.
11. Corrispondenza con i dati richiesti
| Informazione | Contratto |
|---|---|
| Giornale completo Dare/Avere | financial_transactions; le righe debits[] e credits[] supportano acct_code, cc_code, vat_perc e doc_wiva. |
| Partite aperte clienti | invoices |
| Partite aperte fornitori | cinvoices |
| Piano dei conti / AccountStructure | POST data.accounts |
| Centri di costo | POST data.costcenters |
| Incassi clienti | POST data.client_payments; GET payments se previsto dal flusso |
| Pagamenti fornitori | POST data.vendor_payments |
| Codici IVA | Non è richiesto un export dell’anagrafica IVA. Nei dati si trasmette la percentuale IVA numerica; la mappatura verso i codici IVA del sistema contabile è gestita in OB1. |
| Mandante | id_ow |
| Esercizi | first-date e last-date nella GET |
| Dati bancari fornitori | vendors e cinvoices: IBAN e altri dati banca; cinvoices supporta anche BIC. qr_iban è un indicatore 0/1, non il valore dell’IBAN. |
12. Punto da confermare: “conti bancari”
Le strutture vendors e cinvoices coprono le coordinate bancarie del fornitore/documento (IBAN e dati banca; cinvoices anche BIC). In cinvoices qr_iban è un indicatore: "0" = IBAN normale, "1" = QR-IBAN; il valore dell’IBAN è trasmesso separatamente in cf_acct_vendor_bank_iban. Qualora per “conti bancari” si intendano invece i conti bancari propri del mandante, con relativo IBAN, valuta e conto contabile, tale informazione va definita separatamente.
13. Riepilogo implementativo per il Trading Partner
• Esporre l’endpoint GET configurato e filtrare i dati tramite id_ow, first-date, last-date e last-sync-datetime; autenticare le richieste tramite Authorization: Bearer <token>.
• Restituire JSON con ok/login e le collection pertinenti.
• Esporre l’endpoint POST configurato per ricevere gli esiti di elaborazione con id_teleutias.
• Accettare il POST del Piano dei conti/Centri di costo.
• Accettare il POST di incassi clienti/pagamenti fornitori.
• Mantenere i nomi dei campi e il case esattamente come specificato.
• Gestire gli array *_deleted per le cancellazioni quando utilizzati.