Application chantier - gérer le format d'impression

Bonjour, nous commençons a utiliser l’application chantier et je voulais savoir comment intégrer les macros présent dans les print/items.html dans le format d’impression sans avoir à les recopier intégralement?

Merci d’avance

Bonjour @oryxr,

Normalement il n’y a rien de particulier à faire: il faut simplement ajouter le tableau d’articles dans son format d’impression et c’est l’affichage de l’application chantier qui prend le dessus sur l’affichage classique de Dokos.
Cela n’est valable que pour les devis, commandes clients et facture de vente.

Peux-tu donner plus de détails sur tes formats d’impression s’il te plaît ?

ha ok, pour le moment je suis en jinja, j’avais déjà intégré des titres et sous totaux avec un champ personnalisé, je voudrai basculer sur ce que vous avez fait pour être plus standard. Après, est-ce possible de faire le même rendu sans être en jinja ?
Ci-dessous mon format :


<!Doctype HTML>
<div id="header-html" class="print-heading">
    <div class="row print-heading">
            {% if not no_letterhead and footer %}
                {{ letter_head }}
            {% endif %}
    </div>
</div>
<div id="main-html">
    {% set account_manager = frappe.db.get_value("Customer", doc.party_name, "account_manager") %} 
    {% set user = frappe.get_doc("User", account_manager) %} 
    <div class="row">
        <div class="col-xs-12">
            <b>{{ _("Contact") }}: </b> {{ user.first_name or ''}} {{ user.last_name or '' }}<br>
            <b>{{ _("Email") }}: </b> {{ user.email or ''}}<br> <b>{{ _("Phone") }}: </b> {{ user.mobile_no or ''}}
        </div>
    </div>
    <div class="row" style="margin:40px;">
<!-- debut status -->
        <div class="col-xs-6">
            <div class="row"> 
                {%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}
                    <div class="col-xs-12 text-center" document-status="draft">
                        <h4>{{ _("DRAFT") }}</h4>
                    </div>
                {%- endif -%}
                {%- if doc.meta.is_submittable and doc.docstatus==2-%} 
                    <div class="col-xs-12 text-center" document-status="cancelled">
                        <h4>{{ _("CANCELLED") }}</h4>
                    </div> 
                {%- endif -%}
            </div>
        </div>
<!-- fin status -->
<!-- debut coordonne client -->
        <div class="col-xs-6">
            <div class="row"> 
                {% set salutation = frappe.db.get_value("Customer", doc.customer, "salutation") %}
                <div class="col-xs-12 text-left" style="font-size:1.2em">
                    <strong>{{ salutation or '' }} {{ doc.customer_name }}</strong>
                </div>
            </div> 
            {% if doc.customer_address %}
                {% set client_address = frappe.get_doc("Address", doc.customer_address) %}
                <div class="row">
                    <div class="col-xs-12 text-left"> 
                        {{ doc.contact_email }}<br>
                        {{ client_address.address_line1 }}<br>
                        {% if client_address.address_line2 %}{{ client_address.address_line2 }}<br>{% endif %}
                        {{ client_address.pincode }} {{ client_address.city }}<br> 
                        {{ client_address.country }}
                    </div>
                </div>
            {% endif %}
        </div>
    </div>
<!-- fin coordonne client -->
<!-- debut titre devis + date prealable -->
<div class="row">
        <div class="col-xs-12">
            <b>Objet du devis: </b> {{ doc.title or ''}} - {{ doc.note_devis or '' }}<br>
            <b>Date de visite préalable: </b> {{ doc.get_formatted("pl_date_visite_prealable") or ''}}
        </div>
    </div>
