Integrazioni / ERP / Odoo
Guida all’integrazione di Odoo con SkyPlanner APS per la schedulazione della produzione
Questa guida spiega a partner Odoo, sviluppatori e responsabili IT come collegare Odoo Manufacturing a SkyPlanner APS. Per valutare i vantaggi e capire cosa fa già il pulsante Plan di Odoo, leggi la pagina sulla schedulazione della produzione con Odoo e Odoo offre la schedulazione della produzione?.
Odoo resta il sistema di riferimento per prodotti, distinte base, operazioni, ordini di fabbricazione, scorte e calcolo dei costi. SkyPlanner elabora il programma di produzione a partire da questi dati con il motore Arcturus. L’integrazione con Odoo è bidirezionale:
- Da Odoo vengono acquisiti ordini di fabbricazione, ordini di produzione, operazioni delle distinte base, centri di lavoro e ordini di acquisto.
- Le date di inizio e fine pianificate e i centri di lavoro vengono riscritti in
mrp.workorder. - Avanzamento e tempi registrati vengono rinviati a Odoo come Time Logs.
- I webhook di SkyPlanner trasmettono le modifiche al programma di produzione non appena avvengono.
Durante l’avviamento, il team SkyPlanner configura l’integrazione tramite l’API esterna standard di Odoo, adattandola alla versione, all’hosting e alle personalizzazioni in uso. Il supporto prosegue anche dopo la messa in produzione. Questa guida si rivolge ai partner e agli sviluppatori che vogliono partecipare al progetto o sviluppare autonomamente usando l’API REST documentata di SkyPlanner (riferimento API). La gestione di prodotti, materiali e ordini di acquisto è descritta nella documentazione pubblica di SkyPlanner.
Prima di tutto: verifica il piano Odoo e l’hosting
Per prima cosa, verifica quale configurazione di Odoo usa il cliente. È questa a determinare come procedere.
| Configurazione | API esterna | Moduli personalizzati | Come procedere |
|---|---|---|---|
| Odoo Online, One App Free o Standard | No | No | CSV/XLSX, oppure passaggio al piano Custom |
| Odoo Online, piano Custom | Sì | No | API esterna |
| Odoo.sh (piano Custom) | Sì | Sì | API esterna, modulo facoltativo |
| Installazione locale, Community o Enterprise | Sì | Sì | API esterna, modulo facoltativo |
La documentazione API di Odoo precisa che l’accesso all’API esterna è “only available on Custom Odoo pricing plans” (disponibile solo con i piani Odoo Custom), non con One App Free o Standard. La pagina dei prezzi descrive Standard come un piano ospitato su Odoo Online “without custom modules” (senza moduli personalizzati). Chiarisci questi aspetti nella fase di analisi iniziale, non a sviluppo già avviato.
Le opzioni di integrazione di Odoo
| Opzione | Versioni | Autenticazione | Ruolo nell’integrazione con lo schedulatore |
|---|---|---|---|
API esterna JSON-2: POST /json/2/<model>/<method> | Introdotta nella versione 19.0 | Chiave API in Authorization: bearer <key>, header facoltativo X-Odoo-Database | Scelta predefinita per le nuove integrazioni: search_read per la lettura, write per riscrivere le date |
XML-RPC / JSON-RPC esterni: /xmlrpc/2, /jsonrpc, servizi common, object | Fino alla versione 19.0; rimozione prevista | common.authenticate con login e password o chiave API, poi execute_kw | Necessari per i clienti con versioni dalla 16.0 alla 18.0 |
| Controller personalizzati in un modulo | Tutte | Per singola route, ad es. auth='bearer' | Payload combinati: un MO con i relativi ordini di produzione in un’unica chiamata |
| Regole di automazione: “Send Webhook Notification” (Invia notifica webhook) | Nella documentazione dalla versione 17.0 | POST in uscita verso un URL | Invio alla creazione o modifica di MO e ordini di produzione |
| Importazione di record (CSV, XLSX) ed esportazione | Tutte | Sessione utente | Dati per la prova e caricamenti una tantum delle anagrafiche |
Preparati fin da ora alla rimozione. Odoo ha previsto la rimozione di XML-RPC e JSON-RPC in Odoo 22 (autunno 2028) e Odoo Online 21.1 (inverno 2027). Per la versione 19.0 sviluppa su JSON-2; per i database più vecchi, isola l’accesso RPC in un unico adapter, così l’aggiornamento richiederà una sola modifica. La rimozione non riguarda i controller personalizzati con @route(type='jsonrpc').
Autenticazione
Crea un utente dedicato all’integrazione con accesso in lettura a Manufacturing e Inventory e in scrittura agli ordini di produzione. Genera la sua chiave da Preferences > Account Security > New API Key. Nella versione 19.0 le chiavi durano al massimo tre mesi: il middleware deve quindi gestirne la rotazione e segnalare gli errori di autenticazione. In caso contrario, una chiave scaduta interrompe la sincronizzazione senza che nessuno se ne accorga. Sul lato SkyPlanner, l’API REST usa JWT, quindi il middleware conserva entrambe le credenziali.
Ogni chiamata JSON-2 viene eseguita in una transazione SQL distinta, quindi una scrittura distribuita su più chiamate non è atomica. Esegui le scritture per singolo ordine di produzione e registra ogni esito.
Eventi
Odoo invia le modifiche tramite le regole di automazione. Una regola su mrp.production o mrp.workorder, con il trigger On create and edit e l’azione “Send Webhook Notification” (Invia notifica webhook), invia un POST con i campi selezionati a un URL. Crea la regola in Studio oppure, in modalità sviluppatore, dalla maschera Automation Rules. Affiancala a un polling periodico con search_read su write_date per rilevare le importazioni e tutto ciò che è sfuggito alla regola. Nella direzione opposta, i webhook di SkyPlanner inviano le modifiche alla schedulazione e agli stati nel momento in cui avvengono.
I nomi dei campi cambiano da una versione all’altra. Nella versione 19.0 ogni database elenca i propri modelli, campi e metodi in /doc; nelle versioni precedenti, richiama fields_get. Basa la mappatura su queste informazioni, non sulla memoria.
Mappatura dei dati: da Odoo a SkyPlanner
| Modello Odoo | Oggetto SkyPlanner | Direzione | Frequenza |
|---|---|---|---|
product.product / product.template (default_code, uom_id, qty_available) | Prodotto o materiale | Odoo → SkyPlanner | Caricamento iniziale, poi ogni giorno o a ogni modifica |
mrp.bom (product_tmpl_id, product_qty, produce_delay), mrp.bom.line (product_id, product_qty, operation_id), mrp.bom.byproduct | Prodotto multilivello, fabbisogni di materiali per fase | Odoo → SkyPlanner | A ogni modifica |
mrp.routing.workcenter (scheda Operazioni: workcenter_id, sequence, time_mode, time_cycle_manual, blocked_by_operation_ids) | Fasi di lavorazione con sequenza e tempo di esecuzione | Odoo → SkyPlanner | A ogni modifica |
mrp.workcenter (resource_calendar_id, time_efficiency, time_start, time_stop, alternative_workcenter_ids) | Centro di lavoro, efficienza, attrezzaggio e disattrezzaggio, centri di lavoro alternativi | Odoo → SkyPlanner, poi gestione in SkyPlanner | Caricamento iniziale |
mrp.workcenter.capacity (capacity) | Pezzi per ciclo, tempi di attrezzaggio e disattrezzaggio specifici per prodotto | Odoo → SkyPlanner | Caricamento iniziale |
resource.calendar, resource.calendar.attendance, resource.calendar.leaves | Turni e assenze | Odoo → SkyPlanner | Caricamento iniziale, poi assenze a ogni modifica |
mrp.production (product_id, product_qty, date_deadline, priority, state, workorder_ids) | Ordine con scadenza e priorità | Odoo → SkyPlanner | Webhook alla conferma, più polling |
mrp.workorder (operation_id, workcenter_id, duration_expected, state) | Operazione su un centro di lavoro | Odoo → SkyPlanner | Webhook, più polling |
stock.quant, stock.move (movimenti dei componenti) | Giacenze e fabbisogni di materiali per la schedulazione basata sulla disponibilità dei materiali | Odoo → SkyPlanner | A intervalli programmati, ad es. ogni 15–60 minuti |
purchase.order (partner_id, state), purchase.order.line (product_id, product_qty, date_planned, qty_received) | Ordini di acquisto e materiali in arrivo, disponibili alla data di consegna prevista | Odoo → SkyPlanner | Webhook alla conferma o modifica dell’ordine di acquisto, più lo stesso polling periodico |
| Inizio, fine e centro di lavoro pianificati | mrp.workorder.date_start, date_finished, workcenter_id | SkyPlanner → Odoo | A ogni modifica della schedulazione, tramite webhook di SkyPlanner |
| Mobile Confirmations, registrazioni dei tempi | mrp.workcenter.productivity (Time Logs: workcenter_id, workorder_id, date_start, date_end, loss_id) | SkyPlanner → Odoo | A ogni conferma |
| Quantità prodotta, operazione completata | qty_producing sull’ordine di produzione, poi button_finish; button_mark_done sul MO | SkyPlanner → Odoo, oppure registrazione in Odoo Shop Floor | A ogni conferma |
Schemi di integrazione
Prima le anagrafiche.
Carica i centri di lavoro e i calendari, poi i prodotti, le distinte base e le operazioni, che fanno riferimento ai centri di lavoro. Durante la prova di 30 giorni, gli stessi elenchi vengono importati tramite esportazioni CSV. Lo strumento di importazione ed esportazione di Odoo funziona in qualsiasi vista elenco.
Sincronizzazione degli ordini.
Importa i MO in stato confirmed e progress con i relativi ordini di produzione. Escludi i MO in bozza oppure trattali come domanda provvisoria. I sottoassiemi con una propria distinta base possono arrivare come MO figli separati, e Odoo pianifica ogni MO autonomamente. Mappali sui sottoprodotti di SkyPlanner, in modo che i sottoassiemi vengano completati prima dell’avvio del prodotto padre.
Scrittura del programma di produzione in Odoo.
Quando la schedulazione cambia, un webhook di SkyPlanner attiva l’integrazione, che richiama il metodo ORM write su ciascun mrp.workorder interessato. In Odoo 19.0 questo corrisponde a una richiesta JSON-2 per ogni ordine di produzione:
“ POST /json/2/mrp.workorder/write Authorization: bearer <api-key> {"ids": [4711], "vals": {"date_start": "2026-11-03 06:00:00", "date_finished": "2026-11-03 09:30:00", "workcenter_id": 7}} “
JSON-2 riceve ogni argomento del metodo per nome, insieme a ids e context: l’argomento di write(vals) diventa quindi la chiave vals. Dalla versione 16.0 alla 18.0, la stessa chiamata viene eseguita come execute_kw(db, uid, key, 'mrp.workorder', 'write', [[4711], vals]) tramite XML-RPC o JSON-RPC; nella versione 16.0 le chiavi sono date_planned_start e date_planned_finished. Le date e le ore vanno inviate in UTC. Per una scrittura corretta, segui queste regole:
- Invia entrambe le date nella stessa chiamata.
- Aggiungi
workcenter_idsolo quando il motore ha scelto una macchina alternativa. - Modifica solo i campi di schedulazione, mai le quantità o le distinte base.
La scrittura delle date sposta la prenotazione del centro di lavoro in Odoo, così le viste di pianificazione di Odoo mostrano il programma elaborato da SkyPlanner.
Dal reparto produttivo a Odoo. Gli operatori registrano il lavoro in SkyPlanner Mobile Confirmations. Per ogni conferma, l’integrazione richiama create su mrp.workcenter.productivity (JSON-2: POST /json/2/mrp.workcenter.productivity/create con vals_list). Compila workorder_id, workcenter_id, date_start, date_end e un loss_id di tipo Productive; i tempi di manodopera e i relativi costi vengono così registrati in Odoo.
Al completamento di un’operazione, l’integrazione imposta la quantità prodotta e richiama button_finish sull’ordine di produzione. Una volta completato l’ultimo ordine di produzione, il MO è pronto per button_mark_done. Ogni conferma viene registrata una sola volta e l’ID del relativo record Odoo viene conservato insieme alla registrazione dei tempi in SkyPlanner: un nuovo tentativo di invio del webhook non crea mai un secondo Time Log.
Negli stabilimenti che usano l’app Enterprise Shop Floor, il flusso è inverso: SkyPlanner legge lo stato dell’ordine di produzione e qty_produced, mentre Autopilot rischedula automaticamente quando la produzione cambia.
Responsabilità sui dati. Metti per iscritto le regole prima della messa in produzione:
| Dati | Sistema responsabile |
|---|---|
| Prodotti, distinte base, operazioni, quantità, stato degli ordini di fabbricazione | Odoo |
| Sequenza degli ordini di produzione, orari di inizio e fine, scelta del centro di lavoro | SkyPlanner |
| Matrice dei tempi di attrezzaggio e cambio lavorazione, requisiti di attrezzature e operatori, risorse alternative | SkyPlanner |
| Calendari dei centri di lavoro e Time Off | Un solo sistema, scelto durante la definizione del perimetro |
| Time Logs, scorte e calcolo dei costi | Odoo, alimentato dalle conferme di SkyPlanner |
I pianificatori non devono più usare Plan e Unplan in Odoo sugli ordini di fabbricazione schedulati da SkyPlanner. Altrimenti Odoo prenota i propri intervalli orari sovrascrivendo le date di SkyPlanner.
Le fasi tipiche del progetto
L’implementazione viene normalmente completata nel giro di poche settimane dall’inizio dell’avviamento. Prima, puoi usare la prova gratuita di 30 giorni con esportazioni CSV dei tuoi dati Odoo. Il progetto comprende:
- Mappatura delle anagrafiche: modelli e campi Odoo per ciascuna versione (verifica
/docofields_get), unità di misura e sistema responsabile della gestione dei calendari e di Time Off. - Sistemazione dei dati: calendari dei centri di lavoro, Setup Time e Cleanup Time, e durate impostate su Fixed anziché Computed per le operazioni delle distinte base.
- Caricamento iniziale: prodotti, centri di lavoro con i relativi calendari, distinte base e relative operazioni.
- Sincronizzazione degli ordini e degli ordini di acquisto: MO confermati e in corso con i relativi ordini di produzione, più le righe di
purchase.ordercon le date di arrivo previste. - Riscrittura della schedulazione: date e centri di lavoro su
mrp.workorder, con rotazione delle chiavi API lato Odoo. - Conferme dal reparto produttivo: invio a Odoo dei Time Logs e delle conferme di completamento degli ordini di produzione.
- Test in parallelo con il programma di produzione attuale, poi messa in produzione.
Le criticità di Odoo
- Campi data rinominati. Fino alla versione 16.0,
date_planned_startedate_planned_finishedcontenevano le date pianificate, mentredate_start/date_finishedcontenevano quelle effettive. Dalla versione 17.0,date_startedate_finishedsono le date pianificate. Una mappatura copiata da un progetto sulla versione 16.0 legge le date effettive come pianificate sulla versione 17+, senza segnalare errori. - Le date degli ordini di produzione corrispondono a prenotazioni. Nella versione 19.0,
date_startedate_finishedsumrp.workordervengono calcolati a partire da un recordresource.calendar.leaves(leave_id) nel calendario del centro di lavoro. Scrivere le date sull’ordine di produzione aggiorna quella prenotazione. Non scrivere mai direttamente nella tabella delle assenze. - Gli ordini di produzione avviati bloccano Unplan. Odoo non consente di annullare la pianificazione di un MO quando “Some work orders have already started” (Alcuni ordini di produzione sono già stati avviati). In fase di riscrittura, escludi gli ordini di produzione in stato
progressodonee sposta solo quelli non ancora avviati. - Durate che cambiano. Le operazioni impostate su Computed ricavano la durata dagli ultimi ordini di produzione (10 per impostazione predefinita), corretta in base a Time Efficiency. Impostale su Fixed per la prova, oppure accetta che i dati in ingresso cambino. Le operazioni appartengono alle singole distinte base, senza un’anagrafica condivisa dei cicli di lavorazione: ogni distinta base va quindi sistemata separatamente.
- Calendari non corretti. Ogni centro di lavoro deve avere un calendario degli orari lavorativi. Lo schedulatore di Odoo cerca uno spazio disponibile fino a 700 giorni in avanti, poi si arresta con il messaggio “Impossible to plan the workorder” (impossibile pianificare l’ordine di produzione). Sistema i calendari prima del primo caricamento.
- Unità di misura.
mrp.bom.lineha un proprioproduct_uom_id, che può differire dall’unità di magazzino del prodotto. Esegui la conversione prima di verificare la disponibilità dei materiali.
Chi configura l’integrazione con Odoo
Ogni stabilimento usa Odoo in modo diverso, con le proprie operazioni sulle distinte base, i calendari dei centri di lavoro, i centri alternativi e i moduli personalizzati. Il team SkyPlanner mette a disposizione le competenze necessarie per mappare correttamente i dati di quella specifica configurazione.
- Il team SkyPlanner configura l’integrazione in base al tuo ambiente Odoo durante l’avviamento e fornisce supporto dopo la messa in produzione. L’integrazione usa l’API REST e i webhook di SkyPlanner e l’API JSON-2 o RPC di Odoo. Questo è il percorso standard.
- Il tuo partner Odoo può partecipare. Conosce la tua configurazione e i moduli personalizzati e può sviluppare usando la stessa API REST documentata. L’API consente di leggere e scrivere ordini, prodotti, materiali, fasi di processo e registrazioni dei tempi, con autenticazione JWT e documentazione Swagger/OpenAPI.
- I tuoi sviluppatori possono fare altrettanto, di solito con un piccolo middleware affiancato a Odoo o con un modulo su Odoo.sh o su un’installazione locale. Per iniziare basta una chiave API (tutorial di integrazione); il team SkyPlanner fornisce assistenza quando serve.
Lo stesso modello è già in uso in produzione con altri ERP. In Laboratory & Allied, il team IT interno ha realizzato l’integrazione con SAP Business One in gran parte autonomamente, con l’aiuto di SkyPlanner. UTU usa SkyPlanner accanto al proprio ERP NetSuite.
Perché l’integrazione conviene
È la scrittura dei dati in Odoo a rendere utile l’integrazione nel lavoro quotidiano. Una volta attiva:
- Gli ordini di produzione Odoo hanno date concrete. Il motore Arcturus AI mette in sequenza tutti i MO aperti in pochi secondi. Le date e i centri di lavoro che sceglie vengono scritti in
mrp.workordere visualizzati nelle viste di pianificazione di Odoo. - Niente più ripianificazione manuale. Autopilot aggiorna automaticamente la schedulazione quando la produzione cambia e il webhook invia le nuove date a Odoo.
- Il reparto produttivo chiude il ciclo. Gli operatori registrano il lavoro da telefono o tablet con Mobile Confirmations, Production Timer e Quick Log Mode, e i Time Logs vengono inviati a Odoo per la gestione delle scorte e il calcolo dei costi. Schedulazione ed esecuzione si gestiscono in un unico strumento, sia con Community sia con Enterprise.
- La schedulazione rispetta vincoli che Odoo non gestisce. Una matrice dei tempi di attrezzaggio definisce i cambi formato in funzione della sequenza, per ogni coppia di prodotti. Gli utensili sono risorse a capacità finita condivise tra le macchine, e un’operazione può richiedere più operatori contemporaneamente. Quando la macchina o l’operatore principale non è disponibile, il motore ricorre a macchine o personale alternativi. Le date riscritte in
mrp.workorderrispettano tutti questi vincoli. - Gli arrivi dei materiali guidano il programma. Le giacenze e gli ordini di acquisto aperti in Odoo alimentano la schedulazione basata sulla disponibilità dei materiali. I componenti ordinati sono considerati disponibili alla data di consegna dell’ordine di acquisto e le scorte si aggiornano quando l’ordine viene contrassegnato come Delivered. Ogni operazione viene verificata rispetto ai materiali presenti in magazzino e a quelli in arrivo.
Puoi valutare il programma di produzione prima di iniziare qualsiasi attività di integrazione. Avvia la prova gratuita di 30 giorni usando esportazioni CSV e visualizza i tuoi ordini di produzione Odoo sul Gantt, con un massimo di 20 postazioni di lavoro e senza carta di credito. Il prezzo parte da 199 € al mese con 5 postazioni di lavoro incluse, fatturazione mensile e possibilità di disdire in qualsiasi momento. Il preventivo per l’integrazione viene preparato in anticipo in base ai tuoi processi e alle tue esigenze, insieme al piano, così conosci il costo totale prima di iniziare. Scopri le funzionalità e i clienti, oppure prenota una demo.
Recensioni delle aziende manifatturiere su SkyPlanner
2 hrisparmiate ogni settimana
“Con SkyPlanner siamo passati dalla pianificazione della produzione su fogli Excel all’ottimizzazione della produzione in tempo reale.”
Kalle Kalliomäki, specialista della supply chain
UTU · Quadri elettrici e apparecchiature di manovra
La pianificazione della produzione fa risparmiare 2 ore di lavoro ogni settimana e una nuova coda di lavoro arriva alla linea in pochi secondi.
+90%efficienza produttiva
“L’efficienza in produzione è aumentata del 90%.”
Abdul Rucyinga, responsabile IT
Laboratory & Allied · Produzione farmaceutica
L’efficienza produttiva è aumentata del 90% e bastano meno di 30 minuti per creare un piano ottimizzato di tre mesi per tutti i centri di lavoro.
1,000sordini di produzione schedulati automaticamente
“Abbiamo un controllo diverso sulla produzione e la nostra comprensione della capacità produttiva è a un livello completamente diverso.”
Hannu Ryynänen, amministratore delegato
Mamec · Miscelatori industriali, pompe e produzione conto terzi ad alta tecnologia
Migliaia di ordini di produzione vengono schedulati automaticamente e tutta l’organizzazione ha una visione della produzione in tempo reale.
99,2%affidabilità delle consegne
“SkyPlanner ci ha dato la visibilità necessaria per individuare i colli di bottiglia e ha reso più chiara la gestione della produzione.”
Toni Tuori, responsabile di produzione
Piristeel · Sistemi di sicurezza per tetti e di raccolta delle acque piovane
Quest’anno l’affidabilità delle consegne ha raggiunto il 99,2% e la schedulazione permette di risparmiare fino a quattro ore di lavoro al giorno.
Domande frequenti
L’integrazione funziona su Odoo Online?
Con il piano Custom sì, tramite l’API esterna. One App Free e Standard non consentono l’accesso all’API esterna e Standard non supporta moduli personalizzati. Con questi piani, quindi, ci si limita all’importazione e all’esportazione di file CSV/XLSX.
È meglio usare JSON-2 o XML-RPC?
JSON-2 su Odoo 19.0 e versioni successive. Per le versioni dalla 16.0 alla 18.0 servono ancora XML-RPC e JSON-RPC, ma la loro rimozione è prevista in Odoo 22.
Come viene trasferito il programma di produzione in Odoo?
Tramite il metodo ORM write su ciascun mrp.workorder: POST /json/2/mrp.workorder/write con ids e vals nella versione 19.0, oppure execute_kw con write tramite XML-RPC o JSON-RPC nelle versioni dalla 16.0 alla 18.0. I valori sono date_start, date_finished (date_planned_start e date_planned_finished nella versione 16.0) e, se è cambiato, workcenter_id. Odoo sposta di conseguenza la prenotazione del centro di lavoro, così le sue viste di pianificazione mostrano le date di SkyPlanner.
Come arrivano in Odoo le conferme degli operatori?
Come Time Logs: l’integrazione crea record mrp.workcenter.productivity associati all’ordine di produzione, con inizio, fine e causale di perdita Productive, poi richiama button_finish al completamento dell’operazione. Ogni conferma viene registrata una sola volta, quindi i nuovi tentativi di invio non duplicano i tempi.
Chi si occupa della manutenzione dell’integrazione dopo la messa in esercizio?
Il team SkyPlanner configura l’integrazione durante l’avviamento e fornisce assistenza dopo la messa in esercizio, adattandola anche alle modifiche della configurazione di Odoo. Se a realizzarla sono il tuo partner o i tuoi sviluppatori, possono basarsi sull’API REST documentata e sulla documentazione di SkyPlanner, con il supporto del team quando necessario.
Cosa succede agli ordini di produzione già avviati?
Non modificarli quando riscrivi i dati in Odoo. Odoo impedisce di annullare la pianificazione di un MO quando un ordine di produzione è in corso o completato. SkyPlanner ne legge lo stato e l’avanzamento e ne tiene conto per schedulare il lavoro rimanente.
Quanto tempo richiede l’integrazione con Odoo?
Di norma l’implementazione si completa nel giro di poche settimane dall’inizio dell’avviamento. Inizia con la prova di 30 giorni usando le esportazioni CSV: potrai così verificare il programma di produzione sui tuoi dati Odoo prima di iniziare a lavorare sull’API.