[{"data":1,"prerenderedAt":330},["ShallowReactive",2],{"\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fresolveurs-base-taxable":3,"section:\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fresolveurs-base-taxable":329},{"id":4,"title":5,"body":6,"description":316,"extension":317,"meta":318,"navigation":320,"path":325,"seo":326,"stem":327,"__hash__":328},"docs\u002F2.next\u002F3.dodock\u002F10.developpeurs\u002Fresolveurs-base-taxable.md","Résolveurs de base taxable",{"type":7,"value":8,"toc":310},"minimark",[9,13,27,44,49,60,70,80,84,91,126,152,156,163,267,270,274,280,300,303,306],[10,11,5],"h1",{"id":12},"résolveurs-de-base-taxable",[14,15,16,17,21,22,26],"p",{},"Par défaut, Dokos applique le taux d'une ligne de taxe au montant net de chaque article. Le hook ",[18,19,20],"code",{},"erpnext_taxable_base_resolvers"," permet à une application de fournir une autre base pour un ",[23,24,25],"strong",{},"type de charge"," personnalisé : le prix public, le montant brut, le montant net d'une autre taxe…",[14,28,29,30,33,34,37,38,43],{},"Pour les autres hooks (",[18,31,32],{},"doc_events",", ",[18,35,36],{},"scheduler_events","…), voir la ",[39,40,42],"a",{"href":41},"\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fhooks","Référence des hooks",".",[45,46,48],"h2",{"id":47},"quand-le-résolveur-sapplique","Quand le résolveur s'applique",[14,50,51,52,55,56,59],{},"Dokos calcule chaque ligne de taxe selon son champ ",[23,53,54],{},"Basé sur"," (",[18,57,58],{},"charge_type","). Les types standard (montant net, ligne précédente, quantité, montant réel) gardent leur calcul. Pour tout autre type, Dokos cherche un résolveur déclaré pour ce type :",[61,62,63,67],"ul",{},[64,65,66],"li",{},"s'il existe, son résultat est la base de l'article ;",[64,68,69],{},"sinon, la base est le montant net de l'article.",[14,71,72,73,76,77,79],{},"Le montant de taxe de l'article vaut alors ",[18,74,75],{},"taux \u002F 100 × base",". Le type de charge personnalisé doit d'abord exister comme option du champ ",[23,78,54],{}," (par exemple ajoutée par votre application avec un Property Setter).",[45,81,83],{"id":82},"déclarer-le-résolveur","Déclarer le résolveur",[14,85,86,87,90],{},"Dans le fichier ",[18,88,89],{},"hooks.py"," de votre application, associez chaque type de charge au chemin d'une fonction :",[92,93,98],"pre",{"className":94,"code":95,"language":96,"meta":97,"style":97},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# mon_app\u002Fhooks.py\nerpnext_taxable_base_resolvers = {\n    \"Sur prix public\": \"mon_app.taxes.base_prix_public\",\n}\n","python","",[18,99,100,108,114,120],{"__ignoreMap":97},[101,102,105],"span",{"class":103,"line":104},"line",1,[101,106,107],{},"# mon_app\u002Fhooks.py\n",[101,109,111],{"class":103,"line":110},2,[101,112,113],{},"erpnext_taxable_base_resolvers = {\n",[101,115,117],{"class":103,"line":116},3,[101,118,119],{},"    \"Sur prix public\": \"mon_app.taxes.base_prix_public\",\n",[101,121,123],{"class":103,"line":122},4,[101,124,125],{},"}\n",[14,127,128,129,132,133,136,137,140,141,144,145,148,149,151],{},"La fonction reçoit ",[18,130,131],{},"(calc, item, tax)"," : ",[18,134,135],{},"calc"," est le calcul des taxes en cours (",[18,138,139],{},"calc.doc"," est le document parent), ",[18,142,143],{},"item"," la ligne d'article, ",[18,146,147],{},"tax"," la ligne de taxe. Elle renvoie la base de l'article. Dokos peut l'appeler plusieurs fois pour un même article : si elle écrit des attributs temporaires sur ",[18,150,143],{},", ce doit être sans effet de bord cumulatif.",[45,153,155],{"id":154},"reproduire-le-calcul-dans-le-navigateur","Reproduire le calcul dans le navigateur",[14,157,158,159,162],{},"Le formulaire recalcule les taxes dans le navigateur. Pour que l'aperçu corresponde au calcul du serveur, enregistrez la même fonction dans ",[18,160,161],{},"erpnext.taxable_base_resolvers",", dans un fichier JavaScript chargé par votre application :",[92,164,168],{"className":165,"code":166,"language":167,"meta":97,"style":97},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","erpnext.taxable_base_resolvers[\"Sur prix public\"] = (calc, item, tax) => {\n    return (item.prix_public || 0) * item.qty;\n};\n","javascript",[18,169,170,223,262],{"__ignoreMap":97},[101,171,172,176,179,182,185,189,191,194,197,199,202,205,208,210,213,216,220],{"class":103,"line":104},[101,173,175],{"class":174},"sTEyZ","erpnext",[101,177,43],{"class":178},"sMK4o",[101,180,181],{"class":174},"taxable_base_resolvers[",[101,183,184],{"class":178},"\"",[101,186,188],{"class":187},"sfazB","Sur prix public",[101,190,184],{"class":178},[101,192,193],{"class":174},"] ",[101,195,196],{"class":178},"=",[101,198,55],{"class":178},[101,200,135],{"class":201},"sHdIc",[101,203,204],{"class":178},",",[101,206,207],{"class":201}," item",[101,209,204],{"class":178},[101,211,212],{"class":201}," tax",[101,214,215],{"class":178},")",[101,217,219],{"class":218},"spNyl"," =>",[101,221,222],{"class":178}," {\n",[101,224,225,229,232,234,236,239,242,246,249,252,254,256,259],{"class":103,"line":110},[101,226,228],{"class":227},"s7zQu","    return",[101,230,55],{"class":231},"swJcz",[101,233,143],{"class":174},[101,235,43],{"class":178},[101,237,238],{"class":174},"prix_public",[101,240,241],{"class":178}," ||",[101,243,245],{"class":244},"sbssI"," 0",[101,247,248],{"class":231},") ",[101,250,251],{"class":178},"*",[101,253,207],{"class":174},[101,255,43],{"class":178},[101,257,258],{"class":174},"qty",[101,260,261],{"class":178},";\n",[101,263,264],{"class":103,"line":116},[101,265,266],{"class":178},"};\n",[14,268,269],{},"Sans cette fonction, le navigateur utilise le montant net, et le total affiché peut changer à l'enregistrement.",[45,271,273],{"id":272},"exemple","Exemple",[14,275,276,277,279],{},"Cet exemple est fictif. Une application ajoute à la ligne d'article un champ personnalisé ",[18,278,238],{}," et le type de charge « Sur prix public ». La taxe doit porter sur le prix public, pas sur le prix de vente.",[92,281,283],{"className":94,"code":282,"language":96,"meta":97,"style":97},"# mon_app\u002Ftaxes.py\ndef base_prix_public(calc, item, tax):\n    return (item.get(\"prix_public\") or 0) * item.qty\n",[18,284,285,290,295],{"__ignoreMap":97},[101,286,287],{"class":103,"line":104},[101,288,289],{},"# mon_app\u002Ftaxes.py\n",[101,291,292],{"class":103,"line":110},[101,293,294],{},"def base_prix_public(calc, item, tax):\n",[101,296,297],{"class":103,"line":116},[101,298,299],{},"    return (item.get(\"prix_public\") or 0) * item.qty\n",[14,301,302],{},"Une facture contient 10 articles vendus 80 €, avec un prix public de 100 €. Une ligne de taxe à 5 % de type « Sur prix public » donne une base de 1 000 € (10 × 100 €) et une taxe de 50 €. Avec le type standard sur le montant net, la base serait de 800 € et la taxe de 40 €.",[14,304,305],{},"Testez le résolveur sur un site de test avant de l'utiliser sur des factures validées : il change les montants comptabilisés.",[307,308,309],"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);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":97,"searchDepth":104,"depth":110,"links":311},[312,313,314,315],{"id":47,"depth":110,"text":48},{"id":82,"depth":110,"text":83},{"id":154,"depth":110,"text":155},{"id":272,"depth":110,"text":273},"Le hook erpnext_taxable_base_resolvers calcule la base d'une taxe pour un type de charge personnalisé, côté serveur et côté navigateur.","md",{"icon":319,"reviewed":320,"last_verified":321,"sources":322},"i-mdi-hook",true,"2026-10-31",[323,324],"erpnext@develop:erpnext\u002Fcontrollers\u002Ftaxes_and_totals.py","erpnext@develop:erpnext\u002Fpublic\u002Fjs\u002Fcontrollers\u002Ftaxes_and_totals.js","\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fresolveurs-base-taxable",{"title":5,"description":316},"2.next\u002F3.dodock\u002F10.developpeurs\u002Fresolveurs-base-taxable","799Mn1tpcegsW_dPWU_9cBgLpC8ObycPoFsk7g_5IhA",{},1793871750495]