Bonjour,
Je voulais savoir comment récupérer les liens amont et aval d’un document en template jinja et pourquoi pas en script
Par exemple:
Je voudrai afficher le numéro du devis correspondant à la facture émise.
Il y a 2 niveaux de liens à passer: FACT → CDE → DEVIS
Les références sont dans les tables articles. Peut-on appliquer un filtre qui ne garde que les références différentes ? 1 CDE - 1DEVIS par exemple
Peut-on le faire aussi dans l’autre sens (le bouton liens le fait, mais comment le faire dans un rapport ?)
Pour le moment, j’ai ajouté le script dans mon template personnalisé mais ce n’est pas très propre.
{% set cmds = [] %}
{% for it in frappe.get_all("Sales Invoice Item", filters={"parent": doc.name}, fields=["sales_order"]) %}
{% if it.sales_order not in cmds %}
{{ cmds.append(it.sales_order) or ''}}
{%endif%}
{% endfor %}
{% set quotations = [] %}
{% for cmd in cmds %}
{% for it in frappe.get_all("Sales Order Item", filters={"parent": cmd}, fields=["prevdoc_docname"]) %}
{% if it.prevdoc_docname not in quotations %}
{{ quotations.append(it.prevdoc_docname) or ''}}
{%endif%}
{% endfor %}
{% endfor %}
Cette facture est en lien avec {%if quotations|length >1%}les{%else%}le{%endif%} devis n° {{quotations | join(" - ")}}
Voici le rendu:
Il faut peut-être mieux passer par une modification du doctype facture pour rajouter un lien avec un script ?
Je vois deux solutions alternatives pour éviter de faire trop de requêtes via le format d’impression:
Ajoutez un champ prevdoc_docname dans le type de document Sales Invoice Item. Ça récupérera automatiquement le numéro de devis associé à chaque ligne de commande et permettra de se passer des deux requêtes dans le script
Utilisez un script python associé à l’événement avant validation pour récupérer les numéros de devis via vos deux requêtes et les enregistrer dans un champ de type “Petit Texte” pour imprimer directement le contenu de ce champ.
Ca peut être combiné avec l’option 1 pour simplement créer une liste de numéros de devis distincts joints avec un “-”, sans faire de requête
Sinon le script ci-dessus peut être un peu simplifié de la manière suivante:
{% set data = namespace(cmds=[]) %}
{% for it in doc.items %}
{% set data.cmds = data.cmds + [it.sales_order] %}
{% endfor %}
{% set quotations = frappe.get_all("Sales Order Item", filters={"parent": ["in", data.cmds]}, pluck="prevdoc_docname", distinct=True) %}
Cette facture est en lien avec {% if quotations|length > 1 %}les{% else %}le{% endif %} devis n° {{ quotations | join(" - ") }}
Ca l’empêche de pouvoir être ajouté dans le mapping de documents entre commandes et factures.
Il est toujours possible de décocher cette option, mais ça pourrait créer des problèmes lors des duplicata de commandes.
Le mieux est peut-être de s’en tenir au script simplifié.