<!-- fin titre devis + date prealable -->
<!-- debut details items -->
    <div class="row">
        <div id="texte_presentation" class="col-xs-12">
            <p>{{ doc.get_formatted("presentation_devis") }}</p>
        </div>
    </div>
    {%- if doc.page_garde -%} <div class="page-break"></div> {%- endif -%}
    <div class="row">
        <div class="col-xs-12">
            <table id="list_articles" class="table table-condensed table-bordered">
                <thead>
                    <tr>
                        <th style="width: 60%;">{{ _("Description") }}</th>
                        <th style="width: 15%;" class="text-right">{{ _("Rate") }}</th>
                        <th  style="width: 10%;">{{ _("Quantity") }}</th>
                        <th  style="width: 15%;" class="text-right">{{ _("Amount") }} HT</th>
                    </tr>
                </thead>
                <tbody>
                {% set ns = namespace(prev=0) %}
                {% set ns.sumTitre=0 %}
                {% set ns.sumSSTitre=0 %}
                {% set ns.lastSSTitre="" %}
                {% set ns.lastTitre="" %}
                {%- for row in doc.items -%}
                    {%- if row.page_break and row.pl_type_article != "Titre" and row.pl_type_article != "Sous-titre"-%} 
                </tbody>
            </table>
        </div>
    </div>
    <div class="page-break"></div>
    <div class="row">
        <div class="col-xs-12">
            <table id="list_articles" class="table table-condensed table-bordered">
                <thead>
                    <tr>
                        <th style="width: 60%;">{{ _("Description") }}</th>
                        <th style="width: 15%;" class="text-right">{{ _("Rate") }}</th>
                        <th  style="width: 10%;">{{ _("Quantity") }}</th>
                        <th  style="width: 15%;" class="text-right">{{ _("Amount") }} HT</th>
                    </tr>
                </thead>
                <tbody> 
                    {%- endif -%}
                    {% if row.pl_type_article == "Texte" %}
                        <tr class="keep-together">
                            <td id="texteArticle" colspan="4">
                                <div style="padding-left:20px">{{ row.description }}</div>
                            </td>
                        </tr>
                    {% elif row.pl_type_article == "Titre" %}
                        {% if ns.lastTitre == "" %}
                            <tr class="keep-together">
                                <td id="titreTotal" colspan="4">
                                    {% set ns.lastTitre=row.item_name %}
                                    <h1>{{ row.item_name or '' }}</h1>
                                </td>
                            </tr>
                        {% else %}
                            {% if ns.lastSSTitre != "" %}
                                <tr class="keep-together">
                                    <td id="titreSSTotal" colspan="4">
                                        <h1> Sous-total {{ ns.lastSSTitre }} = {{ frappe.utils.fmt_money(ns.sumSSTitre, currency=doc.currency) }}</h1>
                                    </td>
                                </tr>
                            {% endif %}
                                <tr class="keep-together">
                                    <td id="titreTotal" colspan="4">
                                        <h1>Total {{ ns.lastTitre }} = {{ frappe.utils.fmt_money(ns.sumTitre, currency=doc.currency) }}</h1>
                                    </td>
                                </tr>
                                {%- if row.page_break -%} 
                            </tbody>
                        </table>
                    </div>
                </div>
                <div class="page-break"></div>
                <div class="row">
                    <div class="col-xs-12">
                        <table id="list_articles" class="table table-condensed table-bordered">
                            <thead>
                                <tr>
                                    <th style="width: 60%;">{{ _("Description") }}</th>
                                    <th style="width: 15%;" class="text-right">{{ _("Rate") }}</th>
                                    <th  style="width: 10%;">{{ _("Quantity") }}</th>
                                    <th  style="width: 15%;" class="text-right">{{ _("Amount") }} HT</th>
                                </tr>
                            </thead>
                            <tbody> 
                                {%- endif -%}
                            <tr class="keep-together">
                                <td id="titreTotal" colspan="4">
                                    {% set ns.sumTitre=0 %}
                                    {% set ns.sumSSTitre=0 %}
                                    {% set ns.lastSSTitre="" %}
                                    {% set ns.lastTitre=row.item_name %}
                                    <h1>{{ row.item_name or '' }}</h1>
                                </td>
                            </tr>
                        {% endif %}
                    {% elif row.pl_type_article == "Sous-titre" %}
                        {% if ns.lastSSTitre == "" %}
                        <tr class="keep-together">
                            <td id="titreSSTotal" colspan="4">
                                {% set ns.lastSSTitre=row.item_name %}
                                <h1>{{ row.item_name or '' }}</h1>
                            </td>
                        </tr>
                        {% else %}
                        <tr class="keep-together">
                            <td id="titreSSTotal" colspan="4">
                                <h1> Sous-total {{ ns.lastSSTitre }} = {{ frappe.utils.fmt_money(ns.sumSSTitre, currency=doc.currency) }}</h1>
                            </td>
                        </tr>
                        {%- if row.page_break -%} 
                            </tbody>
                        </table>
                    </div>
                </div>
                <div class="page-break"></div>
                <div class="row">
                    <div class="col-xs-12">
                        <table id="list_articles" class="table table-condensed table-bordered">
                            <thead>
                                <tr>
                                    <th style="width: 60%;">{{ _("Description") }}</th>
                                    <th style="width: 15%;" class="text-right">{{ _("Rate") }}</th>
                                    <th  style="width: 10%;">{{ _("Quantity") }}</th>
                                    <th  style="width: 15%;" class="text-right">{{ _("Amount") }} HT</th>
                                </tr>
                            </thead>
                            <tbody> 
                        {%- endif -%}
                        <tr class="keep-together">
                            <td id="titreSSTotal" colspan="4">
                                {% set ns.sumSSTitre=0 %}
                                {% set ns.lastSSTitre=row.item_name %}
                                <h1>{{ row.item_name or '' }}</h1>
                            </td>
                        </tr>
                        {% endif %}
                    {% else %}
                        {% if ns.lastTitre != "" %}
                            {% set ns.sumTitre = ns.sumTitre + row.amount %}
                        {% endif %}
                        {% if ns.lastSSTitre != "" %}
                            {% set ns.sumSSTitre = ns.sumSSTitre + row.amount %}
                        {% endif %}
                        <tr class="keep-together">
                            <td id="item_name">
                                <h1>{{ row.item_name or '' }}</h1>
                                <div style="padding-left:20px">{{ row.description }}</div>
                            </td>
                            <td style="text-align: right;">{{ row.get_formatted("rate", doc) or ''}}</td>
                            <td style="text-align: left;">{{ row.get_formatted("qty") }} {{ row.uom }}</td>
                            <td style="text-align: right;">{{ row.get_formatted("amount", doc) or ''}}</td>
                        </tr>
                    {% endif %}
                    {% if loop.last %}
                        {% if ns.lastSSTitre != "" %}
                            <tr class="keep-together">
                                <td id="titreSSTotal" colspan="4">
                                    <h1> Sous-total {{ ns.lastSSTitre }} = {{ frappe.utils.fmt_money(ns.sumSSTitre, currency=doc.currency) }}</h1>
                                </td>
                            </tr>
                        {% endif %}
                        {% if ns.lastTitre != "" %}
                            <tr class="keep-together">
                                <td id="titreTotal" colspan="4">
                                    <h1>Total {{ ns.lastTitre }} = {{ frappe.utils.fmt_money(ns.sumTitre, currency=doc.currency) }}</h1>
                                </td>
                            </tr>
                        {% endif %}
                    {% endif %}
                {%- endfor -%}
                </tbody>
            </table>
        </div>
    </div>
