Tower: upload laundry_management 19.0.19.0.4 (via marketplace)
This commit is contained in:
686
addons/laundry_management/views/laundry_order_views.xml
Normal file
686
addons/laundry_management/views/laundry_order_views.xml
Normal file
@@ -0,0 +1,686 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<!-- ================================================================
|
||||
POS ORDER — Smart Button to Laundry Order
|
||||
================================================================ -->
|
||||
<record id="view_pos_order_form_laundry_button" model="ir.ui.view">
|
||||
<field name="name">pos.order.form.laundry.button</field>
|
||||
<field name="model">pos.order</field>
|
||||
<field name="inherit_id" ref="point_of_sale.view_pos_pos_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@name='button_box']" position="inside">
|
||||
<button name="action_open_laundry_order"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-tshirt"
|
||||
invisible="not laundry_order_id">
|
||||
<field name="laundry_order_id" widget="statinfo" string="Laundry"/>
|
||||
</button>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ================================================================
|
||||
LAUNDRY ORDER — Form View
|
||||
================================================================ -->
|
||||
<record id="view_laundry_order_form" model="ir.ui.view">
|
||||
<field name="name">laundry.order.form</field>
|
||||
<field name="model">laundry.order</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Laundry Order" create="0">
|
||||
<header>
|
||||
<button name="action_process"
|
||||
string="Start Processing"
|
||||
type="object"
|
||||
class="btn-primary"
|
||||
invisible="state != 'intake'"/>
|
||||
<button name="action_ready"
|
||||
string="Mark Ready"
|
||||
type="object"
|
||||
class="btn-primary"
|
||||
invisible="state != 'processing'"/>
|
||||
<button name="action_deliver"
|
||||
string="Deliver"
|
||||
type="object"
|
||||
class="btn-success"
|
||||
invisible="state != 'ready'"/>
|
||||
<button name="action_cancel"
|
||||
string="Cancel Order"
|
||||
type="object"
|
||||
class="btn-danger"
|
||||
confirm="Cancel this laundry order? This is permanent."
|
||||
invisible="source_type == 'pos' or state in ('delivered', 'cancelled')"/>
|
||||
<button name="action_open_unlock_wizard"
|
||||
string="Unlock for Editing"
|
||||
type="object"
|
||||
class="btn-warning"
|
||||
icon="fa-unlock-alt"
|
||||
invisible="not locked"
|
||||
groups="laundry_management.group_laundry_manager_override"/>
|
||||
<button name="%(action_report_laundry_work_order)d"
|
||||
string="Print Work Order"
|
||||
type="action"
|
||||
class="btn-secondary"/>
|
||||
<field name="state"
|
||||
widget="statusbar"
|
||||
statusbar_visible="intake,processing,ready,delivered"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<!-- Lock ribbon — visible at a glance whether the order
|
||||
is currently editable. Source + manager-unlock
|
||||
metadata are below in the Order Info group. -->
|
||||
<widget name="web_ribbon" title="Locked"
|
||||
bg_color="text-bg-warning"
|
||||
invisible="not locked"/>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="action_open_pos_order"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-shopping-cart"
|
||||
invisible="not pos_order_id">
|
||||
<span class="o_stat_text">POS Order</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="oe_title">
|
||||
<h1><field name="name" readonly="1"/></h1>
|
||||
</div>
|
||||
<group>
|
||||
<group string="Customer">
|
||||
<field name="partner_id" readonly="locked"/>
|
||||
<field name="partner_phone" readonly="1"/>
|
||||
<field name="pos_reference" readonly="1"
|
||||
invisible="not pos_reference"/>
|
||||
</group>
|
||||
<group string="Order Info">
|
||||
<field name="source_type" readonly="1"/>
|
||||
<field name="is_from_pos" invisible="1"/>
|
||||
<field name="locked" invisible="1"/>
|
||||
<field name="tracking_enabled"
|
||||
readonly="locked"
|
||||
help="Phase-4 prep: per-item tracking will be wired in a follow-up."/>
|
||||
<field name="amount_total" readonly="1"/>
|
||||
<field name="amount_paid" readonly="1"/>
|
||||
<field name="amount_due" readonly="1"/>
|
||||
<field name="item_count" readonly="1"/>
|
||||
<field name="company_id" groups="base.group_multi_company" readonly="1"/>
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<field name="pos_order_id" invisible="1"/>
|
||||
</group>
|
||||
</group>
|
||||
<!-- Manager unlock window — info-only block, visible when
|
||||
a manager has granted a temporary edit window. -->
|
||||
<div class="alert alert-info mt-2"
|
||||
role="alert"
|
||||
invisible="not manager_unlocked_until">
|
||||
<strong>Manager unlock active</strong> until
|
||||
<field name="manager_unlocked_until" readonly="1"
|
||||
class="d-inline-block mx-1"/>
|
||||
by
|
||||
<field name="manager_unlocked_by" readonly="1"
|
||||
class="d-inline-block mx-1"
|
||||
options="{'no_open': True}"/>.
|
||||
Reason: <em><field name="manager_unlock_reason" readonly="1"
|
||||
class="d-inline-block"/></em>
|
||||
</div>
|
||||
<group>
|
||||
<group string="Type & Attributes">
|
||||
<!-- Lock-driven readonly. POS-sourced orders
|
||||
stay readonly until a manager unlock window
|
||||
is active. Manual orders editable until
|
||||
final state. -->
|
||||
<field name="order_type_id" readonly="locked"/>
|
||||
<field name="attribute_ids" widget="many2many_tags"
|
||||
options="{'color_field': 'color'}"
|
||||
readonly="locked"/>
|
||||
<field name="priority_level" widget="badge"
|
||||
decoration-danger="priority_level == 'urgent'"
|
||||
decoration-muted="priority_level == 'normal'"
|
||||
readonly="locked"/>
|
||||
</group>
|
||||
<group string="Delivery">
|
||||
<field name="is_delivery" readonly="locked"/>
|
||||
<field name="delivery_address"
|
||||
invisible="not is_delivery"
|
||||
required="is_delivery and not locked"
|
||||
readonly="locked"/>
|
||||
<field name="delivery_scheduled_at"
|
||||
invisible="not is_delivery"
|
||||
readonly="locked"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Items" name="lines">
|
||||
<!-- Line list is editable only when the order
|
||||
is unlocked (manual + non-final, OR an
|
||||
active manager unlock window). The model
|
||||
layer enforces the same rule independently. -->
|
||||
<field name="line_ids" readonly="locked">
|
||||
<list editable="bottom">
|
||||
<field name="tracking_code" readonly="1"/>
|
||||
<field name="product_id"
|
||||
readonly="parent.locked"/>
|
||||
<field name="description"
|
||||
readonly="parent.locked"/>
|
||||
<field name="qty"
|
||||
readonly="parent.locked"/>
|
||||
<field name="price_unit"
|
||||
readonly="parent.locked"/>
|
||||
<field name="subtotal" readonly="1"/>
|
||||
<field name="customer_note"/>
|
||||
<field name="state" widget="badge"
|
||||
decoration-info="state == 'received'"
|
||||
decoration-warning="state == 'processing'"
|
||||
decoration-primary="state == 'ready'"
|
||||
decoration-success="state == 'delivered'"/>
|
||||
<button name="action_line_process" type="object"
|
||||
string="Process" icon="fa-cog"
|
||||
invisible="state != 'received'"/>
|
||||
<button name="action_line_ready" type="object"
|
||||
string="Ready" icon="fa-check"
|
||||
invisible="state != 'processing'"/>
|
||||
<button name="action_line_deliver" type="object"
|
||||
string="Deliver" icon="fa-truck"
|
||||
invisible="state != 'ready'"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
<page string="Notes" name="notes">
|
||||
<field name="notes" placeholder="Internal notes..."/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
<chatter/>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ================================================================
|
||||
LAUNDRY ORDER — Main List View (with quick-action buttons)
|
||||
================================================================ -->
|
||||
<record id="view_laundry_order_list" model="ir.ui.view">
|
||||
<field name="name">laundry.order.list</field>
|
||||
<field name="model">laundry.order</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Laundry Orders" create="0" multi_edit="1"
|
||||
decoration-danger="priority_level == 'urgent'"
|
||||
default_order="priority_level desc, is_delivery desc, create_date desc">
|
||||
<field name="name" string="Order No." readonly="1"/>
|
||||
<field name="partner_id" string="Customer" readonly="1"/>
|
||||
<field name="order_type_id" string="Type" optional="show" readonly="1"/>
|
||||
<field name="attribute_ids" widget="many2many_tags"
|
||||
options="{'color_field': 'color'}"
|
||||
optional="show" readonly="1"/>
|
||||
<field name="priority_level" widget="badge" optional="show"
|
||||
decoration-danger="priority_level == 'urgent'"
|
||||
readonly="1"/>
|
||||
<field name="is_delivery" widget="boolean_toggle"
|
||||
optional="show" readonly="1"/>
|
||||
<field name="delivery_scheduled_at" optional="hide" readonly="1"/>
|
||||
<field name="pos_reference" string="POS Ref" optional="hide" readonly="1"/>
|
||||
<field name="item_count" string="Items" readonly="1"/>
|
||||
<field name="amount_total" string="Total" sum="Total" readonly="1"/>
|
||||
<field name="amount_due" string="Due" optional="show" readonly="1"
|
||||
decoration-danger="amount_due > 0"/>
|
||||
<field name="state" widget="badge" readonly="1"
|
||||
decoration-info="state == 'intake'"
|
||||
decoration-warning="state == 'processing'"
|
||||
decoration-primary="state == 'ready'"
|
||||
decoration-success="state == 'delivered'"
|
||||
decoration-muted="state == 'cancelled'"/>
|
||||
<field name="source_type" optional="hide" readonly="1"/>
|
||||
<field name="locked" widget="boolean_toggle" readonly="1"
|
||||
optional="hide"/>
|
||||
<field name="create_date" string="Date" optional="show" readonly="1"/>
|
||||
<button name="action_process" string="Process"
|
||||
type="object" icon="fa-cog"
|
||||
invisible="state != 'intake'"/>
|
||||
<button name="action_ready" string="Ready"
|
||||
type="object" icon="fa-check"
|
||||
invisible="state != 'processing'"/>
|
||||
<button name="action_deliver" string="Deliver"
|
||||
type="object" icon="fa-truck"
|
||||
invisible="state != 'ready'"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ================================================================
|
||||
LAUNDRY ORDER — Ready for Pickup List (simplified)
|
||||
================================================================ -->
|
||||
<record id="view_laundry_order_ready_list" model="ir.ui.view">
|
||||
<field name="name">laundry.order.ready.list</field>
|
||||
<field name="model">laundry.order</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Ready for Pickup" create="0">
|
||||
<field name="name" string="Order No."/>
|
||||
<field name="partner_id" string="Customer"/>
|
||||
<field name="partner_phone" string="Phone"/>
|
||||
<field name="item_count" string="Items"/>
|
||||
<field name="amount_total" string="Total"/>
|
||||
<field name="amount_due" string="Due"
|
||||
decoration-danger="amount_due > 0"/>
|
||||
<button name="action_deliver" string="Deliver Now"
|
||||
type="object" icon="fa-truck"
|
||||
class="btn-success"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ================================================================
|
||||
LAUNDRY ORDER — Operational Control Board (Smart Kanban)
|
||||
================================================================ -->
|
||||
<record id="view_laundry_order_kanban" model="ir.ui.view">
|
||||
<field name="name">laundry.order.kanban</field>
|
||||
<field name="model">laundry.order</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban class="o_kanban_mobile laundry-board" create="0"
|
||||
group_create="0" group_delete="0" group_edit="0"
|
||||
default_group_by="state"
|
||||
default_order="priority_level desc, is_delivery desc, create_date asc">
|
||||
<field name="name"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="state"/>
|
||||
<field name="amount_total"/>
|
||||
<field name="amount_due"/>
|
||||
<field name="item_count"/>
|
||||
<field name="currency_id"/>
|
||||
<field name="order_type_id"/>
|
||||
<field name="priority_level"/>
|
||||
<field name="is_delivery"/>
|
||||
<field name="create_date"/>
|
||||
<field name="amount_deferred"/>
|
||||
<progressbar field="state"
|
||||
colors='{"intake": "info", "processing": "warning", "ready": "success", "delivered": "muted"}'/>
|
||||
<templates>
|
||||
<t t-name="card">
|
||||
<div class="laundry-board__card"
|
||||
t-att-data-priority="record.priority_level.raw_value"
|
||||
t-att-data-state="record.state.raw_value"
|
||||
t-att-data-delivery="record.is_delivery.raw_value ? '1' : '0'">
|
||||
<div class="laundry-board__strip"/>
|
||||
<div class="laundry-board__head">
|
||||
<div class="laundry-board__title-row">
|
||||
<strong class="laundry-board__name">
|
||||
<field name="name"/>
|
||||
</strong>
|
||||
<span class="laundry-board__total">
|
||||
<field name="amount_total" widget="monetary"/>
|
||||
</span>
|
||||
</div>
|
||||
<div class="laundry-board__customer">
|
||||
<i class="fa fa-user-o me-1"/>
|
||||
<field name="partner_id"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="laundry-board__badges">
|
||||
<span t-if="record.priority_level.raw_value === 'urgent'"
|
||||
class="laundry-pill laundry-pill--urgent">
|
||||
<i class="fa fa-bolt me-1"/>Urgent
|
||||
</span>
|
||||
<span t-if="record.is_delivery.raw_value"
|
||||
class="laundry-pill laundry-pill--delivery">
|
||||
<i class="fa fa-truck me-1"/>Delivery
|
||||
</span>
|
||||
<span t-if="record.order_type_id.raw_value"
|
||||
class="laundry-pill laundry-pill--type">
|
||||
<i class="fa fa-tag me-1"/>
|
||||
<field name="order_type_id"/>
|
||||
</span>
|
||||
<span t-if="record.amount_deferred.raw_value > 0"
|
||||
class="laundry-pill laundry-pill--deferred"
|
||||
title="Paid later via Customer Account">
|
||||
<i class="fa fa-hourglass-half me-1"/>Deferred
|
||||
</span>
|
||||
</div>
|
||||
<div class="laundry-board__meta">
|
||||
<span class="laundry-board__items">
|
||||
<i class="fa fa-shopping-bag me-1"/>
|
||||
<field name="item_count"/> items
|
||||
</span>
|
||||
<span t-if="record.amount_due.raw_value > 0"
|
||||
class="laundry-board__due">
|
||||
Due: <field name="amount_due" widget="monetary"/>
|
||||
</span>
|
||||
<span class="laundry-board__time">
|
||||
<i class="fa fa-clock-o me-1"/>
|
||||
<field name="create_date" widget="date"/>
|
||||
</span>
|
||||
</div>
|
||||
<div class="laundry-board__actions">
|
||||
<button t-if="record.state.raw_value == 'intake'"
|
||||
name="action_process" type="object"
|
||||
class="btn btn-sm btn-primary w-100">
|
||||
<i class="fa fa-play me-1"/>Start Processing
|
||||
</button>
|
||||
<button t-if="record.state.raw_value == 'processing'"
|
||||
name="action_ready" type="object"
|
||||
class="btn btn-sm btn-primary w-100">
|
||||
<i class="fa fa-check me-1"/>Mark Ready
|
||||
</button>
|
||||
<button t-if="record.state.raw_value == 'ready'"
|
||||
name="action_deliver" type="object"
|
||||
class="btn btn-sm btn-success w-100">
|
||||
<i class="fa fa-truck me-1"/>Deliver
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ================================================================
|
||||
LAUNDRY ORDER — Search View
|
||||
================================================================ -->
|
||||
<record id="view_laundry_order_search" model="ir.ui.view">
|
||||
<field name="name">laundry.order.search</field>
|
||||
<field name="model">laundry.order</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search Laundry Orders">
|
||||
<field name="name" string="Order No."/>
|
||||
<field name="partner_id" string="Customer"/>
|
||||
<field name="pos_reference" string="POS Reference"/>
|
||||
<separator/>
|
||||
<filter string="Intake" name="intake" domain="[('state','=','intake')]"/>
|
||||
<filter string="Processing" name="processing" domain="[('state','=','processing')]"/>
|
||||
<filter string="Ready" name="ready" domain="[('state','=','ready')]"/>
|
||||
<filter string="Delivered" name="delivered" domain="[('state','=','delivered')]"/>
|
||||
<separator/>
|
||||
<filter string="Active" name="active" domain="[('state','!=','delivered')]"/>
|
||||
<filter string="Unpaid" name="unpaid" domain="[('amount_due','>',0)]"/>
|
||||
<filter string="Urgent" name="urgent" domain="[('priority_level','=','urgent')]"/>
|
||||
<filter string="Delivery" name="delivery" domain="[('is_delivery','=',True)]"/>
|
||||
<separator/>
|
||||
<filter string="By Status" name="by_state" context="{'group_by':'state'}"/>
|
||||
<filter string="By Customer" name="by_customer" context="{'group_by':'partner_id'}"/>
|
||||
<filter string="By Order Type" name="by_order_type" context="{'group_by':'order_type_id'}"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ================================================================
|
||||
ACTIONS
|
||||
================================================================ -->
|
||||
<record id="action_laundry_order" model="ir.actions.act_window">
|
||||
<field name="name">Laundry Orders</field>
|
||||
<field name="res_model">laundry.order</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
<field name="context">{'search_default_active': 1}</field>
|
||||
<field name="view_ids" eval="[
|
||||
(5, 0, 0),
|
||||
(0, 0, {'view_mode': 'list', 'view_id': ref('view_laundry_order_list')}),
|
||||
(0, 0, {'view_mode': 'form', 'view_id': ref('view_laundry_order_form')}),
|
||||
]"/>
|
||||
<field name="search_view_id" ref="view_laundry_order_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
No laundry orders yet.
|
||||
</p>
|
||||
<p>Orders are created automatically from POS.</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_laundry_ready_orders" model="ir.actions.act_window">
|
||||
<field name="name">Ready for Pickup</field>
|
||||
<field name="res_model">laundry.order</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
<field name="domain">[('state','=','ready')]</field>
|
||||
<field name="view_ids" eval="[
|
||||
(5, 0, 0),
|
||||
(0, 0, {'view_mode': 'list', 'view_id': ref('view_laundry_order_ready_list')}),
|
||||
(0, 0, {'view_mode': 'form', 'view_id': ref('view_laundry_order_form')}),
|
||||
]"/>
|
||||
<field name="search_view_id" ref="view_laundry_order_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
No orders ready for pickup.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Dashboard: kanban grouped by state -->
|
||||
<record id="action_laundry_dashboard" model="ir.actions.act_window">
|
||||
<field name="name">Operations Dashboard</field>
|
||||
<field name="res_model">laundry.order</field>
|
||||
<field name="view_mode">kanban,list,form</field>
|
||||
<field name="context">{'search_default_active': 1}</field>
|
||||
<field name="view_ids" eval="[
|
||||
(5, 0, 0),
|
||||
(0, 0, {'view_mode': 'kanban', 'view_id': ref('view_laundry_order_kanban')}),
|
||||
(0, 0, {'view_mode': 'list', 'view_id': ref('view_laundry_order_list')}),
|
||||
(0, 0, {'view_mode': 'form', 'view_id': ref('view_laundry_order_form')}),
|
||||
]"/>
|
||||
<field name="search_view_id" ref="view_laundry_order_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
No active orders.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Unpaid orders -->
|
||||
<record id="action_laundry_unpaid_orders" model="ir.actions.act_window">
|
||||
<field name="name">Unpaid Orders</field>
|
||||
<field name="res_model">laundry.order</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
<field name="domain">[('amount_due', '>', 0)]</field>
|
||||
<field name="view_ids" eval="[
|
||||
(5, 0, 0),
|
||||
(0, 0, {'view_mode': 'list', 'view_id': ref('view_laundry_order_list')}),
|
||||
(0, 0, {'view_mode': 'form', 'view_id': ref('view_laundry_order_form')}),
|
||||
]"/>
|
||||
<field name="search_view_id" ref="view_laundry_order_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">All orders are fully paid!</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Unpaid customers -->
|
||||
<record id="action_laundry_unpaid_customers" model="ir.actions.act_window">
|
||||
<field name="name">Unpaid Customers</field>
|
||||
<field name="res_model">laundry.order</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
<field name="domain">[('amount_due', '>', 0)]</field>
|
||||
<field name="context">{'search_default_by_customer': 1}</field>
|
||||
<field name="view_ids" eval="[
|
||||
(5, 0, 0),
|
||||
(0, 0, {'view_mode': 'list', 'view_id': ref('view_laundry_order_list')}),
|
||||
(0, 0, {'view_mode': 'form', 'view_id': ref('view_laundry_order_form')}),
|
||||
]"/>
|
||||
<field name="search_view_id" ref="view_laundry_order_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">No customers with unpaid orders!</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ================================================================
|
||||
LAUNDRY ITEM (line-level) — Tracking views
|
||||
================================================================ -->
|
||||
<record id="view_laundry_order_line_search" model="ir.ui.view">
|
||||
<field name="name">laundry.order.line.search</field>
|
||||
<field name="model">laundry.order.line</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search Items">
|
||||
<field name="tracking_code"/>
|
||||
<field name="order_id"/>
|
||||
<field name="order_partner_id" string="Customer"/>
|
||||
<field name="product_id"/>
|
||||
<separator/>
|
||||
<filter string="Received" name="received" domain="[('state','=','received')]"/>
|
||||
<filter string="Processing" name="processing" domain="[('state','=','processing')]"/>
|
||||
<filter string="Ready" name="ready" domain="[('state','=','ready')]"/>
|
||||
<filter string="Delivered" name="delivered" domain="[('state','=','delivered')]"/>
|
||||
<separator/>
|
||||
<filter string="Active" name="active" domain="[('state','!=','delivered')]"/>
|
||||
<separator/>
|
||||
<filter string="By Status" name="by_state" context="{'group_by':'state'}"/>
|
||||
<filter string="By Customer" name="by_customer" context="{'group_by':'order_partner_id'}"/>
|
||||
<filter string="By Order" name="by_order" context="{'group_by':'order_id'}"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_laundry_order_line_list" model="ir.ui.view">
|
||||
<field name="name">laundry.order.line.list</field>
|
||||
<field name="model">laundry.order.line</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Laundry Items" create="0" edit="0">
|
||||
<field name="tracking_code" readonly="1"/>
|
||||
<field name="order_id" readonly="1"/>
|
||||
<field name="order_partner_id" string="Customer" readonly="1"/>
|
||||
<field name="product_id" readonly="1"/>
|
||||
<field name="qty" readonly="1"/>
|
||||
<field name="state" widget="badge" readonly="1"
|
||||
decoration-info="state == 'received'"
|
||||
decoration-warning="state == 'processing'"
|
||||
decoration-primary="state == 'ready'"
|
||||
decoration-success="state == 'delivered'"/>
|
||||
<button name="action_line_process" string="Process"
|
||||
type="object" icon="fa-cog"
|
||||
invisible="state != 'received'"/>
|
||||
<button name="action_line_ready" string="Ready"
|
||||
type="object" icon="fa-check"
|
||||
invisible="state != 'processing'"/>
|
||||
<button name="action_line_deliver" string="Deliver"
|
||||
type="object" icon="fa-truck"
|
||||
invisible="state != 'ready'"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_laundry_order_line_kanban" model="ir.ui.view">
|
||||
<field name="name">laundry.order.line.kanban</field>
|
||||
<field name="model">laundry.order.line</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban class="laundry-board" default_group_by="state"
|
||||
create="0" group_create="0" group_delete="0" group_edit="0">
|
||||
<field name="tracking_code"/>
|
||||
<field name="product_id"/>
|
||||
<field name="order_id"/>
|
||||
<field name="order_partner_id"/>
|
||||
<field name="qty"/>
|
||||
<field name="state"/>
|
||||
<progressbar field="state"
|
||||
colors='{"received": "info", "processing": "warning", "ready": "success", "delivered": "muted"}'/>
|
||||
<templates>
|
||||
<t t-name="card">
|
||||
<div class="laundry-board__card" t-att-data-state="record.state.raw_value">
|
||||
<div class="laundry-board__strip"/>
|
||||
<div class="laundry-board__head">
|
||||
<div class="laundry-board__title-row">
|
||||
<strong class="laundry-board__name">
|
||||
<field name="tracking_code"/>
|
||||
</strong>
|
||||
<span class="laundry-board__total">
|
||||
x<field name="qty"/>
|
||||
</span>
|
||||
</div>
|
||||
<div class="laundry-board__customer">
|
||||
<i class="fa fa-tag me-1" title="Product"/>
|
||||
<field name="product_id"/>
|
||||
</div>
|
||||
<div class="laundry-board__customer">
|
||||
<i class="fa fa-user-o me-1" title="Customer"/>
|
||||
<field name="order_partner_id"/>
|
||||
 · 
