Files
Odoo-Modules/fusion_repairs/report/inspection_certificate_report.xml
gsinghpal bf4464ba37 fix(fusion_repairs): Bundle 4 review - lock cert editing + drop flex in PDF
H1+H2: Field technicians had perm_create=1 perm_write=1 on inspection
certs (could forge or edit issued certs). Reduced to read-only - the
visit-report wizard already sudos when creating new certs from a tech
visit. Added rule_inspection_cert_readonly for the dispatcher group so
even dispatchers cannot edit already-issued certs; only the manager can
revoke/correct. Sealed audit trail.

H3: Replaced display:flex / gap (which wkhtmltopdf 0.12 renders as a
vertical stack) with inline-block + margin in the certificate PDF.
Footer uses float left/right for the cert-number / inspector signature
line so the layout survives wkhtmltopdf rendering.

Bumped to 19.0.1.4.1.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 00:16:05 -04:00

168 lines
8.0 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_report_inspection_certificate" model="ir.actions.report">
<field name="name">Inspection Certificate</field>
<field name="model">fusion.repair.inspection.certificate</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">fusion_repairs.report_inspection_certificate</field>
<field name="report_file">fusion_repairs.report_inspection_certificate</field>
<field name="print_report_name">'Inspection Certificate - %s' % (object.name)</field>
<field name="binding_model_id" ref="model_fusion_repair_inspection_certificate"/>
<field name="binding_type">report</field>
</record>
<template id="report_inspection_certificate">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="cert">
<t t-call="web.external_layout">
<div class="page">
<style>
.cert-wrap {
font-family: sans-serif;
padding: 20mm 18mm;
text-align: center;
}
.cert-banner {
font-size: 11pt;
letter-spacing: 0.4em;
text-transform: uppercase;
color: #c0a544;
margin-bottom: 8mm;
}
.cert-title {
font-size: 30pt;
font-weight: 700;
margin: 4mm 0;
}
.cert-sub {
font-size: 13pt;
color: #555;
margin: 0 0 12mm 0;
}
.cert-issued-to {
font-size: 11pt;
color: #666;
text-transform: uppercase;
letter-spacing: 0.3em;
margin-bottom: 4mm;
}
.cert-client {
font-size: 20pt;
font-weight: 600;
margin-bottom: 12mm;
}
/* wkhtmltopdf does not implement flex/gap reliably -
use inline-block layout instead. */
.cert-info {
margin: 10mm 0;
text-align: center;
}
.cert-info-item {
display: inline-block;
font-size: 10pt;
text-align: left;
margin: 0 9mm;
vertical-align: top;
}
.cert-info-item .label {
text-transform: uppercase;
color: #888;
letter-spacing: 0.2em;
font-size: 8pt;
margin-bottom: 1mm;
}
.cert-info-item .value {
font-size: 12pt;
font-weight: 600;
}
.cert-footer {
margin-top: 18mm;
width: 100%;
}
.cert-footer-row {
width: 100%;
}
.cert-sig {
display: inline-block;
font-size: 10pt;
color: #666;
border-top: 1px solid #999;
padding-top: 2mm;
width: 70mm;
text-align: center;
float: right;
}
.cert-number {
display: inline-block;
font-size: 9pt;
color: #888;
font-family: ui-monospace, monospace;
float: left;
padding-top: 6mm;
}
</style>
<div class="cert-wrap">
<div class="cert-banner">Certificate of Inspection</div>
<div class="cert-title">Safety Inspected</div>
<div class="cert-sub">
This certifies that the equipment described below has passed
its annual safety inspection in accordance with applicable
local regulations.
</div>
<div class="cert-issued-to">Issued To</div>
<div class="cert-client"><t t-out="cert.partner_id.name"/></div>
<div class="cert-info">
<div class="cert-info-item">
<div class="label">Equipment</div>
<div class="value"><t t-out="cert.product_id.display_name"/></div>
</div>
<t t-if="cert.lot_id">
<div class="cert-info-item">
<div class="label">Serial</div>
<div class="value"><t t-out="cert.lot_id.name"/></div>
</div>
</t>
<div class="cert-info-item">
<div class="label">Jurisdiction</div>
<div class="value">
<t t-out="dict(cert._fields['jurisdiction'].selection).get(cert.jurisdiction)"/>
</div>
</div>
</div>
<div class="cert-info">
<div class="cert-info-item">
<div class="label">Issued</div>
<div class="value">
<t t-out="cert.issued_date" t-options="{'widget': 'date'}"/>
</div>
</div>
<div class="cert-info-item">
<div class="label">Valid Until</div>
<div class="value">
<t t-out="cert.expiry_date" t-options="{'widget': 'date'}"/>
</div>
</div>
</div>
<div class="cert-footer">
<div class="cert-number">
Certificate #<t t-out="cert.name"/>
</div>
<div class="cert-sig">
<t t-out="cert.inspector_user_id.name"/><br/>
Inspector
</div>
</div>
</div>
</div>
</t>
</t>
</t>
</template>
</odoo>