Custom Code:
report_saleorder_document
https://mijn.bringonline.nl/odoo/action-7/671/action-31?debug=1

Code
20-12-2025 13:54
<t t-name="web.external_layout_bold">
<!-- HARD OVERRIDE: bullets compact maken (ook als Odoo editor <p> in <li> zet) -->
<style type="text/css">
<![CDATA[
/* Basis: minder witruimte rondom lijsten */
ul, ol {
margin-top: 0 !important;
margin-bottom: 0.35rem !important;
padding-top: 0 !important;
padding-bottom: 0 !important;
}
/* Bullets zelf */
li {
margin: 0 !important;
padding: 0 !important;
line-height: 1.15 !important;
}
/* Dit is meestal de oorzaak: editor stopt <p> in <li> met default marges */
li > p,
li > div,
li > span {
margin: 0 !important;
padding: 0 !important;
line-height: inherit !important;
}
/* Voorkom “alinea-gevoel” binnen een bullet */
li > p {
display: inline !important;
}
/* Als er meerdere p’s in één bullet staan */
li > p + p {
display: inline !important;
margin-left: 0.35em !important;
}
/* Als er wrappers in de li zitten die spacing forceren */
li * {
line-height: inherit !important;
}
]]>
</style>
<!-- Bedrijf bepalen (werkt in offerte + layout wizard preview) -->
<t t-set="bo_company"
t-value="company.company_id if company._name == 'base.document.layout' else ((o and o.company_id) or company)"/>
<t t-set="bo_partner" t-value="bo_company and bo_company.partner_id"/>
<!-- (Optioneel) hardcoded background via attachment -->
<t t-set="BO_BG_ATTACHMENT_ID" t-value="7374"/>
<t t-set="layout_background_url"
t-value="'/web/content/ir.attachment/%s/datas' % BO_BG_ATTACHMENT_ID"/>
<!-- Background layer (achter alles) -->
<div t-if="layout_background_url"
t-att-style="'position:fixed;top:0;left:0;right:0;bottom:0;'
'background-image:url(%s);'
'background-repeat:no-repeat;'
'background-position:center center;'
'background-size:cover;'
'z-index:-1;'
'pointer-events:none;'
'-webkit-print-color-adjust:exact;'
'print-color-adjust:exact;' % layout_background_url">
</div>
<!-- Header -->
<div t-attf-class="header o_company_#{company.id}_layout"
t-att-style="report_header_style"
style="position:relative; z-index:1; background: transparent !important;">
<div class="row">
<div class="col-6">
<img t-if="bo_company.logo"
class="o_company_logo_big"
t-att-src="image_data_uri(bo_company.logo)"
alt="Logo"/>
</div>
</div>
</div>
<!-- Body -->
<div t-attf-class="article o_report_layout_bold o_table_bold o_company_#{company.id}_layout o_snail_mail"
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')"
style="position:relative; z-index:1; background: transparent !important;">
<!-- Rij met rechts BO-NAW -->
<div class="row" style="margin-top:-40px; margin-bottom:2rem;">
<div class="col-4 offset-8" style="padding-top:0;">
<div name="bo_company_address" class="address" style="text-align:right;">
<ul class="list-unstyled mb-0">
<li t-if="bo_partner">
<span t-field="bo_company.partner_id"
t-options="{'widget': 'contact', 'fields': ['name', 'address'], 'no_marker': True}"/>
</li>
<li t-if="bo_company and bo_company.email">
<span t-out="bo_company.email"/>
</li>
<li t-if="bo_company and bo_company.phone">
<span t-out="bo_company.phone"/>
</li>
<li t-if="bo_partner and bo_partner.company_registry">
Kvk: <span t-out="bo_partner.company_registry"/>
</li>
<t t-set="bank_acc" t-value="bo_partner.bank_ids.filtered('acc_number')[:1] if bo_partner else False"/>
<li t-if="bank_acc">
Bank: <span t-out="bank_acc.acc_number"/>
</li>
<li t-if="bo_partner and bo_partner.vat">
Btw: <span t-out="bo_partner.vat"/>
</li>
</ul>
</div>
</div>
</div>
<!-- Titel -->
<h2 t-out="layout_document_title"/>
<!-- Inhoud -->
<t t-out="0"/>
</div>
<!-- Footer -->
<div t-attf-class="footer o_company_#{company.id}_layout {{report_type != 'pdf' and 'mt-auto'}}"
style="min-height:0; height:auto; padding-top:10mm; padding-bottom:2mm; position:relative; z-index:1; background: transparent !important;">
<div class="o_footer_content border-top"
t-attf-class="{{'d-flex' if is_html_empty(company.report_header) else 'row' }} o_footer_content border-top"
style="padding-top:1mm; padding-bottom:1mm;">
<div t-attf-class="{{'flex-grow-1' if is_html_empty(company.report_header) else 'col-8'}} {{'me-2' if is_html_empty(company.report_header) and report_type == 'pdf' else ''}}">
<span t-field="company.report_footer"/>
</div>
<div t-attf-class="{{'' if is_html_empty(company.report_header) else 'col-4'}} text-end">
<strong t-if="not is_html_empty(company.report_header)"
t-field="company.report_header"
class="o_company_tagline">Company tagline</strong>
<span t-if="report_type == 'pdf' and display_name_in_footer"
class="text-muted"
t-out="str(o.name) + ', '">(document name)</span>
<span t-if="report_type == 'pdf'"
t-attf-class="text-muted {{'text-nowrap' if is_html_empty(company.report_header) else ''}}">
Page <span class="page"/> / <span class="topage"/>
</span>
</div>
</div>
</div>
</t>
web.external_layout_bold
https://mijn.bringonline.nl/odoo/settings/ir.ui.view/207

