1052 lines
74 KiB
XML
1052 lines
74 KiB
XML
<odoo>
|
|
<template id="image_home_template" name="Home Page Icons">
|
|
<t t-call="web.frontend_layout">
|
|
<t t-set="no_footer" t-value="True"/>
|
|
<t t-set="no_header" t-value="True"/>
|
|
<t t-set="pageName" t-value="'home_dashboard'"/>
|
|
<t t-set="body_classname" t-value="'o_saas_admin_body' if is_saas_master else 'o_restaurant_body'"/>
|
|
<link rel="preconnect" href="https://fonts.googleapis.com"/>
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/>
|
|
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet"/>
|
|
<link rel="stylesheet" type="text/css" href="/dine360_dashboard/static/src/css/home_menu.css?v=6.0"/>
|
|
<script type="text/javascript" src="/dine360_dashboard/static/src/js/dashboard_pages.js?v=6.0"/>
|
|
|
|
<!-- ============================================================== -->
|
|
<!-- 1. ADMIN RESTAURANT ONBOARD MASTER DB DASHBOARD -->
|
|
<!-- ============================================================== -->
|
|
<t t-if="is_saas_master">
|
|
<div class="o_saas_layout">
|
|
<!-- Left Sidebar (Shared Component) -->
|
|
<t t-call="dine360_dashboard.dashboard_sidebar">
|
|
<t t-set="active_page" t-value="'dashboard'"/>
|
|
</t>
|
|
|
|
<!-- Main Dashboard Content -->
|
|
<main class="o_saas_main">
|
|
<!-- Top Header Bar (Shared Component) -->
|
|
<t t-call="dine360_dashboard.dashboard_topbar"/>
|
|
|
|
<!-- Page Title & Status Header -->
|
|
<section class="o_page_header">
|
|
<div>
|
|
<h1 class="o_heading_title">Dashboard</h1>
|
|
<p class="o_heading_subtitle">Manage your restaurant ecosystem and deployment status</p>
|
|
</div>
|
|
<div class="o_header_controls">
|
|
<div class="o_status_tag">
|
|
<span class="o_green_dot"/>
|
|
<span>System Status: All systems operational</span>
|
|
</div>
|
|
<div class="o_date_picker_btn">
|
|
<i class="fa fa-calendar me-2 text-muted"/>
|
|
<span>Sep 26, 2026 - Oct 26, 2026</span>
|
|
<i class="fa fa-angle-down ms-2 text-muted"/>
|
|
</div>
|
|
<button type="button" class="o_btn_red_action" data-open-modal="modalOnboardRestaurant">
|
|
<i class="fa fa-plus me-1"/> Onboard Restaurant
|
|
</button>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Row 1: 4 Summary Metric Cards -->
|
|
<section class="o_kpi_grid mb-4">
|
|
<!-- KPI 1: Total Restaurants -->
|
|
<div class="o_kpi_card">
|
|
<div class="o_kpi_top">
|
|
<div class="o_kpi_icon_box bg-red-light text-danger">
|
|
<svg width="20" height="20" viewBox="0 0 24 24" fill="#e50000">
|
|
<path d="M21.9 8.2l-1.9-4.7C19.7 2.6 18.8 2 17.8 2H6.2c-1 0-1.9.6-2.2 1.5L2.1 8.2c-.3.7-.1 1.5.4 2 .4.4 1 .7 1.6.7h.1c.9 0 1.7-.5 2.1-1.3l.9-1.8.9 1.8c.4.8 1.2 1.3 2.1 1.3s1.7-.5 2.1-1.3l.9-1.8.9 1.8c.4.8 1.2 1.3 2.1 1.3s1.7-.5 2.1-1.3l.9-1.8.9 1.8c.4.8 1.2 1.3 2.1 1.3h.1c.6 0 1.2-.3 1.6-.7.5-.5.7-1.3.4-2zM4 12.1V20c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-7.9c-.6.3-1.3.4-2 .4-1.2 0-2.3-.6-3-1.6-.7 1-1.8 1.6-3 1.6s-2.3-.6-3-1.6c-.7 1-1.8 1.6-3 1.6-.7 0-1.4-.1-2-.5zM10 20v-5h4v5h-4z"/>
|
|
</svg>
|
|
</div>
|
|
<span class="o_kpi_trend text-danger"><i class="fa fa-arrow-up"/> +0%</span>
|
|
</div>
|
|
<div class="o_kpi_label">Total Restaurants</div>
|
|
<div class="o_kpi_number"><t t-esc="saas_stats['total']"/></div>
|
|
<div class="o_kpi_footer">
|
|
<span class="o_kpi_sub">Currently onboarded</span>
|
|
<svg class="o_sparkline" viewBox="0 0 100 30" preserveAspectRatio="none">
|
|
<path d="M0 25 Q15 28 30 18 T60 22 T80 12 T100 5" fill="none" stroke="#ef4444" stroke-width="2.5" stroke-linecap="round"/>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- KPI 2: Active Subscriptions -->
|
|
<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"/>
|
|
</div>
|
|
<span class="o_kpi_trend text-success"><i class="fa fa-arrow-up"/> +0%</span>
|
|
</div>
|
|
<div class="o_kpi_label">Active Subscriptions</div>
|
|
<div class="o_kpi_number"><t t-esc="saas_stats['active']"/></div>
|
|
<div class="o_kpi_footer">
|
|
<span class="o_kpi_sub">Running smoothly</span>
|
|
<svg class="o_sparkline" viewBox="0 0 100 30" preserveAspectRatio="none">
|
|
<path d="M0 25 Q15 28 30 20 T60 15 T80 18 T100 5" fill="none" stroke="#16a34a" stroke-width="2.5" stroke-linecap="round"/>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- KPI 3: Provisioning -->
|
|
<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-clock-o"/>
|
|
</div>
|
|
<span class="o_kpi_trend text-warning"><i class="fa fa-arrow-up"/> +0%</span>
|
|
</div>
|
|
<div class="o_kpi_label">Provisioning</div>
|
|
<div class="o_kpi_number"><t t-esc="saas_stats['provisioning']"/></div>
|
|
<div class="o_kpi_footer">
|
|
<span class="o_kpi_sub">In progress</span>
|
|
<svg class="o_sparkline" viewBox="0 0 100 30" preserveAspectRatio="none">
|
|
<path d="M0 25 Q15 28 30 22 T60 25 T80 15 T100 10" fill="none" stroke="#d97706" stroke-width="2.5" stroke-linecap="round"/>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- KPI 4: Expired / Suspended -->
|
|
<div class="o_kpi_card">
|
|
<div class="o_kpi_top">
|
|
<div class="o_kpi_icon_box bg-gray-light text-secondary">
|
|
<i class="fa fa-exclamation-circle"/>
|
|
</div>
|
|
<span class="o_kpi_trend text-muted"><i class="fa fa-arrow-up"/> +0%</span>
|
|
</div>
|
|
<div class="o_kpi_label">Expired / Suspended</div>
|
|
<div class="o_kpi_number"><t t-esc="saas_stats['expired']"/></div>
|
|
<div class="o_kpi_footer">
|
|
<span class="o_kpi_sub">Requires attention</span>
|
|
<svg class="o_sparkline" viewBox="0 0 100 30" preserveAspectRatio="none">
|
|
<path d="M0 25 Q15 28 30 22 T60 20 T80 22 T100 12" fill="none" stroke="#64748b" stroke-width="2.5" stroke-linecap="round"/>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Row 2: 3 Widget Cards -->
|
|
<section class="o_middle_grid mb-4">
|
|
<!-- Card 1: Restaurant Activity Chart -->
|
|
<div class="o_widget_card o_card_activity">
|
|
<div class="o_card_header">
|
|
<h3 class="o_card_title mb-0">Restaurant Activity</h3>
|
|
<div class="o_dropdown_badge">
|
|
<span>Last 7 days</span>
|
|
<i class="fa fa-angle-down ms-1"/>
|
|
</div>
|
|
</div>
|
|
<div class="o_activity_content">
|
|
<!-- Left Chart -->
|
|
<div class="o_chart_wrapper">
|
|
<svg class="o_activity_svg" viewBox="0 0 450 180" preserveAspectRatio="none">
|
|
<!-- Grid Lines -->
|
|
<line x1="30" y1="20" x2="440" y2="20" stroke="#f1f5f9" stroke-width="1" stroke-dasharray="3 3"/>
|
|
<line x1="30" y1="55" x2="440" y2="55" stroke="#f1f5f9" stroke-width="1" stroke-dasharray="3 3"/>
|
|
<line x1="30" y1="90" x2="440" y2="90" stroke="#f1f5f9" stroke-width="1" stroke-dasharray="3 3"/>
|
|
<line x1="30" y1="125" x2="440" y2="125" stroke="#f1f5f9" stroke-width="1" stroke-dasharray="3 3"/>
|
|
<line x1="30" y1="160" x2="440" y2="160" stroke="#e2e8f0" stroke-width="1"/>
|
|
|
|
<!-- Y-Axis Labels -->
|
|
<text x="15" y="24" fill="#94a3b8" font-size="10" text-anchor="middle">40</text>
|
|
<text x="15" y="59" fill="#94a3b8" font-size="10" text-anchor="middle">30</text>
|
|
<text x="15" y="94" fill="#94a3b8" font-size="10" text-anchor="middle">20</text>
|
|
<text x="15" y="129" fill="#94a3b8" font-size="10" text-anchor="middle">10</text>
|
|
<text x="15" y="163" fill="#94a3b8" font-size="10" text-anchor="middle">0</text>
|
|
|
|
<!-- Vertical Pink Bars -->
|
|
<rect x="52" y="100" width="16" height="60" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
<rect x="110" y="70" width="16" height="90" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
<rect x="168" y="90" width="16" height="70" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
<rect x="226" y="60" width="16" height="100" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
<rect x="284" y="80" width="16" height="80" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
<rect x="342" y="65" width="16" height="95" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
<rect x="400" y="45" width="16" height="115" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
|
|
<!-- Smooth Curved Red Spline Line -->
|
|
<path d="M 60 135 C 90 120, 100 80, 118 78 C 135 76, 155 110, 176 100 C 195 90, 215 65, 234 68 C 255 70, 275 105, 292 90 C 315 72, 335 70, 350 68 C 375 65, 395 50, 408 48" fill="none" stroke="#e50000" stroke-width="3" stroke-linecap="round"/>
|
|
|
|
<!-- Data Points -->
|
|
<circle cx="60" cy="135" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
<circle cx="118" cy="78" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
<circle cx="176" cy="100" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
<circle cx="234" cy="68" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
<circle cx="292" cy="90" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
<circle cx="350" cy="68" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
<circle cx="408" cy="48" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
</svg>
|
|
<!-- X-Axis Labels -->
|
|
<div class="o_xaxis_labels">
|
|
<span>Sep 20</span>
|
|
<span>Sep 21</span>
|
|
<span>Sep 22</span>
|
|
<span>Sep 23</span>
|
|
<span>Sep 24</span>
|
|
<span>Sep 25</span>
|
|
<span>Sep 26</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Right Stats List -->
|
|
<div class="o_substats_col">
|
|
<div class="o_substat_item">
|
|
<div class="o_substat_icon_box">
|
|
<i class="fa fa-calendar text-danger"/>
|
|
</div>
|
|
<div>
|
|
<div class="o_substat_title">Total Reservations</div>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<span class="o_substat_val"><t t-esc="saas_dashboard_data['reservations_count']"/></span>
|
|
<span class="o_substat_pct text-success"><i class="fa fa-arrow-up"/> +12%</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="o_substat_item">
|
|
<div class="o_substat_icon_box">
|
|
<i class="fa fa-file-text-o text-danger"/>
|
|
</div>
|
|
<div>
|
|
<div class="o_substat_title">Total Orders</div>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<span class="o_substat_val"><t t-esc="saas_dashboard_data['orders_count']"/></span>
|
|
<span class="o_substat_pct text-success"><i class="fa fa-arrow-up"/> +8%</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="o_substat_item">
|
|
<div class="o_substat_icon_box">
|
|
<i class="fa fa-inr text-danger"/>
|
|
</div>
|
|
<div>
|
|
<div class="o_substat_title">Avg. Order Value</div>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<span class="o_substat_val"><t t-esc="saas_dashboard_data['avg_order_value']"/></span>
|
|
<span class="o_substat_pct text-success"><i class="fa fa-arrow-up"/> +6%</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Card 2: Recent Activity -->
|
|
<div class="o_widget_card o_card_recent">
|
|
<div class="o_card_header">
|
|
<h3 class="o_card_title mb-0">Recent Activity</h3>
|
|
<a href="/web#action=dine360_saas_master.action_saas_restaurant" class="o_link_red">View All</a>
|
|
</div>
|
|
<div class="o_activity_timeline">
|
|
<t t-foreach="saas_dashboard_data['recent_activities']" t-as="act">
|
|
<div class="o_activity_row">
|
|
<div class="o_act_icon_box">
|
|
<i t-att-class="act['icon'] + ' text-danger'"/>
|
|
</div>
|
|
<div class="o_act_details">
|
|
<div class="d-flex justify-content-between align-items-start">
|
|
<div class="o_act_title"><t t-esc="act['title']"/></div>
|
|
<span t-attf-class="o_act_badge o_act_badge_{{ act['badge_type'] }}">
|
|
<t t-if="act['badge_type'] in ['completed', 'success']">● </t>
|
|
<t t-esc="act['badge']"/>
|
|
</span>
|
|
</div>
|
|
<div class="o_act_sub"><t t-esc="act['subtitle']"/></div>
|
|
<div class="o_act_time"><t t-esc="act['time']"/></div>
|
|
</div>
|
|
</div>
|
|
</t>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Card 3: Onboarding Progress -->
|
|
<div class="o_widget_card o_card_progress">
|
|
<div class="o_card_header">
|
|
<h3 class="o_card_title mb-0">Onboarding Progress</h3>
|
|
</div>
|
|
<div class="o_donut_container">
|
|
<svg class="o_donut_svg" viewBox="0 0 100 100">
|
|
<circle cx="50" cy="50" r="40" fill="none" stroke="#f8fafc" stroke-width="9"/>
|
|
<circle cx="50" cy="50" r="40" fill="none" stroke="#fecaca" stroke-width="9"/>
|
|
<circle cx="50" cy="50" r="40" fill="none" stroke="#e50000" stroke-width="9"
|
|
stroke-linecap="round"
|
|
stroke-dasharray="251.2"
|
|
stroke-dashoffset="188.4"
|
|
transform="rotate(-90 50 50)"/>
|
|
<text x="50" y="48" text-anchor="middle" font-size="16" font-weight="800" fill="#0f172a">25%</text>
|
|
<text x="50" y="62" text-anchor="middle" font-size="9" font-weight="500" fill="#94a3b8">Complete</text>
|
|
</svg>
|
|
</div>
|
|
|
|
<div class="o_stepper_list">
|
|
<div class="o_step_item completed">
|
|
<div class="o_step_icon_wrapper">
|
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
<circle cx="10" cy="10" r="10" fill="#e50000"/>
|
|
<path d="M6 10L9 13L14 7" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
</svg>
|
|
</div>
|
|
<div>
|
|
<div class="o_step_name">Restaurant Details</div>
|
|
<div class="o_step_state text-muted">Completed</div>
|
|
</div>
|
|
</div>
|
|
<div class="o_step_item completed">
|
|
<div class="o_step_icon_wrapper">
|
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
<circle cx="10" cy="10" r="10" fill="#e50000"/>
|
|
<path d="M6 10L9 13L14 7" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
</svg>
|
|
</div>
|
|
<div>
|
|
<div class="o_step_name">Subscription Plan</div>
|
|
<div class="o_step_state text-muted">Completed</div>
|
|
</div>
|
|
</div>
|
|
<div class="o_step_item active">
|
|
<div class="o_step_icon_wrapper">
|
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
<circle cx="10" cy="10" r="9" stroke="#e50000" stroke-width="2" fill="white"/>
|
|
<circle cx="10" cy="10" r="4.5" fill="#e50000"/>
|
|
</svg>
|
|
</div>
|
|
<div>
|
|
<div class="o_step_name">Database Setup</div>
|
|
<div class="o_step_state text-danger fw-bold">In Progress</div>
|
|
</div>
|
|
</div>
|
|
<div class="o_step_item pending">
|
|
<div class="o_step_icon_wrapper">
|
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
<circle cx="10" cy="10" r="9" stroke="#cbd5e1" stroke-width="2" fill="white"/>
|
|
</svg>
|
|
</div>
|
|
<div>
|
|
<div class="o_step_name">Go Live</div>
|
|
<div class="o_step_state text-muted">Pending</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Row 3: 2 Bottom Cards -->
|
|
<section class="o_bottom_grid">
|
|
<!-- Card 1: Onboarded Restaurants (Wide) -->
|
|
<div class="o_widget_card o_card_restaurants_table">
|
|
<div class="o_card_header">
|
|
<div class="d-flex align-items-center gap-2">
|
|
<h3 class="o_card_title mb-0">Onboarded Restaurants</h3>
|
|
<span class="o_count_pill"><t t-esc="saas_stats['total']"/> Registered</span>
|
|
</div>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<button type="button" class="o_btn_red_small" data-open-modal="modalOnboardRestaurant">
|
|
<i class="fa fa-plus me-1"/> Onboard Restaurant
|
|
</button>
|
|
<a href="/dashboard/restaurants" class="o_btn_white_small">
|
|
View All
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="o_restaurants_list">
|
|
<t t-foreach="onboarded_restaurants" t-as="restaurant">
|
|
<div class="o_res_row_card">
|
|
<!-- Col 1: Logo & Name -->
|
|
<div class="o_res_col_name">
|
|
<div class="o_res_black_avatar">
|
|
<svg width="20" height="15" viewBox="0 0 36 28" fill="none" style="margin-top: 2px;">
|
|
<path d="M18 2C14.5 2 12 4.5 12 7.5C10 7.8 8.5 9.5 8.5 11.5C8.5 13.2 9.6 14.6 11.2 15.1C11.1 15.5 11 16 11 16.5C11 19.5 13.5 22 16.5 22H19.5C22.5 22 25 19.5 25 16.5C25 16 24.9 15.5 24.8 15.1C26.4 14.6 27.5 13.2 27.5 11.5C27.5 9.5 26 7.8 24 7.5C24 4.5 21.5 2 18 2Z" fill="none" stroke="#e50000" stroke-width="2.5"/>
|
|
<path d="M12 22V25C12 26 13 27 14 27H22C23 27 24 26 24 25V22" stroke="#e50000" stroke-width="2.5"/>
|
|
</svg>
|
|
<span class="o_res_avatar_letter">S</span>
|
|
</div>
|
|
<div>
|
|
<div class="o_res_title"><t t-esc="restaurant['name']"/></div>
|
|
<div class="o_res_plan_sub"><t t-esc="restaurant['plan_name']"/> • <t t-esc="restaurant['billing_cycle']"/></div>
|
|
<span class="o_res_pill_active">
|
|
<span class="o_pill_dot"/> Active
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Col 2: Owner & Phone & Subdomain -->
|
|
<div class="o_res_col_info">
|
|
<div class="o_info_line">
|
|
<i class="fa fa-user-o o_info_icon text-muted"/>
|
|
<div>
|
|
<div class="o_info_label">Owner</div>
|
|
<div class="o_info_val"><t t-esc="restaurant['owner_name']"/></div>
|
|
</div>
|
|
</div>
|
|
<div class="o_info_line">
|
|
<i class="fa fa-phone o_info_icon text-muted"/>
|
|
<div>
|
|
<div class="o_info_label">Phone</div>
|
|
<div class="o_info_val"><t t-esc="restaurant['phone']"/></div>
|
|
</div>
|
|
</div>
|
|
<div class="o_info_line">
|
|
<i class="fa fa-globe o_info_icon text-muted"/>
|
|
<div>
|
|
<div class="o_info_label">Subdomain</div>
|
|
<div class="o_info_val text-danger"><t t-esc="restaurant['subdomain']"/></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Col 3: Email & Database & Expires -->
|
|
<div class="o_res_col_info">
|
|
<div class="o_info_line">
|
|
<i class="fa fa-envelope-o o_info_icon text-muted"/>
|
|
<div>
|
|
<div class="o_info_label">Email</div>
|
|
<div class="o_info_val"><t t-esc="restaurant['email']"/></div>
|
|
</div>
|
|
</div>
|
|
<div class="o_info_line">
|
|
<i class="fa fa-database o_info_icon text-muted"/>
|
|
<div>
|
|
<div class="o_info_label">Database</div>
|
|
<div class="o_info_val font-monospace"><t t-esc="restaurant['database_name']"/></div>
|
|
</div>
|
|
</div>
|
|
<div class="o_info_line">
|
|
<i class="fa fa-calendar-o o_info_icon text-muted"/>
|
|
<div>
|
|
<div class="o_info_label">Expires</div>
|
|
<div class="o_info_val"><t t-esc="restaurant['expiry_date']"/></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Col 4: Action Buttons -->
|
|
<div class="o_res_col_actions">
|
|
<a t-att-href="restaurant['launch_url']" target="_blank" class="o_btn_launch_red">
|
|
<i class="fa fa-rocket me-1"/> Launch DB
|
|
</a>
|
|
<a t-att-href="restaurant['manage_url']" class="o_btn_manage_white">
|
|
<i class="fa fa-cog me-1"/> Manage
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</t>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Card 2: Subscription Health -->
|
|
<div class="o_widget_card o_card_sub_health">
|
|
<div class="o_card_header">
|
|
<h3 class="o_card_title mb-0">Subscription Health</h3>
|
|
<span class="fw-bold text-dark">100%</span>
|
|
</div>
|
|
|
|
<!-- Progress bar -->
|
|
<div class="o_health_bar_container">
|
|
<div class="o_health_bar_fill" style="width: 100%;"/>
|
|
</div>
|
|
|
|
<!-- Alert box -->
|
|
<div class="o_health_alert">
|
|
<i class="fa fa-check-circle text-success me-2"/>
|
|
<span>Your subscription is active and running smoothly.</span>
|
|
</div>
|
|
|
|
<!-- Plan details -->
|
|
<div class="o_health_plan_row">
|
|
<div>
|
|
<div class="o_info_label">Plan Details</div>
|
|
<div class="o_info_val fw-bold">Starter • Monthly</div>
|
|
</div>
|
|
<a href="/dashboard/plans" class="o_link_red small">View Plan →</a>
|
|
</div>
|
|
|
|
<!-- Next Billing Date -->
|
|
<div class="o_next_billing_box">
|
|
<i class="fa fa-calendar text-muted me-2"/>
|
|
<div>
|
|
<div class="o_info_label">Next Billing Date</div>
|
|
<div class="o_info_val fw-bold">08 Oct 2026</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
</div>
|
|
</t>
|
|
|
|
<!-- ============================================================== -->
|
|
<!-- 2. TENANT RESTAURANT DB DASHBOARD (Operations & Orders Focused) -->
|
|
<!-- ============================================================== -->
|
|
<t t-else="">
|
|
<div class="o_saas_layout">
|
|
<!-- Left Sidebar (Shared Component) -->
|
|
<t t-call="dine360_dashboard.dashboard_sidebar">
|
|
<t t-set="active_page" t-value="'dashboard'"/>
|
|
</t>
|
|
|
|
<!-- Main Operations Content -->
|
|
<main class="o_saas_main">
|
|
<!-- Top Header Bar (Shared Component) -->
|
|
<t t-call="dine360_dashboard.dashboard_topbar"/>
|
|
|
|
<!-- Page Title & Status Header -->
|
|
<section class="o_page_header">
|
|
<div>
|
|
<h1 class="o_heading_title"><t t-esc="stats['company_name']"/> Dashboard</h1>
|
|
<p class="o_heading_subtitle">Live restaurant operations, online orders, and table status</p>
|
|
</div>
|
|
<div class="o_header_controls">
|
|
<div class="o_status_tag">
|
|
<span class="o_green_dot"/>
|
|
<span>Kitchen Status: Online & Accepting Orders</span>
|
|
</div>
|
|
<div class="o_date_picker_btn">
|
|
<i class="fa fa-calendar me-2 text-muted"/>
|
|
<span>Today, Sep 30, 2026</span>
|
|
</div>
|
|
<a href="/shop" target="_blank" class="o_btn_red_action">
|
|
<i class="fa fa-shopping-bag me-1"/> Storefront
|
|
</a>
|
|
<a href="/pos/web" target="_blank" class="o_btn_red_action" style="background: #111827;">
|
|
<i class="fa fa-desktop me-1"/> POS
|
|
</a>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Row 1: 4 Highlighted KPI Cards -->
|
|
<section class="o_kpi_grid mb-4">
|
|
<!-- KPI 1: Online Orders Today -->
|
|
<div class="o_kpi_card">
|
|
<div class="o_kpi_top">
|
|
<div class="o_kpi_icon_box bg-red-light text-danger">
|
|
<svg width="20" height="20" viewBox="0 0 24 24" fill="#e50000">
|
|
<path d="M21.9 8.2l-1.9-4.7C19.7 2.6 18.8 2 17.8 2H6.2c-1 0-1.9.6-2.2 1.5L2.1 8.2c-.3.7-.1 1.5.4 2 .4.4 1 .7 1.6.7h.1c.9 0 1.7-.5 2.1-1.3l.9-1.8.9 1.8c.4.8 1.2 1.3 2.1 1.3s1.7-.5 2.1-1.3l.9-1.8.9 1.8c.4.8 1.2 1.3 2.1 1.3h.1c.6 0 1.2-.3 1.6-.7.5-.5.7-1.3.4-2zM4 12.1V20c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-7.9c-.6.3-1.3.4-2 .4-1.2 0-2.3-.6-3-1.6-.7 1-1.8 1.6-3 1.6s-2.3-.6-3-1.6c-.7 1-1.8 1.6-3 1.6-.7 0-1.4-.1-2-.5zM10 20v-5h4v5h-4z"/>
|
|
</svg>
|
|
</div>
|
|
<span class="o_kpi_trend text-danger"><i class="fa fa-arrow-up"/> +14%</span>
|
|
</div>
|
|
<div class="o_kpi_label">Online Orders</div>
|
|
<div class="o_kpi_number"><t t-esc="online_orders_data['today_count']"/></div>
|
|
<div class="o_kpi_footer">
|
|
<span class="o_kpi_sub">Received from website</span>
|
|
<svg class="o_sparkline" viewBox="0 0 100 30" preserveAspectRatio="none">
|
|
<path d="M0 25 Q15 28 30 18 T60 22 T80 12 T100 5" fill="none" stroke="#ef4444" stroke-width="2.5" stroke-linecap="round"/>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- KPI 2: Today's Revenue -->
|
|
<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-inr"/>
|
|
</div>
|
|
<span class="o_kpi_trend text-success"><i class="fa fa-arrow-up"/> +8%</span>
|
|
</div>
|
|
<div class="o_kpi_label">Today's Revenue</div>
|
|
<div class="o_kpi_number"><t t-esc="online_orders_data['total_revenue_formatted']"/></div>
|
|
<div class="o_kpi_footer">
|
|
<span class="o_kpi_sub">Across POS & Online</span>
|
|
<svg class="o_sparkline" viewBox="0 0 100 30" preserveAspectRatio="none">
|
|
<path d="M0 25 Q15 28 30 20 T60 15 T80 18 T100 5" fill="none" stroke="#16a34a" stroke-width="2.5" stroke-linecap="round"/>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- KPI 3: Occupied Tables -->
|
|
<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-th"/>
|
|
</div>
|
|
<span class="o_kpi_trend text-warning"><i class="fa fa-arrow-up"/> 67%</span>
|
|
</div>
|
|
<div class="o_kpi_label">Occupied Tables</div>
|
|
<div class="o_kpi_number"><t t-esc="online_orders_data.get('table_stats', {}).get('occupied', 8)"/> / <t t-esc="online_orders_data.get('table_stats', {}).get('total', 12)"/></div>
|
|
<div class="o_kpi_footer">
|
|
<span class="o_kpi_sub">Active floor guests</span>
|
|
<svg class="o_sparkline" viewBox="0 0 100 30" preserveAspectRatio="none">
|
|
<path d="M0 25 Q15 28 30 22 T60 25 T80 15 T100 10" fill="none" stroke="#d97706" stroke-width="2.5" stroke-linecap="round"/>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- KPI 4: Pending Action Orders -->
|
|
<div class="o_kpi_card">
|
|
<div class="o_kpi_top">
|
|
<div class="o_kpi_icon_box bg-gray-light text-secondary">
|
|
<i class="fa fa-clock-o"/>
|
|
</div>
|
|
<span class="o_kpi_trend text-danger"><i class="fa fa-exclamation-circle"/> Action</span>
|
|
</div>
|
|
<div class="o_kpi_label">Pending Orders</div>
|
|
<div class="o_kpi_number"><t t-esc="online_orders_data['pending_count']"/></div>
|
|
<div class="o_kpi_footer">
|
|
<span class="o_kpi_sub">Requires kitchen action</span>
|
|
<svg class="o_sparkline" viewBox="0 0 100 30" preserveAspectRatio="none">
|
|
<path d="M0 25 Q15 28 30 22 T60 20 T80 22 T100 12" fill="none" stroke="#64748b" stroke-width="2.5" stroke-linecap="round"/>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Row 2: 3 Highlighted Widget Cards -->
|
|
<section class="o_middle_grid mb-4">
|
|
<!-- Card 1: Sales & Orders Activity Chart -->
|
|
<div class="o_widget_card o_card_activity">
|
|
<div class="o_card_header">
|
|
<h3 class="o_card_title mb-0">Sales & Orders Activity</h3>
|
|
<div class="o_dropdown_badge">
|
|
<span>Last 7 days</span>
|
|
<i class="fa fa-angle-down ms-1"/>
|
|
</div>
|
|
</div>
|
|
<div class="o_activity_content">
|
|
<!-- Left Chart -->
|
|
<div class="o_chart_wrapper">
|
|
<svg class="o_activity_svg" viewBox="0 0 450 180" preserveAspectRatio="none">
|
|
<!-- Grid Lines -->
|
|
<line x1="30" y1="20" x2="440" y2="20" stroke="#f1f5f9" stroke-width="1" stroke-dasharray="3 3"/>
|
|
<line x1="30" y1="55" x2="440" y2="55" stroke="#f1f5f9" stroke-width="1" stroke-dasharray="3 3"/>
|
|
<line x1="30" y1="90" x2="440" y2="90" stroke="#f1f5f9" stroke-width="1" stroke-dasharray="3 3"/>
|
|
<line x1="30" y1="125" x2="440" y2="125" stroke="#f1f5f9" stroke-width="1" stroke-dasharray="3 3"/>
|
|
<line x1="30" y1="160" x2="440" y2="160" stroke="#e2e8f0" stroke-width="1"/>
|
|
|
|
<!-- Y-Axis Labels -->
|
|
<text x="15" y="24" fill="#94a3b8" font-size="10" text-anchor="middle">40</text>
|
|
<text x="15" y="59" fill="#94a3b8" font-size="10" text-anchor="middle">30</text>
|
|
<text x="15" y="94" fill="#94a3b8" font-size="10" text-anchor="middle">20</text>
|
|
<text x="15" y="129" fill="#94a3b8" font-size="10" text-anchor="middle">10</text>
|
|
<text x="15" y="163" fill="#94a3b8" font-size="10" text-anchor="middle">0</text>
|
|
|
|
<!-- Vertical Pink Bars -->
|
|
<rect x="52" y="100" width="16" height="60" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
<rect x="110" y="70" width="16" height="90" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
<rect x="168" y="90" width="16" height="70" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
<rect x="226" y="60" width="16" height="100" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
<rect x="284" y="80" width="16" height="80" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
<rect x="342" y="65" width="16" height="95" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
<rect x="400" y="45" width="16" height="115" rx="3" fill="#fee2e2" opacity="0.8"/>
|
|
|
|
<!-- Smooth Curved Red Spline Line -->
|
|
<path d="M 60 135 C 90 120, 100 80, 118 78 C 135 76, 155 110, 176 100 C 195 90, 215 65, 234 68 C 255 70, 275 105, 292 90 C 315 72, 335 70, 350 68 C 375 65, 395 50, 408 48" fill="none" stroke="#e50000" stroke-width="3" stroke-linecap="round"/>
|
|
|
|
<!-- Data Points -->
|
|
<circle cx="60" cy="135" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
<circle cx="118" cy="78" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
<circle cx="176" cy="100" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
<circle cx="234" cy="68" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
<circle cx="292" cy="90" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
<circle cx="350" cy="68" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
<circle cx="408" cy="48" r="4.5" fill="#ffffff" stroke="#e50000" stroke-width="2.5"/>
|
|
</svg>
|
|
<!-- X-Axis Labels -->
|
|
<div class="o_xaxis_labels">
|
|
<span>Sep 24</span>
|
|
<span>Sep 25</span>
|
|
<span>Sep 26</span>
|
|
<span>Sep 27</span>
|
|
<span>Sep 28</span>
|
|
<span>Sep 29</span>
|
|
<span>Sep 30</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Right Stats List -->
|
|
<div class="o_substats_col">
|
|
<div class="o_substat_item">
|
|
<div class="o_substat_icon_box">
|
|
<i class="fa fa-calendar text-danger"/>
|
|
</div>
|
|
<div>
|
|
<div class="o_substat_title">Reservations</div>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<span class="o_substat_val">185</span>
|
|
<span class="o_substat_pct text-success"><i class="fa fa-arrow-up"/> +12%</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="o_substat_item">
|
|
<div class="o_substat_icon_box">
|
|
<i class="fa fa-shopping-bag text-danger"/>
|
|
</div>
|
|
<div>
|
|
<div class="o_substat_title">Online Orders</div>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<span class="o_substat_val">1,248</span>
|
|
<span class="o_substat_pct text-success"><i class="fa fa-arrow-up"/> +8%</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="o_substat_item">
|
|
<div class="o_substat_icon_box">
|
|
<i class="fa fa-inr text-danger"/>
|
|
</div>
|
|
<div>
|
|
<div class="o_substat_title">Avg. Ticket Value</div>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<span class="o_substat_val">₹642</span>
|
|
<span class="o_substat_pct text-success"><i class="fa fa-arrow-up"/> +6%</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Card 2: Fast App Launchers -->
|
|
<div class="o_widget_card">
|
|
<div class="o_card_header">
|
|
<h3 class="o_card_title mb-0">Fast App Launchers</h3>
|
|
<a href="/web#action=base.open_module_tree" class="o_link_red">All Apps</a>
|
|
</div>
|
|
<div class="o_quick_apps_grid">
|
|
<a href="/shop" target="_blank" class="o_app_card">
|
|
<div class="o_app_card_icon bg-red-light text-danger">
|
|
<i class="fa fa-shopping-bag"/>
|
|
</div>
|
|
<div>
|
|
<div class="o_app_card_name">Online Order</div>
|
|
<div class="o_app_card_badge text-danger fw-bold">Live Store</div>
|
|
</div>
|
|
</a>
|
|
|
|
<a href="/pos/web" target="_blank" class="o_app_card">
|
|
<div class="o_app_card_icon bg-green-light text-success">
|
|
<i class="fa fa-desktop"/>
|
|
</div>
|
|
<div>
|
|
<div class="o_app_card_name">POS Terminal</div>
|
|
<div class="o_app_card_badge text-success">Registers</div>
|
|
</div>
|
|
</a>
|
|
|
|
<a href="/web#action=dine360_table.action_restaurant_table_form" class="o_app_card">
|
|
<div class="o_app_card_icon bg-amber-light text-warning">
|
|
<i class="fa fa-th"/>
|
|
</div>
|
|
<div>
|
|
<div class="o_app_card_name">Tables</div>
|
|
<div class="o_app_card_badge">Floor Plan</div>
|
|
</div>
|
|
</a>
|
|
|
|
<a href="/web#action=dine360_reservation.action_restaurant_reservation" class="o_app_card">
|
|
<div class="o_app_card_icon bg-gray-light text-secondary">
|
|
<i class="fa fa-calendar"/>
|
|
</div>
|
|
<div>
|
|
<div class="o_app_card_name">Reservations</div>
|
|
<div class="o_app_card_badge">Bookings</div>
|
|
</div>
|
|
</a>
|
|
|
|
<a href="/web#action=product.product_template_action" class="o_app_card">
|
|
<div class="o_app_card_icon bg-red-light text-danger">
|
|
<i class="fa fa-cutlery"/>
|
|
</div>
|
|
<div>
|
|
<div class="o_app_card_name">Menu Dishes</div>
|
|
<div class="o_app_card_badge">Pricing</div>
|
|
</div>
|
|
</a>
|
|
|
|
<a href="/web#action=stock.stock_picking_type_action" class="o_app_card">
|
|
<div class="o_app_card_icon bg-amber-light text-warning">
|
|
<i class="fa fa-cubes"/>
|
|
</div>
|
|
<div>
|
|
<div class="o_app_card_name">Inventory</div>
|
|
<div class="o_app_card_badge">Ingredients</div>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Card 3: Kitchen & Operations Readiness -->
|
|
<div class="o_widget_card o_card_progress">
|
|
<div class="o_card_header">
|
|
<h3 class="o_card_title mb-0">Kitchen Readiness</h3>
|
|
</div>
|
|
<div class="o_donut_container">
|
|
<svg class="o_donut_svg" viewBox="0 0 100 100">
|
|
<circle cx="50" cy="50" r="40" fill="none" stroke="#f8fafc" stroke-width="9"/>
|
|
<circle cx="50" cy="50" r="40" fill="none" stroke="#bbf7d0" stroke-width="9"/>
|
|
<circle cx="50" cy="50" r="40" fill="none" stroke="#16a34a" stroke-width="9"
|
|
stroke-linecap="round"
|
|
stroke-dasharray="251.2"
|
|
stroke-dashoffset="15"
|
|
transform="rotate(-90 50 50)"/>
|
|
<text x="50" y="48" text-anchor="middle" font-size="16" font-weight="800" fill="#0f172a">94%</text>
|
|
<text x="50" y="62" text-anchor="middle" font-size="9" font-weight="600" fill="#16a34a">Ready</text>
|
|
</svg>
|
|
</div>
|
|
|
|
<div class="o_stepper_list">
|
|
<div class="o_step_item completed">
|
|
<div class="o_step_icon_wrapper">
|
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
<circle cx="10" cy="10" r="10" fill="#16a34a"/>
|
|
<path d="M6 10L9 13L14 7" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
</svg>
|
|
</div>
|
|
<div>
|
|
<div class="o_step_name">Online Storefront</div>
|
|
<div class="o_step_state text-success fw-bold">Open & Accepting</div>
|
|
</div>
|
|
</div>
|
|
<div class="o_step_item completed">
|
|
<div class="o_step_icon_wrapper">
|
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
<circle cx="10" cy="10" r="10" fill="#16a34a"/>
|
|
<path d="M6 10L9 13L14 7" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
</svg>
|
|
</div>
|
|
<div>
|
|
<div class="o_step_name">Kitchen Display (KDS)</div>
|
|
<div class="o_step_state text-success fw-bold">Screen Connected</div>
|
|
</div>
|
|
</div>
|
|
<div class="o_step_item active">
|
|
<div class="o_step_icon_wrapper">
|
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
<circle cx="10" cy="10" r="9" stroke="#e50000" stroke-width="2" fill="white"/>
|
|
<circle cx="10" cy="10" r="4.5" fill="#e50000"/>
|
|
</svg>
|
|
</div>
|
|
<div>
|
|
<div class="o_step_name">Table Floor Plan</div>
|
|
<div class="o_step_state text-danger fw-bold">Active Guests</div>
|
|
</div>
|
|
</div>
|
|
<div class="o_step_item completed">
|
|
<div class="o_step_icon_wrapper">
|
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
<circle cx="10" cy="10" r="10" fill="#16a34a"/>
|
|
<path d="M6 10L9 13L14 7" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
</svg>
|
|
</div>
|
|
<div>
|
|
<div class="o_step_name">POS Terminal</div>
|
|
<div class="o_step_state text-muted">Ready</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Row 3: 2 Highlighted Bottom Cards -->
|
|
<section class="o_bottom_grid">
|
|
<!-- Card 1: Live Restaurant Online Orders (Wide) -->
|
|
<div class="o_widget_card o_card_restaurants_table">
|
|
<div class="o_card_header">
|
|
<div class="d-flex align-items-center gap-2">
|
|
<h3 class="o_card_title mb-0">Live Restaurant Online Orders</h3>
|
|
<span class="o_count_pill"><t t-esc="online_orders_data['today_count']"/> Active</span>
|
|
</div>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<a href="/shop" target="_blank" class="o_btn_red_small">
|
|
<i class="fa fa-shopping-bag me-1"/> Storefront
|
|
</a>
|
|
<a href="/web#action=sale.action_quotations_with_onboarding" class="o_btn_white_small">
|
|
View All Orders
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="table-responsive">
|
|
<table class="table o_orders_table align-middle mb-0">
|
|
<thead>
|
|
<tr>
|
|
<th>Order #</th>
|
|
<th>Customer</th>
|
|
<th>Date & Time</th>
|
|
<th>Total Amount</th>
|
|
<th>Status</th>
|
|
<th class="text-end">Action</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<t t-foreach="online_orders_data['orders']" t-as="order_item">
|
|
<tr>
|
|
<td class="font-monospace fw-bold text-dark">
|
|
<t t-esc="order_item['name']"/>
|
|
</td>
|
|
<td>
|
|
<i class="fa fa-user-circle me-1 text-danger"/>
|
|
<span class="fw-bold"><t t-esc="order_item['customer']"/></span>
|
|
<div class="small text-muted"><t t-esc="order_item.get('phone', '')"/></div>
|
|
</td>
|
|
<td class="text-muted small">
|
|
<t t-esc="order_item['date']"/>
|
|
</td>
|
|
<td class="fw-bold text-dark font-monospace fs-6">
|
|
<t t-esc="order_item['amount']"/>
|
|
</td>
|
|
<td>
|
|
<t t-if="order_item['status'] == 'pending'">
|
|
<span class="o_act_badge o_act_badge_login text-danger">● Pending Action</span>
|
|
</t>
|
|
<t t-elif="order_item['status'] == 'confirmed'">
|
|
<span class="o_act_badge o_act_badge_success">● Confirmed</span>
|
|
</t>
|
|
<t t-elif="order_item['status'] == 'cooking'">
|
|
<span class="o_act_badge o_act_badge_info">● Cooking in Kitchen</span>
|
|
</t>
|
|
<t t-elif="order_item['status'] == 'delivered'">
|
|
<span class="o_act_badge o_act_badge_completed">● Delivered</span>
|
|
</t>
|
|
<t t-else="">
|
|
<span class="o_act_badge o_act_badge_info"><t t-esc="order_item['status']"/></span>
|
|
</t>
|
|
</td>
|
|
<td class="text-end">
|
|
<a t-att-href="order_item['url']" class="o_btn_view_order">
|
|
View Details
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
</t>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Card 2: Inventory Health & Alerts -->
|
|
<div class="o_widget_card o_card_sub_health">
|
|
<div class="o_card_header">
|
|
<h3 class="o_card_title mb-0">Inventory & Kitchen Health</h3>
|
|
<span class="fw-bold text-success">98%</span>
|
|
</div>
|
|
|
|
<!-- Progress bar -->
|
|
<div class="o_health_bar_container">
|
|
<div class="o_health_bar_fill" style="width: 98%;"/>
|
|
</div>
|
|
|
|
<!-- Low Stock or Success Alert -->
|
|
<t t-if="low_stock_products">
|
|
<div class="o_health_alert" style="background: #fff1f2; border-color: #fecaca; border-left-color: #ef4444; color: #b91c1c;">
|
|
<i class="fa fa-exclamation-triangle text-danger me-2"/>
|
|
<span><t t-esc="len(low_stock_products)"/> Ingredient(s) running low on stock!</span>
|
|
</div>
|
|
<div class="d-flex flex-column gap-2 mb-3">
|
|
<t t-foreach="low_stock_products[:3]" t-as="prod">
|
|
<div class="d-flex justify-content-between align-items-center p-2 rounded bg-light border small">
|
|
<span class="fw-bold"><t t-esc="prod.name"/></span>
|
|
<span class="text-danger fw-bold"><t t-esc="prod.qty_available"/> <t t-esc="prod.uom_id.name"/></span>
|
|
</div>
|
|
</t>
|
|
</div>
|
|
</t>
|
|
<t t-else="">
|
|
<div class="o_health_alert">
|
|
<i class="fa fa-check-circle text-success me-2"/>
|
|
<span>All ingredients are in healthy stock levels.</span>
|
|
</div>
|
|
</t>
|
|
|
|
<!-- Operations Quick Links -->
|
|
<div class="o_health_plan_row">
|
|
<div>
|
|
<div class="o_info_label">Ingredient Reorder</div>
|
|
<div class="o_info_val fw-bold">Stock Management</div>
|
|
</div>
|
|
<a href="/web#action=stock.stock_picking_type_action" class="o_link_red small">Manage Stock →</a>
|
|
</div>
|
|
|
|
<div class="o_next_billing_box">
|
|
<i class="fa fa-cutlery text-danger me-2"/>
|
|
<div>
|
|
<div class="o_info_label">Kitchen KDS Terminal</div>
|
|
<div class="o_info_val fw-bold">Active & Online</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
</div>
|
|
</t>
|
|
|
|
<!-- MODAL: Onboard New Restaurant -->
|
|
<div id="modalOnboardRestaurant" class="o_dine_modal">
|
|
<div class="o_modal_backdrop"/>
|
|
<div class="o_modal_dialog">
|
|
<div class="o_modal_header">
|
|
<div class="d-flex align-items-center gap-2">
|
|
<div class="o_settings_icon" style="width:34px;height:34px;font-size:15px;">
|
|
<i class="fa fa-cutlery"/>
|
|
</div>
|
|
<h4 class="o_modal_title">Onboard New Restaurant</h4>
|
|
</div>
|
|
<button type="button" class="o_modal_close_btn o_modal_close">&times;</button>
|
|
</div>
|
|
|
|
<form id="formOnboardRestaurant">
|
|
<div class="o_modal_body">
|
|
<div class="row">
|
|
<div class="col-md-6 o_form_group">
|
|
<label class="o_form_label">Restaurant Name *</label>
|
|
<input type="text" name="name" required="required" placeholder="e.g. Royal Bistro" class="o_form_control"/>
|
|
</div>
|
|
<div class="col-md-6 o_form_group">
|
|
<label class="o_form_label">Owner Full Name *</label>
|
|
<input type="text" name="owner_name" required="required" placeholder="e.g. John Doe" class="o_form_control"/>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6 o_form_group">
|
|
<label class="o_form_label">Owner Email *</label>
|
|
<input type="email" name="email" required="required" placeholder="owner@restaurant.com" class="o_form_control"/>
|
|
</div>
|
|
<div class="col-md-6 o_form_group">
|
|
<label class="o_form_label">Contact Phone *</label>
|
|
<input type="tel" name="phone" required="required" placeholder="+91 98765 43210" class="o_form_control"/>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6 o_form_group">
|
|
<label class="o_form_label">Subscription Plan *</label>
|
|
<select name="plan_id" class="o_form_control" required="required">
|
|
<t t-foreach="plans" t-as="plan">
|
|
<option t-att-value="plan['id']"><t t-esc="plan['name']"/> ($<t t-esc="plan['price_monthly']"/>/mo)</option>
|
|
</t>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-6 o_form_group">
|
|
<label class="o_form_label">Billing Cycle *</label>
|
|
<select name="billing_cycle" class="o_form_control">
|
|
<option value="monthly">Monthly Billing</option>
|
|
<option value="yearly">Annual Billing (Save 20%)</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="o_form_group">
|
|
<label class="o_form_label">Tenant Subdomain *</label>
|
|
<div class="d-flex align-items-center gap-1">
|
|
<input type="text" name="subdomain" required="required" placeholder="royalbistro" class="o_form_control font-monospace"/>
|
|
<span class="text-muted small fw-bold">.dine360.com</span>
|
|
</div>
|
|
<small class="text-muted">A dedicated PostgreSQL database and workspace will be provisioned automatically.</small>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="o_modal_footer">
|
|
<button type="button" class="btn btn-light o_modal_close">Cancel</button>
|
|
<button type="submit" class="o_btn_red_action">
|
|
<i class="fa fa-rocket me-1"/> Provision & Launch Database
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</t>
|
|
</template>
|
|
</odoo>
|