Une entreprise cliente est partie, le contrat est terminé, et vous voulez l'archiver dans Odoo. Odoo répond par un message d'erreur : « Vous ne pouvez pas archiver des contacts liés à un utilisateur actif. Archivez d'abord l'utilisateur correspondant. » Si l'entreprise a plusieurs accès au portail, cela signifie : chercher chaque utilisateur un par un, l'archiver un par un, revenir à l'entreprise, archiver de nouveau.
Nous avons écrit pour cela le petit module Archiver une entreprise avec ses utilisateurs du portail (partner_archive_users) pour Odoo 19. Au lieu du message d'erreur, une demande de confirmation s'affiche, et en répondant « Oui », les utilisateurs du portail et l'entreprise sont archivés en une seule étape. Le module est disponible sur GitHub, en tant que logiciel libre sous licence AGPL-3 :
github.com/Alex0176/odoo-partner-archive-users
Nous utilisons le module chez Biricon IT Services dans notre système de production depuis le 3 novembre 2026. Il est récent, l'expérience acquise est donc courte. Quiconque le reprend devrait lire les sections consacrées au périmètre et limites .
Contenu de cet article
Le problème dans Odoo standard
Lors de l'archivage d'un contact, Odoo vérifie si un utilisateur y est rattaché et interrompt l'opération si c'est le cas. Cette vérification a du sens, car chaque utilisateur a besoin d'un contact. Pour les utilisateurs internes, c'est-à-dire les collaborateurs, le blocage est d'ailleurs voulu. Pour les utilisateurs du portail des clients, il représente surtout du travail manuel. Chaque entreprise cliente disposant d'accès au portail, par exemple pour consulter les factures et les tickets, nécessite le même déroulement lors de l'archivage :
- chercher les utilisateurs de l'entreprise et de ses interlocuteurs,
- archiver chacun individuellement,
- revenir à l'entreprise,
- archiver l'entreprise.
La solution : une demande de confirmation
Le module étend le chemin Action → Archiver sur le contact, dans le formulaire comme dans la liste. Si des utilisateurs du portail actifs sont rattachés à l'entreprise choisie ou à ses interlocuteurs, une boîte de dialogue s'ouvre avec la question « L'entreprise doit-elle vraiment être archivée ? Il reste des utilisateurs actifs dans le système. » En dessous figurent les utilisateurs concernés avec leur nom, leur identifiant de connexion et leur contact.
- Oui, archiver l'entreprise et les utilisateurs : les utilisateurs sont archivés d'abord, puis l'entreprise.
- Annuler : rien ne change.
- Aucun utilisateur du portail : Odoo se comporte comme auparavant, aucune boîte de dialogue n'apparaît.
Ce qui est archivé et ce qui ne l'est pas
Le périmètre est volontairement restreint :
- Uniquement les utilisateurs du portail et publics (
share = True). Les utilisateurs internes ne sont jamais archivés par ce chemin. Si un accès de collaborateur est rattaché au contact, le message d'erreur d'Odoo subsiste. Ainsi, personne ne bloque par inadvertance un collaborateur en archivant une entreprise. - Les interlocuteurs restent actifs en tant que contacts. Seuls leurs accès au portail sont archivés. Cela correspond au comportement standard d'Odoo, qui ne touche pas non plus aux sous-contacts lors de l'archivage d'une entreprise.
- Uniquement le chemin d'archivage de l'interface. Un
write({'active': False})direct, par exemple dans une importation ou un script, passe sans modification par la vérification d'Odoo.
Mise en œuvre technique
Le module n'ajoute aucun nouveau champ aux modèles existants. Il se compose d'une extension de res.partner.action_archive et d'un assistant (partner.archive.users.wizard) qui apparaît sous forme de boîte de dialogue.
| Élément | Fonction |
|---|---|
action_archive sur le contact | Recherche les utilisateurs actifs avec share = True rattachés au contact ou (pour les entreprises) aux contacts de l'entreprise. S'il y en a, la boîte de dialogue est renvoyée au lieu d'archiver. |
| Assistant | Enregistre l'entreprise et les utilisateurs trouvés, les affiche et, en cas de « Oui », exécute l'archivage avec la clé de contexte archive_linked_users. |
Contexte skip_archive_users_wizard | Désactive la boîte de dialogue. La vérification d'Odoo s'applique alors de nouveau. |
| Accès | Les utilisateurs internes (base.group_user) peuvent créer et utiliser l'assistant. |
| Traduction | L'allemand (de.po) et le modèle (.pot) sont fournis. |
Les utilisateurs sont recherchés et archivés avec des droits élevés (sudo). La boîte de dialogue fonctionne ainsi aussi pour les utilisateurs sans accès à la gestion des utilisateurs. L'envers de la médaille figure sous limites.
Une découverte : le test était vert, la boîte de dialogue pourtant défaillante
Lors de la première utilisation, le module comportait une erreur que les tests automatiques n'ont pas détectée. Au premier clic sur « Archiver » dans l'interface, c'est l'écran d'erreur d'Odoo avec Cannot read properties of undefined (reading 'map') qui est apparu à la place de la boîte de dialogue.
La cause : le client web appelle action_archive directement et exécute une action renvoyée sans autre traitement. Ce faisant, il lit impérativement la clé views de l'action. Notre action n'avait que view_mode. Pour les actions issues de boutons avec type="object", le serveur les complète au préalable (clean_action dans call_button), mais pas pour l'appel direct d'action_archive. Les tests n'appelaient la méthode qu'en Python, et là le champ manquant passait inaperçu.
Le correctif tient en une ligne ("views": [(False, "form")]), à quoi s'ajoute une vérification dans le test qui exige précisément cette clé. Rien n'a été archivé à cette occasion. La leçon : quiconque renvoie une action depuis une méthode que le client appelle directement (action_archive, action_unarchive et similaires) devrait toujours fournir views.
Installation
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
Les dépendances sont base et contacts. Après l'installation, le service Odoo doit être redémarré, car le module contient du code Python. Quiconque exploite un système de production installe d'abord le module sur une copie de la base de données.
limites
- Autorisation. Comme les utilisateurs sont archivés avec des droits élevés, toute personne autorisée à archiver un contact peut aussi, via la boîte de dialogue, archiver les accès au portail de cette entreprise. Cela ne s'applique pas aux utilisateurs internes. Pour sécuriser plus finement les accès au portail, il faut adapter le module.
- Pas de restauration automatique. Si l'entreprise est réactivée plus tard, les utilisateurs restent archivés. Ils doivent être réactivés à la main.
- Uniquement les contacts. Le module concerne les entreprises en tant que contacts (
res.partner). L'archivage d'une société Odoo (res.company) comporte d'autres vérifications, par exemple lorsqu'elle est encore la société par défaut d'utilisateurs. Le module n'est pas prévu pour cela. - Testé uniquement sur Odoo 19.0 Community. Nous ne l'avons pas vérifié pour d'autres versions.
Questions fréquentes
Pourquoi les collaborateurs ne sont-ils pas archivés en même temps ?
Un utilisateur interne dispose de droits dans le système et est généralement lié à ses propres données, tâches et autorisations. Le bloquer comme effet secondaire de l'archivage d'une entreprise nous semble trop risqué. C'est pourquoi le message d'erreur d'Odoo subsiste.
Puis-je désactiver la demande de confirmation ?
Dans le code, via le contexte skip_archive_users_wizard. Il n'existe pas de paramètre dans l'interface. Quiconque désinstalle le module retrouve le comportement standard d'Odoo.
Sous quelle licence est-il distribué ?
Sous AGPL-3. Les erreurs et améliorations sont les bienvenues sous forme d'issue dans le dépôt GitHub .
Assistance de Biricon IT Services
Nous gérons des installations Odoo pour les petites et moyennes entreprises : de la mise en place aux adaptations et migrations, jusqu'à l'exploitation courante. Si vous souhaitez simplifier dans Odoo des processus comme l'archivage d'entreprises clientes, mettre en place un portail pour vos clients ou installer un module en toute sécurité dans votre instance de production, nous vous aidons volontiers. Autres développements internes : Numéros de pièces composés d'un préfixe, de l'année et d'un compteur, Firmenbuch et vérification d'adresse pour les clients autrichiens et Ensembles de produits dans le devis sous forme de section.
Situation au 3 novembre 2026. Version du module 19.0.1.0.0 avec le correctif du même jour. Tous les noms et identifiants de connexion des illustrations sont choisis librement.