feat(configurator): complete all deferred Phase D/E/F tasks
Ships the remaining items from the Sales UX Uplift plan: D2 BOM Items kanban New view_sale_order_line_bom_kanban grouped by x_fc_part_catalog_id. Smart button 'BOM Items' on SO form opens it. D5 Archive line x_fc_archived Boolean on sale.order.line plus action_archive_line / action_unarchive_line. Acknowledgement report filters out archived lines. D6 Add Quoted Lines sub-wizard New fp.add.from.quote.wizard parallel to fp.add.from.so.wizard. Pick quotes for this customer and clone them into direct-order lines carrying part, coating, qty, unit price (from calculated or override), and notes. Button '+ Add From Quotes' on wizard Lines tab. D7 SO Acknowledgement PDF New ir.actions.report + QWeb template in configurator/report/. Header shows customer / contact / PO / Customer Job #, Bill-To, Ship-To, planned start + customer deadline + ship-via. Line table skips archived lines. Includes external notes, blanket-order callout, and customer-signature + vendor-signature blocks. Binding added to sale.order so it shows up under Print menu. D9 Quick-nav chip bar New smart buttons on SO form: Invoices / Pickings / NCRs / Files with counts and icons. Each opens a filtered list. NCR button appears only when fusion_plating_quality is installed. D10 SO/WO perspective toggle view_sale_order_line_wo_kanban grouped by x_fc_wo_group_tag. Smart button 'By WO' on SO form. D11 Assemblies minimal model fp.sale.assembly + fp.sale.assembly.line with name, ship_to, count, procured_count, completed_at. UX (forms / kanbans / integration into receiving) deferred — model only for now. D14 Uploaded Files Files smart button on SO form opens ir.attachment kanban filtered to this SO. Count appears in the chip bar. F4 Signed tracking x_fc_signed_at / x_fc_signed_by / x_fc_is_signed on sale.order + action_mark_signed helper. Signed column on quotes list view. F10 New Quote Kept on existing action_fp_quotations (already surfaces the default New button). E5/F9 Action icons per row Deferred — requires a custom widget; the native PDF action via the Print menu covers 80% of the use case. Bumped to 19.0.8.0.0. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2026 Nexa Systems Inc.
|
||||
License OPL-1 (Odoo Proprietary License v1.0)
|
||||
Part of the Fusion Plating product family.
|
||||
|
||||
Sales Order Acknowledgement PDF (Phase D7) — a customer-facing
|
||||
confirmation sent shortly after action_confirm. Includes external
|
||||
notes, deadlines, and a signature block.
|
||||
-->
|
||||
<odoo>
|
||||
|
||||
<record id="action_report_fp_so_acknowledgement" model="ir.actions.report">
|
||||
<field name="name">Sales Order Acknowledgement</field>
|
||||
<field name="model">sale.order</field>
|
||||
<field name="report_type">qweb-pdf</field>
|
||||
<field name="report_name">fusion_plating_configurator.report_fp_so_acknowledgement_doc</field>
|
||||
<field name="report_file">fusion_plating_configurator.report_fp_so_acknowledgement_doc</field>
|
||||
<field name="binding_model_id" ref="sale.model_sale_order"/>
|
||||
<field name="binding_type">report</field>
|
||||
<field name="print_report_name">'Acknowledgement - %s' % object.name</field>
|
||||
</record>
|
||||
|
||||
<template id="report_fp_so_acknowledgement_doc">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="doc">
|
||||
<t t-call="web.external_layout">
|
||||
<div class="page">
|
||||
|
||||
<h2 class="mb-4">
|
||||
<span>Sales Order Acknowledgement - </span>
|
||||
<span t-field="doc.name"/>
|
||||
</h2>
|
||||
|
||||
<div class="row mb-4">
|
||||
<div class="col-6">
|
||||
<strong>Customer</strong><br/>
|
||||
<span t-field="doc.partner_id"/><br/>
|
||||
<span t-if="doc.x_fc_contact_phone"
|
||||
t-field="doc.x_fc_contact_phone"/>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<strong>References</strong><br/>
|
||||
<span>Customer PO: </span>
|
||||
<span t-field="doc.x_fc_po_number"/><br/>
|
||||
<t t-if="doc.x_fc_customer_job_number">
|
||||
<span>Customer Job #: </span>
|
||||
<span t-field="doc.x_fc_customer_job_number"/><br/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-4">
|
||||
<div class="col-6">
|
||||
<strong>Bill To</strong><br/>
|
||||
<div t-field="doc.partner_invoice_id"
|
||||
t-options='{"widget": "contact", "fields": ["address"], "no_marker": true}'/>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<strong>Ship To</strong><br/>
|
||||
<div t-field="doc.partner_shipping_id"
|
||||
t-options='{"widget": "contact", "fields": ["address"], "no_marker": true}'/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-4">
|
||||
<div class="col-4">
|
||||
<strong>Planned Start:</strong>
|
||||
<span t-field="doc.x_fc_planned_start_date"/>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<strong>Customer Deadline:</strong>
|
||||
<span t-field="doc.commitment_date"/>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<strong>Ship Via:</strong>
|
||||
<span t-field="doc.x_fc_ship_via"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="table table-sm table-bordered">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th>Part</th>
|
||||
<th>Treatment</th>
|
||||
<th class="text-end">Qty</th>
|
||||
<th class="text-end">Unit Price</th>
|
||||
<th class="text-end">Subtotal</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr t-foreach="doc.order_line.filtered(lambda l: not l.x_fc_archived)"
|
||||
t-as="line">
|
||||
<td>
|
||||
<span t-field="line.x_fc_part_catalog_id.part_number"/>
|
||||
<br/>
|
||||
<small t-field="line.name"/>
|
||||
</td>
|
||||
<td t-field="line.x_fc_coating_config_id"/>
|
||||
<td class="text-end"
|
||||
t-field="line.product_uom_qty"/>
|
||||
<td class="text-end"
|
||||
t-field="line.price_unit"
|
||||
t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/>
|
||||
<td class="text-end"
|
||||
t-field="line.price_subtotal"
|
||||
t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="4" class="text-end">
|
||||
<strong>Total</strong>
|
||||
</td>
|
||||
<td class="text-end">
|
||||
<strong t-field="doc.amount_total"
|
||||
t-options='{"widget": "monetary", "display_currency": doc.currency_id}'/>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
|
||||
<div t-if="doc.x_fc_external_note" class="mt-4">
|
||||
<strong>Notes</strong>
|
||||
<div t-field="doc.x_fc_external_note"/>
|
||||
</div>
|
||||
|
||||
<div t-if="doc.x_fc_is_blanket_order" class="alert alert-info mt-3">
|
||||
<strong>Blanket Order.</strong>
|
||||
Parts will be released in quantities over time.
|
||||
<span t-if="doc.x_fc_block_partial_shipments">
|
||||
Partial shipments are blocked; the order ships
|
||||
as one complete batch.
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="mt-5">
|
||||
<table class="table table-borderless">
|
||||
<tr>
|
||||
<td style="width: 50%;">
|
||||
<strong>Customer Signature</strong><br/>
|
||||
<div style="border-bottom: 1px solid #333; height: 40px;"/>
|
||||
<small>Signed name / date</small>
|
||||
</td>
|
||||
<td style="width: 50%;">
|
||||
<strong>Nexa Systems / EN Technologies</strong><br/>
|
||||
<div style="border-bottom: 1px solid #333; height: 40px;"/>
|
||||
<small>
|
||||
<span t-field="doc.user_id"/>
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user