{"id":72,"date":"2022-08-30T09:00:00","date_gmt":"2022-08-30T12:00:00","guid":{"rendered":"https:\/\/dcoder.io\/blog\/integration-erp-crm-agenda\/"},"modified":"2022-08-30T09:00:00","modified_gmt":"2022-08-30T12:00:00","slug":"integration-erp-crm-agenda","status":"publish","type":"post","link":"https:\/\/dcoder.io\/blog\/fr\/integration-erp-crm-agenda\/","title":{"rendered":"ERP, CRM et agenda : comment cesser de saisir trois fois la m\u00eame chose"},"content":{"rendered":"<p><strong>D\u00e9cidez quel syst\u00e8me poss\u00e8de chaque information, int\u00e9grez par \u00e9v\u00e9nements plut\u00f4t que de tout synchroniser avec tout, et journalisez chaque \u00e9change.<\/strong> La plupart des int\u00e9grations qui tombent en panne silencieusement le font parce que la propri\u00e9t\u00e9 de la donn\u00e9e n&#8217;a jamais \u00e9t\u00e9 tranch\u00e9e et que personne ne surveillait.<\/p>\n<p>Dans presque toute entreprise de taille moyenne, quelqu&#8217;un passe en r\u00e9alit\u00e9 sa journ\u00e9e \u00e0 recopier des donn\u00e9es d&#8217;un syst\u00e8me vers un autre. La commande arrive par message, une personne la saisit dans l&#8217;ERP, une autre la r\u00e9p\u00e8te dans le CRM, une troisi\u00e8me la note dans l&#8217;agenda. Quatre saisies de la m\u00eame information et quatre occasions de se tromper.<\/p>\n<h2>D&#8217;abord, qui poss\u00e8de chaque information<\/h2>\n<p>Avant tout code, r\u00e9glez la question politique. Pour chaque donn\u00e9e importante, un syst\u00e8me est la source de v\u00e9rit\u00e9 et les autres en d\u00e9tiennent des copies.<\/p>\n<p>La fiche client : vit-elle dans le CRM ou dans l&#8217;ERP ? Si la r\u00e9ponse est \u00ab dans les deux \u00bb, vous n&#8217;avez pas une int\u00e9gration, vous avez un conflit programm\u00e9. Le jour o\u00f9 le m\u00eame client sera modifi\u00e9 aux deux endroits, une version sera \u00e9cart\u00e9e, et ce sera la mauvaise.<\/p>\n<p>Une r\u00e9partition qui fonctionne bien : le CRM poss\u00e8de la relation (contacts, historique, opportunit\u00e9s), l&#8217;ERP poss\u00e8de ce qui a une port\u00e9e fiscale (produits, prix, commandes, factures) et l&#8217;agenda poss\u00e8de le temps (qui est occup\u00e9 et quand).<\/p>\n<p>Une fois cela r\u00e9gl\u00e9, la r\u00e8gle devient simple. L&#8217;\u00e9criture n&#8217;a lieu que chez le propri\u00e9taire. Les autres re\u00e7oivent et affichent.<\/p>\n<h2>Des \u00e9v\u00e9nements, pas une synchronisation g\u00e9n\u00e9rale<\/h2>\n<p>La tentation est de cr\u00e9er une routine qui tourne toutes les heures en comparant tout avec tout. Cela fonctionne un temps, puis devient le processus le plus fragile de l&#8217;entreprise : lent, difficile \u00e0 diagnostiquer et parfaitement capable d&#8217;\u00e9craser une modification r\u00e9cente par une donn\u00e9e p\u00e9rim\u00e9e.<\/p>\n<p>Ce qui tient dans la dur\u00e9e, c&#8217;est le mod\u00e8le par \u00e9v\u00e9nements. \u00ab Commande valid\u00e9e \u00bb, \u00ab client cr\u00e9\u00e9 \u00bb, \u00ab rendez-vous annul\u00e9 \u00bb. Chaque \u00e9v\u00e9nement d\u00e9clenche des actions pr\u00e9cises dans les autres syst\u00e8mes. Si l&#8217;un d&#8217;eux est indisponible, l&#8217;\u00e9v\u00e9nement patiente dans la file et sera trait\u00e9 plus tard, sans rien perdre et sans tout r\u00e9p\u00e9ter.<\/p>\n<p>En pratique, il faut trois pi\u00e8ces : un r\u00e9cepteur de notifications (le webhook que l&#8217;autre syst\u00e8me appelle), une file d&#8217;attente, et un processeur capable de rejouer une op\u00e9ration sans dupliquer son effet.<\/p>\n<h2>L&#8217;idempotence, le mot barbare qui sauve l&#8217;exploitation<\/h2>\n<p>Toute int\u00e9gration traitera deux fois le m\u00eame message \u00e0 un moment donn\u00e9. L&#8217;autre syst\u00e8me renvoie parce qu&#8217;il n&#8217;a pas re\u00e7u l&#8217;accus\u00e9 de r\u00e9ception \u00e0 temps, quelqu&#8217;un rejoue la file, le r\u00e9seau hoquette.<\/p>\n<p>Si votre processeur n&#8217;y est pas pr\u00e9par\u00e9, le client est d\u00e9bit\u00e9 deux fois ou le stock est d\u00e9cr\u00e9ment\u00e9 deux fois. La protection est simple : chaque \u00e9v\u00e9nement porte un identifiant unique et, avant d&#8217;agir, vous v\u00e9rifiez si cet identifiant a d\u00e9j\u00e0 \u00e9t\u00e9 trait\u00e9. C&#8217;est une demi-heure de travail qui \u00e9vite le genre d&#8217;erreur que personne ne sait expliquer ensuite.<\/p>\n<h2>Journalisez tout, y compris le contenu<\/h2>\n<p>Quand une int\u00e9gration \u00e9choue, et cela arrivera, la question est toujours la m\u00eame : qu&#8217;a-t-on envoy\u00e9 exactement et qu&#8217;a-t-on re\u00e7u exactement. Sans journal complet, il ne reste que la sp\u00e9culation et les accusations crois\u00e9es avec le prestataire d&#8217;en face.<\/p>\n<p>Conservez, pour chaque \u00e9change : horodatage, adresse appel\u00e9e, contenu envoy\u00e9, r\u00e9ponse re\u00e7ue, code de statut et temps de r\u00e9ponse. Trente jours d&#8217;historique suffisent. Cela transforme \u00ab l&#8217;int\u00e9gration d\u00e9raille \u00bb en \u00ab \u00e0 14h32 l&#8217;ERP a renvoy\u00e9 une erreur 500 sur cet appel \u00bb, ce qui est une tout autre conversation.<\/p>\n<h2>La couche interm\u00e9diaire qui \u00e9vite la d\u00e9pendance<\/h2>\n<p>Brancher le syst\u00e8me A directement sur le syst\u00e8me B para\u00eet \u00e9conomique et cr\u00e9e un probl\u00e8me pour plus tard. Le jour o\u00f9 l&#8217;un des deux est remplac\u00e9, toute l&#8217;int\u00e9gration part avec lui.<\/p>\n<p>Une couche au milieu, qu&#8217;il s&#8217;agisse d&#8217;un petit service maison ou d&#8217;un outil d&#8217;automatisation visuelle comme n8n, re\u00e7oit d&#8217;un c\u00f4t\u00e9 et livre de l&#8217;autre en traduisant les formats. Changer de CRM revient alors \u00e0 r\u00e9\u00e9crire un connecteur, pas l&#8217;int\u00e9gration enti\u00e8re. Et ceux qui exploitent le processus peuvent voir le flux sans ouvrir de code.<\/p>\n<h2>Commencez l\u00e0 o\u00f9 \u00e7a fait le plus mal, et mesurez avant<\/h2>\n<p>N&#8217;essayez pas de tout int\u00e9grer. Demandez \u00e0 l&#8217;\u00e9quipe quelle ressaisie consomme le plus de temps et commencez par celle-l\u00e0. Avant d&#8217;automatiser, chronom\u00e9trez : combien de minutes par jour, combien de personnes, avec quel taux d&#8217;erreur.<\/p>\n<p>Un client a d\u00e9couvert que trois personnes passaient quarante minutes par jour \u00e0 ressaisir des commandes entre l&#8217;outil de vente et l&#8217;ERP. Cela fait deux heures par jour, dix heures par semaine. L&#8217;int\u00e9gration s&#8217;est rembours\u00e9e en cinq semaines, et ce chiffre n&#8217;existait que parce qu&#8217;il avait \u00e9t\u00e9 mesur\u00e9 avant, et non estim\u00e9 apr\u00e8s.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La ressaisie entre syst\u00e8mes est le co\u00fbt invisible le plus r\u00e9pandu dans les entreprises de taille moyenne. Comment int\u00e9grer sans devenir d\u00e9pendant d&#8217;un prestataire et sans casser \u00e0 chaque mise \u00e0 jour.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-72","post","type-post","status-publish","format-standard","hentry","category-sem-categoria"],"_links":{"self":[{"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/posts\/72","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/comments?post=72"}],"version-history":[{"count":0,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/posts\/72\/revisions"}],"wp:attachment":[{"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/media?parent=72"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/categories?post=72"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/tags?post=72"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}