Un’azienda cliente si è trasferita, il contratto è terminato e Lei vuole archiviarla in Odoo. Odoo risponde con un messaggio di errore: “Non è possibile archiviare contatti collegati a un utente attivo. Archivi prima l’utente associato.” Se l’azienda ha più accessi al portale, significa: cercare ogni utente singolarmente, archiviarlo singolarmente, tornare all’azienda, archiviare di nuovo.
Per questo abbiamo scritto il piccolo modulo Archivia azienda insieme agli utenti del portale (partner_archive_users) per Odoo 19. Invece del messaggio di errore compare una richiesta di conferma e, con “Sì”, gli utenti del portale e l’azienda vengono archiviati in un solo passaggio. Il modulo è disponibile su GitHub come software libero con licenza AGPL-3:
github.com/Alex0176/odoo-partner-archive-users
Utilizziamo il modulo presso Biricon IT Services dal 3 novembre 2026 nel nostro sistema di produzione. È nuovo, quindi l’esperienza maturata è breve. Chi lo adotta dovrebbe leggere le sezioni su Ambito e limiti .
Contenuto di questo articolo
Il problema nell’Odoo standard
Quando si archivia un contatto, Odoo verifica se vi è collegato un utente e interrompe l’operazione in caso affermativo. Il controllo ha senso, perché ogni utente ha bisogno di un contatto. Per gli utenti interni, cioè i collaboratori, il blocco è anche voluto. Per gli utenti del portale dei clienti, invece, è soprattutto lavoro manuale. Ogni azienda cliente con accessi al portale, ad esempio per consultare fatture e ticket, richiede alla sua archiviazione la stessa procedura:
- cercare gli utenti dell’azienda e dei suoi referenti,
- archiviare ciascuno singolarmente,
- tornare all’azienda,
- archiviare l’azienda.
La soluzione: una richiesta di conferma
Il modulo estende il percorso Azione → Archivia sul contatto, sia nel modulo sia nell’elenco. Se all’azienda selezionata o ai suoi referenti sono collegati utenti del portale attivi, si apre una finestra di dialogo con la domanda “Archiviare davvero l’azienda? Nel sistema ci sono ancora utenti attivi.” Sotto compaiono gli utenti interessati con nome, nome di accesso e contatto.
- Sì, archivia azienda e utenti: prima vengono archiviati gli utenti, poi l’azienda.
- Annulla: non cambia nulla.
- Nessun utente del portale presente: Odoo si comporta come prima, non compare alcuna finestra di dialogo.
Che cosa viene archiviato e che cosa no
L’ambito è volutamente ristretto:
- Solo utenti del portale e pubblici (
share = True). Gli utenti interni non vengono mai archiviati con questo percorso. Se al contatto è collegato un accesso di un collaboratore, il messaggio di errore di Odoo rimane. In questo modo nessuno blocca per errore un collaboratore archiviando un’azienda. - I referenti restano attivi come contatti. Vengono archiviati solo i loro accessi al portale. Ciò corrisponde all’Odoo standard, che archiviando un’azienda non tocca nemmeno i sottocontatti.
- Solo il percorso di archiviazione dell’interfaccia. Un
write({'active': False})diretto, ad esempio in un’importazione o in uno script, passa invariato per il controllo di Odoo.
Implementazione tecnica
Il modulo non ha nuovi campi sui modelli esistenti. È costituito da un’estensione di res.partner.action_archive e da una procedura guidata (partner.archive.users.wizard) che compare come finestra di dialogo.
| Componente | Funzione |
|---|---|
action_archive sul contatto | Cerca utenti attivi con share = True collegati al contatto o (per le aziende) ai contatti dell’azienda. Se ce ne sono, al posto dell’archiviazione viene restituita la finestra di dialogo. |
| Procedura guidata | Memorizza azienda e utenti trovati, li mostra e, con “Sì”, esegue l’archiviazione con la chiave di contesto archive_linked_users. |
Contesto skip_archive_users_wizard | Disattiva la finestra di dialogo. Torna allora a valere il controllo di Odoo. |
| Accesso | La procedura guidata può essere creata e utilizzata dagli utenti interni (base.group_user). |
| Traduzione | Sono allegati il tedesco (de.po) e il modello (.pot). |
Gli utenti vengono cercati e archiviati con diritti elevati (sudo). Così la finestra di dialogo funziona anche per gli utenti senza accesso alla gestione degli utenti. Il rovescio della medaglia è descritto in limiti.
Una scoperta: il test era verde, ma la finestra di dialogo era comunque rotta
Al primo utilizzo il modulo presentava un errore che i test automatici non hanno trovato. Al primo clic su “Archivia” nell’interfaccia, al posto della finestra di dialogo è comparsa la schermata di errore di Odoo con Cannot read properties of undefined (reading 'map').
La causa: il client web richiama direttamente action_archive ed esegue un’azione restituita senza ulteriore elaborazione. Così facendo legge obbligatoriamente la chiave views dell’azione. La nostra azione aveva solo view_mode. Le azioni provenienti da pulsanti con type="object" vengono completate prima dal server (clean_action in call_button), la chiamata diretta di action_archive no. I test richiamavano il metodo solo in Python e lì il campo mancante non dava nell’occhio.
La correzione è una riga ("views": [(False, "form")]), a cui si aggiunge un controllo nel test che richiede proprio questa chiave. In questo processo non è stato archiviato nulla. La lezione: chi restituisce un’azione da un metodo che il client richiama direttamente (action_archive, action_unarchive e simili) dovrebbe sempre includere views.
Installazione
git clone https://github.com/Alex0176/odoo-partner-archive-users.git
ln -s /pfad/odoo-partner-archive-users/partner_archive_users /pfad/addons/
odoo-bin -c odoo.conf -d <datenbank> -i partner_archive_users --stop-after-init
Le dipendenze sono base e contacts. Dopo l’installazione il servizio Odoo deve essere riavviato, perché il modulo contiene codice Python. Chi gestisce un sistema di produzione installa il modulo prima su una copia del database.
limiti
- Autorizzazione. Poiché gli utenti vengono archiviati con diritti elevati, chiunque possa archiviare un contatto può archiviare tramite la finestra di dialogo anche gli accessi al portale di quell’azienda. Per gli utenti interni ciò non vale. Chi vuole proteggere più finemente gli accessi al portale deve adattare il modulo.
- Nessun ripristino automatico. Se l’azienda viene riattivata in seguito, gli utenti restano archiviati. Devono essere riattivati a mano.
- Solo contatti. Il modulo riguarda le aziende come contatti (
res.partner). L’archiviazione di un’azienda Odoo (res.company) ha altri controlli, ad esempio quando è ancora l’azienda predefinita di utenti. Il modulo non è pensato per questo. - Testato solo con Odoo 19.0 Community. Per altre versioni non lo abbiamo verificato.
Domande frequenti
Perché i collaboratori non vengono archiviati insieme?
Un utente interno ha diritti nel sistema ed è per lo più collegato a dati, attività e autorizzazioni propri. Bloccarlo come effetto collaterale dell’archiviazione di un’azienda ci sembra troppo rischioso. Per questo resta il messaggio di errore di Odoo.
Posso disattivare la richiesta di conferma?
Nel codice tramite il contesto skip_archive_users_wizard. Non esiste un’impostazione nell’interfaccia. Chi disinstalla il modulo ottiene di nuovo il comportamento standard di Odoo.
Con quale licenza è distribuito?
Con la AGPL-3. Errori e miglioramenti sono benvenuti come issue nel repository GitHub .
Supporto da parte di Biricon IT Services
Seguiamo installazioni Odoo per piccole e medie imprese: dall’introduzione alle personalizzazioni e alle migrazioni fino alla gestione operativa. Se desidera semplificare in Odoo processi come l’archiviazione di aziende clienti, configurare un portale per i Suoi clienti o portare in sicurezza un modulo nella Sua istanza di produzione, saremo lieti di aiutarLa. Altri sviluppi interni: Numeri di documento da prefisso, anno e contatore, Firmenbuch e verifica degli indirizzi per clienti austriaci e Set di prodotti nel preventivo come sezione.
Aggiornato al 3 novembre 2026. Versione del modulo 19.0.1.0.0 con la correzione dello stesso giorno. Tutti i nomi e i nomi di accesso nelle figure sono scelti liberamente.