Code
20-12-2025 13:54
<t t-name="sale.report_saleorder_document">
<t t-call="web.external_layout">
<!-- Basis context -->
<t t-set="doc" t-value="doc.with_context(lang=doc.partner_id.lang)"/>
<t t-set="forced_vat" t-value="doc.fiscal_position_id.foreign_vat"/>
<t t-set="company" t-value="doc.company_id"/>
<div class="page">
<div class="oe_structure"/>
<t t-set="is_proforma" t-value="env.context.get('proforma', False) or is_pro_forma"/>
<t t-set="layout_document_title">
<span t-if="is_proforma">Pro-Forma Invoice # </span>
<span t-elif="doc.state in ['draft','sent']">Quotation # </span>
<span t-else="">Order # </span>
<span t-field="doc.name">SO0000</span>
</t>
<div class="row mb-4" id="informations">
<div t-if="doc.client_order_ref" class="col" name="informations_reference">
<strong>Your Reference</strong>
<div t-field="doc.client_order_ref">SO0000</div>
</div>
<div t-if="doc.date_order" class="col" name="informations_date">
<strong t-if="is_proforma">Issued Date</strong>
<strong t-elif="doc.state in ['draft', 'sent']">Quotation Date</strong>
<strong t-else="">Order Date</strong>
<div t-field="doc.date_order" t-options="{'widget': 'date'}">2023-12-31</div>
</div>
<div t-if="doc.validity_date and doc.state in ['draft', 'sent']" class="col" name="expiration_date">
<strong>Expiration</strong>
<div t-field="doc.validity_date">2023-12-31</div>
</div>
<div t-if="doc.commitment_date" class="col" name="delivery_date">
<strong>Delivery Date</strong>
<div t-field="doc.commitment_date" t-options="{'widget': 'date'}">
2023-12-31
</div>
</div>
<div t-if="doc.user_id.name" class="col">
<strong>Salesperson</strong>
<div t-field="doc.user_id">Mitchell Admin</div>
</div>
</div>
<!-- 2. Klant-NAW definities (blijven nodig voor web.address_layout) -->
<t t-set="address">
<div style="margin-top:4px; margin-bottom:1rem;">
<div t-field="doc.partner_id" class="mb-0" t-options="{'widget': 'contact', 'fields': ['address', 'name'], 'no_marker': True}"/>
<p t-if="doc.partner_id.vat" class="mb-0">
<t t-if="doc.company_id.account_fiscal_country_id.vat_label" t-out="doc.company_id.account_fiscal_country_id.vat_label"/>
<t t-else="">Tax ID</t>:
<span t-field="doc.partner_id.vat"/>
</p>
</div>
</t>
<t t-if="doc.partner_shipping_id == doc.partner_invoice_id and doc.partner_invoice_id != doc.partner_id or doc.partner_shipping_id != doc.partner_invoice_id">
<t t-set="information_block">
<strong>
<t t-if="doc.partner_shipping_id == doc.partner_invoice_id">
Invoicing and Shipping Address
</t>
<t t-else="">
Invoicing Address
</t>
</strong>
<div t-field="doc.partner_invoice_id" t-options="{'widget': 'contact', 'fields': ['address', 'name', 'phone'], 'no_marker': True, 'phone_icons': True}"/>
<t t-if="doc.partner_shipping_id != doc.partner_invoice_id">
<strong class="d-block mt-3">Shipping Address</strong>
<div t-field="doc.partner_shipping_id" t-options="{'widget': 'contact', 'fields': ['address', 'name', 'phone'], 'no_marker': True, 'phone_icons': True}"/>
</t>
</t>
</t>
<!-- Titel boven klant-NAW -->
<div style="margin-top:4rem; margin-bottom:1rem;">
<div class="row">
<div class="col-6">
<strong>Ontvanger</strong>
</div>
</div>
<div class="row" id="customer_address">
<div class="col-6">
<t t-raw="address"/>
</div>
</div>
</div>
<!-- Offerte introtekst -->
<t t-if="not is_html_empty(doc.x_quote_introtext)">
<div class="mt-3" name="quote_intro" style="padding: 2rem 0rem 1rem 0rem;">
<t t-raw="doc.x_quote_introtext"/>
</div>
</t>
<!-- Orderregels -->
<t t-set="lines_to_report" t-value="doc._get_order_lines_to_report()"/>
<t t-set="display_discount" t-value="any(l.discount for l in lines_to_report)"/>
<t t-set="hide_taxes_details" t-value="True"/>
<t t-set="display_taxes" t-value="False"/>
<div class="oe_structure"/>
<t t-if="display_discount">
<t t-set="qtyWidth" t-value="7"/>
<t t-set="descWidth" t-value="61"/>
<t t-set="unitWidth" t-value="12"/>
<t t-set="discWidth" t-value="8"/>
<t t-set="totalWidth" t-value="12"/>
</t>
<t t-else="">
<t t-set="qtyWidth" t-value="7"/>
<t t-set="descWidth" t-value="61"/>
<t t-set="unitWidth" t-value="16"/>
<t t-set="discWidth" t-value="0"/>
<t t-set="totalWidth" t-value="16"/>
</t>
<!-- PRODUCTTABEL MET STEVIGE BORDERS -->
<table style="width:100%; border-collapse:collapse; background-color:#f1f5fe;">
<thead>
<tr style="background-color:#d6e4ff; font-weight:bold; color:#08349b;">
<th t-att-style="'width:%s%%; text-align:left; text-transform:none; border:0.8pt solid #f1f5fe; padding:6px 8px;' % qtyWidth">
Aantal
</th>
<th t-att-style="'width:%s%%; text-align:left; text-transform:none; border:0.8pt solid #f1f5fe; padding:6px 8px;' % descWidth">
Omschrijving
</th>
<th t-att-style="'width:%s%%; text-align:right; text-transform:none; border:0.8pt solid #f1f5fe; padding:6px 8px;' % unitWidth">
Prijs
</th>
<th t-if="display_discount" t-att-style="'width:%s%%; text-align:right; text-transform:none; border:0.8pt solid #f1f5fe; padding:6px 8px;' % discWidth">
Korting
</th>
<th t-att-style="'width:%s%%; text-align:right; text-transform:none; border:0.8pt solid #f1f5fe; padding:6px 8px;' % totalWidth">
Totaal
</th>
</tr>
</thead>
<tbody>
<t t-foreach="lines_to_report" t-as="line">
<tr t-if="line.display_type in ('line_section', 'line_subsection')" style="background-color:#ffffff; font-weight:bold;">
<td colspan="5" style="text-align:left; border:0.8pt solid #f1f5fe; padding:6px 8px;">
<span t-field="line.name"/>
</td>
</tr>
<tr t-elif="line.display_type == 'line_note'" style="background-color:#ffffff; font-style:italic;">
<td colspan="5" style="text-align:left; border:0.8pt solid #f1f5fe; padding:6px 8px;">
<span t-field="line.name"/>
</td>
</tr>
<tr t-else="" style="background-color:#ffffff;">
<td style="text-align:left; border:0.8pt solid #f1f5fe; padding:6px 8px;">
<t t-set="qty" t-value="line.product_uom_qty"/>
<t t-if="float(qty).is_integer()">
<t t-out="int(qty)"/> x
</t>
<t t-else="">
<t t-out="('%.2f' % qty).replace('.', ',')"/> x
</t>
</td>
<td style="text-align:left; border:0.8pt solid #f1f5fe; padding:6px 8px;">
<t t-set="full_name" t-value="line.name or ''"/>
<t t-set="parts" t-value="full_name.split('\n', 1)"/>
<t t-set="title" t-value="parts[0] if parts else ''"/>
<t t-set="desc" t-value="parts[1] if len(parts) > 1 else ''"/>
<strong>
<t t-out="title"/>
</strong>
<t t-if="desc">
<br/>
<em>
<t t-set="desc_lines" t-value="desc.split('\n')"/>
<t t-foreach="desc_lines" t-as="l">
<t t-if="l">
<t t-out="l"/>
<br/>
</t>
</t>
</em>
</t>
</td>
<td style="text-align:right; border:0.8pt solid #f1f5fe; padding:6px 8px;">
<t t-set="symbol" t-value="doc.currency_id.symbol or ''"/>
<t t-set="unit" t-value="line.price_unit"/>
<t t-out="symbol"/> <t t-out="('%.2f' % unit).replace('.', ',')"/>
</td>
<td t-if="display_discount" style="text-align:right; border:0.8pt solid #f1f5fe; padding:6px 8px;">
<t t-if="line.discount">
<t t-out="int(line.discount) if float(line.discount).is_integer() else line.discount"/>
<span>%</span>
</t>
</td>
<td style="text-align:right; border:0.8pt solid #f1f5fe; padding:6px 8px;">
<t t-set="symbol" t-value="doc.currency_id.symbol or ''"/>
<t t-set="total" t-value="line.price_subtotal"/>
<t t-out="symbol"/> <t t-out="('%.2f' % total).replace('.', ',')"/>
</td>
</tr>
</t>
</tbody>
</table>
<!-- Totaalblok -->
<div class="clearfix" name="so_total_summary" style="margin-top:20px;">
<div id="total" class="row mt-4" name="total">
<div t-attf-class="#{'col-6' if report_type != 'html' else 'col-sm-7 col-md-6'} ms-auto">
<table style="width:100%; border-collapse:separate; border-spacing:1px; background-color:#f1f5fe;">
<tr style="background-color:#d6e4ff; font-weight:bold; color:#08349b;">
<td style="text-align:right; padding:6px 8px;">
Subtotaal (excl. btw)
</td>
<td style="text-align:right; padding:6px 8px;">
<t t-set="symbol" t-value="doc.currency_id.symbol or ''"/>
<t t-set="subtotal" t-value="doc.amount_untaxed"/>
<t t-out="symbol"/> <t t-out="('%.2f' % subtotal).replace('.', ',')"/>
</td>
</tr>
<t t-if="doc.amount_tax">
<tr style="background-color:#d6e4ff; font-weight:bold; color:#08349b;">
<td style="text-align:right; padding:6px 8px;">
BTW
</td>
<td style="text-align:right; padding:6px 8px;">
<t t-set="symbol" t-value="doc.currency_id.symbol or ''"/>
<t t-set="btw" t-value="doc.amount_tax"/>
<t t-out="symbol"/> <t t-out="('%.2f' % btw).replace('.', ',')"/>
</td>
</tr>
</t>
<tr style="background-color:#08349b; color:#ffffff; font-weight:bold;">
<td style="text-align:right; padding:6px 8px;">
Totaal (incl. btw)
</td>
<td style="text-align:right; padding:6px 8px;">
<t t-set="symbol" t-value="doc.currency_id.symbol or ''"/>
<t t-set="total" t-value="doc.amount_total"/>
<t t-out="symbol"/> <t t-out="('%.2f' % total).replace('.', ',')"/>
</td>
</tr>
</table>
</div>
</div>
</div>
<!-- Offerte outrootekst -->
<t t-if="not is_html_empty(doc.x_quote_outrotext)">
<div name="quote_outro" style="padding: 2rem 0rem 10rem 0rem;">
<t t-raw="doc.x_quote_outrotext"/>
</div>
</t>
<div class="oe_structure"/>
<div t-if="not doc.signature" class="oe_structure"/>
<div t-else="" class="mt-4 ml64 mr4" name="signature">
<div class="offset-8">
<strong>Signature</strong>
</div>
<div class="offset-8">
<img t-att-src="image_data_uri(doc.signature)" style="max-height: 4cm; max-width: 8cm;"/>
</div>
<div class="offset-8 text-center">
<span t-field="doc.signed_by">Oscar Morgan</span>
</div>
</div>
<div>
<!-- marge boven algemene voorwaarden / order_note -->
<span t-field="doc.note" t-attf-style="margin-top:8px; display:block; #{'text-align:justify;text-justify:inter-word;' if doc.company_id.terms_type != 'html' else ''}" name="order_note"/>
<p t-if="not is_html_empty(doc.payment_term_id.note)">
<span t-field="doc.payment_term_id.note">The payment should also be transmitted with love</span>
</p>
<div class="oe_structure"/>
<p t-if="doc.fiscal_position_id and not is_html_empty(doc.fiscal_position_id.sudo().note)" id="fiscal_position_remark">
<strong>Fiscal Position Remark:</strong>
<span t-field="doc.fiscal_position_id.sudo().note">No further requirements for this payment</span>
</p>
</div>
<div class="oe_structure"/>
<t t-set="base_address" t-value="doc.env['ir.config_parameter'].sudo().get_param('web.base.url')"/>
<t t-set="portal_url" t-value="base_address + '/my/orders/' + str(doc.id) + '#portal_connect_software_modal_btn'"/>
<div t-if="any(u._is_portal() for u in doc.partner_id.user_ids) and doc._get_edi_builders()" class="text-center">
<a t-att-href="portal_url">Connect your software</a> with <t t-out="doc.company_id.name"/> to create quotes automatically.
</div>
</div>
</t>
</t>