Files
Odoo-Modules/fusion_inventory/views/stock_picking_views.xml
gsinghpal e9cf75ee48 changes
2026-03-14 12:04:20 -04:00

138 lines
8.2 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ═══════════════════════════════════════════════════════════
Stock Picking Form: SO/Invoice tracking + Serial Scanner
═══════════════════════════════════════════════════════════ -->
<record id="view_picking_form_inherit_fi" model="ir.ui.view">
<field name="name">stock.picking.form.fusion.inventory</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<!-- ── Smart buttons: Sale Order ── -->
<xpath expr="//div[@name='button_box']" position="inside">
<button name="action_view_sale_order" type="object"
class="oe_stat_button" icon="fa-shopping-cart"
invisible="not x_fi_sale_order_id">
<field name="x_fi_sale_order_id" widget="statinfo"
string="Sale Order"/>
</button>
<button name="action_view_invoices" type="object"
class="oe_stat_button" icon="fa-file-text-o"
invisible="x_fi_invoice_count == 0">
<field name="x_fi_invoice_count" widget="statinfo"
string="Invoices"/>
</button>
<button name="action_view_purchase_order" type="object"
class="oe_stat_button" icon="fa-truck"
invisible="not x_fi_purchase_order_id">
<field name="x_fi_purchase_order_id" widget="statinfo"
string="Purchase Order"/>
</button>
<button name="action_view_bills" type="object"
class="oe_stat_button" icon="fa-credit-card"
invisible="x_fi_bill_count == 0">
<field name="x_fi_bill_count" widget="statinfo"
string="Bills"/>
</button>
</xpath>
<!-- ── Status pills below header: Sale Order ── -->
<xpath expr="//header" position="after">
<div class="d-flex gap-2 px-3 pb-2"
invisible="not x_fi_sale_order_id">
<span class="text-muted">SO Status:</span>
<field name="x_fi_sale_order_state" widget="badge"
decoration-info="x_fi_sale_order_state == 'draft'"
decoration-primary="x_fi_sale_order_state == 'sale'"
decoration-success="x_fi_sale_order_state == 'done'"
decoration-danger="x_fi_sale_order_state == 'cancel'"/>
<span class="text-muted ms-3">Invoice:</span>
<field name="x_fi_invoice_status" widget="badge"
decoration-danger="x_fi_invoice_status == 'no'"
decoration-warning="x_fi_invoice_status == 'invoiced'"
decoration-success="x_fi_invoice_status == 'paid'"/>
</div>
<div class="d-flex gap-2 px-3 pb-2"
invisible="not x_fi_purchase_order_id">
<span class="text-muted">PO Status:</span>
<field name="x_fi_purchase_order_state" widget="badge"
decoration-info="x_fi_purchase_order_state == 'draft'"
decoration-primary="x_fi_purchase_order_state == 'purchase'"
decoration-success="x_fi_purchase_order_state == 'done'"
decoration-danger="x_fi_purchase_order_state == 'cancel'"/>
<span class="text-muted ms-3">Bill:</span>
<field name="x_fi_bill_status" widget="badge"
decoration-danger="x_fi_bill_status == 'no'"
decoration-warning="x_fi_bill_status == 'billed'"
decoration-success="x_fi_bill_status == 'paid'"/>
</div>
</xpath>
<!-- ── Serial Number Scan button ── -->
<xpath expr="//header" position="inside">
<button name="action_scan_serial_numbers" type="object"
string="Scan Serial Numbers"
class="btn-secondary"
invisible="picking_type_code != 'outgoing'"/>
</xpath>
</field>
</record>
<!-- ═══════════════════════════════════════════════════════════
Stock Picking List: Invoice status column + filters
═══════════════════════════════════════════════════════════ -->
<record id="view_picking_list_inherit_fi" model="ir.ui.view">
<field name="name">stock.picking.list.fusion.inventory</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.vpicktree"/>
<field name="arch" type="xml">
<xpath expr="//list" position="inside">
<field name="x_fi_invoice_status" string="Invoice Status"
widget="badge" optional="show"
decoration-danger="x_fi_invoice_status == 'no'"
decoration-warning="x_fi_invoice_status == 'invoiced'"
decoration-success="x_fi_invoice_status == 'paid'"/>
<field name="x_fi_bill_status" string="Bill Status"
widget="badge" optional="show"
decoration-danger="x_fi_bill_status == 'no'"
decoration-warning="x_fi_bill_status == 'billed'"
decoration-success="x_fi_bill_status == 'paid'"/>
</xpath>
</field>
</record>
<!-- ═══════════════════════════════════════════════════════════
Stock Picking Search: Filters for invoice status
═══════════════════════════════════════════════════════════ -->
<record id="view_picking_search_inherit_fi" model="ir.ui.view">
<field name="name">stock.picking.search.fusion.inventory</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_internal_search"/>
<field name="arch" type="xml">
<xpath expr="//search" position="inside">
<separator/>
<filter name="fi_paid_not_delivered" string="Paid - Ready to Deliver"
domain="[('x_fi_invoice_status', '=', 'paid'), ('state', 'not in', ('done', 'cancel'))]"/>
<filter name="fi_invoiced_not_delivered" string="Invoiced - Not Delivered"
domain="[('x_fi_invoice_status', '=', 'invoiced'), ('state', 'not in', ('done', 'cancel'))]"/>
<filter name="fi_not_invoiced" string="Not Invoiced"
domain="[('x_fi_invoice_status', '=', 'no'), ('picking_type_code', '=', 'outgoing')]"/>
<separator/>
<filter name="fi_bill_paid" string="Bill Paid"
domain="[('x_fi_bill_status', '=', 'paid'), ('picking_type_code', '=', 'incoming')]"/>
<filter name="fi_billed_not_paid" string="Billed - Not Paid"
domain="[('x_fi_bill_status', '=', 'billed'), ('picking_type_code', '=', 'incoming')]"/>
<filter name="fi_not_billed" string="Not Billed"
domain="[('x_fi_bill_status', '=', 'no'), ('picking_type_code', '=', 'incoming')]"/>
</xpath>
</field>
</record>
</odoo>