Tower: upload laundry_management 19.0.19.0.4 (via marketplace)

This commit is contained in:
2026-05-01 15:16:22 +00:00
parent 599cc43b87
commit a32918ffab

View 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"/>
&#160;|&#160;
Opening Float:
<field name="session_opening_cash" readonly="1"
widget="monetary"
options="{'currency_field': 'currency_id'}"
class="d-inline"/>
&#160;|&#160;
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>