[{"data":1,"prerenderedAt":1187},["ShallowReactive",2],{"\u002Fnext\u002Fapplications\u002Fevent-streaming":3,"section:\u002Fnext\u002Fapplications\u002Fevent-streaming":1186},{"id":4,"title":5,"body":6,"description":1161,"extension":1162,"meta":1163,"navigation":1165,"path":1182,"seo":1183,"stem":1184,"__hash__":1185},"docs\u002F2.next\u002F2.applications\u002F5.event-streaming.md","Event Streaming",{"type":7,"value":8,"toc":1140},"minimark",[9,13,26,29,37,40,45,59,97,103,107,148,154,158,161,219,226,239,244,371,392,398,427,437,464,468,477,485,489,492,520,534,538,541,544,561,570,574,584,637,643,697,715,727,730,737,740,753,756,760,783,787,878,884,887,920,924,1027,1121,1125],[10,11,5],"h1",{"id":12},"event-streaming",[14,15,16,17,21,22,25],"p",{},"Event Streaming copie des documents d'un site Dokos vers un autre site Dokos. Un site ",[18,19,20],"strong",{},"producteur"," enregistre chaque création, modification, annulation et suppression. Un site ",[18,23,24],{},"consommateur"," récupère ces changements et les applique à ses propres documents.",[14,27,28],{},"La synchronisation va dans un seul sens : du producteur vers le consommateur. Les changements faits sur le consommateur ne reviennent pas au producteur.",[14,30,31,32,36],{},"L'application n'a pas de traduction française. Ses écrans et ses types de documents s'affichent en anglais. Elle n'a pas d'espace de travail : ouvrez ses listes par la barre de recherche ou par leur adresse, par exemple ",[33,34,35],"code",{},"\u002Fdesk\u002Fevent-producer",".",[14,38,39],{},"L'application n'existe qu'en version next. Elle n'a pas de branche v5.",[41,42,44],"h2",{"id":43},"comment-fonctionne-la-synchronisation","Comment fonctionne la synchronisation",[46,47,48,49,52,53,55,56,58],"mermaid",{},"\nflowchart LR\n    D[Document modifié",[50,51],"br",{},"sur le producteur] --> U[Event Update Log]\n    U -->|notification| C[Site consommateur]\n    C -->|demande les changements| U\n    C --> S[Event Sync Log",[50,54],{},"Synced ou Failed]\n    C --> L[(Document local",[50,57],{},"créé, modifié ou supprimé)]\n",[60,61,62,85,88,91],"ol",{},[63,64,65,66,69,70,73,74,77,78,81,82,84],"li",{},"Sur le producteur, chaque enregistrement d'un document suivi crée un ",[18,67,68],{},"Event Update Log",". Le type de changement est ",[33,71,72],{},"Create",", ",[33,75,76],{},"Update"," ou ",[33,79,80],{},"Delete",". Une annulation crée un ",[33,83,76],{}," qui change le statut du document.",[63,86,87],{},"Le producteur prévient chaque consommateur concerné par une tâche de fond.",[63,89,90],{},"Le consommateur demande au producteur tous les changements postérieurs à sa dernière synchronisation.",[63,92,93,94,36],{},"Le consommateur applique chaque changement, dans l'ordre de création, et l'enregistre dans un ",[18,95,96],{},"Event Sync Log",[14,98,99,100,102],{},"Un ",[18,101,68],{}," n'est créé que si au moins un consommateur a fait approuver ce type de document et ne s'est pas désinscrit. Une modification qui ne change aucune valeur ne crée pas de journal. Aucun journal n'est créé pendant l'installation d'une application ou une migration.",[41,104,106],{"id":105},"prérequis","Prérequis",[108,109,110,113,116,119,122,129],"ul",{},[63,111,112],{},"L'application Event Streaming est installée sur les deux sites.",[63,114,115],{},"Les deux sites sont joignables l'un par l'autre en HTTP ou HTTPS.",[63,117,118],{},"Les tâches de fond (workers) et le planificateur de tâches sont actifs sur les deux sites.",[63,120,121],{},"Un même utilisateur, avec la même adresse e-mail, existe sur les deux sites. Cette page l'appelle « l'abonné ». L'application le nomme « Event Subscriber ».",[63,123,124,125,128],{},"L'abonné a le rôle ",[18,126,127],{},"Responsable système"," sur les deux sites. Le producteur refuse l'inscription si l'abonné n'a pas ce rôle chez lui.",[63,130,131,132,135,136,139,140,143,144,147],{},"L'abonné a des clés API sur les deux sites. Pour les créer, ouvrez sa fiche ",[18,133,134],{},"Utilisateur",", onglet ",[18,137,138],{},"Paramètres",", section ",[18,141,142],{},"Accès API",", puis cliquez sur ",[18,145,146],{},"Générer des clés",". Notez la clé et le secret : le secret ne s'affiche qu'à la génération.",[14,149,150,151,153],{},"Seul le rôle ",[18,152,127],{}," a accès aux types de documents de l'application.",[41,155,157],{"id":156},"configurer-le-consommateur","Configurer le consommateur",[14,159,160],{},"Toute la configuration se fait sur le site consommateur. Le producteur reçoit l'inscription automatiquement.",[60,162,163,172,191,203,209,216],{},[63,164,165,166,168,169,36],{},"Sur le site consommateur, ouvrez ",[33,167,35],{}," et cliquez sur ",[18,170,171],{},"Ajouter",[63,173,174,175,178,179,182,183,186,187,190],{},"Dans ",[18,176,177],{},"Producer URL",", saisissez l'adresse du site producteur, par exemple ",[33,180,181],{},"https:\u002F\u002Fsiege.exemple.fr",". Seuls les schémas ",[33,184,185],{},"http"," et ",[33,188,189],{},"https"," sont acceptés. La barre oblique finale est retirée.",[63,192,174,193,186,196,199,200,36],{},[18,194,195],{},"API Key",[18,197,198],{},"API Secret",", saisissez les clés de l'abonné ",[18,201,202],{},"sur le site producteur",[63,204,174,205,208],{},[18,206,207],{},"Event Subscriber",", choisissez l'abonné. Il doit avoir des clés API sur le site consommateur.",[63,210,211,212,215],{},"Dans le tableau ",[18,213,214],{},"Event Producer Document Types",", ajoutez une ligne par type de document à recevoir. Les types de documents uniques (Single) et les tables enfants ne sont pas proposés.",[63,217,218],{},"Enregistrez.",[14,220,221,222,225],{},"À l'enregistrement, le site consommateur vérifie que le producteur répond. Il fait trois essais, à cinq secondes d'intervalle. Il inscrit ensuite le consommateur sur le producteur : un document ",[18,223,224],{},"Event Consumer"," est créé sur le producteur. Son nom est l'adresse du site consommateur. Il contient les clés API de l'abonné sur le consommateur, pour que le producteur puisse le prévenir.",[14,227,228,229,232,233,238],{},"Le consommateur ne reçoit que les changements faits ",[18,230,231],{},"après"," son inscription. Les documents qui existaient avant ne sont pas copiés, sauf s'ils sont modifiés par la suite (voir ",[234,235,237],"a",{"href":236},"#ordre-des-changements","Ordre des changements",").",[240,241,243],"h3",{"id":242},"les-options-de-chaque-type-de-document","Les options de chaque type de document",[245,246,247,260],"table",{},[248,249,250],"thead",{},[251,252,253,257],"tr",{},[254,255,256],"th",{},"Champ",[254,258,259],{},"Effet",[261,262,263,274,291,301,321,331,341,351,361],"tbody",{},[251,264,265,271],{},[266,267,268],"td",{},[18,269,270],{},"Document Type",[266,272,273],{},"Le type de document à recevoir.",[251,275,276,284],{},[266,277,278,186,281],{},[18,279,280],{},"Has Mapping",[18,282,283],{},"Mapping",[266,285,286,287,238],{},"Les noms de champs diffèrent entre les deux sites. Choisissez une correspondance (voir ",[234,288,290],{"href":289},"#correspondances-entre-types-de-documents","Correspondances",[251,292,293,298],{},[266,294,295],{},[18,296,297],{},"Use Same Name",[266,299,300],{},"Le document garde sur le consommateur le même nom que sur le producteur.",[251,302,303,308],{},[266,304,305],{},[18,306,307],{},"Approval Status",[266,309,310,311,73,314,77,317,320],{},"Le statut d'approbation, mis à jour par le producteur : ",[33,312,313],{},"Pending",[33,315,316],{},"Approved",[33,318,319],{},"Rejected",". Le producteur le fixe.",[251,322,323,328],{},[266,324,325],{},[18,326,327],{},"Unsubscribe",[266,329,330],{},"Cochez pour arrêter de recevoir ce type de document. Le producteur cesse alors de créer des journaux pour vous.",[251,332,333,338],{},[266,334,335],{},[18,336,337],{},"Condition",[266,339,340],{},"Filtre les documents envoyés (voir plus bas).",[251,342,343,348],{},[266,344,345],{},[18,346,347],{},"Naming Expression",[266,349,350],{},"Calcule le nom du document sur le consommateur.",[251,352,353,358],{},[266,354,355],{},[18,356,357],{},"Skip Validation",[266,359,360],{},"Écrit le document directement en base, sans validations ni contrôles. Option risquée, à réserver aux cas maîtrisés.",[251,362,363,368],{},[266,364,365],{},[18,366,367],{},"Skip Dependencies",[266,369,370],{},"Ne copie pas les documents liés manquants.",[14,372,373,374,376,377,380,381,384,385,380,388,391],{},"Si ",[18,375,297],{}," n'est pas coché, l'application ajoute deux champs personnalisés en lecture seule au type de document du consommateur : ",[18,378,379],{},"Remote Document Name"," (",[33,382,383],{},"remote_docname",") et ",[18,386,387],{},"Remote Site",[33,389,390],{},"remote_site_name","). Ils gardent le nom d'origine et le site d'origine. Le consommateur s'en sert pour retrouver le document lors des modifications suivantes.",[14,393,394,395,397],{},"La ",[18,396,337],{}," est évaluée sur le producteur, pour chaque changement :",[108,399,400,411],{},[63,401,402,403,406,407,410],{},"une expression Python qui reçoit ",[33,404,405],{},"doc",", par exemple ",[33,408,409],{},"doc.disabled == 0"," ;",[63,412,413,414,417,418,73,421,186,423,426],{},"ou ",[33,415,416],{},"cmd:"," suivi du chemin d'une méthode Python. Elle reçoit ",[33,419,420],{},"consumer",[33,422,405],{},[33,424,425],{},"update_log"," et renvoie vrai ou faux.",[14,428,429,430,433,434,36],{},"Une erreur dans la condition bloque l'envoi du document. Elle est enregistrée dans le ",[18,431,432],{},"Journal des erreurs"," du producteur sous le titre ",[33,435,436],{},"has_consumer_access error",[14,438,394,439,441,442,73,445,186,448,451,452,455,456,459,460,463],{},[18,440,347],{}," est une expression Python qui reçoit ",[33,443,444],{},"name",[33,446,447],{},"doctype",[33,449,450],{},"site",". Elle peut aussi commencer par ",[33,453,454],{},"call:"," suivi du chemin d'une méthode. Avec ",[33,457,458],{},"call-recursive:",", la méthode renomme aussi les valeurs des champs ",[18,461,462],{},"Lien"," du document et de ses tables.",[240,465,467],{"id":466},"modifier-la-liste-après-coup","Modifier la liste après coup",[14,469,470,471,474,475,36],{},"Quand vous modifiez la fiche ",[18,472,473],{},"Event Producer"," et l'enregistrez, le consommateur envoie la nouvelle liste au producteur. Les types de documents déjà approuvés gardent leur statut. Les nouveaux types arrivent en ",[33,476,313],{},[14,478,479,480,77,482,484],{},"Si vous changez ",[18,481,195],{},[18,483,198],{},", l'enregistrement ne renvoie pas la liste au producteur.",[41,486,488],{"id":487},"approuver-sur-le-producteur","Approuver sur le producteur",[14,490,491],{},"Le producteur décide de ce qu'il partage. Tant qu'un type de document n'est pas approuvé, rien n'est envoyé.",[60,493,494,500,503,518],{},[63,495,496,497,36],{},"Sur le site producteur, ouvrez ",[33,498,499],{},"\u002Fdesk\u002Fevent-consumer",[63,501,502],{},"Ouvrez la fiche du consommateur. Son nom est l'adresse du site consommateur.",[63,504,211,505,508,509,511,512,514,515,517],{},[18,506,507],{},"Event Consumer Document Types",", passez ",[18,510,307],{}," à ",[33,513,316],{}," pour chaque type de document à partager, ou à ",[33,516,319],{}," pour le refuser.",[63,519,218],{},[14,521,522,523,525,526,528,529,531,532,36],{},"Le producteur recopie les statuts sur la fiche ",[18,524,473],{}," du consommateur. L'indicateur du statut est orange pour ",[33,527,313],{},", vert pour ",[33,530,316],{}," et rouge pour ",[33,533,319],{},[41,535,537],{"id":536},"quels-documents-sont-synchronisés","Quels documents sont synchronisés",[14,539,540],{},"Tout type de document qui n'est ni unique ni une table enfant peut être synchronisé. L'application suit tous les types de documents du site. Elle ne crée de journal que pour ceux qui ont un consommateur approuvé.",[14,542,543],{},"Pour chaque changement reçu, le consommateur agit ainsi :",[108,545,546,551,556],{},[63,547,548,550],{},[18,549,72],{}," : il crée le document. S'il existe déjà un document du même nom, il ne fait rien.",[63,552,553,555],{},[18,554,76],{}," : il applique les champs modifiés, les lignes ajoutées, modifiées et supprimées des tables, puis enregistre. S'il ne trouve pas le document local, il demande le document complet au producteur et le crée.",[63,557,558,560],{},[18,559,80],{}," : il supprime le document local s'il le trouve.",[14,562,563,564,566,567,569],{},"Avant de créer ou modifier un document, le consommateur crée les documents liés qui lui manquent. Il les demande au producteur et les crée avec le même nom. Il traite d'abord les liens des tables enfants, puis les champs ",[18,565,462],{},", puis les liens dynamiques. Cochez ",[18,568,367],{}," pour ne pas le faire.",[240,571,573],{"id":572},"correspondances-entre-types-de-documents","Correspondances entre types de documents",[14,575,576,577,580,581,36],{},"Une correspondance (",[18,578,579],{},"Document Type Mapping",") relie un type de document du producteur à un type de document du consommateur, quand leurs champs diffèrent. Créez-la sur le consommateur, dans ",[33,582,583],{},"\u002Fdesk\u002Fdocument-type-mapping",[245,585,586,595],{},[248,587,588],{},[251,589,590,592],{},[254,591,256],{},[254,593,594],{},"Rôle",[261,596,597,607,617,627],{},[251,598,599,604],{},[266,600,601],{},[18,602,603],{},"Mapping Name",[266,605,606],{},"Le nom de la correspondance.",[251,608,609,614],{},[266,610,611],{},[18,612,613],{},"Local Document Type",[266,615,616],{},"Le type de document sur le consommateur.",[251,618,619,624],{},[266,620,621],{},[18,622,623],{},"Remote Document Type",[266,625,626],{},"Le nom du type de document sur le producteur.",[251,628,629,634],{},[266,630,631],{},[18,632,633],{},"Field Mapping",[266,635,636],{},"Une ligne par champ.",[14,638,639,640,642],{},"Quand vous choisissez ",[18,641,613],{},", le tableau se remplit avec les champs du type local. Pour chaque ligne :",[108,644,645,651,657,663,677,682],{},[63,646,647,650],{},[18,648,649],{},"Local Fieldname"," : le champ du consommateur (obligatoire) ;",[63,652,653,656],{},[18,654,655],{},"Remote Fieldname"," : le champ correspondant sur le producteur ;",[63,658,659,662],{},[18,660,661],{},"Default Value"," : la valeur à mettre quand le producteur n'envoie rien ;",[63,664,665,668,669,672,673,676],{},[18,666,667],{},"Mapping Type"," : ",[33,670,671],{},"Child Table"," pour une table, ",[33,674,675],{},"Document"," pour un document lié ;",[63,678,679,681],{},[18,680,283],{}," : la correspondance à appliquer à la table ou au document lié ;",[63,683,684,687,688,690,691,694,695,36],{},[18,685,686],{},"Remote Value Filters"," : pour ",[33,689,675],{},", un filtre JSON qui trouve le document lié sur le producteur. Une valeur qui commence par ",[33,692,693],{},"eval:"," est une expression Python sur ",[33,696,405],{},[14,698,699,700,73,702,77,705,708,709,711,712,714],{},"Un champ ",[18,701,462],{},[18,703,704],{},"Lien dynamique",[18,706,707],{},"Table"," du consommateur doit avoir une ",[18,710,283],{}," ou une ",[18,713,661],{},". Sinon la correspondance ne s'enregistre pas.",[14,716,717,718,720,721,723,724,726],{},"Sur la fiche ",[18,719,473],{},", cochez ",[18,722,280],{}," et choisissez la correspondance. Le consommateur s'abonne alors au ",[18,725,623],{}," chez le producteur.",[41,728,237],{"id":729},"ordre-des-changements",[14,731,732,733,736],{},"Le consommateur garde la date du dernier changement traité dans un ",[18,734,735],{},"Event Producer Last Update",". À chaque synchronisation, il demande les changements plus récents, pour les types de documents approuvés.",[14,738,739],{},"Les changements sont appliqués dans l'ordre où le producteur les a créés.",[14,741,742,743,745,746,749,750,752],{},"Le producteur note dans chaque ",[18,744,68],{}," les consommateurs qui l'ont lu (champ ",[18,747,748],{},"Consumers","). Si un consommateur n'a pas lu le changement précédent d'un document, le producteur lui renvoie aussi les changements non lus de ce document, dans l'ordre. C'est le cas quand un document se met à remplir la ",[18,751,337],{}," : le consommateur reçoit alors son historique.",[14,754,755],{},"L'application ne détecte pas les conflits. Un changement reçu du producteur remplace les valeurs locales des champs concernés. Une modification locale sur le consommateur n'est ni protégée ni renvoyée.",[41,757,759],{"id":758},"quand-la-synchronisation-a-lieu","Quand la synchronisation a lieu",[108,761,762,771,774,780],{},[63,763,764,765,767,768,238],{},"Dès qu'un ",[18,766,68],{}," est créé, le producteur prévient les consommateurs concernés par une tâche de fond (file ",[33,769,770],{},"long",[63,772,773],{},"Si un consommateur ne répond pas, le producteur remet la notification en file d'attente.",[63,775,776,777,238],{},"Le consommateur, prévenu, lance la récupération des changements en tâche de fond (file ",[33,778,779],{},"default",[63,781,782],{},"Chaque jour, le planificateur du producteur prévient tous les consommateurs qui ont au moins un type de document approuvé.",[41,784,786],{"id":785},"journaux-et-relance-des-échecs","Journaux et relance des échecs",[245,788,789,802],{},[248,790,791],{},[251,792,793,796,799],{},[254,794,795],{},"Journal",[254,797,798],{},"Site",[254,800,801],{},"Contenu",[261,803,804,831,867],{},[251,805,806,814,817],{},[266,807,808,380,810,813],{},[18,809,68],{},[33,811,812],{},"\u002Fdesk\u002Fevent-update-log",")",[266,815,816],{},"Producteur",[266,818,819,820,823,824,73,827,830],{},"Un changement : ",[18,821,822],{},"Update Type",", type de document, ",[18,825,826],{},"Document Name",[18,828,829],{},"Data"," (le document ou les différences) et les consommateurs qui l'ont lu.",[251,832,833,840,843],{},[266,834,835,380,837,813],{},[18,836,96],{},[33,838,839],{},"\u002Fdesk\u002Fevent-sync-log",[266,841,842],{},"Consommateur",[266,844,845,846,849,850,853,854,857,858,73,861,186,863,866],{},"Le résultat de chaque changement appliqué : ",[18,847,848],{},"Status"," ",[33,851,852],{},"Synced"," (vert) ou ",[33,855,856],{},"Failed"," (rouge), document local, ",[18,859,860],{},"Producer Document Name",[18,862,829],{},[18,864,865],{},"Error"," (le détail technique de l'erreur).",[251,868,869,873,875],{},[266,870,871],{},[18,872,735],{},[266,874,842],{},[266,876,877],{},"La date du dernier changement traité pour chaque producteur.",[14,879,880,881,36],{},"Un changement en échec ne bloque pas les suivants. Le consommateur passe au changement suivant et avance sa date de dernière synchronisation. Un échec n'est donc ",[18,882,883],{},"pas relancé automatiquement",[14,885,886],{},"Pour relancer un échec :",[60,888,889,900,905,908],{},[63,890,891,892,894,895,897,898,36],{},"Sur le consommateur, ouvrez ",[33,893,839],{}," et filtrez sur ",[18,896,848],{}," = ",[33,899,856],{},[63,901,902,903,36],{},"Ouvrez le journal et lisez le champ ",[18,904,865],{},[63,906,907],{},"Corrigez la cause, par exemple un champ obligatoire manquant ou un document lié absent.",[63,909,910,911,914,915,917,918,36],{},"Cliquez sur ",[18,912,913],{},"Resync",". Le statut passe à ",[33,916,852],{}," si la relance réussit, sinon il reste ",[33,919,856],{},[41,921,923],{"id":922},"dépannage","Dépannage",[245,925,926,936],{},[248,927,928],{},[251,929,930,933],{},[254,931,932],{},"Message ou symptôme",[254,934,935],{},"Cause et solution",[261,937,938,948,956,964,975,987,998,1015],{},[251,939,940,943],{},[266,941,942],{},"« Please generate keys for the Event Subscriber User … first. »",[266,944,945,946,36],{},"L'abonné n'a pas de clés API sur le consommateur. Générez-les sur sa fiche ",[18,947,134],{},[251,949,950,953],{},[266,951,952],{},"« Failed to connect to the Event Producer site. Retry after some time. »",[266,954,955],{},"Le producteur n'a pas répondu avec un code 200 après trois essais. Vérifiez l'adresse et que le site est en ligne.",[251,957,958,961],{},[266,959,960],{},"« User … not found on the producer site »",[266,962,963],{},"L'abonné n'existe pas sur le producteur. Créez-le avec la même adresse e-mail.",[251,965,966,969],{},[266,967,968],{},"« Event Subscriber has to be a System Manager. »",[266,970,971,972,974],{},"Donnez à l'abonné le rôle ",[18,973,127],{}," sur le producteur.",[251,976,977,980],{},[266,978,979],{},"« Failed to create an Event Consumer or an Event Consumer for the current site is already registered. »",[266,981,99,982,984,985,36],{},[18,983,224],{}," existe déjà pour ce site sur le producteur. Supprimez-le sur le producteur, puis recréez la fiche ",[18,986,473],{},[251,988,989,992],{},[266,990,991],{},"« Please set API Key and Secret on the producer and consumer sites first. »",[266,993,994,995,997],{},"La fiche ",[18,996,473],{}," a perdu sa clé ou son secret. Saisissez-les de nouveau.",[251,999,1000,1003],{},[266,1001,1002],{},"Aucun changement n'arrive",[266,1004,1005,1006,1008,1009,1011,1012,1014],{},"Vérifiez que le type de document est ",[33,1007,316],{}," et non désinscrit, que la ",[18,1010,337],{}," est remplie, et que les tâches de fond tournent sur les deux sites. Consultez aussi le ",[18,1013,432],{}," du producteur.",[251,1016,1017,1020],{},[266,1018,1019],{},"Un document arrive sous un autre nom",[266,1021,1022,1024,1025,36],{},[18,1023,297],{}," n'est pas coché. Le nom d'origine est dans ",[18,1026,379],{},[1028,1029,1032,1046],"callout",{"color":1030,"icon":1031},"info","i-heroicons-light-bulb",[14,1033,1034,1037,1038,1041,1042,1045],{},[18,1035,1036],{},"Exemple fictif :"," Dokompany a un site siège, ",[33,1039,1040],{},"https:\u002F\u002Fsiege.dokompany.fr",", et un site pour sa filiale de Lyon, ",[33,1043,1044],{},"https:\u002F\u002Flyon.dokompany.fr",". Le siège crée les articles. La filiale doit recevoir les articles actifs.",[60,1047,1048,1058,1076,1091,1104,1114],{},[63,1049,1050,1051,1054,1055,1057],{},"L'utilisatrice ",[33,1052,1053],{},"synchro@dokompany.fr"," est créée sur les deux sites, avec le rôle ",[18,1056,127],{}," et des clés API sur chacun.",[63,1059,1060,1061,1063,1064,849,1066,1068,1069,1071,1072,849,1074,36],{},"Sur le site de Lyon, une fiche ",[18,1062,473],{}," est créée : ",[18,1065,177],{},[33,1067,1040],{},", les clés de ",[33,1070,1053],{}," sur le siège, ",[18,1073,207],{},[33,1075,1053],{},[63,1077,1078,1079,849,1081,73,1084,1086,1087,849,1089,36],{},"Une ligne est ajoutée : ",[18,1080,270],{},[33,1082,1083],{},"Item",[18,1085,297],{}," coché, ",[18,1088,337],{},[33,1090,409],{},[63,1092,1093,1094,849,1096,1098,1099,1101,1102,36],{},"Sur le siège, la fiche ",[18,1095,224],{},[33,1097,1044],{}," apparaît. Le type ",[33,1100,1083],{}," est passé à ",[33,1103,316],{},[63,1105,1106,1107,1110,1111,1113],{},"Le siège crée l'article ",[33,1108,1109],{},"CAFE-250",". Quelques instants plus tard, ",[33,1112,1109],{}," existe à Lyon, avec son groupe d'articles et son unité de mesure s'ils manquaient.",[63,1115,99,1116,849,1118,1120],{},[18,1117,96],{},[33,1119,852],{}," le confirme à Lyon.",[41,1122,1124],{"id":1123},"voir-aussi","Voir aussi",[108,1126,1127,1133],{},[63,1128,1129],{},[234,1130,1132],{"href":1131},"\u002Fnext\u002Fdecouvrir\u002Fcatalogue-des-applications","Catalogue des applications",[63,1134,1135,1139],{},[234,1136,1138],{"href":1137},"\u002Fnext\u002Fapplications\u002Fdokos-data-hub","Dokos Data Hub",", pour recevoir des fichiers de partenaires externes",{"title":1141,"searchDepth":1142,"depth":1143,"links":1144},"",1,2,[1145,1146,1147,1152,1153,1156,1157,1158,1159,1160],{"id":43,"depth":1143,"text":44},{"id":105,"depth":1143,"text":106},{"id":156,"depth":1143,"text":157,"children":1148},[1149,1151],{"id":242,"depth":1150,"text":243},3,{"id":466,"depth":1150,"text":467},{"id":487,"depth":1143,"text":488},{"id":536,"depth":1143,"text":537,"children":1154},[1155],{"id":572,"depth":1150,"text":573},{"id":729,"depth":1143,"text":237},{"id":758,"depth":1143,"text":759},{"id":785,"depth":1143,"text":786},{"id":922,"depth":1143,"text":923},{"id":1123,"depth":1143,"text":1124},"Synchroniser des documents d'un site Dokos vers un autre : producteur, consommateur, approbation, correspondances, journaux et relance des échecs.","md",{"icon":1164,"reviewed":1165,"last_verified":1166,"sources":1167},"i-lucide-radio-tower",true,"2026-11-04",[1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181],"event_streaming@develop:event_streaming\u002Fhooks.py","event_streaming@develop:event_streaming\u002Ftasks.py","event_streaming@develop:event_streaming\u002Fevent_streaming\u002Fdoctype\u002Fevent_producer\u002Fevent_producer.py","event_streaming@develop:event_streaming\u002Fevent_streaming\u002Fdoctype\u002Fevent_producer\u002Fevent_producer.json","event_streaming@develop:event_streaming\u002Fevent_streaming\u002Fdoctype\u002Fevent_producer_document_type\u002Fevent_producer_document_type.json","event_streaming@develop:event_streaming\u002Fevent_streaming\u002Fdoctype\u002Fevent_consumer\u002Fevent_consumer.py","event_streaming@develop:event_streaming\u002Fevent_streaming\u002Fdoctype\u002Fevent_consumer\u002Fevent_consumer.json","event_streaming@develop:event_streaming\u002Fevent_streaming\u002Fdoctype\u002Fevent_consumer_document_type\u002Fevent_consumer_document_type.json","event_streaming@develop:event_streaming\u002Fevent_streaming\u002Fdoctype\u002Fevent_update_log\u002Fevent_update_log.py","event_streaming@develop:event_streaming\u002Fevent_streaming\u002Fdoctype\u002Fevent_sync_log\u002Fevent_sync_log.json","event_streaming@develop:event_streaming\u002Fevent_streaming\u002Fdoctype\u002Fevent_sync_log\u002Fevent_sync_log.js","event_streaming@develop:event_streaming\u002Fevent_streaming\u002Fdoctype\u002Fdocument_type_mapping\u002Fdocument_type_mapping.py","event_streaming@develop:event_streaming\u002Fevent_streaming\u002Fdoctype\u002Fdocument_type_field_mapping\u002Fdocument_type_field_mapping.json","frappe@develop:frappe\u002Fcore\u002Fdoctype\u002Fuser\u002Fuser.json","\u002Fnext\u002Fapplications\u002Fevent-streaming",{"title":5,"description":1161},"2.next\u002F2.applications\u002F5.event-streaming","p8dFVR7PdL6_U-jwu74TWaeDzwVqI7Bjy5V3Te7_3pw",{},1793871720797]