<!-- fin details items -->
<!-- debut sign client + total + acompte -->
    <div class="row" style="margin-top: 0px; page-break-inside:avoid;">
        <div class="col-xs-7 text-left">L'offre est valable jusqu'au <ins>{{doc.get_formatted("valid_till")}}</ins></div>
        <div class="col-xs-5">
            <div class="row" style="border: 1px solid #d1d8dd; margin-right: auto;">
                <div class="col-xs-12">
                    <div class="row" style="margin-top:10px; margin-left:5px;">
                        <div class="col-xs-6 text-left"><label>{{ _("Total") }} HT</label></div>
                        <div class="col-xs-6 text-right">{{ doc.get_formatted("total") or '' }}</div>
                    </div> 
                    {%- if (doc.discount_amount and doc.apply_discount_on == "Net Total") -%} 
                        <div class="row" style="margin-left:5px;"> 
                            {%- if (doc.additional_discount_percentage) -%} <div class="col-xs-6 text-left"><label>{{ _("Discount") }} ({{ doc.get_formatted("additional_discount_percentage") }}%)</label></div> 
                            {%- else -%} <div class="col-xs-6 text-left"><label>{{ _("Discount") }}</label></div>{%- endif -%} 
                            <div class="col-xs-6 text-right">{{ doc.get_formatted("discount_amount") }}</div>
                        </div>
                        <div class="row" style="margin-left:5px;">
                            <div class="col-xs-6 text-left"><label>{{ _("Net Total") }}</label></div>
                            <div class="col-xs-6 text-right">{{ doc.get_formatted("net_total") or '' }}</div>
                        </div>
                    {%- endif -%} 
                    {%- for row in doc.taxes -%} 
                        {%- if row.tax_amount_after_discount_amount -%} 
                            <div class="row" style="margin-left:5px;">
                                <div class="col-xs-6 text-left"><label>{{ row.description }}</label></div>
                                <div class="col-xs-6 text-right">{{ row.get_formatted("tax_amount_after_discount_amount", doc) }}</div>
                            </div>
                        {%- endif -%}
                    {%- endfor -%} 
                    {%- if doc.taxes or doc.discount_amount -%} 
                        <div class="row" style="margin-left:5px;">
                            <div class="col-xs-6 text-left"><label>{{ _("Grand Total") }}</label></div>
                            <div class="col-xs-6 text-right"><strong>{{ doc.get_formatted("grand_total") }}</strong></div>
                        </div>
                    {% endif %}
                </div>
            </div>
            {% if doc.payment_schedule and doc.acompte %}
            <div class="row" style="margin-right: auto;">
                <div class="col-xs-12">
                    <div class="row" style="margin-top:0px;">
                        <div class="col-xs-6 text-left"><em>Acompte {{ doc.payment_schedule[0].invoice_portion or "" }}%</em></div>
                        <div class="col-xs-6 text-right"><em>{{ frappe.utils.fmt_money(doc.payment_schedule[0].payment_amount or '', currency=doc.currency) }}</em></div>
                    </div>
                </div>
            </div>
            {%- endif -%}
        </div>
    </div>
    <div class="row" style="margin-top: 10px;">
        <div class="col-xs-12 text-left">
            <div class="row">
                <div class="col-xs-12 text-justify"> <b>Le client, par l'acceptation du devis, reconnaît avoir pris connaissance des conditions générales de ventes.</b></div>
            </div>
            <div class="row" style="margin-top: 10px;">
                <div class="col-xs-6">
                    <div class="col-xs-2 text-left">le</div>
                    <div class="col-xs-3 text-right">/</div>
                    <div class="col-xs-3 text-right">/</div>
                </div>
            </div>
            <div class="row text-left"><!--</div> style="margin-top: 10px;"-->
                <div class="col-xs-12 text-left"> Signature du client précédé de la mention manuscrite:<br> "Bon pour Accord et exécution" </div>
            </div>
        </div>
    </div>
