206 lines
12 KiB
XML
206 lines
12 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<template id="orders_page_template" name="Dine360 Online Orders Page">
|
|
<t t-call="dine360_dashboard.dashboard_layout">
|
|
<t t-set="active_page" t-value="'orders'"/>
|
|
|
|
<!-- Page Title & Header -->
|
|
<section class="o_page_header">
|
|
<div>
|
|
<h1 class="o_heading_title">Online Orders</h1>
|
|
<p class="o_heading_subtitle">Live customer online orders from website storefront and delivery channels</p>
|
|
</div>
|
|
<div class="o_header_controls">
|
|
<div class="o_status_tag">
|
|
<span class="o_green_dot"/>
|
|
<span>Storefront: Live & Accepting Orders</span>
|
|
</div>
|
|
<a href="/shop" target="_blank" class="o_btn_red_action">
|
|
<i class="fa fa-shopping-bag me-1"/> Open Storefront
|
|
</a>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Row 1: KPI Cards -->
|
|
<section class="o_kpi_grid mb-4">
|
|
<div class="o_kpi_card">
|
|
<div class="o_kpi_top">
|
|
<div class="o_kpi_icon_box bg-red-light text-danger">
|
|
<i class="fa fa-clock-o fs-5"/>
|
|
</div>
|
|
<span class="o_kpi_trend text-danger">Action Needed</span>
|
|
</div>
|
|
<div class="o_kpi_label">Pending Orders</div>
|
|
<div class="o_kpi_number"><t t-esc="online_orders_data.get('pending_count', 0)"/></div>
|
|
<div class="o_kpi_footer">
|
|
<span class="o_kpi_sub">Requires kitchen accept</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="o_kpi_card">
|
|
<div class="o_kpi_top">
|
|
<div class="o_kpi_icon_box bg-green-light text-success">
|
|
<i class="fa fa-check fs-5"/>
|
|
</div>
|
|
<span class="o_kpi_trend text-success">Confirmed</span>
|
|
</div>
|
|
<div class="o_kpi_label">Confirmed Orders</div>
|
|
<div class="o_kpi_number"><t t-esc="online_orders_data.get('confirmed_count', 0)"/></div>
|
|
<div class="o_kpi_footer">
|
|
<span class="o_kpi_sub">Accepted & processing</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="o_kpi_card">
|
|
<div class="o_kpi_top">
|
|
<div class="o_kpi_icon_box bg-amber-light text-warning">
|
|
<i class="fa fa-cutlery fs-5"/>
|
|
</div>
|
|
<span class="o_kpi_trend text-warning">Cooking</span>
|
|
</div>
|
|
<div class="o_kpi_label">In Kitchen</div>
|
|
<div class="o_kpi_number"><t t-esc="online_orders_data.get('cooking_count', 0)"/></div>
|
|
<div class="o_kpi_footer">
|
|
<span class="o_kpi_sub">Preparing on station</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="o_kpi_card">
|
|
<div class="o_kpi_top">
|
|
<div class="o_kpi_icon_box bg-slate-light text-primary">
|
|
<i class="fa fa-money fs-5"/>
|
|
</div>
|
|
<span class="o_kpi_trend text-primary">Sales</span>
|
|
</div>
|
|
<div class="o_kpi_label">Total Revenue</div>
|
|
<div class="o_kpi_number"><t t-esc="online_orders_data.get('total_revenue_formatted', '$0.00')"/></div>
|
|
<div class="o_kpi_footer">
|
|
<span class="o_kpi_sub">Online sales today</span>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Row 2: Filter Toolbar -->
|
|
<div class="o_page_toolbar">
|
|
<div class="o_filter_pills">
|
|
<div class="o_filter_pill active" data-filter="all">All Orders (<t t-esc="len(online_orders_data.get('orders', []))"/>)</div>
|
|
<div class="o_filter_pill" data-filter="pending">Pending</div>
|
|
<div class="o_filter_pill" data-filter="confirmed">Confirmed</div>
|
|
<div class="o_filter_pill" data-filter="cooking">Cooking</div>
|
|
<div class="o_filter_pill" data-filter="delivered">Delivered</div>
|
|
</div>
|
|
|
|
<div class="o_toolbar_search">
|
|
<i class="fa fa-search text-muted"/>
|
|
<input type="text" class="o_toolbar_search_input" placeholder="Search order number or customer..."/>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Row 3: Orders Table -->
|
|
<div class="o_modern_table_card mb-4">
|
|
<div class="o_card_header">
|
|
<h3 class="o_card_title mb-0">Live Customer Order Stream</h3>
|
|
<a href="/web#action=sale.action_quotations_with_onboarding" class="o_btn_white_small">
|
|
View All in Backend
|
|
</a>
|
|
</div>
|
|
|
|
<div class="table-responsive">
|
|
<table class="o_modern_table">
|
|
<thead>
|
|
<tr>
|
|
<th>Order Ref</th>
|
|
<th>Customer Info</th>
|
|
<th>Time Placed</th>
|
|
<th>Order Amount</th>
|
|
<th>Status</th>
|
|
<th class="text-end">Kitchen Action</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<t t-if="not online_orders_data.get('orders')">
|
|
<tr>
|
|
<td colspan="6" class="text-center py-5 text-muted">
|
|
<i class="fa fa-shopping-bag fa-3x mb-3 text-secondary"/>
|
|
<h5>No online orders yet today</h5>
|
|
<p class="small">Customer website orders will appear here in real time.</p>
|
|
</td>
|
|
</tr>
|
|
</t>
|
|
|
|
<t t-foreach="online_orders_data.get('orders', [])" t-as="order">
|
|
<tr data-search-item="true" data-filter-item="true" t-att-data-status="order['status']">
|
|
<td>
|
|
<span class="font-monospace fw-bold text-dark"><t t-esc="order['name']"/></span>
|
|
</td>
|
|
<td>
|
|
<div class="fw-bold text-dark"><t t-esc="order['customer']"/></div>
|
|
<div class="small text-muted"><t t-esc="order.get('phone', '')"/></div>
|
|
</td>
|
|
<td>
|
|
<div class="small text-muted"><i class="fa fa-clock-o me-1"/><t t-esc="order['date']"/></div>
|
|
</td>
|
|
<td>
|
|
<span class="fw-bold font-monospace fs-6 text-dark"><t t-esc="order['amount']"/></span>
|
|
</td>
|
|
<td>
|
|
<t t-if="order['status'] == 'pending'">
|
|
<span class="o_badge_status warning"><span class="o_badge_dot"/> Pending</span>
|
|
</t>
|
|
<t t-elif="order['status'] == 'confirmed'">
|
|
<span class="o_badge_status success"><span class="o_badge_dot"/> Confirmed</span>
|
|
</t>
|
|
<t t-elif="order['status'] == 'cooking'">
|
|
<span class="o_badge_status info"><span class="o_badge_dot"/> Cooking</span>
|
|
</t>
|
|
<t t-elif="order['status'] == 'delivered'">
|
|
<span class="o_badge_status secondary"><span class="o_badge_dot"/> Delivered</span>
|
|
</t>
|
|
<t t-elif="order['status'] == 'rejected'">
|
|
<span class="o_badge_status danger"><span class="o_badge_dot"/> Rejected</span>
|
|
</t>
|
|
<t t-else="">
|
|
<span class="o_badge_status secondary"><t t-esc="order['status']"/></span>
|
|
</t>
|
|
</td>
|
|
<td class="text-end">
|
|
<div class="d-inline-flex gap-1 align-items-center justify-content-end">
|
|
<t t-if="order['status'] == 'pending'">
|
|
<button type="button" class="btn btn-sm btn-success o_btn_update_order" t-att-data-order-id="order['id']" data-status="confirmed" title="Accept Online Order">
|
|
<i class="fa fa-check"/> Accept
|
|
</button>
|
|
<button type="button" class="btn btn-sm btn-outline-danger o_btn_update_order" t-att-data-order-id="order['id']" data-status="rejected" title="Reject Order">
|
|
<i class="fa fa-times"/>
|
|
</button>
|
|
</t>
|
|
<t t-elif="order['status'] == 'confirmed'">
|
|
<button type="button" class="btn btn-sm btn-warning text-dark fw-bold o_btn_update_order" t-att-data-order-id="order['id']" data-status="cooking" title="Send to Kitchen Station">
|
|
<i class="fa fa-fire"/> Cook
|
|
</button>
|
|
</t>
|
|
<t t-elif="order['status'] == 'cooking'">
|
|
<button type="button" class="btn btn-sm btn-outline-success fw-bold o_btn_update_order" t-att-data-order-id="order['id']" data-status="delivered" title="Mark as Ready">
|
|
<i class="fa fa-check-circle"/> Ready
|
|
</button>
|
|
</t>
|
|
<t t-elif="order['status'] == 'delivered'">
|
|
<span class="badge bg-light text-success border py-1 px-2"><i class="fa fa-check me-1"/> Completed</span>
|
|
</t>
|
|
<t t-elif="order['status'] == 'rejected'">
|
|
<span class="badge bg-light text-danger border py-1 px-2"><i class="fa fa-times me-1"/> Cancelled</span>
|
|
</t>
|
|
<a t-att-href="order['url']" class="btn btn-sm btn-light border text-muted ms-1" title="View Order Details">
|
|
<i class="fa fa-external-link"/>
|
|
</a>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</t>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</t>
|
|
</template>
|
|
</odoo>
|