Facturation horaire pour certains articles

Bonjour,

Lorsque la quantité pour un article est exprimée en “heures”, la facturation par défaut pour “une heure et demi” se présente ainsi dans les documents à imprimer :

C’est parfois troublant pour le client, car la confusion avec l’interprétation “1 heure et 50 minutes” est possible, voir naturelle.

J’aurais aimé quelque chose du style 1"30, ou 1h30. A minima, j’aimerais contrôler les nombre de digits après la virgule pour cette colonne (2 par défaut), afin de la rendre non-ambigue. Par exemple : 1.500 Heure(s).

J’ai eu beau chercher un peu partout comment faire, je ne trouver pas de réponse, Il me semble qu’il faut redéfinir un format d’impression pour la table des articles (ou la facture) en jinja2 ? Dans ce cas, comment récupérer le code pour le format de facture par défaut pour ne pas tout refaire ?

Toute aide sera la bienvenue, merci.

Bonnes fêtes de fin d’année.

Richard.

Bonjour @richardg,

Peut-être qu’en mettant l’unité de mesure à droite de la quantité, la lecture sera plus claire ?
Il y a une option pour cela dans les paramètres d’impression: image

Une seconde option pourrait être d’ajouter un champ personnalisé “Durée” dans la table enfant “Article de la facture de vente”. Ca permettrait d’imprimer une valeur en heures et minutes à la place de la quantité facturée:
image

Exemple:

Il faudrait faire un script python pour que le champ dépende de la quantité facturée.

Sinon, il est effectivement possible de faire un format d’impression sur mesure en Jinja. Voici le dossier avec les fichiers contenant le code standard:

Je vous souhaite de très bonnes fêtes !

Bonjour Charles-Henry,

Merci beaucoup pour ces pistes, qui m’ont permis d’avancer.

Au final, j’ai fait ce petit changement dans le code du fichier /frappe/frappe/utils/formatters.py :


elif df.get(“fieldtype”) == “Currency”:
default_currency = frappe.db.get_default(“currency”)
currency = currency or get_field_currency(df, doc) or default_currency
return fmt_money(value, precision=get_field_precision(df, doc), currency=currency)

elif (df.get(“fieldname”) == “qty” or df.get(“fieldname”) == “total_qty”) and (doc.get(“uom”) == “Heure”):
return format_duration(value * 3600)

elif df.get("fieldtype") == "Float":
	precision = get_field_precision(df, doc)
	currency = currency or get_field_currency(df, doc)

J’imagine bien que ce n’est pas la méthode la plus propre, mais il me semble que ca fonctionne sans casser d’autres parties du logiciel… ?

J’ai aussi un peu adapté le jinja pour masquer l’unité si c’est une quantité horaire.

Merci encore et bonne fin d’année.

Richard.