Browse Source

Jan 06 : [ADD] Initial Commit 'table_reservation_on_website'

pull/254/merge
RisvanaCybro 1 year ago
parent
commit
b62587351e
  1. 46
      table_reservation_on_website/README.rst
  2. 23
      table_reservation_on_website/__init__.py
  3. 63
      table_reservation_on_website/__manifest__.py
  4. 23
      table_reservation_on_website/controllers/__init__.py
  5. 67
      table_reservation_on_website/controllers/main.py
  6. 217
      table_reservation_on_website/controllers/table_reservation_on_website.py
  7. 18
      table_reservation_on_website/data/product_product_data.xml
  8. 13
      table_reservation_on_website/data/table_reservation_data.xml
  9. 7
      table_reservation_on_website/doc/RELEASE_NOTES.md
  10. 25
      table_reservation_on_website/models/__init__.py
  11. 37
      table_reservation_on_website/models/pos_config.py
  12. 29
      table_reservation_on_website/models/restaurant_table.py
  13. 42
      table_reservation_on_website/models/sale_order.py
  14. 139
      table_reservation_on_website/models/table_reservation.py
  15. 2
      table_reservation_on_website/security/ir.model.access.csv
  16. BIN
      table_reservation_on_website/static/description/assets/icons/check.png
  17. BIN
      table_reservation_on_website/static/description/assets/icons/chevron.png
  18. BIN
      table_reservation_on_website/static/description/assets/icons/cogs.png
  19. BIN
      table_reservation_on_website/static/description/assets/icons/consultation.png
  20. BIN
      table_reservation_on_website/static/description/assets/icons/ecom-black.png
  21. BIN
      table_reservation_on_website/static/description/assets/icons/education-black.png
  22. BIN
      table_reservation_on_website/static/description/assets/icons/hotel-black.png
  23. BIN
      table_reservation_on_website/static/description/assets/icons/license.png
  24. BIN
      table_reservation_on_website/static/description/assets/icons/lifebuoy.png
  25. BIN
      table_reservation_on_website/static/description/assets/icons/logo.png
  26. BIN
      table_reservation_on_website/static/description/assets/icons/manufacturing-black.png
  27. BIN
      table_reservation_on_website/static/description/assets/icons/pos-black.png
  28. BIN
      table_reservation_on_website/static/description/assets/icons/puzzle.png
  29. BIN
      table_reservation_on_website/static/description/assets/icons/restaurant-black.png
  30. BIN
      table_reservation_on_website/static/description/assets/icons/service-black.png
  31. BIN
      table_reservation_on_website/static/description/assets/icons/trading-black.png
  32. BIN
      table_reservation_on_website/static/description/assets/icons/training.png
  33. BIN
      table_reservation_on_website/static/description/assets/icons/update.png
  34. BIN
      table_reservation_on_website/static/description/assets/icons/user.png
  35. BIN
      table_reservation_on_website/static/description/assets/icons/wrench.png
  36. BIN
      table_reservation_on_website/static/description/assets/misc/categories.png
  37. BIN
      table_reservation_on_website/static/description/assets/misc/check-box.png
  38. BIN
      table_reservation_on_website/static/description/assets/misc/compass.png
  39. BIN
      table_reservation_on_website/static/description/assets/misc/corporate.png
  40. BIN
      table_reservation_on_website/static/description/assets/misc/customer-support.png
  41. BIN
      table_reservation_on_website/static/description/assets/misc/cybrosys-logo.png
  42. BIN
      table_reservation_on_website/static/description/assets/misc/features.png
  43. BIN
      table_reservation_on_website/static/description/assets/misc/logo.png
  44. BIN
      table_reservation_on_website/static/description/assets/misc/pictures.png
  45. BIN
      table_reservation_on_website/static/description/assets/misc/pie-chart.png
  46. BIN
      table_reservation_on_website/static/description/assets/misc/right-arrow.png
  47. BIN
      table_reservation_on_website/static/description/assets/misc/star.png
  48. BIN
      table_reservation_on_website/static/description/assets/misc/support.png
  49. BIN
      table_reservation_on_website/static/description/assets/misc/whatsapp.png
  50. BIN
      table_reservation_on_website/static/description/assets/modules/delivery_date_ecommerce.png
  51. BIN
      table_reservation_on_website/static/description/assets/modules/openai_website_product_media.png
  52. BIN
      table_reservation_on_website/static/description/assets/modules/product_brand_ecommerce.png
  53. BIN
      table_reservation_on_website/static/description/assets/modules/website_multi_variant.png
  54. BIN
      table_reservation_on_website/static/description/assets/modules/website_repeat_sale.png
  55. BIN
      table_reservation_on_website/static/description/assets/modules/wishlist_product_website_backend.png
  56. BIN
      table_reservation_on_website/static/description/assets/screenshots/1.png
  57. BIN
      table_reservation_on_website/static/description/assets/screenshots/10.png
  58. BIN
      table_reservation_on_website/static/description/assets/screenshots/11.png
  59. BIN
      table_reservation_on_website/static/description/assets/screenshots/12.png
  60. BIN
      table_reservation_on_website/static/description/assets/screenshots/13.png
  61. BIN
      table_reservation_on_website/static/description/assets/screenshots/14.png
  62. BIN
      table_reservation_on_website/static/description/assets/screenshots/15.png
  63. BIN
      table_reservation_on_website/static/description/assets/screenshots/16.png
  64. BIN
      table_reservation_on_website/static/description/assets/screenshots/17.png
  65. BIN
      table_reservation_on_website/static/description/assets/screenshots/18.png
  66. BIN
      table_reservation_on_website/static/description/assets/screenshots/2.png
  67. BIN
      table_reservation_on_website/static/description/assets/screenshots/3.png
  68. BIN
      table_reservation_on_website/static/description/assets/screenshots/4.png
  69. BIN
      table_reservation_on_website/static/description/assets/screenshots/5.png
  70. BIN
      table_reservation_on_website/static/description/assets/screenshots/6.png
  71. BIN
      table_reservation_on_website/static/description/assets/screenshots/7.png
  72. BIN
      table_reservation_on_website/static/description/assets/screenshots/8.png
  73. BIN
      table_reservation_on_website/static/description/assets/screenshots/hero.gif
  74. BIN
      table_reservation_on_website/static/description/banner.png
  75. BIN
      table_reservation_on_website/static/description/icon.png
  76. 648
      table_reservation_on_website/static/description/index.html
  77. BIN
      table_reservation_on_website/static/img/table.png
  78. BIN
      table_reservation_on_website/static/src/images/logo.jpg
  79. 46
      table_reservation_on_website/static/src/js/FloorScreen.js
  80. 23
      table_reservation_on_website/static/src/js/PaymentScreen.js
  81. 41
      table_reservation_on_website/static/src/js/reservation_floor.js
  82. 43
      table_reservation_on_website/static/src/js/table_reservation.js
  83. 32
      table_reservation_on_website/views/pos_config_views.xml
  84. 16
      table_reservation_on_website/views/restaurant_floor_views.xml
  85. 14
      table_reservation_on_website/views/restaurant_table_views.xml
  86. 20
      table_reservation_on_website/views/sale_order_views.xml
  87. 10
      table_reservation_on_website/views/table_reservation_on_website_menus.xml
  88. 237
      table_reservation_on_website/views/table_reservation_templates.xml
  89. 72
      table_reservation_on_website/views/table_reservation_views.xml
  90. 24
      table_reservation_on_website/views/table_reserved_templates.xml