<!-- fin sign client + total + acompte -->
<!-- debut conditions generales de vente -->
    {% if doc.terms != '' %}
        <div class="row page-break"></div>
        <div class="row">
            <div class="col-xs-12 text-center">
                <h1 style="font-size: 16px;">Conditions générales de Vente de St Jo Energies</h1>
            </div>
        </div>
        <div id="terms" class="row">
            <div class="col-xs-12 text-justify"> {{ doc.terms }} </div>
        </div>
    {% endif %}
<!-- fin conditions generales de vente -->
</div>
<div id="footer-html">
    <div class="print-footer">
        <div class="text-right small page-number"> {{ _("Page {0} of {1}").format('<span class="page"></span>', '<span class="topage"></span>') }} </div>
        {% if not no_letterhead and footer %} 
            <div> {{ footer }} </div>
        {% endif %}
    </div>
</div>

et css personnalisé :

#titreTotal {
    text-align: center;
    text-transform: uppercase;
    background-color: #ffffff;
    background-color: rgba(246,231,0,0.1);
}

#titreSSTotal {
    text-transform: uppercase;
    background-color: #ffffff;
    background-color: rgba(240,127,0,0.1);
}

Le rendu donne ça:

Et la page de fin

Merci pour ton aide

Il sera possible de s’en approcher en ajoutant des champs HTML à certains endroits si nécessaire.
Par contre seul le style de la table d’articles sera personnalisable avec css, puisque l’idée est qu’on propose un composant « sur étagère ». Donc regarde peut-être d’abord si cela te convient.

Étant donné que tu as une grande maîtrise de ton format d’impression, le mieux est peut-être de t’inspirer des macros existantes pour les adapter à tes besoins.