Récupération des liens dans jinja

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 ?)

Merci d’avance

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:
image

Il faut peut-être mieux passer par une modification du doctype facture pour rajouter un lien avec un script ?

Bonjour @oryxr,

Je vois deux solutions alternatives pour éviter de faire trop de requêtes via le format d’impression:

  1. 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

  2. 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(" - ") }}

Bonne journée

super, merci.
J’intègre mes modifs

Je n’arrive pas a récupérer le devis, voici le champ que j’ai rajouté:

Bonjour @oryxr,

Désolé je n’avais pas vérifié, mais prevdoc_docname est configuré pour ne pas pouvoir être copié lors d’une copie du document:

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é.

Bonne soirée !