Documentation ERPNext

ERPNext

Personnaliser un format d'impression

Trois familles de formats : le standard du framework, le format glissé dans le générateur, et le HTML écrit en Jinja.

2 min de lectureMis à jour le Source : docs.frappe.io

Trois familles

Les formats d'impression sont les mises en page produites pour imprimer ou envoyer une transaction par e-mail. Ils servent aux ventes, aux achats, aux documents RH, et à bien d'autres pièces. ERPNext en distingue trois : standard, personnalisé et HTML.

Format standard

Chaque type de document imprimable a son format standard, généré par le framework Frappe. Le placement des champs suit leur position dans le document.

Toute modification du format standard passe par Personnaliser le formulaire. Voir aussi Visibilité des champs dans un format d'impression.

Format personnalisé

On crée ses formats avec le générateur, en glissant les champs. ERPNext fournit des modèles dans trois styles : Moderne, Monochrome et Classique.

Pour créer une variante, ouvrez un modèle existant dans Construction > Vues > Format d'impression.

Les réglages d'impression et de PDF se modifient dans Paramètres > Réglages d'impression. Voir Réglages d'impression.

Format HTML

Un format HTML demande du HTML, du CSS et du Python. Les formats sont fournis côté serveur avec le langage de modèles Jinja. Tous les formulaires ont accès à l'objet doc, qui contient le document en cours de formatage. On accède aussi à des utilitaires courants via le module frappe. Pour de l'aide, la page d'origine renvoie au forum ERPNext.

Pour le style, le framework CSS Bootstrap est fourni, avec l'ensemble de ses classes.

L'exemple de la source :

html
<h3>{{ doc.select_print_heading or "Invoice" }}</h3>
<div class="row">
    <div class="col-md-3 text-right">Customer Name</div>
    <div class="col-md-9">{{ doc.customer_name }}</div>
</div>
<div class="row">
    <div class="col-md-3 text-right">Date</div>
    <div class="col-md-9">{{ doc.get_formatted("invoice_date") }}</div>
</div>
{%- for row in doc.items -%}
{%- endfor -%}
<table class="table table-bordered">
    <tbody>
        <tr>
            <th>Sr</th>
            <th>Item Name</th>
            <th>Description</th>
            <th class="text-right">Qty</th>
            <th class="text-right">Rate</th>
            <th class="text-right">Amount</th>
        </tr>
        <tr>
            <td style="width: 3%;">{{ row.idx }}</td>
            <td style="width: 20%;">
                {{ row.item_name }}
                {% if row.item_code != row.item_name -%}
                <br>Item Code: {{ row.item_code}}
                {%- endif %}
            </td>
            <td style="width: 37%;">
                <div style="border: 0px;">{{ row.description }}</div>
            </td>
            <td style="width: 10%; text-align: right;">
                {{ row.qty }} {{ row.uom or row.stock_uom }}
            </td>
            <td style="width: 15%; text-align: right;">
                {{ row.get_formatted("rate", doc) }}
            </td>
            <td style="width: 15%; text-align: right;">
                {{ row.get_formatted("amount", doc) }}
            </td>
        </tr>
    </tbody>
</table>

Deux notes de la page :

  1. Pour une date ou une devise formatées : doc.get_formatted("fieldname").
  2. Pour une chaîne traduisible : {{ _("This string is translated") }}.

> [!NOTE] > Dans l'exemple officiel, la boucle {% for row in doc.items %} est fermée avant le tableau qui utilise row. La page publie le fragment tel quel.