[{"data":1,"prerenderedAt":335},["ShallowReactive",2],{"\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fhooks-routage-factures-electroniques":3,"section:\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fhooks-routage-factures-electroniques":334},{"id":4,"title":5,"body":6,"description":322,"extension":323,"meta":324,"navigation":157,"path":330,"seo":331,"stem":332,"__hash__":333},"docs\u002F1.v5\u002F3.dodock\u002F10.developpeurs\u002Fhooks-routage-factures-electroniques.md","Hooks de routage par unité économique",{"type":7,"value":8,"toc":317},"minimark",[9,13,17,80,87,92,103,114,137,200,210,214,232,246,292,296,313],[10,11,5],"h1",{"id":12},"hooks-de-routage-par-unité-économique",[14,15,16],"p",{},"Une société peut émettre et recevoir des factures électroniques au nom de plusieurs unités économiques : établissements, services, agences. Dans l'annuaire, chaque unité a son propre code de routage. L'application E-transactions propose deux hooks pour qu'une autre application tienne compte de ces unités.",[18,19,20,39],"table",{},[21,22,23],"thead",{},[24,25,26,30,33,36],"tr",{},[27,28,29],"th",{},"Hook",[27,31,32],{},"Sens",[27,34,35],{},"Appel",[27,37,38],{},"Effet",[40,41,42,62],"tbody",{},[24,43,44,51,54,59],{},[45,46,47],"td",{},[48,49,50],"code",{},"etransactions_seller_electronic_address",[45,52,53],{},"Émission",[45,55,56],{},[48,57,58],{},"fn(sales_invoice) -> str | None",[45,60,61],{},"Remplace l'adresse électronique du vendeur (BT-34) de la facture",[24,63,64,69,72,77],{},[45,65,66],{},[48,67,68],{},"etransactions_incoming_invoice_values",[45,70,71],{},"Réception",[45,73,74],{},[48,75,76],{},"fn(einvoice) -> dict | None",[45,78,79],{},"Ajoute des valeurs d'en-tête à la facture fournisseur créée depuis la facture reçue",[14,81,82,83,86],{},"Déclarez chaque hook comme une liste de chemins de fonctions dans le fichier ",[48,84,85],{},"hooks.py"," de votre application.",[88,89,91],"h2",{"id":90},"émettre-depuis-ladresse-dune-unité","Émettre depuis l'adresse d'une unité",[14,93,94,95,97,98,102],{},"Lors de la génération de la facture électronique, E-transactions appelle chaque fonction du hook ",[48,96,50],{}," avec la ",[99,100,101],"strong",{},"Facture de vente",". La première réponse non vide remplace l'adresse électronique de la société pour cette facture. Si aucune fonction ne répond, E-transactions garde l'adresse de la société.",[14,104,105,106,109,110,113],{},"La valeur est un identifiant d'annuaire, avec ou sans schéma : ",[48,107,108],{},"123456789_ROUTE1"," ou ",[48,111,112],{},"0225:123456789_ROUTE1",".",[115,116,121],"pre",{"className":117,"code":118,"language":119,"meta":120,"style":120},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# mon_app\u002Fhooks.py\netransactions_seller_electronic_address = [\"mon_app.einvoice.adresse_vendeur\"]\n","python","",[48,122,123,131],{"__ignoreMap":120},[124,125,128],"span",{"class":126,"line":127},"line",1,[124,129,130],{},"# mon_app\u002Fhooks.py\n",[124,132,134],{"class":126,"line":133},2,[124,135,136],{},"etransactions_seller_electronic_address = [\"mon_app.einvoice.adresse_vendeur\"]\n",[115,138,140],{"className":117,"code":139,"language":119,"meta":120,"style":120},"# mon_app\u002Feinvoice.py\nimport frappe\n\n\ndef adresse_vendeur(sales_invoice):\n    # Exemple fictif : le centre de coût de la facture porte le code de routage\n    # dans un champ personnalisé « custom_code_routage ».\n    if not sales_invoice.cost_center:\n        return None\n    return frappe.db.get_value(\"Cost Center\", sales_invoice.cost_center, \"custom_code_routage\")\n",[48,141,142,147,152,159,164,170,176,182,188,194],{"__ignoreMap":120},[124,143,144],{"class":126,"line":127},[124,145,146],{},"# mon_app\u002Feinvoice.py\n",[124,148,149],{"class":126,"line":133},[124,150,151],{},"import frappe\n",[124,153,155],{"class":126,"line":154},3,[124,156,158],{"emptyLinePlaceholder":157},true,"\n",[124,160,162],{"class":126,"line":161},4,[124,163,158],{"emptyLinePlaceholder":157},[124,165,167],{"class":126,"line":166},5,[124,168,169],{},"def adresse_vendeur(sales_invoice):\n",[124,171,173],{"class":126,"line":172},6,[124,174,175],{},"    # Exemple fictif : le centre de coût de la facture porte le code de routage\n",[124,177,179],{"class":126,"line":178},7,[124,180,181],{},"    # dans un champ personnalisé « custom_code_routage ».\n",[124,183,185],{"class":126,"line":184},8,[124,186,187],{},"    if not sales_invoice.cost_center:\n",[124,189,191],{"class":126,"line":190},9,[124,192,193],{},"        return None\n",[124,195,197],{"class":126,"line":196},10,[124,198,199],{},"    return frappe.db.get_value(\"Cost Center\", sales_invoice.cost_center, \"custom_code_routage\")\n",[14,201,202,203,206,207,209],{},"Une facture du centre de coût « Agence Lyon » (code de routage ",[48,204,205],{},"123456789_LYON",") part alors de l'adresse ",[48,208,205],{},". Les autres factures partent de l'adresse de la société.",[88,211,213],{"id":212},"compléter-les-factures-reçues","Compléter les factures reçues",[14,215,216,217,220,221,223,224,227,228,231],{},"Quand E-transactions crée une ",[99,218,219],{},"Facture fournisseur"," depuis une facture électronique reçue, il appelle chaque fonction du hook ",[48,222,68],{}," avec le document ",[48,225,226],{},"Einvoice"," reçu. Il fusionne les dictionnaires renvoyés, dans l'ordre des applications, et les ajoute aux valeurs d'en-tête. Les valeurs des champs qui existent aussi sur la ",[99,229,230],{},"Facture d'achat"," sont reportées sur celle-ci.",[115,233,235],{"className":117,"code":234,"language":119,"meta":120,"style":120},"# mon_app\u002Fhooks.py\netransactions_incoming_invoice_values = [\"mon_app.einvoice.valeurs_reception\"]\n",[48,236,237,241],{"__ignoreMap":120},[124,238,239],{"class":126,"line":127},[124,240,130],{},[124,242,243],{"class":126,"line":133},[124,244,245],{},"etransactions_incoming_invoice_values = [\"mon_app.einvoice.valeurs_reception\"]\n",[115,247,249],{"className":117,"code":248,"language":119,"meta":120,"style":120},"# mon_app\u002Feinvoice.py\nimport frappe\n\n\ndef valeurs_reception(einvoice):\n    # Exemple fictif : le code de routage de l'acheteur (BT-49) donne le centre de coût.\n    code = einvoice.buyer_electronic_address\n    centre = frappe.db.get_value(\"Cost Center\", {\"custom_code_routage\": code}, \"name\")\n    return {\"cost_center\": centre} if centre else None\n",[48,250,251,255,259,263,267,272,277,282,287],{"__ignoreMap":120},[124,252,253],{"class":126,"line":127},[124,254,146],{},[124,256,257],{"class":126,"line":133},[124,258,151],{},[124,260,261],{"class":126,"line":154},[124,262,158],{"emptyLinePlaceholder":157},[124,264,265],{"class":126,"line":161},[124,266,158],{"emptyLinePlaceholder":157},[124,268,269],{"class":126,"line":166},[124,270,271],{},"def valeurs_reception(einvoice):\n",[124,273,274],{"class":126,"line":172},[124,275,276],{},"    # Exemple fictif : le code de routage de l'acheteur (BT-49) donne le centre de coût.\n",[124,278,279],{"class":126,"line":178},[124,280,281],{},"    code = einvoice.buyer_electronic_address\n",[124,283,284],{"class":126,"line":184},[124,285,286],{},"    centre = frappe.db.get_value(\"Cost Center\", {\"custom_code_routage\": code}, \"name\")\n",[124,288,289],{"class":126,"line":190},[124,290,291],{},"    return {\"cost_center\": centre} if centre else None\n",[88,293,295],{"id":294},"points-dattention","Points d'attention",[297,298,299,303,306],"ul",{},[300,301,302],"li",{},"Une exception dans une fonction n'est pas interceptée : elle arrête la génération ou la création de la facture.",[300,304,305],{},"Gardez les fonctions sans effet de bord. Elles doivent seulement calculer une valeur.",[300,307,308,309,312],{},"Le champ ",[48,310,311],{},"custom_code_routage"," des exemples est un champ personnalisé, à créer par votre application.",[314,315,316],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":120,"searchDepth":127,"depth":133,"links":318},[319,320,321],{"id":90,"depth":133,"text":91},{"id":212,"depth":133,"text":213},{"id":294,"depth":133,"text":295},"Les hooks etransactions_seller_electronic_address et etransactions_incoming_invoice_values adaptent les factures électroniques à l'unité économique qui les émet ou les reçoit.","md",{"reviewed":157,"last_verified":325,"sources":326},"2026-11-04",[327,328,329],"etransactions@v5:etransactions\u002Futils\u002Fhooks.py","etransactions@v5:etransactions\u002Fetransactions\u002Fdoctype\u002Feinvoice\u002Fgenerator.py","etransactions@v5:etransactions\u002Fetransactions\u002Fdoctype\u002Feinvoice\u002Feinvoice.py","\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fhooks-routage-factures-electroniques",{"title":5,"description":322},"1.v5\u002F3.dodock\u002F10.developpeurs\u002Fhooks-routage-factures-electroniques","TdpE7ipjxVXkwxX7ZLZpP_3LyUsVu-be7SSARt-tWHo",{},1793871962828]