Tower: upload laundry_management 19.0.19.0.4 (via marketplace)
This commit is contained in:
277
addons/laundry_management/views/laundry_dashboard_views.xml
Normal file
277
addons/laundry_management/views/laundry_dashboard_views.xml
Normal file
@@ -0,0 +1,277 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════════════════════
|
||||
LAUNDRY DASHBOARD — KPI Form View
|
||||
Opened via server action so data is always fresh.
|
||||
═══════════════════════════════════════════════════════════════ -->
|
||||
<record id="view_laundry_dashboard_form" model="ir.ui.view">
|
||||
<field name="name">laundry.dashboard.form</field>
|
||||
<field name="model">laundry.dashboard</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Laundry Dashboard" create="false" edit="false" delete="false">
|
||||
<sheet>
|
||||
|
||||
<!-- ── Header toolbar ─────────────────────────────── -->
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<h2 class="mb-0">Laundry Dashboard</h2>
|
||||
<div class="d-flex gap-2">
|
||||
<button name="action_refresh"
|
||||
string="Refresh"
|
||||
type="object"
|
||||
class="btn btn-sm btn-secondary"/>
|
||||
<button name="action_new_order"
|
||||
string="+ New Order"
|
||||
type="object"
|
||||
class="btn btn-sm btn-primary"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── Session banner ─────────────────────────────── -->
|
||||
<div class="alert alert-success mb-3"
|
||||
role="alert"
|
||||
invisible="not session_is_open">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<strong>Session Open: </strong>
|
||||
<field name="session_name" readonly="1" class="d-inline fw-bold"/>
|
||||
 | 
|
||||
Opening Float:
|
||||
<field name="session_opening_cash" readonly="1"
|
||||
widget="monetary"
|
||||
options="{'currency_field': 'currency_id'}"
|
||||
class="d-inline"/>
|
||||
 | 
