Skip to main content

Create a Custom QWeb Report in Odoo

Do you need to generate custom reports for your business, but find the standard Odoo reporting functions are not enough? Don’t worry, with a little bit of Python programming you can create custom QWeb reports that will meet your exact needs. In this tutorial, we will show you how to create a report with required elements.

<?xml version="1.0" encoding="utf-8"?>
<odoo>

    <!-- Invoice templates -->
    <template id="custom_invoice_custom_report">
        <t t-call="web.html_container">
            <t t-foreach="docs" t-as="doc">
                <t t-call="my_module.custom_invoice_external_layout">
                    <div class="page" style="font-family: sans-serif; font-size: 15px;">
                        
                        <div t-if="doc.name">
                            Invoice No.: <span t-field="doc.name"/>
                        </div>
                        <div t-if="doc.partner_id.name">
                            Partner: <span t-field="doc.partner_id.name"/>
                        </div>
                        <!-- Invoice lines -->
                        <t t-foreach="doc.invoice_line_ids" t-as="line">
                        </t>

                    </div>

                </t>
            </t>
        </t>
    </template>
    <!-- Layout -->

    <template id="custom_invoice_external_layout_standard">
        <!-- Header -->
        <div t-attf-class="header o_company_#{company.id}_layout">
            <div class="row" style="align-items: center;">
                <img t-if="company.report_header_custom" t-att-src="image_data_uri(company.report_header_custom)" alt="Logo" style="max-height: 269px;"/>
            </div>
        </div>
        <!-- Footer -->
        <div class="footer">
            <div class="text-center">
                Page: <span class="page"/> of <span class="topage"/>
            </div>
        </div>

        <div t-attf-class="article o_company_#{company.id}_layout"
             t-att-data-oe-model="o and o._name" t-att-data-oe-id="o and o.id"
             t-att-data-oe-lang="o and o.env.context.get('lang')">
            <t t-call="web.address_layout"/>
            <t t-raw="0"/>
        </div>


    </template>

    <!-- Public api: layout to t-call from reports -->
    <template id="custom_invoice_external_layout">
        <t t-if="not o" t-set="o" t-value="doc"/>
        <t t-if="not company">
            <!-- Multicompany -->
            <t t-if="company_id">
                <t t-set="company" t-value="company_id"/>
            </t>
            <t t-elif="o and 'company_id' in o">
                <t t-set="company" t-value="o.company_id.sudo()"/>
            </t>
            <t t-else="else">
                <t t-set="company" t-value="res_company"/>
            </t>
        </t>

        <t t-call="my_module.custom_invoice_external_layout_standard">
            <t t-raw="0"/>
        </t>

    </template>

    <!-- Custom Invoice Report Action -->
    <report
            id="custom_invoice_report_action"
            string="Custom Invoice Report"
            print_report_name="(object.number or 'Custom Invoice Report')"
            model="account.invoice"
            report_type="qweb-pdf"
            name="my_module.custom_invoice_custom_report"
            file="my_module.custom_invoice_custom_report"
    />
    <record id="paperformat_invoice_report" model="report.paperformat">
        <field name="name">Custom Invoice Report Paperformat</field>
        <field name="default" eval="True"/>
        <field name="format">A4</field>
        <field name="orientation">Portrait</field>
        <field name="margin_top">35</field>
        <field name="margin_bottom">15</field>
        <field name="margin_left">5</field>
        <field name="margin_right">5</field>
        <field name="header_line" eval="False"/>
        <field name="header_spacing">30</field>
        <field name="dpi">90</field>
    </record>
    <record id="my_module.custom_invoice_report_action" model="ir.actions.report">
        <field name="paperformat_id" ref="my_module.paperformat_invoice_report"/>
    </record>
</odoo>

By continuing to use the site, you agree to the use of cookies.