OneDrive et SharePoint — pièces jointes déposées dans Microsoft 365
OneDrive SharePoint Integration for Odoo via Microsoft Graph — mirror Odoo attachments into a Microsoft 365 space: OAuth2 with admin consent, one folder per record, share link back, queue consumed by cron, Retry-After throttling honoured, and an explicit, configurable deletion policy. No network cal
Schermafbeeldingen
-
OneDrive et SharePoint — pièces jointes déposées dans Microsoft 365 — capture 1 -
OneDrive et SharePoint — pièces jointes déposées dans Microsoft 365 — capture 2 -
OneDrive et SharePoint — pièces jointes déposées dans Microsoft 365 — capture 3 -
OneDrive et SharePoint — pièces jointes déposées dans Microsoft 365 — capture 4 -
OneDrive et SharePoint — pièces jointes déposées dans Microsoft 365 — capture 5
Les pièces jointes d'Odoo déposées dans OneDrive et SharePoint
Un dossier par enregistrement, un lien de partage en retour, une file consommée au cron — et surtout les quatre choses que les connecteurs ratent : le jeton qui expire, le quota, la suppression, et l'appel réseau qui bloque un processus Odoo. Odoo 20 Community.
Non éprouvé contre un locataire Microsoft réel. Le programme développeur Microsoft 365, qui délivrait un locataire d'essai gratuit, est réservé depuis 2024 aux abonnés Visual Studio Professional ou Enterprise — vérifié le 14 septembre 2026. Toute la logique est éprouvée par 57 tests sur des réponses enregistrées, y compris les jetons expirés et les refus de quota, mais la conformité de bout en bout avec un vrai locataire ne l'est pas. Nous préférons l'écrire ici que vous le laisser découvrir. Un test d'intégration réelle est livré, prêt à lancer avec vos identifiants.
| Odoo 20 Community — On Premise | ✔ |
| Odoo.sh | ✔ |
| Odoo Online (SaaS) — les appels sortants y sont interdits | ✘ |
Le constat
Les pièces jointes d'Odoo vivent dans Odoo. Les documents de l'entreprise vivent dans SharePoint. Entre les deux, quelqu'un recopie — et ce quelqu'un oublie.
Écrire un PUT vers Microsoft Graph prend vingt lignes. Le problème est tout ce qui l'entoure, et que les connecteurs traitent mal parce que ces cas sont rares en recette et certains en production : le jeton de rafraîchissement qui meurt un mardi matin, le quota atteint parce qu'un collègue a lancé un import de mille factures, la pièce jointe supprimée d'Odoo et la question de savoir si le document de l'entreprise doit disparaître avec elle, et l'envoi qui part depuis le processus qui sert la page. Ce module est fait de ces quatre réponses.
Le jeton expire, et le module le dit
La connexion est passée à « Jeton expiré — reconnexion nécessaire ». Le bandeau rouge dit exactement ce qui se passe : « La file est arrêtée pour cette connexion : les 6 tâche(s) en attente ne sont pas perdues et repartiront d'elles-mêmes dès la reconnexion. » Un bouton Reconnecter apparaît, et lui seul. Remarquez aussi les deux dates distinctes à droite : dernière tentative le 14 septembre, dernier appel abouti le 4 août — on lit la panne, on ne la devine pas.
La file s'arrête, rien n'est perdu
Les tâches restent « à faire ». Elles ne sont pas marquées en échec — une tâche en échec demanderait un geste de plus, pour chacune, le jour de la reconnexion.
Aucune tentative en boucle
Marteler un jeton mort toutes les dix minutes ne le ressuscite pas, et finit par faire bloquer le compte. Le retour est un geste humain.
Définitif ou passager, ce n'est pas pareil
invalid_grant et interaction_required exigent un humain. Un 503 du service de jetons se réessaie. Les confondre, c'est soit condamner une connexion vivante, soit marteler une connexion morte.
Le secret client aussi expire — au plus tard deux ans après sa création. Azure l'impose, et aucun module ne peut deviner cette date : elle se saisit. Un cron quotidien alerte trente jours avant. Un secret qui expire un vendredi soir sans que personne ne l'ait vu venir, c'est le même incident avec un mois de retard.
Un dossier par enregistrement
Le chemin est visible en clair : Odoo/Contact/2026/Menuiserie Vandeputte/Contrat cadre signé.pdf. Le gabarit {modele}/{annee}/{enregistrement} se réarrange comme vous voulez, et tout vit sous le dossier racine que vous avez nommé — le module n'écrit jamais ailleurs. Ici deux connexions suivent les mêmes contacts : chaque fichier a donc deux dépôts, l'un déjà parti vers SharePoint, l'autre encore en attente vers OneDrive. Le bouton Ouvrir n'apparaît que sur les lignes qui ont réellement obtenu un lien.
Trois dangers dans un nom de fichier, trois traitements
| Danger | Ce qui arrive sans traitement | Traitement |
|---|---|---|
| Évasion de chemin | Un enregistrement nommé ../../secret écrit hors du dossier racine | Les .. et les séparateurs sont retirés, pas échappés |
| Caractères refusés | « : ? * | " < > » font échouer le dépôt sur un message obscur de Graph | Remplacés par un tiret |
| Noms réservés Windows | Un dossier CON, NUL ou COM1 ne peut pas exister, extension comprise | Préfixés par un tiret bas |
Rien ne part tant que vous n'avez rien nommé
Aucun modèle Odoo n'est suivi par défaut, et l'écran le dit lui-même. Un connecteur qui se mettrait à téléverser toute votre base au moment de son installation serait une mauvaise surprise doublée d'une facture de stockage — et il n'y aurait aucun moyen de revenir en arrière : les fichiers seraient partis. Notez à gauche la politique de suppression sur « Conserver le fichier distant », qui est le défaut.
La suppression est votre décision, jamais la nôtre
| Politique | Ce qui se passe | Appel émis |
|---|---|---|
| Conserver le défaut | Le dépôt passe à « conservé », le fichier distant reste, et la trace de ce qu'il est devenu est gardée | aucun |
| Corbeille | Le fichier va dans la corbeille du site, récupérable pendant la durée de rétention de votre locataire | un |
| Supprimer | Purge définitive, par l'en-tête Prefer: permanent-delete. Irréversible | un |
Le défaut n'est pas de la prudence de façade. Retirer une pièce jointe d'Odoo n'est pas décider du sort d'un document pour l'entreprise : quelqu'un peut nettoyer un doublon dans Odoo alors que le fichier sert de pièce justificative ailleurs, et une suppression distante est irréversible pour lui. Un défaut destructeur se découvre le jour où il est trop tard — un test garde donc ce défaut.
Une file qui ne ment pas sur son état
Deux lignes disent toute la discipline du module. La ligne orange est « En cours », cochée orpheline, prise en charge il y a deux jours : son processus est mort en cours d'envoi. Elle ne porte que le bouton Annuler — pas de Relancer. La ligne rouge est simplement « Échouée » après deux tentatives : elle, se relance.
La différence n'est pas cosmétique. D'une tâche échouée, on sait qu'elle n'a rien fait. D'une orpheline, on ne sait pas si l'envoi est parti ni s'il a abouti — et un envoi qui a abouti puis qu'on refait crée un doublon dans SharePoint, qu'il faudra retrouver à la main. Le module ne la relance donc jamais tout seul : il la marque, la compte, et attend une décision. La relancer demande de l'annuler d'abord, ce qui oblige à constater qu'on abandonne l'envoi précédent au lieu de l'oublier.
Le quota est respecté, pas subi
Sur un 429, le module lit l'en-tête Retry-After, met la connexion en pause jusqu'à cette date, et remet la tâche en file. Graph limite parfois un locataire entier par un 503 assorti d'un Retry-After : ce cas est traité comme un quota, pas comme une panne. Sans en-tête on attend une minute — réessayer aussitôt est le plus sûr moyen d'être limité plus longtemps — et un Retry-After d'une journée est borné à une heure, faute de quoi il bloquerait la file pour tout le monde.
C'est la seule reprise automatique du module, et l'exception est délibérée. Elle se justifie exactement là où la règle de l'orpheline ne s'applique pas : sur un 429, on sait que l'appel n'a rien fait, puisque Graph l'a refusé avant de le traiter. Aucun doublon n'est possible.
Aucun appel réseau dans un processus qui sert une page
Téléverser un document ne fait qu'écrire une ligne en base. L'envoi part du cron, toutes les dix minutes, ou d'une action « maintenant ». La règle ne repose pas sur la discipline de celui qui écrira le prochain bouton : le transport refuse de partir si le contexte ne porte pas l'autorisation explicite. Un appel tenté depuis un champ calculé tombe pendant les tests, et non en production un jour de charge.
L’application en mouvement
Le module en marche, enregistré dans le vrai client Odoo 19 : graph connexion, graph connexion (fiche), graph depot puis graph tache. Ce n’est pas un montage — ce sont les trames du navigateur sur le module livré, pris sur sa propre base.
Vidéo MP4 — 232 ko, 1280 px, 3.3 s, 4 écrans. Une amorce animée est aussi livrée en GIF (222 ko, 560 px) pour les contextes qui n’affichent pas la balise vidéo.
Ce que le module ne fait pas
- Les fichiers de plus de quatre mégaoctets. Au-delà, Graph exige une session d'envoi fragmentée, absente de cette version. Le fichier reste dans Odoo, intact, et la tâche dit pourquoi — plutôt que de laisser Graph rendre une erreur incompréhensible.
- Il ne rapatrie pas dans Odoo les fichiers créés depuis SharePoint, et ne synchronise pas dans les deux sens.
- Il ne remplace pas le module Documents d'Odoo Enterprise.
- Il ne fonctionne pas sur Odoo Online : les appels sortants y sont interdits.
57 tests, aucun sur le réseau. Le transport est remplacé par des réponses enregistrées, et le remplaçant compte les appels — ce qui permet d'affirmer qu'un chemin de code n'a rien appelé du tout, l'assertion la plus difficile à faire autrement. Chaque règle centrale a ensuite été neutralisée une par une pour vérifier que des tests tombaient bien : garde réseau, jeton définitivement mort, quota, politique de suppression par défaut, assainissement des chemins, relance des orphelines. Un test qui ne tombe pas quand on casse sa règle ne teste rien.
Wat deze app niet doet
- Les fichiers de plus de quatre mégaoctets. Au-delà, Graph exige une session d'envoi fragmentée, absente de cette version. Le fichier reste dans Odoo, intact, et la tâche dit pourquoi — plutôt que de laisser Graph rendre une erreur incompréhensible.
- Il ne rapatrie pas dans Odoo les fichiers créés depuis SharePoint, et ne synchronise pas dans les deux sens.
- Il ne remplace pas le module Documents d'Odoo Enterprise.
- Il ne fonctionne pas sur Odoo Online : les appels sortants y sont interdits.
Vereiste applicaties van de appstore
Geen.
Gebruikte Odoo Community-modules
base
| Serie | Versie | Status | Gepubliceerd op |
|---|---|---|---|
| 20.0 | 20.0.1.0.0 | Beschikbaar | 02-10-2026 |
| 19.0 | 19.0.1.0.0 | Beschikbaar |
Fiche gegenereerd uit de code van de uitgever (privé-repository, branch 20.0): de broncode is niet gepubliceerd.
Automatische controle van de appstore (los van de uitgever), toegepast op alle applicaties. Conforme.
| Controle | Resultaat | Effect indien afwezig |
|---|---|---|
| Manifeste lisible sans exécution | conforme | bloquant |
| Licence reconnue (OPL-1) | conforme | bloquant |
| Aucune dépendance vers Odoo Enterprise | conforme | bloquant |
| Aucun import de code Enterprise | conforme | bloquant |
| Aucun en-tête de licence Enterprise | conforme | bloquant |
| Icône static/description/icon.png | conforme | déclasse |
| Description (static/description/index.html ou README) | conforme | déclasse |
| Tests automatisés (tests/test_*.py) | conforme | déclasse |
| Traduction française (i18n/fr.po) | conforme | info |
| Section « Ce que le module ne fait pas » | conforme | info |
| Titre de 70 caractères au plus (67 actuellement) | conforme | info |
| Résumé en français | absent | info |
Guide de l'utilisateur — OneDrive et SharePoint
Ce guide vous mène de l'application Azure vide au premier fichier déposé, puis vous explique quoi faire le jour où quelque chose casse — parce que quelque chose cassera, et que c'est ce jour-là qu'un guide sert.
À lire avant de commencer. Ce module n'a jamais été éprouvé contre un locataire Microsoft réel : le programme développeur Microsoft 365 n'est plus ouvert sans abonnement Visual Studio. La logique est testée sur des réponses enregistrées ; la conformité de bout en bout ne l'est pas. Faites votre première mise en service sur un dossier d'essai, pas sur vos documents comptables.
1. Préparer l'application Azure
Tout part du portail Azure, et rien ne peut être fait depuis Odoo : Microsoft exige que l'application soit déclarée et consentie de son côté.
1.1. Créer l'inscription d'application
- Ouvrez portal.azure.com > Microsoft Entra ID > Inscriptions d'applications > Nouvelle inscription.
- Donnez-lui un nom qui vous parlera dans deux ans — « Odoo — dépôt des pièces jointes » et non « test1 ».
- Comptes pris en charge : ce répertoire d'organisation uniquement, sauf si vous savez précisément pourquoi vous voulez autre chose.
- Validez.
Relevez sur la page d'accueil de l'application :
| Ce que dit Azure | Ce que demande Odoo |
|---|---|
| ID d'application (client) | Identifiant d'application (client) |
| ID d'annuaire (locataire) | Identifiant de locataire (tenant) |
1.2. Créer le secret client
Certificats et secrets > Nouveau secret client.
Azure impose une durée de vie, deux ans au maximum. Notez la date d'expiration : vous allez la saisir dans Odoo, et c'est elle qui déclenchera l'alerte trente jours avant. Copiez la valeur du secret immédiatement — Azure ne la remontre jamais.
1.3. Accorder les autorisations
Autorisations d'API > Ajouter une autorisation > Microsoft Graph.
Pour le mode application, celui d'un site SharePoint d'entreprise, choisissez Autorisations d'application :
Files.ReadWrite.AllSites.ReadWrite.All
Puis — et c'est l'étape qu'on oublie — cliquez sur « Accorder un consentement
administrateur pour ». Sans ce clic, le jeton sera
délivré et Graph refusera chaque appel avec un 403 incompréhensible.
Pour le mode délégué, celui d'un OneDrive personnel, choisissez
Autorisations déléguées et ajoutez offline_access — sans lui, Microsoft ne
délivre aucun jeton de rafraîchissement, et la connexion mourra au bout d'une
heure sans explication.
1.4. Trouver l'identifiant du lecteur
C'est la partie la moins agréable, et Microsoft ne l'a pas simplifiée.
Pour un site SharePoint, avec l'explorateur Graph
(developer.microsoft.com/graph/graph-explorer), connecté avec un compte de
votre organisation :
GET https://graph.microsoft.com/v1.0/sites/contoso.sharepoint.com:/sites/vente
La réponse porte l'id du site, de la forme
contoso.sharepoint.com,<guid>,<guid>. Puis :
GET https://graph.microsoft.com/v1.0/sites/<cet id>/drives
La réponse liste les bibliothèques de documents ; l'id de celle que vous visez
est votre identifiant de lecteur.
Pour un OneDrive personnel, GET /me/drive suffit.
2. Créer la connexion dans Odoo
Paramètres > Microsoft 365 > Connexions > Nouveau.
| Champ | Ce qu'on y met |
|---|---|
| Nom | Ce que vous voulez lire dans la liste : « SharePoint — Documents commerciaux » |
| Mode d'authentification | Application pour un site SharePoint, Délégué pour un OneDrive personnel |
| Identifiant de locataire | L'ID d'annuaire relevé en 1.1 |
| Identifiant d'application | L'ID d'application relevé en 1.1 |
| Secret client | La valeur copiée en 1.2. Visible des seuls administrateurs, jamais écrite dans le journal |
| Le secret expire le | La date relevée en 1.2. Ne la sautez pas : sans elle, l'expiration vous surprendra |
| Identifiant du site | Pour SharePoint, l'id relevé en 1.4. Vide en OneDrive personnel |
| Identifiant du lecteur | L'id de la bibliothèque, relevé en 1.4 |
| Dossier racine | Odoo par défaut. Tout ce que le module dépose vit là-dessous, et nulle part ailleurs |
| Arborescence | {modele}/{annee}/{enregistrement} par défaut |
L'arborescence
Les jetons disponibles :
| Jeton | Ce qu'il rend |
|---|---|
{modele} |
Le nom lisible du modèle Odoo — « Contact », « Commande client » |
{enregistrement} |
Le nom affiché de l'enregistrement |
{id} |
Son identifiant numérique |
{annee}, {mois} |
La date du dépôt |
Un jeton mal orthographié ne fait pas tomber le dépôt : l'arborescence se rabat
sur {modele}/{enregistrement}. Une faute de frappe dans un gabarit ne doit pas
punir une pièce jointe qui, elle, va très bien.
Les noms sont assainis automatiquement. Un client nommé Dupont & Fils : S.A.
donnera un dossier Dupont & Fils - S.A. — les deux-points sont refusés par
Windows. Un enregistrement nommé .. ne vous fera pas sortir du dossier racine.
3. Choisir ce qui part
Onglet « Modèles suivis ».
Rien ne part tant que vous n'avez rien nommé ici. C'est délibéré : un connecteur qui téléverserait toute votre base à l'installation ne vous laisserait aucun moyen de revenir en arrière — les fichiers seraient partis.
Ajoutez les modèles dont vous voulez que les pièces jointes soient déposées :
res.partner, sale.order, account.move… Les modèles à pièces jointes
techniques — vues, ressources web — sont refusés : les envoyer remplirait votre
espace Microsoft de fichiers que personne ne lira.
4. Choisir ce qui se passe à la suppression
Champ « Quand la pièce jointe est supprimée d'Odoo ».
| Choix | Effet |
|---|---|
| Conserver le fichier distant (défaut) | Le fichier reste dans Microsoft 365. Le dépôt passe à « conservé » et garde la trace |
| Déplacer vers la corbeille | Le fichier va dans la corbeille du site, récupérable pendant la durée de rétention de votre locataire |
| Supprimer définitivement | Le fichier est purgé. Irréversible |
Prenez ce choix au sérieux. Retirer une pièce jointe d'Odoo n'est pas décider du sort d'un document pour votre entreprise : quelqu'un peut nettoyer un doublon dans Odoo alors que le fichier sert de pièce justificative ailleurs.
5. Vérifier que ça marche
Bouton « Essayer maintenant », en haut du formulaire.
Il appelle Microsoft Graph pour de vrai, demande la racine de votre lecteur, et affiche ce qui revient. C'est ainsi qu'on valide un consentement fraîchement accordé.
| Ce que vous voyez | Ce que ça veut dire |
|---|---|
| État Active | Tout est en place |
AADSTS7000215 |
Le secret client est faux ou a été recopié tronqué |
AADSTS700016 |
L'identifiant d'application n'existe pas dans ce locataire |
403 accessDenied |
Le consentement administrateur n'a pas été accordé (étape 1.3) |
404 itemNotFound |
L'identifiant du lecteur est faux |
Code HTTP 0 |
Rien n'est revenu : votre serveur Odoo n'a pas d'accès sortant |
Déposez ensuite une pièce jointe sur un enregistrement d'un modèle suivi. Elle apparaît aussitôt dans Fichiers déposés, à l'état « en attente », et dans la File de transfert.
Elle partira au prochain passage du cron, toutes les dix minutes. Pour ne pas attendre : ouvrez la file et lancez « Consommer maintenant ».
6. Le jour où ça casse
Un bandeau rouge : « Le jeton de rafraîchissement a expiré »
C'est l'incident normal d'un connecteur Microsoft, pas un défaut du module.
Ce qui se passe déjà, sans vous : la file est arrêtée pour cette connexion. Vos tâches en attente ne sont pas perdues et ne sont pas marquées en échec. Aucun appel n'est tenté — marteler un jeton mort finit par faire bloquer le compte.
Ce que vous avez à faire :
- lisez le message affiché.
AADSTS700082signifie quatre-vingt-dix jours sans usage ;AADSTS65001, un consentement retiré ; - réglez la cause côté Microsoft — reconsentez l'application, ou renouvelez le secret s'il a expiré ;
- revenez sur la connexion et cliquez « Reconnecter ».
Les tâches repartent d'elles-mêmes au passage suivant du cron. Vous n'avez aucune tâche à relancer une par une.
Un bandeau bleu : « Microsoft Graph a demandé d'attendre »
Vous avez atteint une limite de débit. Le module a lu le délai demandé par Microsoft, mis la connexion en pause jusque-là, et remis les tâches en file. Il n'y a rien à faire : la file reprendra seule.
Si cela revient souvent, espacez le cron ou réduisez la taille du lot
(dyo_ms_graph_documents.lot_par_passage, vingt par défaut).
Une tâche marquée « orpheline »
Son processus est mort en cours d'envoi. On ignore si le fichier est parti et s'il a abouti.
Le module ne la relance jamais tout seul, et c'est voulu : si l'envoi avait abouti, le refaire créerait un doublon dans SharePoint, que vous devriez retrouver à la main.
Allez voir dans votre espace Microsoft si le fichier est là :
- il y est → annulez la tâche ;
- il n'y est pas → annulez-la, puis relancez-la. Le détour est volontaire : il vous oblige à constater que vous abandonnez l'envoi précédent.
Le secret client va expirer
Un bandeau orange trente jours avant, et une ligne dans le journal Odoo chaque jour. Créez un nouveau secret dans Azure, saisissez sa valeur et sa nouvelle date dans la connexion. Rien d'autre ne change.
Un fichier trop gros
« Au-delà de quatre mégaoctets, Microsoft Graph exige une session d'envoi fragmentée, que ce module ne prend pas en charge. »
La pièce jointe reste dans Odoo, intacte. Déposez le fichier à la main dans SharePoint, puis annulez la tâche.
7. Les écrans de surveillance
Fichiers déposés
Un dépôt par fichier. Il survit à la pièce jointe : quand celle-ci est supprimée d'Odoo, le dépôt reste, avec le chemin distant et l'identifiant du fichier. Sans lui, on ne saurait plus quel fichier distant existe encore.
Le bouton Ouvrir mène au fichier dans Microsoft 365.
File de transfert
Filtres utiles : « À faire », « Échouées », et « Orphelines — décision attendue ».
Journal des appels
Durée, code de retour et résumé de chaque appel, les succès compris. Un journal qui ne garderait que les erreurs ne servirait à rien le jour où il faut prouver qu'un fichier est bien parti, ni celui où l'on cherche pourquoi les dépôts sont passés de trois cents millisecondes à huit secondes.
Les jetons et le secret ne sont jamais écrits ici.
Purge automatique à deux mois.
8. Réglages avancés
Paramètres > Technique > Paramètres système :
| Clé | Défaut | Effet |
|---|---|---|
dyo_ms_graph_documents.lot_par_passage |
20 | Nombre de tâches traitées par passage du cron |
dyo_ms_graph_documents.minutes_orpheline |
30 | Délai au-delà duquel une tâche « en cours » est déclarée orpheline |
Les quatre crons sont dans Paramètres > Technique > Actions planifiées : vider la file (10 min), signaler les orphelines (1 h), signaler les secrets qui expirent (1 j), purger le journal (1 sem).
9. Ce que le module ne fait pas
- Odoo Online (SaaS) : impossible, les appels sortants y sont interdits. On Premise et Odoo.sh uniquement.
- Les fichiers de plus de quatre mégaoctets.
- Le rapatriement dans Odoo des fichiers créés depuis SharePoint.
- La synchronisation dans les deux sens.
Beoordelingen van ingelogde klanten. Eén beoordeling per klant; de uitgever kan erop reageren. Log in om een beoordeling te plaatsen.
- Uitgever
- DYONYSOS
- contact@omnifloo.com
- Omnifloo-klanten
- Support inbegrepen volgens uw formule: helpcentrum.