|
||||
Session Sales:
|
||||
<field name="session_sales" readonly="1"
|
||||
widget="monetary"
|
||||
options="{'currency_field': 'currency_id'}"
|
||||
class="d-inline fw-bold text-success"/>
|
||||
</div>
|
||||
<button name="action_open_session"
|
||||
string="View Session"
|
||||
type="object"
|
||||
class="btn btn-sm btn-success"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="alert alert-warning mb-3"
|
||||
role="alert"
|
||||
invisible="session_is_open">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<span>
|
||||
<strong>No Active Session</strong> —
|
||||
Open a session before creating orders.
|
||||
</span>
|
||||
<button name="action_new_session"
|
||||
string="Open Session"
|
||||
type="object"
|
||||
class="btn btn-sm btn-warning"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── Today KPI row ──────────────────────────────── -->
|
||||
<div class="row g-3 mb-4">
|
||||
<div class="col-md-3">
|
||||
<div class="card text-center border-primary h-100">
|
||||
<div class="card-body">
|
||||
<div class="display-6 fw-bold text-primary">
|
||||
<field name="today_orders" readonly="1"/>
|
||||
</div>
|
||||
<div class="text-muted small mt-1">Today's Orders</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card text-center border-success h-100">
|
||||
<div class="card-body">
|
||||
<div class="display-6 fw-bold text-success">
|
||||
<field name="today_revenue" readonly="1"
|
||||
widget="monetary"
|
||||
options="{'currency_field': 'currency_id'}"/>
|
||||
</div>
|
||||
<div class="text-muted small mt-1">Today's Revenue</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card text-center border-info h-100">
|
||||
<div class="card-body">
|
||||
<div class="display-6 fw-bold text-info">
|
||||
<field name="today_collected" readonly="1"
|
||||
widget="monetary"
|
||||
options="{'currency_field': 'currency_id'}"/>
|
||||
</div>
|
||||
<div class="text-muted small mt-1">Collected Today</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card text-center border-danger h-100">
|
||||
<div class="card-body">
|
||||
<div class="display-6 fw-bold text-danger">
|
||||
<field name="today_outstanding" readonly="1"
|
||||
widget="monetary"
|
||||
options="{'currency_field': 'currency_id'}"/>
|
||||
</div>
|
||||
<div class="text-muted small mt-1">Outstanding Today</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── Operations Pipeline ────────────────────────── -->
|
||||
<h5 class="mb-3 border-bottom pb-2">Operations Pipeline</h5>
|
||||
<div class="row g-3 mb-4">
|
||||
<div class="col-md-3">
|
||||
<div class="card h-100 bg-success bg-opacity-10 border-success">
|
||||
<div class="card-body text-center">
|
||||
<div class="fs-2 fw-bold text-success">
|
||||
<field name="ready_count" readonly="1"/>
|
||||
</div>
|
||||
<div class="small text-success fw-semibold">Ready for Pickup</div>
|
||||
<button name="action_view_ready_orders"
|
||||
string="View"
|
||||
type="object"
|
||||
class="btn btn-sm btn-outline-success mt-2"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card h-100 bg-warning bg-opacity-10 border-warning">
|
||||
<div class="card-body text-center">
|
||||
<div class="fs-2 fw-bold text-warning">
|
||||
<field name="in_progress_count" readonly="1"/>
|
||||
</div>
|
||||
<div class="small text-warning fw-semibold">In Processing</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card h-100 bg-secondary bg-opacity-10">
|
||||
<div class="card-body text-center">
|
||||
<div class="fs-2 fw-bold text-secondary">
|
||||
<field name="draft_count" readonly="1"/>
|
||||
</div>
|
||||
<div class="small text-muted">Draft / Quotes</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card h-100">
|
||||
<div class="card-body text-center">
|
||||
<div class="fs-2 fw-bold">
|
||||
<field name="pending_count" readonly="1"/>
|
||||
</div>
|
||||
<div class="small text-muted">Total Pending</div>
|
||||
<button name="action_view_pending_orders"
|
||||
string="View All"
|
||||
type="object"
|
||||
class="btn btn-sm btn-outline-secondary mt-2"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── Session breakdown (if open) ────────────────── -->
|
||||
<div invisible="not session_is_open">
|
||||
<h5 class="mb-3 border-bottom pb-2">Current Session Breakdown</h5>
|
||||
<div class="row g-3 mb-4">
|
||||
<div class="col-md-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<div class="small text-muted">Total Session Sales</div>
|
||||
<div class="fs-4 fw-bold">
|
||||
<field name="session_sales" readonly="1"
|
||||
widget="monetary"
|
||||
options="{'currency_field': 'currency_id'}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<div class="small text-muted">Cash Collected</div>
|
||||
<div class="fs-4 fw-bold text-success">
|
||||
<field name="session_cash" readonly="1"
|
||||
widget="monetary"
|
||||
options="{'currency_field': 'currency_id'}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<div class="small text-muted">Bank / Card</div>
|
||||
<div class="fs-4 fw-bold text-info">
|
||||
<field name="session_bank" readonly="1"
|
||||
widget="monetary"
|
||||
options="{'currency_field': 'currency_id'}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── Month summary ──────────────────────────────── -->
|
||||
<h5 class="mb-3 border-bottom pb-2">This Month</h5>
|
||||
<div class="row g-3 mb-2">
|
||||
<div class="col-md-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<div class="small text-muted">Orders This Month</div>
|
||||
<div class="fs-4 fw-bold">
|
||||
<field name="month_orders" readonly="1"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<div class="small text-muted">Revenue This Month</div>
|
||||
<div class="fs-4 fw-bold">
|
||||
<field name="month_revenue" readonly="1"
|
||||
widget="monetary"
|
||||
options="{'currency_field': 'currency_id'}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<div class="small text-muted">Collected This Month</div>
|
||||
<div class="fs-4 fw-bold text-success">
|
||||
<field name="month_paid" readonly="1"
|
||||
widget="monetary"
|
||||
options="{'currency_field': 'currency_id'}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- hidden fields needed for widget resolution -->
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<field name="session_is_open" invisible="1"/>
|
||||
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════════════════════
|
||||
SERVER ACTION — creates fresh dashboard record and opens it
|
||||
═══════════════════════════════════════════════════════════════ -->
|
||||
<record id="action_laundry_dashboard_server" model="ir.actions.server">
|
||||
<field name="name">Open Laundry Dashboard</field>
|
||||
<field name="model_id" ref="model_laundry_dashboard"/>
|
||||
<field name="binding_model_id" ref="model_laundry_dashboard"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">action = model.action_open_dashboard()</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user