|
||||
<field name="order_id"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="laundry-board__actions">
|
||||
<button t-if="record.state.raw_value == 'received'"
|
||||
name="action_line_process" type="object"
|
||||
class="btn btn-sm btn-primary w-100">
|
||||
<i class="fa fa-play me-1"/>Start Processing
|
||||
</button>
|
||||
<button t-if="record.state.raw_value == 'processing'"
|
||||
name="action_line_ready" type="object"
|
||||
class="btn btn-sm btn-primary w-100">
|
||||
<i class="fa fa-check me-1"/>Mark Ready
|
||||
</button>
|
||||
<button t-if="record.state.raw_value == 'ready'"
|
||||
name="action_line_deliver" type="object"
|
||||
class="btn btn-sm btn-success w-100">
|
||||
<i class="fa fa-truck me-1"/>Deliver
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_laundry_items" model="ir.actions.act_window">
|
||||
<field name="name">Laundry Items</field>
|
||||
<field name="res_model">laundry.order.line</field>
|
||||
<field name="view_mode">kanban,list</field>
|
||||
<field name="context">{'search_default_active': 1}</field>
|
||||
<field name="search_view_id" ref="view_laundry_order_line_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">No items yet.</p>
|
||||
<p>Items appear here once an order is created from POS.</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ================================================================
|
||||
SERVICE CATALOG
|
||||
================================================================ -->
|
||||
<record id="action_laundry_product_catalog" model="ir.actions.act_window">
|
||||
<field name="name">Service Catalog</field>
|
||||
<field name="res_model">product.template</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
<field name="domain">[('is_laundry_service','=',True)]</field>
|
||||
<field name="context">{
|
||||
'default_is_laundry_service': True,
|
||||
'default_type': 'service',
|
||||
'default_sale_ok': True,
|
||||
}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Create your first laundry service product.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ================================================================
|
||||
SERVER ACTIONS — Bulk Operations
|
||||
================================================================ -->
|
||||
<record id="action_bulk_process" model="ir.actions.server">
|
||||
<field name="name">Start Processing</field>
|
||||
<field name="model_id" ref="model_laundry_order"/>
|
||||
<field name="binding_model_id" ref="model_laundry_order"/>
|
||||
<field name="binding_view_types">list</field>
|
||||
<field name="state">code</field>
|
||||
<field name="code">
|
||||
if records:
|
||||
records.filtered(lambda o: o.state == 'intake').action_process()
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_bulk_ready" model="ir.actions.server">
|
||||
<field name="name">Mark Ready</field>
|
||||
<field name="model_id" ref="model_laundry_order"/>
|
||||
<field name="binding_model_id" ref="model_laundry_order"/>
|
||||
<field name="binding_view_types">list</field>
|
||||
<field name="state">code</field>
|
||||
<field name="code">
|
||||
if records:
|
||||
records.filtered(lambda o: o.state == 'processing').action_ready()
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_bulk_deliver" model="ir.actions.server">
|
||||
<field name="name">Deliver</field>
|
||||
<field name="model_id" ref="model_laundry_order"/>
|
||||
<field name="binding_model_id" ref="model_laundry_order"/>
|
||||
<field name="binding_view_types">list</field>
|
||||
<field name="state">code</field>
|
||||
<field name="code">
|
||||
if records:
|
||||
records.filtered(lambda o: o.state == 'ready').action_deliver()
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user