Résolveurs de base taxable
Résolveurs de base taxable
Par défaut, Dokos applique le taux d'une ligne de taxe au montant net de chaque article. Le hook erpnext_taxable_base_resolvers permet à une application de fournir une autre base pour un type de charge personnalisé : le prix public, le montant brut, le montant net d'une autre taxe…
Pour les autres hooks (doc_events, scheduler_events…), voir la Référence des hooks.
Quand le résolveur s'applique
Dokos calcule chaque ligne de taxe selon son champ Basé sur (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 :
- s'il existe, son résultat est la base de l'article ;
- sinon, la base est le montant net de l'article.
Le montant de taxe de l'article vaut alors taux / 100 × base. Le type de charge personnalisé doit d'abord exister comme option du champ Basé sur (par exemple ajoutée par votre application avec un Property Setter).
Déclarer le résolveur
Dans le fichier hooks.py de votre application, associez chaque type de charge au chemin d'une fonction :
# mon_app/hooks.py
erpnext_taxable_base_resolvers = {
"Sur prix public": "mon_app.taxes.base_prix_public",
}
La fonction reçoit (calc, item, tax) : calc est le calcul des taxes en cours (calc.doc est le document parent), item la ligne d'article, 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 item, ce doit être sans effet de bord cumulatif.
Reproduire le calcul dans le navigateur
Le formulaire recalcule les taxes dans le navigateur. Pour que l'aperçu corresponde au calcul du serveur, enregistrez la même fonction dans erpnext.taxable_base_resolvers, dans un fichier JavaScript chargé par votre application :
erpnext.taxable_base_resolvers["Sur prix public"] = (calc, item, tax) => {
return (item.prix_public || 0) * item.qty;
};
Sans cette fonction, le navigateur utilise le montant net, et le total affiché peut changer à l'enregistrement.
Exemple
Cet exemple est fictif. Une application ajoute à la ligne d'article un champ personnalisé prix_public et le type de charge « Sur prix public ». La taxe doit porter sur le prix public, pas sur le prix de vente.
# mon_app/taxes.py
def base_prix_public(calc, item, tax):
return (item.get("prix_public") or 0) * item.qty
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 €.
Testez le résolveur sur un site de test avant de l'utiliser sur des factures validées : il change les montants comptabilisés.