46
table_reservation_on_website/README.rst

@ -0,0 +1,46 @@
.. image:: https://img.shields.io/badge/license-LGPL--3-green.svg
:target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
Table Reservation on Website
============================
This Module allows to reserve table through website
Configuration
=============
* No additional configurations needed
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
License
-------
Lesser General Public License, Version 3 (LGPL v3).
(https://www.gnu.org/licenses/lgpl-3.0-standalone.html)
Credits
-------
Developer: (V15) Fathima Mazlin AM, Contact: odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

23
table_reservation_on_website/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Fathima Mazlin AM(odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE (LGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###############################################################################
from . import controllers
from . import models

63
table_reservation_on_website/__manifest__.py

@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Fathima Mazlin AM(odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE (LGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###############################################################################
{
'name': 'Table Reservation on Website',
'version': '15.0.1.0.0',
'category': 'eCommerce,Point of Sale',
'summary': 'We can reserve table through website',
'description': 'We can reserve table through website. And also user can '
'choose their table on website. Table, and other '
'information is fetch from point of sale',
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'depends': ['base', 'website_sale', 'pos_restaurant'],
'data': [
'security/ir.model.access.csv',
'data/table_reservation_data.xml',
'data/product_product_data.xml',
'views/table_reservation_templates.xml',
'views/table_reservation_on_website_menus.xml',
'views/restaurant_table_views.xml',
'views/restaurant_floor_views.xml',
'views/table_reservation_views.xml',
'views/sale_order_views.xml',
'views/table_reserved_templates.xml',
'views/pos_config_views.xml',
],
'assets': {
'point_of_sale.assets': [
'table_reservation_on_website/static/src/js/PaymentScreen.js',
'table_reservation_on_website/static/src/js/FloorScreen.js',
],
'web.assets_frontend': [
'table_reservation_on_website/static/src/js/table_reservation.js',
'table_reservation_on_website/static/src/js/reservation_floor.js',
],
},
'images': ['static/description/banner.png'],
'license': 'LGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

23
table_reservation_on_website/controllers/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Fathima Mazlin AM(odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE (LGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###############################################################################
from . import main
from . import table_reservation_on_website

67
table_reservation_on_website/controllers/main.py

@ -0,0 +1,67 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Fathima Mazlin AM (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import http
from odoo.http import request
from odoo.addons.website_sale.controllers.main import WebsiteSale
from odoo.addons.payment.controllers.post_processing import PaymentPostProcessing
class WebsiteSalePayment(WebsiteSale):
"""For creating new record for table reservation """
@http.route('/shop/payment/validate', type='http', auth="public",
website=True, sitemap=False)
def shop_payment_validate(self, sale_order_id=None, **post):
"""Payment Validate page"""
if sale_order_id is None:
order = request.website.sale_get_order()
if not order and 'sale_last_order_id' in request.session:
last_order_id = request.session['sale_last_order_id']
order = request.env['sale.order'].sudo().browse(
last_order_id).exists()
else:
order = request.env['sale.order'].sudo().browse(sale_order_id)
assert order.id == request.session.get('sale_last_order_id')
tx = order.get_portal_last_transaction() if order else order.env[
'payment.transaction']
if order:
reservation = request.env['table.reservation'].sudo().create({
"customer_id": request.env.user.partner_id.id,
"booked_tables_ids": order.tables_ids,
"floor_id": order.floors,
"date": order.date,
"starting_at": order.starting_at,
"ending_at": order.ending_at,
'booking_amount': order.booking_amount,
'state': 'reserved',
})
order.table_reservation_id = reservation.id
if not order or (order.amount_total and not tx):
return request.redirect('/shop')
if order and not order.amount_total and not tx:
order.with_context(send_email=True).action_confirm()
return request.redirect(order.get_portal_url())
request.website.sale_reset()
if tx and tx.state == 'draft':
return request.redirect('/shop')
PaymentPostProcessing.remove_transactions(tx)
return request.redirect('/shop/confirmation')

217
table_reservation_on_website/controllers/table_reservation_on_website.py

@ -0,0 +1,217 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Fathima Mazlin AM (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from datetime import datetime, timedelta
from odoo import http
from odoo.http import request
class TableReservation(http.Controller):
"""For table reservation"""
@http.route(['/table_reservation'], type='http', auth='user', website=True)
def table_reservation(self):
"""For render table reservation template"""
return http.request.render(
"table_reservation_on_website.table_reservation", {})
@http.route(['/restaurant/floors'], type='http', auth='user', website=True)
def restaurant_floors(self, **kwargs):
"""To get floor details"""
floors = request.env['restaurant.floor'].search([])
payment = request.env['pos.config'].search([])
for rec in payment:
if rec.module_pos_restaurant:
payment_status = rec.reservation_charge
refund = rec.refund
vals = {
'floors': floors,
'date': kwargs.get('date'),
'start_time': kwargs.get('start_time'),
'end_time': kwargs.get('end_time'),
'payment': payment_status,
'refund': refund,
}
return http.request.render(
"table_reservation_on_website.restaurant_floors", vals)
@http.route(['/restaurant/floors/tables'], type='json', auth='user',
website=True)
def restaurant_floors_tables(self, **kwargs):
"""To get non-reserved table details"""
table_inbetween = []
payment = request.env['pos.config'].search([])
for rec in payment:
if rec.module_pos_restaurant:
payment_status = rec.reservation_charge
tables = request.env['restaurant.table'].search([('floor_id', '=',
int(kwargs.get(
'floors_id')))])
reserved = request.env['table.reservation'].search([(
'floor_id', '=', int(kwargs.get('floors_id'))), (
'date', '=', datetime.strptime(kwargs.get('date'), "%Y-%m-%d")), (
'state', '=', 'reserved')])
start_time_new = datetime.strptime(kwargs.get("start"), "%H:%M").time()
for rec in reserved:
start_at = datetime.strptime(rec.starting_at, "%H:%M").time()
end_at = datetime.strptime(rec.ending_at, "%H:%M").time()
if start_at <= start_time_new <= end_at:
for table in rec.booked_tables_ids:
table_inbetween.append(table.id)
data_tables = {}
for rec in tables:
if rec.id not in table_inbetween:
if payment_status:
data_tables[rec.id] = {}
data_tables[rec.id]['id'] = rec.id
data_tables[rec.id]['name'] = rec.name
data_tables[rec.id]['seats'] = rec.seats
data_tables[rec.id]['rate'] = rec.rate
else:
data_tables[rec.id] = {}
data_tables[rec.id]['id'] = rec.id
data_tables[rec.id]['name'] = rec.name
data_tables[rec.id]['seats'] = rec.seats
data_tables[rec.id]['rate'] = 0
return data_tables
@http.route(['/booking/confirm'], type="http", auth="public",
csrf=False, website=True)
def booking_confirm(self, **kwargs):
"""For booking tables"""
company = request.env.company
list_tables = [rec for rec in kwargs.get("tables").split(',')]
record_tables = request.env['restaurant.table'].search(
[('id', 'in', list_tables)])
amount = [rec.rate for rec in record_tables]
payment = request.env['pos.config'].search([])
for rec in payment:
if rec.module_pos_restaurant:
payment_status = rec.reservation_charge
if payment_status:
table = request.env.ref(
'table_reservation_on_website'
'.product_product_table_booking')
table.write({
'list_price': sum(amount)
})
sale_order = request.website.sale_get_order(force_create=True)
if sale_order.state != 'draft':
request.session['sale_order_id'] = None
sale_order = request.website.sale_get_order(force_create=True)
sale_order.sudo().write({
'tables_ids': record_tables,
'floors': kwargs.get('floors'),
'date': kwargs.get('date'),
'starting_at': kwargs.get('start_time'),
"ending_at": kwargs.get('end_time'),
'booking_amount': sum(amount),
'order_line': [
(0, 0, {
'name': request.env.ref(
'table_reservation_on_website'
'.product_product_table_booking').name,
'product_id': request.env.ref(
'table_reservation_on_website'
'.product_product_table_booking').id,
'product_uom_qty': 1,
'price_unit': sum(amount),
})],
})
sale_order.website_id = request.env['website'].search(
[('company_id',
'=',
company.id)],
limit=1)
return request.redirect("/shop/cart")
else:
request.env['table.reservation'].sudo().create({
"customer_id": request.env.user.partner_id.id,
"booked_tables_ids": record_tables,
"floor_id": kwargs.get('floors'),
"date": kwargs.get('date'),
"starting_at": kwargs.get('start_time'),
"ending_at": kwargs.get('end_time'),
'booking_amount': 0,
'state': 'reserved',
})
return request.render(
"table_reservation_on_website.table_reserved_templates")
@http.route(['/table/reservation/pos'], type='json', auth='public',
website=True)
def table_reservation_pos(self, partner_id, table_id):
"""For pos table booking"""
table = request.env['restaurant.table'].browse(table_id)
date_and_time = datetime.now()
starting_at = (
(date_and_time + timedelta(hours=5, minutes=30)).time()).strftime(
"%H:%M")
end_time = (
(date_and_time + timedelta(hours=6, minutes=30)).time()).strftime(
"%H:%M")
payment = request.env['pos.config'].search([])
for rec in payment:
if rec.module_pos_restaurant:
payment_status = rec.reservation_charge
if payment_status:
request.env['table.reservation'].sudo().create({
'customer_id': partner_id,
'floor_id': table.floor_id.id,
'booked_tables_ids': table,
'date': date_and_time.date(),
'starting_at': starting_at,
'ending_at': end_time,
'booking_amount': table.rate,
'state': 'reserved',
})
else:
request.env['table.reservation'].sudo().create({
'customer_id': partner_id,
'floor_id': table.floor_id.id,
'booked_tables_ids': table,
'date': date_and_time.date(),
'starting_at': starting_at,
'ending_at': end_time,
'booking_amount': 0,
'state': 'reserved',
})
return
@http.route(['/active/floor/tables'], type='json', auth='user',
website=True)
def active_floor_tables(self, floor_id):
"""To get active floors"""
table_inbetween = []
table_reservation = request.env['table.reservation'].sudo().search([(
'floor_id', "=", floor_id), ('date', '=', datetime.now().date()),
('state', '=', 'reserved')])
for rec in table_reservation:
start_at = datetime.strptime(rec.starting_at, "%H:%M").time()
end_at = datetime.strptime(rec.ending_at, "%H:%M").time()
now = (
(datetime.now() + timedelta(hours=5,
minutes=30)).time()).strftime(
"%H:%M")
if start_at <= datetime.strptime(now, "%H:%M").time() <= end_at:
for table in rec.booked_tables_ids:
table_inbetween.append(table.id)
return table_inbetween

18
table_reservation_on_website/data/product_product_data.xml

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data noupdate="1">
<!-- To create new product Table Booking-->
<record id="product_product_table_booking" model="product.product">
<field name="name">Table Booking</field>
<field name="standard_price">0</field>
<field name="list_price">0</field>
<field name="detailed_type">product</field>
<field name="uom_id" ref="uom.product_uom_unit"/>
<field name="uom_po_id" ref="uom.product_uom_unit"/>
<field name="description">Table Booking</field>
<field name="default_code">TB</field>
<field name="image_1920" type="base64"
file="table_reservation_on_website/static/img/table.png"/>
</record>
</data>
</odoo>

13
table_reservation_on_website/data/table_reservation_data.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data noupdate="1">
<!-- Record for sequence number-->
<record id="table_reservation_data_sequence" model="ir.sequence">
<field name="name">Table Reservation Sequence Number</field>
<field name="code">table.reservation</field>
<field name="prefix">TR</field>
<field name="padding">3</field>
<field name="company_id"/>
</record>
</data>
</odoo>

7
table_reservation_on_website/doc/RELEASE_NOTES.md

@ -0,0 +1,7 @@
## Module <table_reservation_on_website>
#### 26.12.2023
#### Version 15.0.1.0.0
#### ADD
- Initial commit for Table Reservation on Website

25
table_reservation_on_website/models/__init__.py

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Fathima Mazlin AM (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import restaurant_table
from . import pos_config
from . import sale_order
from . import table_reservation

37
table_reservation_on_website/models/pos_config.py

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Fathima Mazlin AM (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models
class PosConfig(models.Model):
"""Inherit the model res config settings"""
_inherit = 'pos.config'
reservation_charge = fields.Boolean(string="Reservation Charge",
help="Payment for pre booking tables",
config_parameter="table_"
"reservation_on_"
"website.reservation"
"_charge")
refund = fields.Text(string="No Refund Notes", help="No refund notes to "
"display in website",
config_parameter="table_reservation_on_website.refund")

29
table_reservation_on_website/models/restaurant_table.py

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Fathima Mazlin AM (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models
class RestaurantTable(models.Model):
"""Inherit restaurant table for adding new field"""
_inherit = 'restaurant.table'
rate = fields.Float(string="Amount", help="Amount of table")

42
table_reservation_on_website/models/sale_order.py

@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Fathima Mazlin AM (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models
class SaleOrder(models.Model):
"""Inherit sale order for adding new fields"""
_inherit = 'sale.order'
table_reservation_id = fields.Many2one(comodel_name='table.reservation',
string="Table Reservation",
help="Can view the table "
"reservation", readonly=True)
tables_ids = fields.Many2many("restaurant.table", string="tables",
help="Booked Tables")
floors = fields.Integer(string="Floor Number", help="Floor Number")
date = fields.Date(string="Date", help="Date of reservation")
starting_at = fields.Char(string="Starting At", help="starting time of "
"reservation")
ending_at = fields.Char(string="Ending At", help="Ending time of "
"reservation")
booking_amount = fields.Float(string="Booking Amount",
help="Booking Charge")

139
table_reservation_on_website/models/table_reservation.py

@ -0,0 +1,139 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Fathima Mazlin AM (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from datetime import datetime
import re
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class TableReservation(models.Model):
"""Create new model table reservation"""
_name = "table.reservation"
_description = 'Table Reservation'
_rec_name = 'sequence'
sequence = fields.Char(string='Sequence', default=_('New'), readonly=True,
copy=False, help="Sequence number for records")
customer_id = fields.Many2one(comodel_name="res.partner",
string="Customer",
help="Name of the customer", required=True)
floor_id = fields.Many2one(comodel_name='restaurant.floor', string="Floor "
"Plan",
help="Booked floor", required=True)
booked_tables_ids = fields.Many2many(comodel_name='restaurant.table',
string="Tables",
help="Booked tables", required=True
)
date = fields.Date(string="Date", help="Date of reservation",
required=True)
starting_at = fields.Char(string="Starting At", help="starting time of "
"reservation",
required=True)
ending_at = fields.Char(string="Ending At", help="Ending time of "
"reservation",
required=True)
booking_amount = fields.Float(string="Booking Charge", help="Amount for "
"booking",
compute="_compute_booking_amount")
state = fields.Selection([('draft', "Draft"), ('reserved', 'Reserved'),
('done', "Done"), ("cancel", "Cancelled")],
default='draft', string="Status",
help="State visible in status bar")
@api.model
def create(self, vals):
"""Super create function to add sequence number"""
vals['sequence'] = self.env['ir.sequence'].next_by_code(
"table.reservation")
return super(TableReservation, self).create(vals)
@api.onchange('starting_at', 'ending_at')
def _onchange_time(self):
"""Pattern for time"""
for record in self:
if record.starting_at:
pattern = r'^([01]\d|2[0-3]):([0-5]\d)$'
if not re.match(pattern, record.starting_at):
raise UserError(_("Invalid time format! [ "
"format HH:MM]"))
if record.ending_at:
pattern = r'^([01]\d|2[0-3]):([0-5]\d)$'
if not re.match(pattern, record.ending_at):
raise UserError(_("Invalid time format! [ "
"format HH:MM]"))
@api.onchange("floor_id")
def _onchange_floor(self):
"""To show the tables corresponding the floor"""
tables = self.env['restaurant.table'].search([('floor_id', '=',
self.floor_id.id)])
table_inbetween = []
reserved = self.search([('floor_id', '=', self.floor_id.id), ('date', '=',
self.date),
('state', '=', 'reserved')])
if self.starting_at:
start_time_new = datetime.strptime(
self.starting_at, "%H:%M").time()
for rec in reserved:
start_at = datetime.strptime(rec.starting_at, "%H:%M").time()
end_at = datetime.strptime(rec.ending_at, "%H:%M").time()
if start_at <= start_time_new <= end_at:
for table in rec.booked_tables_ids:
table_inbetween.append(table.id)
table_floor = [rec.id for rec in tables if
rec.id not in table_inbetween]
domain = [('id', 'in', table_floor)]
return {'domain': {'booked_tables_ids': domain}}
@api.depends("booked_tables_ids")
def _compute_booking_amount(self):
"""For computing the booking amount"""
payment = self.env['pos.config'].search([])
for rec in payment:
if rec.module_pos_restaurant:
payment_status = rec.reservation_charge
if payment_status:
if self.booked_tables_ids:
sum_amount = [rec.rate for rec in self.booked_tables_ids]
self.booking_amount = sum(sum_amount)
else:
self.booking_amount = 0
else:
self.booking_amount = 0
def action_cancel(self):
"""For cancel button"""
self.write({
'state': 'cancel'
})
def action_reserved(self):
"""For reserved button"""
self.write({
'state': "reserved"
})
def action_done(self):
"""For done button"""
self.write({
'state': 'done'
})

2
table_reservation_on_website/security/ir.model.access.csv

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_table_reservation_user,access.table.reservation.user,model_table_reservation,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_table_reservation_user access.table.reservation.user model_table_reservation base.group_user 1 1 1 1

BIN
table_reservation_on_website/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
table_reservation_on_website/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
table_reservation_on_website/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
table_reservation_on_website/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
table_reservation_on_website/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
table_reservation_on_website/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
table_reservation_on_website/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
table_reservation_on_website/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
table_reservation_on_website/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
table_reservation_on_website/static/description/assets/icons/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
table_reservation_on_website/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
table_reservation_on_website/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
table_reservation_on_website/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
table_reservation_on_website/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
table_reservation_on_website/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
table_reservation_on_website/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
table_reservation_on_website/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
table_reservation_on_website/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
table_reservation_on_website/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
table_reservation_on_website/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
table_reservation_on_website/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
table_reservation_on_website/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
table_reservation_on_website/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
table_reservation_on_website/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
table_reservation_on_website/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
table_reservation_on_website/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
table_reservation_on_website/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
table_reservation_on_website/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
table_reservation_on_website/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
table_reservation_on_website/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
table_reservation_on_website/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
table_reservation_on_website/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
table_reservation_on_website/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
table_reservation_on_website/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
table_reservation_on_website/static/description/assets/modules/delivery_date_ecommerce.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
table_reservation_on_website/static/description/assets/modules/openai_website_product_media.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
table_reservation_on_website/static/description/assets/modules/product_brand_ecommerce.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
table_reservation_on_website/static/description/assets/modules/website_multi_variant.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
table_reservation_on_website/static/description/assets/modules/website_repeat_sale.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
table_reservation_on_website/static/description/assets/modules/wishlist_product_website_backend.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/13.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/14.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/15.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/17.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/18.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 KiB

BIN
table_reservation_on_website/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
table_reservation_on_website/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

648
table_reservation_on_website/static/description/index.html

@ -0,0 +1,648 @@
<div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;">
<!-- TITLE BAR -->
<div class="d-flex align-items-center justify-content-between"
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
<img src="assets/misc/cybrosys-logo.png" width="42" height="42"
style="width: 42px; height: 42px;"/>
<div>
<div
style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Community
</div>
<div
style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
<div
style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Odoo.sh
</div>
</div>
</div>
<!-- END OF TITLE BAR -->
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
Table Reservation on Website</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">
We Can Reserve Table Through Website</p>
<!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif" class="img-responsive"
style="width: 100%; margin-left: auto; margin-right: auto;"/>
</div>
</div>
</div>
</div>
<!-- NAVIGATION SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/compass.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Explore This
Module</h2>
</div>
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;">
<div class="col-sm-12 col-md-6 my-3">
<a href="#overview">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn
more about this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#features">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View features of this module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#screenshots">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">
See key screenshots of this module
</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
</div>
<!-- END OF NAVIGATION SECTION -->
<!-- OVERVIEW SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pie-chart.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Overview
</h2>
</div>
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 py-4">
We can reserve table through website. And also user can choose their
table on website. Table, and other information is fetch from point of sale.
</div>
</div>
<!-- END OF OVERVIEW SECTION -->
<!-- FEATURES SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"
id="features">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/features.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Features
</h2>
</div>
<div class="row"
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center"
style="margin-top: 40px; margin-bottom: 40px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Community and Enterprise Support.</span>
</div>
<div class="d-flex align-items-center"
style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span
style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Can reserve table from website.</span>
</div>
</div>
</div>
<!-- END OF FEATURES SECTION -->
<!-- SCREENSHOTS SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="screenshots">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pictures.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Screenshots
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Reservation Charge</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">If we enable "Reservation Charge" we want to pay for
reservation. If we disable "Reservation Charge" there is
no payment for table reservation.</p>
<img src="assets/screenshots/1.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Floors</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
We can add "Amount" for reservation in pos floor.</p>
<img src="assets/screenshots/2.png" class="img-thumbnail">
<img src="assets/screenshots/3.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Select Your Date and Time</h3>
<img src="assets/screenshots/4.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Select your Floor</h3>
<img src="assets/screenshots/5.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Table Reservation</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Click the button "Booking Confirm" after selecting the
tables.</p>
<img src="assets/screenshots/6.png" class="img-thumbnail">
</div><div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Successfully Reserved Template</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
we can we Reserved template while clicking"Booking Confirm".</p>
<img src="assets/screenshots/7.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Table Reservation Data</h3>
<img src="assets/screenshots/8.png" class="img-thumbnail">
<img src="assets/screenshots/10.png" class="img-thumbnail">
</div><div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Reservation Charge</h3>
<img src="assets/screenshots/11.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> No Refund Note</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
You can see the no refund note in website if enable "Reservation Charge".</p>
<img src="assets/screenshots/12.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Cart</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Redirect to Cart page while clicking the button "Booking Confirm".</p>
<img src="assets/screenshots/13.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Payment Page</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Redirect to Payment page while clicking the button "Process Checkout".</p>
<img src="assets/screenshots/14.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Payment Confirmation</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Redirect to Payment Confirmation page while clicking the button "Pay Now".</p>
<img src="assets/screenshots/15.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Sale Order</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
In sale order we can see the Table Reservation details.</p>
<img src="assets/screenshots/16.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Table Reservation</h3>
<img src="assets/screenshots/17.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Pos Restaurant</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
We can't view already reserved tables.</p>
<img src="assets/screenshots/18.png" class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Related
Products
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner" style="padding: 30px;">
<div class="carousel-item" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/product_brand_ecommerce/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/product_brand_ecommerce.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/website_repeat_sale/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/website_repeat_sale.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/openai_website_product_media/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/openai_website_product_media.png">
</div>
</a>
</div>
</div>
<div class="carousel-item active"
style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/delivery_date_ecommerce/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/delivery_date_ecommerce.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/wishlist_product_website_backend/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/wishlist_product_website_backend.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/website_multi_variant/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/website_multi_variant.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev"
style="width:35px; color:#000"> <span
class="carousel-control-prev-icon"><i
class="fa fa-chevron-left"
style="font-size:24px"></i></span>
</a> <a class="carousel-control-next" href="#demo1"
data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i
class="fa fa-chevron-right"
style="font-size:24px"></i></span>
</a>
</div>
</div>
</div>
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/star.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
</div>
</div>
<!-- END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/corporate.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our
Industries
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Trading
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure
and
sell your products</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
POS
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy
configuration
and convivial experience</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Education
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
A platform for
educational management</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Manufacturing
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Plan, track and
schedule your operations</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or
restaurant methodically</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
</div>
</div>
</div>
</div>
<!-- END OF OUR INDUSTRIES -->
<!-- SUPPORT -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/customer-support.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support
</h2>
</div>
<div class="container mt-5">
<div class="row">
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/support.png" height="48" width="48" style="width: 42px; height: 42px;"/>
</div>
<div>
<h4>Need Help?</h4>
<p style="line-height: 100%;">Got questions or need help? Get in touch.</p>
<a href="mailto:odoo@cybrosys.com">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
odoo@cybrosys.com</p>
</a>
</div>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/whatsapp.png" height="52" width="52" style="width: 52px; height: 52px;"/>
</div>
<div>
<h4>WhatsApp</h4>
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p>
<a href="https://api.whatsapp.com/send?phone=918606827707">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">+91 86068
27707</p>
</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center">
<img src="assets/misc/logo.png" width="144" height="31"
style="width:144px; height: 31px; margin-top: 40px;"/>
</div>
</div>
</div>
<!-- END OF SUPPORT -->

BIN
table_reservation_on_website/static/img/table.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 MiB

BIN
table_reservation_on_website/static/src/images/logo.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 KiB

46
table_reservation_on_website/static/src/js/FloorScreen.js

@ -0,0 +1,46 @@
/** @odoo-module **/
import FloorScreen from 'pos_restaurant.FloorScreen';
import rpc from 'web.rpc';
import ajax from 'web.ajax';
import Registries from 'point_of_sale.Registries';
import models from 'point_of_sale.models';
/** To load model into pos **/
models.load_models([{
model: 'table.reservation',
fields: ['id', 'floor_id', 'booked_tables_ids', 'date', 'starting_at',
'ending_at', 'state'],
loaded: function(self, table_reservation) {
self.table_reservation = table_reservation;
}
}]);
const TableFloor = (FloorScreen) =>
class extends FloorScreen {
/**
For getting active tables
**/
get activeTables(){
var table_record = []
var self = this
const now = new Date();
const utc530Offset = 330 * 60 * 1000;
const timeWithOffset = new Date(now.getTime() + utc530Offset);
const formattedTime = timeWithOffset.toISOString().replace('T', ' ').substr(0, 16);
const [datePart, timePart] = formattedTime.split(' ');
self.activeFloor.tables.forEach(function(table){
self.env.pos.table_reservation.forEach(function(record){
if(record.floor_id[0] == self.activeFloor.id && record.date == datePart && record.state == "reserved"){
if(record.starting_at <= timePart && timePart <= record.ending_at){
record.booked_tables_ids.forEach(function(rec){
if(rec == table['id']){
table_record.push(rec);
}
});
}
}
});
});
const updatedData = this.activeFloor.tables.filter(item => !table_record.includes(item["id"]));
return updatedData;
}
}
Registries.Component.extend(FloorScreen, TableFloor);

23
table_reservation_on_website/static/src/js/PaymentScreen.js

@ -0,0 +1,23 @@
/** @odoo-module **/
import PaymentScreen from 'point_of_sale.PaymentScreen';
import rpc from 'web.rpc';
import ajax from 'web.ajax';
import Registries from 'point_of_sale.Registries';
const TableReservation = (PaymentScreen) =>
class extends PaymentScreen {
/**
For payment validation in pos
**/
async _finalizeValidation() {
var self = this
if (this.currentOrder.table){
ajax.jsonRpc('/table/reservation/pos','call',{
'partner_id' : this.currentOrder.changed.client.id,
'table_id': this.currentOrder.table.id,
}).then( function(data){});
}
return super._finalizeValidation()
}
}
Registries.Component.extend(PaymentScreen, TableReservation);

41
table_reservation_on_website/static/src/js/reservation_floor.js

@ -0,0 +1,41 @@
/** @odoo-module */
import publicWidget from 'web.public.widget';
let booked_table = []
publicWidget.registry.table_reservation_floor = publicWidget.Widget.extend({
selector: '#tableContainer',
events: {
'click .card_table': '_onTableClick',
},
/**
Select table for reservation
**/
_onTableClick: function () {
var current_div_id = event.target.closest('.card_table')
var rate = current_div_id.querySelector('#rate').innerText
var count = this.$el.find('#count_table')[0];
var amount = this.$el.find('#total_amount')[0];
var booked = this.$el.find('#tables_input')[0];
var table_count = this.$el.find('#tables_counts')[0];
count.innerText = table_count.value
if (current_div_id.style.backgroundColor == 'green'){
booked_table.splice(booked_table.indexOf(Number(current_div_id.id)), 1);
current_div_id.style.backgroundColor = '#96ccd5';
count.innerText = Number(count.innerText) - 1;
amount.innerText = Number(amount.innerText) - Number(rate)
table_count.value = Number(count.innerText);
}
else{
current_div_id.style.backgroundColor = 'green'
count.innerText = Number(count.innerText) + 1;
booked_table.push(Number(current_div_id.id))
table_count.value = Number(count.innerText);
if (amount.innerText){
amount.innerText = Number(rate) + Number(amount.innerText)
}
else{
amount.innerText = Number(rate)
}
}
booked.value = booked_table
},
});

43
table_reservation_on_website/static/src/js/table_reservation.js

@ -0,0 +1,43 @@
/** @odoo-module */
import publicWidget from 'web.public.widget';
import ajax from 'web.ajax';
publicWidget.registry.table_reservation = publicWidget.Widget.extend({
selector: '#restaurant_floors',
events: {
'change #floors_rest': '_onFloorChange',
'click .card_table': '_onTableClick',
},
/**
To get all tables belongs to the floor
**/
_onFloorChange: function () {
var floors = this.$el.find("#floors_rest")[0].value;
var date = this.$el.find("#date_id").prevObject[0].offsetParent.lastElementChild[1].defaultValue
var start = this.$el.find("#start_id").prevObject[0].offsetParent.lastElementChild[2].defaultValue
document.getElementById('count_table').innerText = 0;
document.getElementById('total_amount').innerText = 0;
ajax.jsonRpc("/restaurant/floors/tables", 'call', {
'floors_id' : floors,
'date': date,
'start':start,
})
.then(function (data) {
if(floors == 0){
$('#table_container_row').empty();
$('#info').hide();
}
else{
$('#table_container_row').empty();
$('#info').show();
for (let i in data){
$('#table_container_row').append('<div id="'+data[i]['id'] +
'" class="card card_table col-sm-2" style="background-color:#96ccd5;padding:0;margin:5px;width:250px;"><div class="card-body"><b>' +data[i]['name'] +
'</b><br/><br/><br/><span><i class="fa fa-user-o" aria-hidden="true"></i> '+ data[i]['seats']+
'</span><br/><span><i class="fa fa-money"></i></span><span id="rate">'
+ data[i]['rate'] +
'</span>/Slot</div></div><br/>');
}
}
});
},
});

32
table_reservation_on_website/views/pos_config_views.xml

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- For adding new field in config settings-->
<record id="pos_config_view_form" model="ir.ui.view">
<field name="name">pos.config.view.form.inherit.table.reservation.on.website</field>
<field name="model">pos.config</field>
<field name="inherit_id"
ref="point_of_sale.pos_config_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='iface_orderline_customer_notes']"
position="before">
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="reservation_charge"/>
</div>
<div class="o_setting_right_pane">
<label for="reservation_charge"/>
<div class="content-group"
id="warning_text_pos_restaurant">
Enable to show payment option to pre-booking
tables.
</div>
</div>
<div class="o_setting_right_pane" style="display:flex;">
<label for="refund"/>
<field name="refund"/>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

16
table_reservation_on_website/views/restaurant_floor_views.xml

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- To adding a new field in restaurant floor -->
<record id="view_restaurant_floor_form" model="ir.ui.view">
<field name="name">restaurant.floor.view.form.inherit.table.reservation.on.website</field>
<field name="model">restaurant.floor</field>
<field name="inherit_id"
ref="pos_restaurant.view_restaurant_floor_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='table_ids']/tree[1]/field[@name='shape']"
position="after">
<field name="rate"/>
</xpath>
</field>
</record>
</odoo>

14
table_reservation_on_website/views/restaurant_table_views.xml

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- To adding new field in restaurant table-->
<record id="view_restaurant_table_form" model="ir.ui.view">
<field name="name">restaurant.table.view.form.inherit.table.reservation.on.website</field>
<field name="model">restaurant.table</field>
<field name="inherit_id" ref="pos_restaurant.view_restaurant_table_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='seats']" position="after">
<field name="rate"/>
</xpath>
</field>
</record>
</odoo>

20
table_reservation_on_website/views/sale_order_views.xml

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- To adding new fields in sale order-->
<record id="view_order_form" model="ir.ui.view">
<field name="name">sale.order.view.form.inherit.table.reservation.on.website</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='payment_term_id']" position="after">
<field name="table_reservation_id"/>
<field name="tables_ids" invisible="1"/>
<field name="floors" invisible="1"/>
<field name="date" invisible="1"/>
<field name="starting_at" invisible="1"/>
<field name="ending_at" invisible="1"/>
<field name="booking_amount" invisible="1"/>
</xpath>
</field>
</record>
</odoo>

10
table_reservation_on_website/views/table_reservation_on_website_menus.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Menu for table reservation in website-->
<record id="table_reservation_main_menu" model="website.menu">
<field name="name">Table Reservation</field>
<field name="url">/table_reservation</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence">55</field>
</record>
</odoo>

237
table_reservation_on_website/views/table_reservation_templates.xml

@ -0,0 +1,237 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--Template for time and slots-->
<template id="table_reservation" name="Table Reservation">
<t t-call="website.layout">
<div id="wrap" class="oe_structure oe_empty">
<section class="s_website_form" data-vcss="001"
data-snippet="s_website_form">
<div class="container">
<form action="/restaurant/floors" method="POST"
enctype="multipart/form-data"
class="oe_import">
<input type="hidden" name="csrf_token"
t-att-value="request.csrf_token()"/>
<center>
<br/>
<br/>
<h1>
<b>Table Reservation</b>
</h1>
<br/>
<br/>
<div>
<div class="form-group row"
style="width:70%;padding-left:15%;">
<label for="date"
class="col-2 col-form-label">
Date
</label>
<div class="col-4">
<input type="date"
name="date"
class="form-control"
id="date"
required="1"/>
</div>
</div>
<br/>
</div>
</center>
<center>
<div class="s_website_form_rows row s_col_no_bgcolor">
<div class="row"
style="padding-left:32%;width:85%;">
<div class="col-2">
<strong>Slots:</strong>
</div>
<div class="col-2">
<label for="start_time">
Start Time
</label>
</div>
<div class="col-3">
<input id="start_time"
name="start_time"
type="time"
class="form-control s_website_form_input"
required="1"/>
</div>
</div>
<br/>
<br/>
<div class="row"
style="padding-left:40%;width:95%;">
<div class="col-2">
<label for="end_time">
End Time
</label>
</div>
<div class="col-3">
<input id="end_time"
name="end_time"
type="time"
class="form-control s_website_form_input"
required="1"/>
</div>
</div>
</div>
</center>
<br/>
<div class="row" data-name="Submit Button">
<div class="col-sm-2" style="padding-left:45%;">
<button type="submit"
class="btn btn-primary">
Submit
</button>
</div>
</div>
</form>
</div>
</section>
</div>
</t>
</template>
<!-- Template for floors-->
<template id="restaurant_floors" name="Admission Submit">
<t t-call="website.layout">
<div id="wrap" class="oe_structure oe_empty">
<section class="s_website_form" data-vcss="001"
data-snippet="s_website_form">
<div class="container">
<br/>
<br/>
<form action="/booking/confirm" method="POST"
enctype="multipart/form-data"
class="oe_import">
<div class="row">
<div class="col-2">
<span>Select Your Floor</span>
</div>
<div class="col-2" id="restaurant_floors">
<select name="floors"
id="floors_rest"
class="form-control">
<option value="0">Select a
Floor
</option>
<t t-foreach="floors" t-as="floor">
<option t-att-value="floor.id">
<t t-esc="floor.name"/>
</option>
</t>
</select>
</div>
</div>
<br/>
<br/>
<br/>
<div id="info" style=" display: none;">
<div id="tableContainer"
style="width:100%;display:flex;">
<div class="row" id="table_container_row">
</div>
<div class="card"
style="background-color:#c8e0e0;width:1000px;height:370px;border:0;">
<div class="card-body"
style="border:1px;">
<h5 class="card-title"
style="Font-size:45px;">Booking
Info
</h5>
<table style="border:0;">
<tr>
<td>
Date:
</td>
<td style="text-align:right;">
<t t-esc="date"/>
</td>
</tr>
<tr>
<td>Start Time:</td>
<td style="text-align:right;">
<t t-esc="start_time"/>
</td>
</tr>
<tr>
<td>End Time:</td>
<td style="text-align:right;">
<t t-esc="end_time"/>
</td>
</tr>
<tr>
<td>
<b>Booking Amount
For <span
id="count_table">
0
</span>Tables
</b>
</td>
<td style="text-align:right;">
<span id="total_amount">
</span>
</td>
</tr>
</table>
<span hidden="hidden">
<input name="date"
id="date_id"
ref="dateInput"
class="form-control border-0 p-0"
type="text"
data-allow-hotkeys="true"
t-att-value="date"
t-ref="autofocus"/>
<input name="start_time"
id="start_id"
class="form-control border-0 p-0"
type="text"
data-allow-hotkeys="true"
t-att-value="start_time"
t-ref="autofocus"/>
<input name="end_time"
class="form-control border-0 p-0"
type="text"
data-allow-hotkeys="true"
t-att-value="end_time"
t-ref="autofocus"/>
<input name="tables"
id="tables_input"
class="form-control border-0 p-0"
type="text"
data-allow-hotkeys="true"
t-ref="autofocus">
</input>
<input name="tables_count"
id="tables_counts"
class="form-control border-0 p-0"
type="text"
data-allow-hotkeys="true"
t-ref="autofocus">
</input>
</span>
<button type="submit"
class="btn btn-primary">
Booking Confirm
</button>
</div>
<div style="line-height:1px;background: #ffffff;border:0;">
</div>
<t t-if="payment">
<div style="background: #ffffff;border:0;color:#FF0000;">
<t t-esc="refund"/>
</div>
</t>
</div>
</div>
</div>
<br/>
</form>
</div>
</section>
</div>
</t>
</template>
</odoo>

72
table_reservation_on_website/views/table_reservation_views.xml

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Tree views for table reservation model -->
<record id="table_reservation_view_tree" model="ir.ui.view">
<field name="name">table.reservation.view.tree</field>
<field name="model">table.reservation</field>
<field name="arch" type="xml">
<tree>
<field name="sequence"/>
<field name="customer_id"/>
<field name="booked_tables_ids" widget="many2many_tags"/>
<field name="floor_id"/>
<field name="starting_at"/>
<field name="ending_at"/>
</tree>
</field>
</record>
<!-- Form views for table reservation model -->
<record id="table_reservation_view_form" model="ir.ui.view">
<field name="name">table.reservation.view.form</field>
<field name="model">table.reservation</field>
<field name="arch" type="xml">
<form>
<header>
<button name="action_reserved" string="Reserve"
states="draft" type="object"
class="oe_highlight"/>
<button name="action_done" string="Done"
states="reserved" type="object"
class="oe_highlight"/>
<button name="action_cancel" string="cancel"
states="reserved" type="object"
class="oe_highlight"/>
<field name="state" widget="statusbar"
options="{'clickable': '1'}"
statusbar_visible="draft"/>
</header>
<sheet>
<div class="oe_title">
<h1>
<field name="sequence"/>
</h1>
</div>
<group>
<group>
<field name="customer_id"/>
<field name="date"/>
<field name="starting_at"/>
<field name="ending_at"/>
<field name="floor_id"/>
<field name="booked_tables_ids"
widget="many2many_tags"/>
<field name="booking_amount"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<!-- Action for menu table reservation -->
<record id="table_reservation_action" model="ir.actions.act_window">
<field name="name">Table Reservation</field>
<field name="res_model">table.reservation</field>
<field name="view_mode">list,form</field>
</record>
<!-- Menu -->
<menuitem id="table_reservation_menu"
name="Table Reservation"
parent="point_of_sale.menu_point_config_product"
action="table_reservation_action"
sequence="9"/>
</odoo>

24
table_reservation_on_website/views/table_reserved_templates.xml

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- Reserved redirect template -->
<template id="table_reserved_templates">
<t t-call="website.layout">
<section id="banner" class="banner-imgShop">
<div class="container wrapper ">
<div class="banner-content">
<div class="logo">
<br/>
<br/>
<br/>
<img src="/table_reservation_on_website/static/src/images/logo.jpg"
alt="" style="width:95%;height:450px;"/>
<br/>
<br/>
<br/>
</div>
</div>
</div>
</section>
</t>
</template>
</odoo>
Loading…
Cancel
Save