Alaguraj0361 b9d5617051 Add SaaS multi-tenant models and views for restaurant management
- Introduced `saas.plan` model to define subscription plans with limits and pricing.
- Created `saas.restaurant` model to manage restaurant tenants, including database provisioning and subscription management.
- Implemented views for managing SaaS plans and restaurant tenants, including tree and form views.
- Added security access rights for the new models.
- Developed a backup management view for database backups.
- Updated menu structure to include new SaaS management options.
- Added Docker and deployment configurations for PostgreSQL, Redis, and Odoo services.
- Included scaling guide and backup scripts for production environments.
- Enhanced theme with new images and layout adjustments.
2026-06-19 15:03:51 +05:30

117 lines
5.4 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Tree View -->
<record id="view_saas_restaurant_tree" model="ir.ui.view">
<field name="name">saas.restaurant.tree</field>
<field name="model">saas.restaurant</field>
<field name="arch" type="xml">
<tree string="Restaurants">
<field name="name"/>
<field name="owner_name"/>
<field name="email"/>
<field name="subdomain"/>
<field name="plan_id"/>
<field name="status" widget="badge" decoration-success="status == 'active'" decoration-info="status == 'draft'" decoration-danger="status == 'suspended' or status == 'expired'"/>
<field name="expiry_date"/>
</tree>
</field>
</record>
<!-- Form View -->
<record id="view_saas_restaurant_form" model="ir.ui.view">
<field name="name">saas.restaurant.form</field>
<field name="model">saas.restaurant</field>
<field name="arch" type="xml">
<form string="Restaurant Tenant">
<header>
<button name="action_create_database" string="Provision Database" type="object" class="oe_highlight" invisible="status != 'draft'"/>
<button name="action_suspend" string="Suspend Subscription" type="object" class="btn-danger" invisible="status != 'active'"/>
<button name="action_activate" string="Activate Subscription" type="object" class="oe_highlight" invisible="status not in ['suspended', 'expired']"/>
<field name="status" widget="statusbar" statusbar_visible="draft,active,suspended,expired"/>
</header>
<sheet>
<field name="logo" widget="image" class="oe_avatar" options="{'preview_image': 'logo'}"/>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1>
<field name="name" placeholder="Restaurant Name"/>
</h1>
</div>
<group>
<group string="Owner Information">
<field name="owner_name"/>
<field name="email"/>
<field name="phone"/>
</group>
<group string="Address">
<field name="street"/>
<field name="city"/>
<field name="country_id"/>
</group>
</group>
<group>
<group string="Tenant Deployment">
<field name="database_name"/>
<field name="subdomain"/>
</group>
<group string="Subscription Details">
<field name="plan_id"/>
<field name="billing_cycle"/>
<field name="start_date"/>
<field name="expiry_date"/>
</group>
</group>
<group>
<group string="Localizations">
<field name="currency_id"/>
<field name="timezone"/>
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
<!-- Search View -->
<record id="view_saas_restaurant_search" model="ir.ui.view">
<field name="name">saas.restaurant.search</field>
<field name="model">saas.restaurant</field>
<field name="arch" type="xml">
<search string="Search Restaurants">
<field name="name"/>
<field name="owner_name"/>
<field name="email"/>
<field name="subdomain"/>
<filter string="Draft" name="status_draft" domain="[('status', '=', 'draft')]"/>
<filter string="Active" name="status_active" domain="[('status', '=', 'active')]"/>
<filter string="Suspended" name="status_suspended" domain="[('status', '=', 'suspended')]"/>
<filter string="Expired" name="status_expired" domain="[('status', '=', 'expired')]"/>
<group expand="0" string="Group By">
<filter string="Plan" name="group_by_plan" context="{'group_by': 'plan_id'}"/>
<filter string="Status" name="group_by_status" context="{'group_by': 'status'}"/>
</group>
</search>
</field>
</record>
<!-- Action -->
<record id="action_saas_restaurant" model="ir.actions.act_window">
<field name="name">Restaurants</field>
<field name="res_model">saas.restaurant</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_saas_restaurant_search"/>
</record>
<!-- Menuitem -->
<menuitem id="menu_saas_restaurant"
name="Restaurants List"
parent="menu_saas_tenants"
action="action_saas_restaurant"
sequence="10"/>
</odoo>