@ -0,0 +1,45 @@ |
|||
.. image:: https://img.shields.io/badge/licence-LGPL--3-blue.svg |
|||
:target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html |
|||
:alt: License: LGPL-3 |
|||
|
|||
POS Kitchen Screen |
|||
================== |
|||
* POS Kitchen Screen facilitates sending certain orders automatically to the kitchen |
|||
|
|||
Company |
|||
------- |
|||
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
|||
|
|||
License |
|||
------- |
|||
General Public License, Version 3 (LGPL v3). |
|||
(https://www.gnu.org/licenses/lgpl-3.0-standalone.html) |
|||
|
|||
|
|||
Credits |
|||
------- |
|||
Developer: Gokul P I, |
|||
|
|||
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>` |
@ -0,0 +1,22 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Gokul P I (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 models |
@ -0,0 +1,79 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Gokul P I (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/>. |
|||
# |
|||
############################################################################# |
|||
{ |
|||
'name': 'POS Kitchen Screen', |
|||
'version': '17.0.1.0.0', |
|||
'category': 'Point Of Sale', |
|||
'summary': 'POS Kitchen Screen facilitates sending certain orders ' |
|||
'automatically to the kitchen.The POS Kitchen Screen allows for' |
|||
'the customization of order views, so that staff can see the ' |
|||
'information that is most important to them.', |
|||
'description': 'The POS Kitchen Screen in Odoo 17 is a feature that ' |
|||
'allows restaurant staff to view and manage orders in ' |
|||
'real-time from the kitchen. This screen provides a clear ' |
|||
'and organized display of all active orders, enabling ' |
|||
'kitchen staff to prioritize and manage their tasks ' |
|||
'efficiently. The POS Kitchen Screen in Odoo 16 also ' |
|||
'allows for the customization of order views, so that ' |
|||
'staff can see the information that is most important to ' |
|||
'them. Additionally, this feature facilitates ' |
|||
'communication between front-end and back-end staff, ' |
|||
'enabling them to work together seamlessly and provide a ' |
|||
'better dining experience for customers.', |
|||
'author': 'Cybrosys Techno Solutions', |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'maintainer': 'Cybrosys Techno Solutions', |
|||
'website': "https://www.cybrosys.com", |
|||
'depends': ['pos_restaurant'], |
|||
'data': [ |
|||
'security/pos_kitchen_screen_groups.xml', |
|||
"security/ir.model.access.csv", |
|||
'data/kitchen_screen_sequence_data.xml', |
|||
"views/kitchen_screen_views.xml", |
|||
"views/pos_kitchen_screen_odoo_menus.xml", |
|||
"views/pos_order_views.xml", |
|||
], |
|||
'assets': { |
|||
'point_of_sale._assets_pos': [ |
|||
'pos_kitchen_screen_odoo/static/src/js/fields_load.js', |
|||
'pos_kitchen_screen_odoo/static/src/js/order_payment.js', |
|||
'pos_kitchen_screen_odoo/static/src/js/order_button.js', |
|||
], |
|||
'web.assets_backend': [ |
|||
'pos_kitchen_screen_odoo/static/src/css/kitchen_screen.css', |
|||
'pos_kitchen_screen_odoo/static/src/js/kitchen_screen.js', |
|||
'pos_kitchen_screen_odoo/static/src/xml/kitchen_screen_templates.xml', |
|||
'https://code.jquery.com/jquery-1.10.2.min.js', |
|||
'https://unpkg.com/scrollreveal@4.0.0/dist/scrollreveal.min.js', |
|||
'https://fonts.googleapis.com', |
|||
'https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js', |
|||
'https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js', |
|||
], |
|||
}, |
|||
'images': [ |
|||
'static/description/banner.jpg', |
|||
], |
|||
'license': 'LGPL-3', |
|||
'installable': True, |
|||
'auto_install': False, |
|||
'application': False, |
|||
} |
@ -0,0 +1,15 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<record id="kitchen_screen_sequence" model="ir.sequence"> |
|||
<field name="name">Kitchen Screen</field> |
|||
<field name="code">kitchen.screen</field> |
|||
<field name="active">True</field> |
|||
<field name="prefix">KITCHEN</field> |
|||
<field name="padding">4</field> |
|||
<field name="number_next">1</field> |
|||
<field name="number_increment">1</field> |
|||
<field name="company_id" eval="False"/> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,6 @@ |
|||
## Module <pos_kitchen_screen_odoo> |
|||
|
|||
#### 10.01.2024 |
|||
#### Version 17.0.1.0.0 |
|||
#### ADD |
|||
- Initial commit for Pos Kitchen Screen |
@ -0,0 +1,24 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Gokul P I (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 kitchen_screen |
|||
from . import pos_orders |
|||
from . import pos_session |
@ -0,0 +1,68 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Gokul P I (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 api, fields, models |
|||
|
|||
|
|||
class KitchenScreen(models.Model): |
|||
"""Kitchen Screen model for the cook""" |
|||
_name = 'kitchen.screen' |
|||
_description = 'Pos Kitchen Screen' |
|||
_rec_name = 'sequence' |
|||
|
|||
def _pos_shop_id(self): |
|||
"""Domain for the Pos Shop""" |
|||
kitchen = self.search([]) |
|||
if kitchen: |
|||
return [('module_pos_restaurant', '=', True), |
|||
( |
|||
'id', 'not in', [rec.id for rec in kitchen.pos_config_id])] |
|||
else: |
|||
return [('module_pos_restaurant', '=', True)] |
|||
|
|||
sequence = fields.Char(readonly=True, default='New', |
|||
copy=False, tracking=True, help="Sequence of items") |
|||
pos_config_id = fields.Many2one('pos.config', string='Allowed POS', |
|||
domain=_pos_shop_id, |
|||
help="Allowed POS for kitchen") |
|||
pos_categ_ids = fields.Many2many('pos.category', |
|||
string='Allowed POS Category', |
|||
help="Allowed POS Category" |
|||
"for the corresponding Pos") |
|||
shop_number = fields.Integer(related='pos_config_id.id', string='Customer', |
|||
help="Id of the POS") |
|||
|
|||
def kitchen_screen(self): |
|||
"""Redirect to corresponding kitchen screen for the cook""" |
|||
return { |
|||
'type': 'ir.actions.act_url', |
|||
'target': 'new', |
|||
'url': '/pos/kitchen?pos_config_id= %s' % self.pos_config_id.id, |
|||
} |
|||
|
|||
@api.model |
|||
def create(self, vals): |
|||
"""Used to create sequence""" |
|||
if vals.get('sequence', 'New') == 'New': |
|||
vals['sequence'] = self.env['ir.sequence'].next_by_code( |
|||
'kitchen.screen') |
|||
result = super(KitchenScreen, self).create(vals) |
|||
return result |
@ -0,0 +1,247 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Gokul P I (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 api, fields, models |
|||
|
|||
|
|||
class PosOrder(models.Model): |
|||
"""Inheriting the pos order model """ |
|||
_inherit = "pos.order" |
|||
|
|||
order_status = fields.Selection(string="Order Status", |
|||
selection=[("draft", "Draft"), |
|||
("waiting", "Cooking"), |
|||
("ready", "Ready"), |
|||
("cancel", "Cancel")], |
|||
help='To know the status of order') |
|||
order_ref = fields.Char(string="Order Reference", |
|||
help='Reference of the order') |
|||
is_cooking = fields.Boolean(string="Is Cooking", |
|||
help='To identify the order is kitchen orders') |
|||
hour = fields.Char(string="Order Time", readonly=True, |
|||
help='To set the time of each order') |
|||
minutes = fields.Char(string='order time') |
|||
floor = fields.Char(string='Floor time') |
|||
|
|||
def write(self, vals): |
|||
"""Super the write function for adding order status in vals""" |
|||
message = { |
|||
'res_model': self._name, |
|||
'message': 'pos_order_created' |
|||
} |
|||
self.env["bus.bus"]._sendone('pos_order_created', |
|||
"notification", |
|||
message) |
|||
for order in self: |
|||
if order.order_status == "waiting" and vals.get( |
|||
"order_status") != "ready": |
|||
vals["order_status"] = order.order_status |
|||
if vals.get("state") and vals[ |
|||
"state"] == "paid" and order.name == "/": |
|||
vals["name"] = self._compute_order_name() |
|||
return super(PosOrder, self).write(vals) |
|||
|
|||
@api.model_create_multi |
|||
def create(self, vals_list): |
|||
"""Override create function for the validation of the order""" |
|||
message = { |
|||
'res_model': self._name, |
|||
'message': 'pos_order_created' |
|||
} |
|||
self.env["bus.bus"]._sendone('pos_order_created', |
|||
"notification", |
|||
message) |
|||
for vals in vals_list: |
|||
pos_orders = self.search( |
|||
[("pos_reference", "=", vals["pos_reference"])]) |
|||
if pos_orders: |
|||
for rec in pos_orders.lines: |
|||
for lin in vals_list[0]["lines"]: |
|||
if lin[2]["product_id"] == rec.product_id.id: |
|||
lin[2]["order_status"] = rec.order_status |
|||
vals_list[0]["order_status"] = pos_orders.order_status |
|||
return super().create(vals_list) |
|||
|
|||
else: |
|||
if vals.get('order_id') and not vals.get('name'): |
|||
# set name based on the sequence specified on the config |
|||
config = self.env['pos.order'].browse( |
|||
vals['order_id']).session_id.config_id |
|||
if config.sequence_line_id: |
|||
vals['name'] = config.sequence_line_id._next() |
|||
if not vals.get('name'): |
|||
# fallback on any pos.order sequence |
|||
vals['name'] = self.env['ir.sequence'].next_by_code( |
|||
'pos.order.line') |
|||
return super().create(vals_list) |
|||
|
|||
def get_details(self, shop_id, order=None): |
|||
"""For getting the kitchen orders for the cook""" |
|||
dic = order |
|||
if order: |
|||
orders = self.search( |
|||
[("pos_reference", "=", order[0]['pos_reference'])]) |
|||
if not orders: |
|||
self.create(dic) |
|||
else: |
|||
orders.lines = False |
|||
orders.lines = dic[0]['lines'] |
|||
kitchen_screen = self.env["kitchen.screen"].sudo().search( |
|||
[("pos_config_id", "=", shop_id)]) |
|||
pos_orders = self.env["pos.order.line"].search( |
|||
["&", ("is_cooking", "=", True), |
|||
("product_id.pos_categ_ids", "in", |
|||
[rec.id for rec in kitchen_screen.pos_categ_ids])]) |
|||
pos = self.env["pos.order"].search( |
|||
[("lines", "in", [rec.id for rec in pos_orders])], |
|||
order="date_order") |
|||
pos_lines = pos.lines.search( |
|||
[("product_id.pos_categ_ids", "in", |
|||
[rec.id for rec in kitchen_screen.pos_categ_ids])]) |
|||
values = {"orders": pos.read(), "order_lines": pos_lines.read()} |
|||
return values |
|||
|
|||
def action_pos_order_paid(self): |
|||
"""Supering the action_pos_order_paid function for setting its kitchen |
|||
order and setting the order reference""" |
|||
res = super().action_pos_order_paid() |
|||
kitchen_screen = self.env["kitchen.screen"].search( |
|||
[("pos_config_id", "=", self.config_id.id)] |
|||
) |
|||
for order_line in self.lines: |
|||
order_line.is_cooking = True |
|||
if kitchen_screen: |
|||
for line in self.lines: |
|||
line.is_cooking = True |
|||
self.is_cooking = True |
|||
self.order_ref = self.name |
|||
return res |
|||
|
|||
@api.onchange("order_status") |
|||
def onchange_order_status(self): |
|||
"""To set is_cooking false""" |
|||
if self.order_status == "ready": |
|||
self.is_cooking = False |
|||
|
|||
def order_progress_draft(self): |
|||
"""Calling function from js to change the order status""" |
|||
self.order_status = "waiting" |
|||
for line in self.lines: |
|||
if line.order_status != "ready": |
|||
line.order_status = "waiting" |
|||
|
|||
def order_progress_cancel(self): |
|||
"""Calling function from js to change the order status""" |
|||
self.order_status = "cancel" |
|||
for line in self.lines: |
|||
if line.order_status != "ready": |
|||
line.order_status = "cancel" |
|||
|
|||
def order_progress_change(self): |
|||
"""Calling function from js to change the order status""" |
|||
kitchen_screen = self.env["kitchen.screen"].search( |
|||
[("pos_config_id", "=", self.config_id.id)]) |
|||
stage = [] |
|||
for line in self.lines: |
|||
for categ in line.product_id.pos_categ_ids: |
|||
if categ.id in [rec.id for rec in |
|||
kitchen_screen.pos_categ_ids]: |
|||
stage.append(line.order_status) |
|||
if "waiting" in stage or "draft" in stage: |
|||
self.order_status = "ready" |
|||
else: |
|||
self.order_status = "ready" |
|||
|
|||
def check_order(self, order_name): |
|||
"""Calling function from js to know status of the order""" |
|||
pos_order = self.env['pos.order'].sudo().search( |
|||
[('pos_reference', '=', str(order_name))]) |
|||
kitchen_order = self.env['kitchen.screen'].sudo().search( |
|||
[('pos_config_id', '=', pos_order.config_id.id)]) |
|||
if kitchen_order: |
|||
for category in pos_order.lines.mapped('product_id').mapped( |
|||
'pos_categ_ids').mapped('id'): |
|||
if category not in kitchen_order.pos_categ_ids.mapped('id'): |
|||
return { |
|||
'category': pos_order.lines.product_id.pos_categ_ids.browse( |
|||
category).name} |
|||
if kitchen_order and pos_order: |
|||
if pos_order.order_status != 'ready': |
|||
return True |
|||
else: |
|||
return False |
|||
else: |
|||
return False |
|||
|
|||
def check_order_status(self, order_name): |
|||
pos_order = self.env['pos.order'].sudo().search( |
|||
[('pos_reference', '=', str(order_name))]) |
|||
kitchen_order = self.env['kitchen.screen'].sudo().search( |
|||
[('pos_config_id', '=', pos_order.config_id.id)]) |
|||
for category in pos_order.lines.mapped('product_id').mapped( |
|||
'pos_categ_ids').mapped('id'): |
|||
if category not in kitchen_order.pos_categ_ids.mapped('id'): |
|||
return 'no category' |
|||
if kitchen_order: |
|||
if pos_order.order_status == 'ready': |
|||
return False |
|||
else: |
|||
return True |
|||
else: |
|||
return True |
|||
|
|||
|
|||
class PosOrderLine(models.Model): |
|||
"""Inheriting the pos order line""" |
|||
_inherit = "pos.order.line" |
|||
|
|||
order_status = fields.Selection( |
|||
selection=[('draft', 'Draft'), ('waiting', 'Cooking'), |
|||
('ready', 'Ready'), ('cancel', 'Cancel')], default='draft', |
|||
help='The status of orderliness') |
|||
order_ref = fields.Char(related='order_id.order_ref', |
|||
string='Order Reference', |
|||
help='Order reference of order') |
|||
is_cooking = fields.Boolean(string="Cooking", default=False, |
|||
help='To identify the order is ' |
|||
'kitchen orders') |
|||
customer_id = fields.Many2one('res.partner', string="Customer", |
|||
related='order_id.partner_id', |
|||
help='Id of the customer') |
|||
|
|||
def get_product_details(self, ids): |
|||
"""To get the product details""" |
|||
lines = self.env['pos.order'].browse(ids) |
|||
res = [] |
|||
for rec in lines: |
|||
res.append({ |
|||
'product_id': rec.product_id.id, |
|||
'name': rec.product_id.name, |
|||
'qty': rec.qty |
|||
}) |
|||
return res |
|||
|
|||
def order_progress_change(self): |
|||
"""Calling function from js to change the order_line status""" |
|||
if self.order_status == 'ready': |
|||
self.order_status = 'waiting' |
|||
else: |
|||
self.order_status = 'ready' |
@ -0,0 +1,61 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Gokul P I (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 models |
|||
|
|||
|
|||
class PosSession(models.Model): |
|||
"""Inheriting the pos session""" |
|||
_inherit = 'pos.session' |
|||
|
|||
def _pos_ui_models_to_load(self): |
|||
"""Pos ui models to load""" |
|||
result = super()._pos_ui_models_to_load() |
|||
result += { |
|||
'pos.order', 'pos.order.line' |
|||
} |
|||
return result |
|||
|
|||
def _loader_params_pos_order(self): |
|||
"""Load the fields to pos order""" |
|||
return {'search_params': { |
|||
'domain': [], |
|||
'fields': ['name', 'date_order', 'pos_reference', |
|||
'partner_id', 'lines', 'order_status', 'order_ref', |
|||
'is_cooking']}} |
|||
|
|||
def _get_pos_ui_pos_order(self, params): |
|||
"""Get pos ui pos order""" |
|||
return self.env['pos.order'].search_read( |
|||
**params['search_params']) |
|||
|
|||
def _loader_params_pos_order_line(self): |
|||
"""Load the fields to pos order line""" |
|||
return {'search_params': {'domain': [], |
|||
'fields': ['product_id', 'qty', |
|||
'order_status', 'order_ref', |
|||
'customer_id', |
|||
'price_subtotal', 'total_cost']}} |
|||
|
|||
def _get_pos_ui_pos_order_line(self, params): |
|||
"""Get pos ui pos order line""" |
|||
return self.env['pos.order.line'].search_read( |
|||
**params['search_params']) |
|
@ -0,0 +1,15 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Kitchen screen group for cook--> |
|||
<record model="ir.module.category" id="module_category_pos_kitchen_screen_odoo"> |
|||
<field name="name">Pos Kitchen Screen</field> |
|||
<field name="description">Kitchen Access Groups</field> |
|||
<field name="sequence">20</field> |
|||
</record> |
|||
|
|||
<record id="kitchen_cook" model="res.groups"> |
|||
<field name="name">Kitchen Cook</field> |
|||
<field name="category_id" |
|||
ref="pos_kitchen_screen_odoo.module_category_pos_kitchen_screen_odoo"/> |
|||
</record> |
|||
</odoo> |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 589 B |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 565 B |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 967 B |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 532 KiB |
After Width: | Height: | Size: 71 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 934 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 912 KiB |
After Width: | Height: | Size: 88 KiB |
After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 722 KiB |
After Width: | Height: | Size: 728 KiB |
After Width: | Height: | Size: 503 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 12 KiB |
@ -0,0 +1,941 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="UTF-8"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|||
<title>Odoo App 3 Index</title> |
|||
<!-- Bootstrap CSS --> |
|||
<link rel="stylesheet" |
|||
href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css" |
|||
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" |
|||
crossorigin="anonymous"> |
|||
<link rel="stylesheet" |
|||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css"> |
|||
<link rel="preconnect" href="https://fonts.googleapis.com"> |
|||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
|||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" |
|||
rel="stylesheet"> |
|||
</head> |
|||
<body> |
|||
<section> |
|||
<div class="container" |
|||
style="font-family: 'Inter', sans-serif !important;background-color: #fff !important;"> |
|||
<div class="row"> |
|||
<div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between flex-wrap align-items-sm-center" |
|||
style="border-bottom:1px solid rgba(0, 0, 0, 0.22)"> |
|||
<div class="my-3"> |
|||
<img src="assets/misc/Cybrosys R.png" |
|||
style="width:auto !important; height:40px !important"> |
|||
</div> |
|||
<div class="my-3 d-flex align-items-center"> |
|||
<div class="text-center" |
|||
style="background-color:#017E84 !important;font-size: 0.8rem !important; color:#fff !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;"> |
|||
Community |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="row"> |
|||
<div class="col-sm-12 col-md-12 col-lg-12 text-center d-flex align-items-center flex-column" |
|||
style="margin: 80px 0px !important;"> |
|||
<h1 style="font-size: 2.8rem;font-weight: 700; color: |
|||
#1A202C;"> |
|||
POS Kitchen Screen</h1> |
|||
<p class="my-3 mb-4" |
|||
style="max-width: 80%; font-weight: 400 !important; line-height: 32px; color: #718096;"> |
|||
Streamline Your Restaurant Operations With The |
|||
POS Kitchen Screen Designed Exclusively for Odoo 17 |
|||
Community. |
|||
</p> |
|||
<div style="width: 80%; margin-top: 3rem;"> |
|||
<img src="assets/screenshots/hero.gif" |
|||
class="img-responsive" width="100%" height="auto"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="container mt-5 mb-5"> |
|||
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4"> |
|||
<p class="m-0" |
|||
style="font-weight: 600; font-size: 24px; color:#714b67 !important"> |
|||
Key Highlights |
|||
</p> |
|||
</div> |
|||
<div class="row py-4"> |
|||
<div class="col-md-6 col-sm-12 p-3"> |
|||
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
|||
background: #FFF; |
|||
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
|||
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
|||
display: flex; justify-content: center; align-items: center; |
|||
margin-right: 10px; flex-shrink: 0;"> |
|||
<i class="fa-solid fa-star " |
|||
style="color: #fff;font-size:14px;"></i> |
|||
</div> |
|||
<div> |
|||
<p style="color: #1A202C;font-weight: 600; |
|||
font-size: 1.2rem; margin-bottom: 2px;"> |
|||
Real-time Orders: |
|||
</p> |
|||
<p class="m-0" style="color:#718096">The POS |
|||
Kitchen Screen is a feature in Odoo 16 that is |
|||
specifically designed for restaurants and other |
|||
food-related businesses. With this feature, |
|||
restaurant staff can easily view and manage |
|||
orders in real-time</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-6 col-sm-12 p-3"> |
|||
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
|||
background: #FFF; |
|||
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
|||
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
|||
display: flex; justify-content: center; align-items: center; |
|||
margin-right: 10px; flex-shrink: 0;"> |
|||
<i class="fa-solid fa-star " |
|||
style="color: #fff;font-size:14px;"></i> |
|||
</div> |
|||
<div> |
|||
<p style="color: #1A202C;font-weight: 600; |
|||
font-size: 1.2rem; margin-bottom: 2px;"> |
|||
Efficient Order Management: </p> |
|||
<p class="m-0" style="color:#718096">Streamline |
|||
kitchen operations by creating and managing |
|||
orders seamlessly through the dedicated kitchen |
|||
screen, enhancing workflow efficiency.</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-6 col-sm-12 p-3"> |
|||
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
|||
background: #FFF; |
|||
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
|||
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
|||
display: flex; justify-content: center; align-items: center; |
|||
margin-right: 10px; flex-shrink: 0;"> |
|||
<i class="fa-solid fa-star " |
|||
style="color: #fff;font-size:14px;"></i> |
|||
</div> |
|||
<div> |
|||
<p style="color: #1A202C;font-weight: 600; |
|||
font-size: 1.2rem; margin-bottom: 2px;"> |
|||
Comprehensive Order Details: </p> |
|||
<p class="m-0" style="color:#718096"> View detailed |
|||
information for each order, including order |
|||
time, table name, cashier name, order internal |
|||
reference, and floor details, providing a |
|||
holistic overview.</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-6 col-sm-12 p-3"> |
|||
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
|||
background: #FFF; |
|||
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
|||
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
|||
display: flex; justify-content: center; align-items: center; |
|||
margin-right: 10px; flex-shrink: 0;"> |
|||
<i class="fa-solid fa-star " |
|||
style="color: #fff;font-size:14px;"></i> |
|||
</div> |
|||
<div> |
|||
<p style="color: #1A202C;font-weight: 600; |
|||
font-size: 1.2rem; margin-bottom: 2px;"> |
|||
Error Prevention Mechanism: |
|||
</p> |
|||
<p class="m-0" style="color:#718096"> Safeguard |
|||
against errors by restricting payment |
|||
processing until order completion and |
|||
preventing the addition of food items to |
|||
completed orders, ensuring accuracy in |
|||
transactions. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-6 col-sm-12 p-3"> |
|||
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
|||
background: #FFF; |
|||
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
|||
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
|||
display: flex; justify-content: center; align-items: center; |
|||
margin-right: 10px; flex-shrink: 0;"> |
|||
<i class="fa-solid fa-star " |
|||
style="color: #fff;font-size:14px;"></i> |
|||
</div> |
|||
<div> |
|||
<p style="color: #1A202C;font-weight: 600; |
|||
font-size: 1.2rem; margin-bottom: 2px;"> |
|||
User-Friendly Interface: |
|||
</p> |
|||
<p class="m-0" style="color:#718096">Enjoy a |
|||
user-friendly design that allows easy |
|||
navigation and order creation, enhancing the |
|||
overall user experience and promoting |
|||
efficiency in kitchen and POS operations.</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-6 col-sm-12 p-3"> |
|||
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px; |
|||
background: #FFF; |
|||
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); "> |
|||
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67; |
|||
display: flex; justify-content: center; align-items: center; |
|||
margin-right: 10px; flex-shrink: 0;"> |
|||
<i class="fa-solid fa-star " |
|||
style="color: #fff;font-size:14px;"></i> |
|||
</div> |
|||
<div> |
|||
<p style="color: #1A202C;font-weight: 600; |
|||
font-size: 1.2rem; margin-bottom: 2px;"> |
|||
Multi-Order Capability: |
|||
</p> |
|||
<p class="m-0" style="color:#718096">Create |
|||
multiple orders for the same table effortlessly |
|||
by utilizing the 'Order' button in the |
|||
top-right corner, providing flexibility and |
|||
convenience in managing customer requests.</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="container rounded"> |
|||
<ul class="nav nav-tabs d-flex" |
|||
style="width: fit-content;margin: 0 auto;gap: 1rem;"> |
|||
<li class="col text-center py-2 text-nowrap " |
|||
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;"> |
|||
<a class="active show" data-toggle="tab" href="#tab1" |
|||
style="color: #fff;font-weight: 500; background-color: #714B67; text-decoration: none;"> |
|||
<i class="fa-regular fa-image pr-2" |
|||
style="color: #fff;"></i> |
|||
Screenshots</a></li> |
|||
<li class="col text-center py-2 text-nowrap " |
|||
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;"> |
|||
<a data-toggle="tab" href="#tab2" |
|||
style="color: #fff;font-weight: 500; text-decoration: none;"><i |
|||
class="fa-solid fa-star pr-2" |
|||
style="color: #fff;"></i>Features</a></li> |
|||
<li class="col text-center py-2 text-nowrap " |
|||
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;"> |
|||
<a data-toggle="tab" href="#tab3" |
|||
style="color: #fff;font-weight: 500; text-decoration: none; background-color: #714B67;"><i |
|||
class="fa-solid fa-book-open pr-2" |
|||
style="color: #fff;"></i>Released Notes</a></li> |
|||
</ul> |
|||
<div class="tab-content" |
|||
style="background-color: rgba(121, 113, 119, 0.04);"> |
|||
<div id="tab1" class="tab-pane fade in active show"> |
|||
<div class="col-lg-12 py-2" |
|||
style="padding: 1rem 4rem !important;"> |
|||
<div |
|||
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<div class="row justify-content-center p-3 w-100 m-0"> |
|||
<img src="assets/screenshots/1.png" |
|||
class="img-responsive" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<div class="px-3"> |
|||
<h4 class="mt-2" |
|||
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
|||
First set the access right for the user as |
|||
'Kitchen Cook' |
|||
</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-12 py-2" |
|||
style="padding: 1rem 4rem !important;"> |
|||
<div |
|||
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<div class="row justify-content-center p-3 w-100 m-0"> |
|||
<img src="assets/screenshots/2.png" |
|||
class="img-responsive" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<div class="px-3"> |
|||
<h4 class="mt-2" |
|||
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
|||
Create a kitchen screen from the POS |
|||
</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-12 py-2" |
|||
style="padding: 1rem 4rem !important;"> |
|||
<div |
|||
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<div class="row justify-content-center p-3 w-100 m-0"> |
|||
<img src="assets/screenshots/3.png" |
|||
class="img-responsive" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<div class="px-3"> |
|||
<h4 class="mt-2" |
|||
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
|||
Configure the POS session and associated |
|||
category to seamlessly integrate kitchen |
|||
orders into the dedicated kitchen screen |
|||
for efficient order processing.To access |
|||
the detailed information pertaining to |
|||
kitchen orders, kindly utilize the <mark>"Kitchen |
|||
Screen" </mark>button located in the image |
|||
above.</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-12 py-2" |
|||
style="padding: 1rem 4rem !important;"> |
|||
<div |
|||
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<div class="row justify-content-center p-3 w-100 m-0"> |
|||
<img src="assets/screenshots/img.png" |
|||
class="img-responsive" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<div class="px-3"> |
|||
<h4 class="mt-2" |
|||
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
|||
This is the initial view of the kitchen |
|||
order interface, displayed when no orders |
|||
have been created for the kitchen.</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-12 py-2" |
|||
style="padding: 1rem 4rem !important;"> |
|||
<div |
|||
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<div class="row justify-content-center p-3 w-100 m-0"> |
|||
<img src="assets/screenshots/4.png" |
|||
class="img-responsive" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<div class="px-3"> |
|||
<h4 class="mt-2" |
|||
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
|||
We can effortlessly generate kitchen orders |
|||
by utilizing the designated 'Order' button |
|||
displayed in the image below. |
|||
</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-12 py-2" |
|||
style="padding: 1rem 4rem !important;"> |
|||
<div |
|||
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<div class="row justify-content-center p-3 w-100 m-0"> |
|||
<img src="assets/screenshots/5.png" |
|||
class="img-responsive" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<div class="px-3"> |
|||
<h4 class="mt-2" |
|||
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
|||
After creating the order in the POS session |
|||
it will come under the cooking stage.Here |
|||
you can gain comprehensive insights into |
|||
each order, including Order Time, Table |
|||
name, Cashier name, Order Internal |
|||
Reference, and Floor details, and Order |
|||
Count of the 'Cooking' stage for a |
|||
complete overview of your kitchen |
|||
operations. |
|||
</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-12 py-2" |
|||
style="padding: 1rem 4rem !important;"> |
|||
<div |
|||
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<div class="row justify-content-center p-3 w-100 m-0"> |
|||
<img src="assets/screenshots/6.png" |
|||
class="img-responsive" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<div class="px-3"> |
|||
<h4 class="mt-2" |
|||
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
|||
After cccepting the Order in the cooking |
|||
stage it will come under this "Ready" |
|||
stage. when the food was ready we can |
|||
simply click the DONE button, and it will |
|||
automatically goto the Completed stage. |
|||
Here also you can see all the details of |
|||
your order. |
|||
</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-12 py-2" |
|||
style="padding: 1rem 4rem !important;"> |
|||
<div |
|||
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<div class="row justify-content-center p-3 w-100 m-0"> |
|||
<img src="assets/screenshots/7.png" |
|||
class="img-responsive" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<div class="px-3"> |
|||
<h4 class="mt-2" |
|||
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
|||
All the Completed foods are shown in the |
|||
'Completed' Stage. Experience a detailed |
|||
view of your Orders, showcasing essential |
|||
information such as Order Time, Table name, |
|||
Cashier name, Order Internal Reference, and |
|||
Floor details, providing comprehensive |
|||
oversight. |
|||
</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-12 py-2" |
|||
style="padding: 1rem 4rem !important;"> |
|||
<div |
|||
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<div class="row justify-content-center p-3 w-100 m-0"> |
|||
<img src="assets/screenshots/8.png" |
|||
class="img-responsive" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<div class="px-3"> |
|||
<h4 class="mt-2" |
|||
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
|||
Payment processing is enabled only upon |
|||
order completion, ensuring a structured |
|||
workflow that aligns with efficient kitchen |
|||
operations.Attempting a payment before |
|||
completing kitchen orders results in an |
|||
error, promoting a streamlined process and |
|||
ensuring all food items are prepared before |
|||
finalizing transactions. |
|||
</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-12 py-2" |
|||
style="padding: 1rem 4rem !important;"> |
|||
<div |
|||
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<div class="row justify-content-center p-3 w-100 m-0"> |
|||
<img src="assets/screenshots/9.png" |
|||
class="img-responsive" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<div class="px-3"> |
|||
<h4 class="mt-2" |
|||
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
|||
Once an order is completed, any attempt to |
|||
add additional food items to the kitchen is |
|||
restricted, reinforcing accuracy in order |
|||
fulfillment and kitchen management.Adding |
|||
any food item after order completion |
|||
prompts an error |
|||
</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-12 py-2" |
|||
style="padding: 1rem 4rem !important;"> |
|||
<div |
|||
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<div class="row justify-content-center p-3 w-100 m-0"> |
|||
<img src="assets/screenshots/10.png" |
|||
class="img-responsive" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<div class="px-3"> |
|||
<h4 class="mt-2" |
|||
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important"> |
|||
Effortlessly create additional orders for |
|||
the same table by clicking the 'Order' |
|||
button located in the top-right corner. |
|||
</h4> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
</div> |
|||
|
|||
|
|||
<div id="tab2" class="tab-pane fade"> |
|||
<div class="col-mg-12" style="padding: 1rem 4rem;"> |
|||
<ul style="list-style: none; padding: 1rem 0;font-weight: 500;"> |
|||
<li class="py-3" |
|||
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<span style="margin-right: 12px;"><img |
|||
src="assets/misc/star (1) 2.svg" |
|||
alt="" |
|||
width="16px">One of the main advantages of the POS Kitchen Screen is that it provides a clear and organized display of all active orders, making it easy for kitchen staff to see what needs to be done next. </span> |
|||
</li> |
|||
<li class="py-3" |
|||
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<span style="margin-right: 12px;"><img |
|||
src="assets/misc/star (1) 2.svg" |
|||
alt="" |
|||
width="16px">The POS Kitchen Screen is a valuable tool for any restaurant or food-related business that wants to streamline their operations and improve their customer service.</span> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</div> |
|||
<div id="tab3" class="tab-pane fade"> |
|||
<div class="col-mg-12 active" style="padding: 1rem 4rem;"> |
|||
<div class="py-3" |
|||
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);"> |
|||
<div class="d-flex mb-3" |
|||
style="font-size: 0.8rem; font-weight: 500;"><span>Version |
|||
17.0.1.0.0</span><span |
|||
class="px-2">|</span><span |
|||
style="color: #714B67;font-weight: 600;">Released on:10th Jan 2024</span> |
|||
</div> |
|||
<p class="m-0" |
|||
style=" color:#718096!important; font-size:1rem !important;line-height: 28px;"> |
|||
Initial Commit for POS Kitchen Screen |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="container mt-5"> |
|||
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5"> |
|||
<p class="m-0" |
|||
style="font-weight: 600; font-size: 24px; color:#000 !important"> |
|||
Related Products</p> |
|||
</div> |
|||
</div> |
|||
<div id="myCarousel" class="carousel slide py-3" data-ride="carousel"> |
|||
<div class="carousel-inner"> |
|||
<div class="carousel-item active"> |
|||
<div class="row p-4"> |
|||
<div class="col"> |
|||
<div class="p-3"> |
|||
<a href="https://apps.odoo.com/apps/modules/17.0/base_accounting_kit/" |
|||
style="color: #000; text-decoration: none;"> |
|||
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
|||
<div style="width: 300px; "> |
|||
<img src="assets/modules/1.jpg" |
|||
alt="" width="100%" |
|||
height="auto"> |
|||
|
|||
</div> |
|||
<p class="text-center pt-2 text-black font-weight-bold"> |
|||
Odoo 17 Full Accounting Kit</p> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div class="col"> |
|||
<div class="p-3"> |
|||
<a href="https://apps.odoo.com/apps/modules/17.0/auto_database_backup/" |
|||
style="color: #000; text-decoration: none;"> |
|||
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
|||
<div style="width: 300px; "> |
|||
<img src="assets/modules/2.gif" |
|||
alt="" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<p class="text-center pt-2 text-black font-weight-bold"> |
|||
Automatic Database Backup To Local |
|||
Server, Remote Server,Google Drive, |
|||
Dropbox, Onedrive, Nextcloud and |
|||
Amazon S3</p> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div class="col"> |
|||
<div class="p-3"> |
|||
<a href="https://apps.odoo.com/apps/modules/17.0/direct_print_odoo/" |
|||
style="color: #000; text-decoration: none;"> |
|||
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
|||
<div style="width: 300px; "> |
|||
<img src="assets/modules/3.jpg" |
|||
alt="" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<p class="text-center pt-2 text-black font-weight-bold"> |
|||
Direct Print</p> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="carousel-item"> |
|||
<div class="row p-4"> |
|||
<div class="col"> |
|||
<div class="p-3"> |
|||
<a href="https://apps.odoo.com/apps/modules/17.0/mail_push_notification/" |
|||
style="color: #000; text-decoration: none;"> |
|||
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
|||
<div style="width: 300px; "> |
|||
<img src="assets/modules/4.jpg" |
|||
alt="" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<p class="text-center pt-2 text-black font-weight-bold"> |
|||
Push Notification From ChatBox</p> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div class="col"> |
|||
<div class="p-3"> |
|||
<a href="https://apps.odoo.com/apps/modules/17.0/login_user_detail/" |
|||
style="color: #000; text-decoration: none;"> |
|||
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
|||
<div style="width: 300px;"> |
|||
<img src="assets/modules/5.png" |
|||
alt="" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<p class="text-center pt-2 text-black font-weight-bold"> |
|||
User Log Details</p> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div class="col"> |
|||
<div class="p-3"> |
|||
<a href="https://apps.odoo.com/apps/modules/17.0/hr_payroll_account_community/" |
|||
style="color: #000; text-decoration: none;"> |
|||
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;"> |
|||
<div style="width: 300px;"> |
|||
<img src="assets/modules/6.jpg" |
|||
alt="" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<p class="text-center pt-2 text-black font-weight-bold"> |
|||
Odoo17 Payroll Accounting</p> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<a class="carousel-control-prev" href="#myCarousel" |
|||
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="#myCarousel" |
|||
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 class="container mt-5"> |
|||
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4"> |
|||
<p class="m-0" |
|||
style="font-weight: 600; font-size: 24px; color:#000 !important"> |
|||
Our Services</p> |
|||
|
|||
</div> |
|||
</div> |
|||
<div class="container my-5"> |
|||
<div class="row py-3"> |
|||
<div class="col-md-4 col-sm-6 px-4 py-4"> |
|||
<div |
|||
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
|||
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
|||
<div style="background-color:#13EA36 ; border-radius: 50%; padding: 15px; width: 68px; |
|||
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
|||
<img src="assets/icons/cogs.png" |
|||
alt="service-icon" width="38px" |
|||
height="auto"> |
|||
</div> |
|||
</div> |
|||
<p style="margin-top: 20px; font-weight: bold;">Odoo |
|||
Customization</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-4 col-sm-6 px-4 py-4"> |
|||
<div |
|||
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
|||
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
|||
<div style="background-color:#DBC711; border-radius: 50%; padding: 15px; width: 68px; |
|||
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
|||
<img src="assets/icons/wrench.png" |
|||
alt="service-icon" width="38px" |
|||
height="auto"> |
|||
</div> |
|||
</div> |
|||
<p style="margin-top: 20px; font-weight: bold;">Odoo |
|||
Implementation</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-4 col-sm-6 px-4 py-4"> |
|||
<div |
|||
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;"> |
|||
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
|||
<div style="background-color:#FF6B6B ; border-radius: 50%; padding: 15px; width: 68px; |
|||
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
|||
<img src="assets/icons/lifebuoy.png" |
|||
alt="service-icon" width="38px" |
|||
height="auto"> |
|||
</div> |
|||
</div> |
|||
<p style="margin-top: 20px; font-weight: bold;">Odoo |
|||
Support</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-4 col-sm-6 px-4 py-4"> |
|||
<div |
|||
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;"> |
|||
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
|||
<div style="background-color:#FFA801 ; border-radius: 50%; padding: 15px; width: 68px; |
|||
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
|||
<img src="assets/icons/user.png" |
|||
alt="service-icon" width="38px" |
|||
height="auto"> |
|||
</div> |
|||
</div> |
|||
<p style="margin-top: 20px; font-weight: bold;">Hire |
|||
Odoo Developer</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-4 col-sm-6 px-4 py-4"> |
|||
<div |
|||
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;"> |
|||
|
|||
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
|||
<div style="background-color:#54A0FF; border-radius: 50%; padding: 15px; width: 68px; |
|||
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
|||
<img src="assets/icons/puzzle.png" |
|||
alt="service-icon" width="38px" |
|||
height="auto"> |
|||
</div> |
|||
</div> |
|||
<p style="margin-top: 20px; font-weight: bold;">Odoo |
|||
Integration</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-4 col-sm-6 px-4 py-4"> |
|||
<div |
|||
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
|||
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
|||
<div style="background-color:#6D7680 ; border-radius: 50%; padding: 15px; width: 68px; |
|||
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
|||
<img src="assets/icons/update.png" |
|||
alt="service-icon" width="38px" |
|||
height="auto"> |
|||
</div> |
|||
</div> |
|||
<p style="margin-top: 20px; font-weight: bold;">Odoo |
|||
Migration</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-4 col-sm-6 px-4 py-4"> |
|||
<div |
|||
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
|||
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
|||
<div style="background-color:#786FA6 ; border-radius: 50%; padding: 15px; width: 68px; |
|||
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
|||
<img src="assets/icons/consultation.png" |
|||
alt="service-icon" width="38px" |
|||
height="auto"> |
|||
</div> |
|||
</div> |
|||
<p style="margin-top: 20px; font-weight: bold;">Odoo |
|||
Consultancy</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-4 col-sm-6 px-4 py-4"> |
|||
<div |
|||
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;position: relative;border-radius: 4px;"> |
|||
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
|||
<div style="background-color:#F8A5C2 ; border-radius: 50%; padding: 15px; width: 68px; |
|||
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
|||
<img src="assets/icons/training.png" |
|||
alt="service-icon" width="38px" |
|||
height="auto"> |
|||
</div> |
|||
</div> |
|||
<p style="margin-top: 20px; font-weight: bold;">Odoo |
|||
Implementation</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-4 col-sm-6 px-4 py-4"> |
|||
<div |
|||
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;"> |
|||
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);"> |
|||
<div style="background-color:#E6BE26; border-radius: 50%; padding: 15px; width: 68px; |
|||
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);"> |
|||
<img src="assets/icons/license.png" |
|||
alt="service-icon" width="38px" |
|||
height="auto"> |
|||
</div> |
|||
</div> |
|||
<p style="margin-top: 20px; font-weight: bold;">Odoo |
|||
Licensing Consultancy</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="container mt-5"> |
|||
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4"> |
|||
<p class="m-0" |
|||
style="font-weight: 600; font-size: 24px; color:#000 !important"> |
|||
Our Industries</p> |
|||
</div> |
|||
</div> |
|||
<div class="container"> |
|||
<div class="row my-5 py-4"> |
|||
<div class="col-md-3 col-sm-6 p-0"> |
|||
<div class="d-flex flex-column h-100 " |
|||
style="border-right: 1px solid rgb(209, 209, 209); border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; box-shadow: 6px 0 10px rgba(228, 227, 227, 0.373);"> |
|||
<img src="assets/icons/trading-black.png" width="42px" |
|||
height="auto" alt=""> |
|||
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
|||
font-size: 1.2rem; margin-bottom: 2px;">Trading</p> |
|||
<p>Easily procure and sell your products</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-3 col-sm-6 p-0"> |
|||
<div class="d-flex flex-column h-100" |
|||
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgb(209, 209, 209); padding: 30px;"> |
|||
<img src="assets/icons/pos-black.png" width="42px" |
|||
height="auto" alt=""> |
|||
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
|||
font-size: 1.2rem; margin-bottom: 2px;">POS</p> |
|||
<p>Easy configuration and convivial experience</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-3 col-sm-6 p-0"> |
|||
<div class="d-flex flex-column h-100" |
|||
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding: 30px; box-shadow: 0 5px 10px rgba(228, 227, 227, 0.373)"> |
|||
<img src="assets/icons/education-black.png" |
|||
width="42px" height="auto" alt=""> |
|||
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
|||
font-size: 1.2rem; margin-bottom: 2px;"> |
|||
Education</p> |
|||
<p>A platform for educational management</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-3 col-sm-6 p-0"> |
|||
<div class="d-flex flex-column h-100" |
|||
style="border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; "> |
|||
<img src="assets/icons/manufacturing-black.png" |
|||
width="42px" height="auto" alt=""> |
|||
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
|||
font-size: 1.2rem; margin-bottom: 2px;"> |
|||
Manufacturing</p> |
|||
<p>Plan, track and schedule your operations</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-3 col-sm-6 p-0"> |
|||
<div class="d-flex flex-column h-100" |
|||
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;"> |
|||
<img src="assets/icons/ecom-black.png" width="42px" |
|||
height="auto" alt=""> |
|||
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
|||
font-size: 1.2rem; margin-bottom: 2px;">E-commerce |
|||
& Website</p> |
|||
<p>Mobile friendly, awe-inspiring product pages</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-3 col-sm-6 p-0"> |
|||
<div class="d-flex flex-column h-100" |
|||
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;box-shadow: 0 -5px 10px rgba(228, 227, 227, 0.373);"> |
|||
<img src="assets/icons/service-black.png" width="42px" |
|||
height="auto" alt=""> |
|||
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
|||
font-size: 1.2rem; margin-bottom: 2px;">Service |
|||
Management</p> |
|||
<p>Keep track of services and invoice</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-3 col-sm-6 p-0"> |
|||
<div class="d-flex flex-column h-100" |
|||
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px; "> |
|||
<img src="assets/icons/restaurant-black.png" |
|||
width="42px" height="auto" alt=""> |
|||
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
|||
font-size: 1.2rem; margin-bottom: 2px;"> |
|||
Restaurant</p> |
|||
<p>Run your bar or restaurant methodically</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-3 col-sm-6 p-0"> |
|||
<div class="d-flex flex-column h-100" |
|||
style=" padding: 30px;box-shadow: -5px 0 10px rgba(228, 227, 227, 0.373);"> |
|||
<img src="assets/icons/hotel-black.png" width="42px" |
|||
height="auto" alt=""> |
|||
<p style="color: #714B67;font-weight: 600; margin-top: 10px; |
|||
font-size: 1.2rem; margin-bottom: 2px;">Hotel |
|||
Management</p> |
|||
<p>An all-inclusive hotel management application</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="container mt-5"> |
|||
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5"> |
|||
<p class="m-0" |
|||
style="font-weight: 600; font-size: 24px; color:#000 !important"> |
|||
Support</p> |
|||
</div> |
|||
</div> |
|||
<div class="container my-5"> |
|||
<div class="row" style="background-color: #FFFAFE;"> |
|||
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center" |
|||
style="border-right: 1px solid #D9D9D9;"> |
|||
<div style="padding: 30px;"> |
|||
<div class="d-flex align-items-center"> |
|||
<img src="assets/misc/support (1) 1.svg" alt="" |
|||
width="60px" style="margin-right: 12px;"> |
|||
<div style="padding: 0px 8px;"> |
|||
<span |
|||
style="color: #714B67;font-size: 24px;font-weight: 600;padding-bottom: 1rem;">Need |
|||
Help?</span> |
|||
<p class="m-0" style="color:#718096;">Got |
|||
questions or need help? Get in touch.</p> |
|||
<div style="font-weight: 400;"><span><img |
|||
src="assets/misc/support-email.svg" |
|||
alt="" |
|||
width="18px" |
|||
style="filter: invert(1);margin-right: 0.8rem;"></span>odoo@cybrosys.com |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center"> |
|||
<div style="padding: 30px;"> |
|||
<div class="d-flex align-items-center"> |
|||
<img src="assets/misc/whatsapp 1.svg" alt="" |
|||
width="60px" style="margin-right: 12px;"> |
|||
<div> |
|||
<span style="color: #714B67;font-size: 24px;font-weight: 600;">WhatsApp</span> |
|||
<p class="m-0" style="color:#718096;">Say hi to |
|||
us on WhatsApp!</p> |
|||
<div style="font-weight: 400; font-size: 16px;"><span><img |
|||
src="assets/misc/phone.svg" |
|||
alt="" width="14px" |
|||
style="filter: invert(1); margin-right: 0.8rem;"></span>+91 |
|||
99456767686 |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<!-- Optional JavaScript --> |
|||
<!-- jQuery first, then Popper.js, then Bootstrap JS --> |
|||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> |
|||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> |
|||
</body> |
|||
</html> |
After Width: | Height: | Size: 889 B |
After Width: | Height: | Size: 803 B |
After Width: | Height: | Size: 801 B |
After Width: | Height: | Size: 803 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 6.9 KiB |
@ -0,0 +1,710 @@ |
|||
.kitchen{ |
|||
height: 100vh; |
|||
overflow: hidden; |
|||
} |
|||
.kitchen .body_wrapper { |
|||
--white-color: #ffff; |
|||
--black-color: #000000; |
|||
--body-bg:#F9F9F9; |
|||
--draft:#545454; |
|||
--cooking: #1D89AB; |
|||
--completed:#0d7411a3; |
|||
--bg-grey:#DEDEDE; |
|||
--bg-blue: #DAE7EB; |
|||
} |
|||
.kitchen .body_wrapper{ |
|||
position: relative; |
|||
font-family: "Inter", sans-serif !important; |
|||
color: var(--text-color); |
|||
background-color: var(--body-bg); |
|||
padding: 50px 100px; |
|||
overflow: scroll; |
|||
height: 100%; |
|||
} |
|||
|
|||
@media screen and (max-width: 768px) { |
|||
.kitchen .body_wrapper { |
|||
padding: 30px 15px; |
|||
} |
|||
} |
|||
.kitchen .accept_cancel,.card-bottom{ |
|||
padding: 15px 15px; |
|||
text-align: center; |
|||
display: flex; |
|||
justify-content: space-evenly; |
|||
} |
|||
.kitchen *:focus { |
|||
outline: 0 !important; |
|||
} |
|||
|
|||
.kitchen *:hover { |
|||
transition: 0.2s; |
|||
} |
|||
|
|||
.kitchen *:focus { |
|||
outline: 0 !important; |
|||
box-shadow: none !important; |
|||
} |
|||
|
|||
.kitchen *button:focus { |
|||
border: none; |
|||
outline: none; |
|||
box-shadow: none; |
|||
} |
|||
|
|||
.kitchen * { |
|||
list-style-type: none; |
|||
font-family: "Inter", sans-serif !important; |
|||
font-size: 18px; |
|||
} |
|||
|
|||
.kitchen *:focus, *:active { |
|||
outline: none !important; |
|||
} |
|||
|
|||
.kitchen.sr .load-hidden { |
|||
visibility: hidden; |
|||
} |
|||
|
|||
.kitchen *::selection { |
|||
color: #f3ebee; |
|||
background-color: black; |
|||
} |
|||
|
|||
.kitchen *a, |
|||
.kitchen a:visited { |
|||
color: #990000; |
|||
text-decoration: none; |
|||
} |
|||
|
|||
|
|||
.kitchen .affix { |
|||
top: 0; |
|||
width: 100%; |
|||
z-index: 9999 !important; |
|||
} |
|||
|
|||
.kitchen { |
|||
scroll-behavior: smooth !important; |
|||
} |
|||
|
|||
|
|||
.kitchen .custom_padding_top { |
|||
padding-top: 80px; |
|||
} |
|||
|
|||
.kitchen .custom_padding_bottom { |
|||
padding-bottom: 80px; |
|||
} |
|||
|
|||
.kitchen .main_heading { |
|||
font-size: 36px; |
|||
font-weight: 500; |
|||
color: var(--white-color); |
|||
padding-bottom: 20px; |
|||
text-align: center; |
|||
margin-bottom: 20px; |
|||
} |
|||
|
|||
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ |
|||
/* Document |
|||
========================================================================== */ |
|||
/** |
|||
* 1. Correct the line height in all browsers. |
|||
* 2. Prevent adjustments of font size after orientation changes in iOS. |
|||
*/ |
|||
.kitchen { |
|||
line-height: 1.15; |
|||
/* 1 */ |
|||
-webkit-text-size-adjust: 100%; |
|||
/* 2 */ |
|||
} |
|||
|
|||
/* Sections |
|||
========================================================================== */ |
|||
/** |
|||
* Remove the margin in all browsers. |
|||
*/ |
|||
|
|||
/** |
|||
* Render the `main` element consistently in IE. |
|||
*/ |
|||
.kitchen main { |
|||
display: block; |
|||
} |
|||
|
|||
/** |
|||
* Correct the font size and margin on `h1` elements within `section` and |
|||
* `article` contexts in Chrome, Firefox, and Safari. |
|||
*/ |
|||
.kitchen h1 { |
|||
font-size: 2em; |
|||
margin: 0.67em 0; |
|||
} |
|||
|
|||
/* Grouping content |
|||
========================================================================== */ |
|||
/** |
|||
* 1. Add the correct box sizing in Firefox. |
|||
* 2. Show the overflow in Edge and IE. |
|||
*/ |
|||
.kitchen hr { |
|||
box-sizing: content-box; |
|||
/* 1 */ |
|||
height: 0; |
|||
/* 1 */ |
|||
overflow: visible; |
|||
/* 2 */ |
|||
} |
|||
|
|||
/** |
|||
* 1. Correct the inheritance and scaling of font size in all browsers. |
|||
* 2. Correct the odd `em` font sizing in all browsers. |
|||
*/ |
|||
.kitchen pre { |
|||
font-family: monospace, monospace; |
|||
/* 1 */ |
|||
font-size: 1em; |
|||
/* 2 */ |
|||
} |
|||
|
|||
/* Text-level semantics |
|||
========================================================================== */ |
|||
/** |
|||
* Remove the gray background on active links in IE 10. |
|||
*/ |
|||
.kitchen a { |
|||
background-color: transparent; |
|||
} |
|||
|
|||
/** |
|||
* 1. Remove the bottom border in Chrome 57- |
|||
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. |
|||
*/ |
|||
.kitchen abbr[title] { |
|||
border-bottom: none; |
|||
/* 1 */ |
|||
text-decoration: underline; |
|||
/* 2 */ |
|||
text-decoration: underline dotted; |
|||
/* 2 */ |
|||
} |
|||
|
|||
/** |
|||
* Add the correct font weight in Chrome, Edge, and Safari. |
|||
*/ |
|||
.kitchen b, |
|||
.kitchen strong { |
|||
font-weight: bolder; |
|||
} |
|||
|
|||
/** |
|||
* 1. Correct the inheritance and scaling of font size in all browsers. |
|||
* 2. Correct the odd `em` font sizing in all browsers. |
|||
*/ |
|||
.kitchen code, |
|||
.kitchen kbd, |
|||
.kitchen samp { |
|||
font-family: monospace, monospace; |
|||
/* 1 */ |
|||
font-size: 1em; |
|||
/* 2 */ |
|||
} |
|||
|
|||
/** |
|||
* Add the correct font size in all browsers. |
|||
*/ |
|||
.kitchen small { |
|||
font-size: 80%; |
|||
} |
|||
|
|||
/** |
|||
* Prevent `sub` and `sup` elements from affecting the line height in |
|||
* all browsers. |
|||
*/ |
|||
.kitchen sub, |
|||
.kitchen sup { |
|||
font-size: 75%; |
|||
line-height: 0; |
|||
position: relative; |
|||
vertical-align: baseline; |
|||
} |
|||
|
|||
.kitchen sub { |
|||
bottom: -0.25em; |
|||
} |
|||
|
|||
.kitchen sup { |
|||
top: -0.5em; |
|||
} |
|||
|
|||
/* Embedded content |
|||
========================================================================== */ |
|||
/** |
|||
* Remove the border on images inside links in IE 10. |
|||
*/ |
|||
.kitchen img { |
|||
border-style: none; |
|||
} |
|||
|
|||
/* Forms |
|||
========================================================================== */ |
|||
/** |
|||
* 1. Change the font styles in all browsers. |
|||
* 2. Remove the margin in Firefox and Safari. |
|||
*/ |
|||
.kitchen button, |
|||
input, |
|||
.kitchen optgroup, |
|||
.kitchen select, |
|||
.kitchen textarea { |
|||
font-family: inherit; |
|||
/* 1 */ |
|||
font-size: 100%; |
|||
/* 1 */ |
|||
line-height: 1.15; |
|||
/* 1 */ |
|||
margin: 0; |
|||
/* 2 */ |
|||
} |
|||
|
|||
/** |
|||
* Show the overflow in IE. |
|||
* 1. Show the overflow in Edge. |
|||
*/ |
|||
.kitchen button, |
|||
.kitchen input { |
|||
/* 1 */ |
|||
overflow: visible; |
|||
} |
|||
|
|||
/** |
|||
* Remove the inheritance of text transform in Edge, Firefox, and IE. |
|||
* 1. Remove the inheritance of text transform in Firefox. |
|||
*/ |
|||
.kitchen button, |
|||
select { |
|||
/* 1 */ |
|||
text-transform: none; |
|||
} |
|||
|
|||
/** |
|||
* Correct the inability to style clickable types in iOS and Safari. |
|||
*/ |
|||
.kitchen button, |
|||
.kitchen [type="button"], |
|||
.kitchen [type="reset"], |
|||
.kitchen [type="submit"] { |
|||
-webkit-appearance: button; |
|||
} |
|||
|
|||
/** |
|||
* Remove the inner border and padding in Firefox. |
|||
*/ |
|||
.kitchen button::-moz-focus-inner, |
|||
.kitchen [type="button"]::-moz-focus-inner, |
|||
.kitchen [type="reset"]::-moz-focus-inner, |
|||
.kitchen [type="submit"]::-moz-focus-inner { |
|||
border-style: none; |
|||
padding: 0; |
|||
} |
|||
|
|||
/** |
|||
* Restore the focus styles unset by the previous rule. |
|||
*/ |
|||
.kitchen button:-moz-focusring, |
|||
.kitchen [type="button"]:-moz-focusring, |
|||
.kitchen [type="reset"]:-moz-focusring, |
|||
.kitchen [type="submit"]:-moz-focusring { |
|||
outline: 1px dotted ButtonText; |
|||
} |
|||
|
|||
/** |
|||
* Correct the padding in Firefox. |
|||
*/ |
|||
.kitchen fieldset { |
|||
padding: 0.35em 0.75em 0.625em; |
|||
} |
|||
|
|||
/** |
|||
* 1. Correct the text wrapping in Edge and IE. |
|||
* 2. Correct the color inheritance from `fieldset` elements in IE. |
|||
* 3. Remove the padding so developers are not caught out when they zero out |
|||
* `fieldset` elements in all browsers. |
|||
*/ |
|||
.kitchen legend { |
|||
box-sizing: border-box; |
|||
/* 1 */ |
|||
color: inherit; |
|||
/* 2 */ |
|||
display: table; |
|||
/* 1 */ |
|||
max-width: 100%; |
|||
/* 1 */ |
|||
padding: 0; |
|||
/* 3 */ |
|||
white-space: normal; |
|||
/* 1 */ |
|||
} |
|||
|
|||
/** |
|||
* Add the correct vertical alignment in Chrome, Firefox, and Opera. |
|||
*/ |
|||
.kitchen progress { |
|||
vertical-align: baseline; |
|||
} |
|||
|
|||
/** |
|||
* Remove the default vertical scrollbar in IE 10+. |
|||
*/ |
|||
.kitchen textarea { |
|||
overflow: auto; |
|||
} |
|||
|
|||
/** |
|||
* 1. Add the correct box sizing in IE 10. |
|||
* 2. Remove the padding in IE 10. |
|||
*/ |
|||
.kitchen [type="checkbox"], |
|||
.kitchen [type="radio"] { |
|||
box-sizing: border-box; |
|||
/* 1 */ |
|||
padding: 0; |
|||
/* 2 */ |
|||
} |
|||
|
|||
/** |
|||
* Correct the cursor style of increment and decrement buttons in Chrome. |
|||
*/ |
|||
.kitchen [type="number"]::-webkit-inner-spin-button, |
|||
.kitchen [type="number"]::-webkit-outer-spin-button { |
|||
height: auto; |
|||
} |
|||
|
|||
/** |
|||
* 1. Correct the odd appearance in Chrome and Safari. |
|||
* 2. Correct the outline style in Safari. |
|||
*/ |
|||
.kitchen [type="search"] { |
|||
-webkit-appearance: textfield; |
|||
/* 1 */ |
|||
outline-offset: -2px; |
|||
/* 2 */ |
|||
} |
|||
|
|||
/** |
|||
* Remove the inner padding in Chrome and Safari on macOS. |
|||
*/ |
|||
.kitchen [type="search"]::-webkit-search-decoration { |
|||
-webkit-appearance: none; |
|||
} |
|||
|
|||
/** |
|||
* 1. Correct the inability to style clickable types in iOS and Safari. |
|||
* 2. Change font properties to `inherit` in Safari. |
|||
*/ |
|||
.kitchen ::-webkit-file-upload-button { |
|||
-webkit-appearance: button; |
|||
/* 1 */ |
|||
font: inherit; |
|||
/* 2 */ |
|||
} |
|||
|
|||
/* Interactive |
|||
========================================================================== */ |
|||
/* |
|||
* Add the correct display in Edge, IE 10+, and Firefox. |
|||
*/ |
|||
.kitchen details { |
|||
display: block; |
|||
} |
|||
|
|||
/* |
|||
* Add the correct display in all browsers. |
|||
*/ |
|||
.kitchen summary { |
|||
display: list-item; |
|||
} |
|||
|
|||
/* Misc |
|||
========================================================================== */ |
|||
/** |
|||
* Add the correct display in IE 10+. |
|||
*/ |
|||
.kitchen template { |
|||
display: none; |
|||
} |
|||
|
|||
/** |
|||
* Add the correct display in IE 10. |
|||
*/ |
|||
.kitchen [hidden] { |
|||
display: none; |
|||
} |
|||
|
|||
.kitchen .btn { |
|||
border: none !important; |
|||
outline: 0 !important; |
|||
transition: 0.5s; |
|||
} |
|||
|
|||
.kitchen .btn-primary { |
|||
border-radius: 4px; |
|||
font-size: 14px; |
|||
|
|||
letter-spacing: normal; |
|||
text-decoration: none; |
|||
padding: 12px 25px; |
|||
position: relative; |
|||
font-weight:700; |
|||
color: var(--white-color) !important; |
|||
transition: all 0.3s; |
|||
background-color: var(--cooking) !important; |
|||
text-transform: uppercase; |
|||
border:1px solid !important; |
|||
border-color:var(--cooking) !important; |
|||
} |
|||
|
|||
.kitchen .btn-primary:hover { |
|||
color: var(--cooking) !important; |
|||
transition: all 0.3s; |
|||
background-color: transparent !important; |
|||
|
|||
} |
|||
|
|||
|
|||
.kitchen .btn-secondary { |
|||
border-radius: 4px; |
|||
font-size: 14px; |
|||
text-transform: uppercase; |
|||
border:1px solid !important; |
|||
border-color:var(--draft) !important; |
|||
letter-spacing: normal; |
|||
text-decoration: none; |
|||
padding: 12px 25px; |
|||
position: relative; |
|||
font-weight:700; |
|||
color: var(--white-color) !important; |
|||
transition: all 0.3s; |
|||
background-color: var(--draft) !important; |
|||
|
|||
} |
|||
|
|||
.kitchen .btn-secondary:hover { |
|||
color: var(--draft) !important; |
|||
transition: all 0.3s; |
|||
background-color: transparent !important; |
|||
|
|||
} |
|||
|
|||
.kitchen .btn-transparent { |
|||
padding: 0; |
|||
font-size: 12px; |
|||
} |
|||
|
|||
.kitchen .infiniarc_banner { |
|||
padding-top: 50px; |
|||
margin-bottom: 100px; |
|||
} |
|||
|
|||
.kitchen .infiniarc_banner .banner_bg { |
|||
background-image: url(./../assets/banner/banne_1.jpg); |
|||
background-repeat: no-repeat; |
|||
background-position: center; |
|||
background-size: cover; |
|||
height: 50vh; |
|||
position: relative; |
|||
border-radius: 10px; |
|||
} |
|||
|
|||
.kitchen .infiniarc_banner .banner_bg_1 { |
|||
background-image: url(./../assets/banner/banne_1.jpg); |
|||
} |
|||
|
|||
.kitchen .infiniarc_banner .banner_bg_2 { |
|||
background-image: url(./../assets/banner/banner_2.jpg); |
|||
} |
|||
|
|||
.kitchen .infiniarc_banner .banner_bg_3 { |
|||
background-image: url(./../assets/banner/banner_3.jpg); |
|||
} |
|||
|
|||
.kitchen .top_bar { |
|||
background-color: var(--white-color); |
|||
padding: 20px 15px 10px 25px; |
|||
box-shadow: 0px 2px 4px 1px rgba(0, 0, 0, 0.25); |
|||
border-radius: 5px; |
|||
margin-top: 20px; |
|||
} |
|||
.kitchen .fixed-top { |
|||
position: fixed; |
|||
top: 20px; |
|||
right: 0; |
|||
left: 0; |
|||
z-index: 1030; |
|||
margin: auto; |
|||
width: 69%; |
|||
} |
|||
|
|||
.kitchen .top_bar ul { |
|||
padding-left: 0; |
|||
display: flex; |
|||
flex-wrap: wrap; |
|||
width : 100%; |
|||
justify-content: space-evenly; |
|||
} |
|||
|
|||
.kitchen .top_bar ul li { |
|||
padding-right: 25px; |
|||
} |
|||
|
|||
.kitchen .top_bar ul li a { |
|||
display: flex; |
|||
align-items: center; |
|||
text-decoration: none; |
|||
} |
|||
|
|||
.kitchen .top_bar ul li a .icon { |
|||
background-color: var(--white-color); |
|||
padding: 6px 8px; |
|||
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); |
|||
} |
|||
|
|||
.kitchen .top_bar ul li a .icon svg { |
|||
height: 30px !important; |
|||
display: block; |
|||
} |
|||
|
|||
|
|||
.kitchen .top_bar ul li a span { |
|||
margin-left: 15px; |
|||
color: var(--draft); |
|||
font-size: 30px; |
|||
font-weight: 700; |
|||
padding-top: 5px; |
|||
} |
|||
|
|||
.kitchen .top_bar ul li a .cooking { |
|||
color: var(--cooking) !important; |
|||
} |
|||
|
|||
.kitchen .top_bar ul li a .completed { |
|||
color: var(--completed); |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card { |
|||
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); |
|||
transition: box-shadow 0.3s ease-out, transform 0.3s ease-out, opacity 0.2s ease-out; |
|||
transform: translate(0px, 0px); |
|||
-webkit-transform: translate(0px, 0px); |
|||
-moz-transform: translate(0px, 0px); |
|||
transition: 0.5s; |
|||
margin-bottom: 40px; |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card:hover { |
|||
transform: translate(0, -4px); |
|||
-webkit-transform: translate(0, -4px); |
|||
-moz-transform: translate(0, -4px); |
|||
transition: 0.5s; |
|||
box-shadow: rgba(45, 45, 45, 0.05) 0px 2px 2px, rgba(49, 49, 49, 0.05) 0px 4px 4px, rgba(42, 42, 42, 0.05) 0px 8px 8px, rgba(32, 32, 32, 0.05) 0px 16px 16px, rgba(49, 49, 49, 0.05) 0px 32px 32px, rgba(35, 35, 35, 0.05) 0px 64px 64px; |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card .card-header { |
|||
display: flex; |
|||
flex-wrap: wrap; |
|||
justify-content: space-between; |
|||
border: none; |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card .card-header .left { |
|||
display: flex; |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card .card-header .left .icon { |
|||
background-color: var(--white-color); |
|||
padding: 6px 8px; |
|||
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); |
|||
height: 55px; |
|||
width: 45px; |
|||
border-radius: 5px; |
|||
margin-right: 10px; |
|||
|
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card .card-header .left .status h4 { |
|||
font-size: 26px; |
|||
color: var(--draft); |
|||
text-transform: capitalize; |
|||
font-weight: 700; |
|||
margin-bottom: 0; |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card .card-header .left .status .mt { |
|||
margin-top: -10px; |
|||
color: var(--draft); |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card .card-header .left .status .c_blue { |
|||
color: var(--cooking); |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card .card-header .left .status .c_white { |
|||
color: var(--white-color); |
|||
} |
|||
@media (max-width: 1287px) { |
|||
/* Responsive styles */ |
|||
.kitchen .screen_info .wrapper .card .card-header .right { |
|||
padding-top:0px; |
|||
} |
|||
|
|||
} |
|||
.kitchen .screen_info .wrapper .card .card-header .right { |
|||
padding-top:8px; |
|||
} |
|||
.kitchen .screen_info .wrapper .card .card-header .right span { |
|||
font-size: 18px; |
|||
font-weight: 700; |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card .bg_grey { |
|||
background-color: var(--bg-grey); |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card .bg_blue { |
|||
background-color: var(--bg-blue); |
|||
color: var(--cooking) !important; |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card .bg_green { |
|||
background-color: var(--completed); |
|||
color: var(--white-color); |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card .list-group .list-group-item { |
|||
font-size: 20px; |
|||
font-weight: 500; |
|||
color: var(--draft); |
|||
padding: 20px 30px; |
|||
text-align: start; |
|||
line-height: 30px; |
|||
} |
|||
|
|||
.kitchen .screen_info .wrapper .card .list-group .list-group-item span { |
|||
font-size: 20px; |
|||
font-weight: 700; |
|||
margin-right: 5px; |
|||
} |
|||
.kitchen_order_count{ |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; margin-top: 10px; |
|||
font-size: 16px !important; |
|||
border-radius: 5px !important; |
|||
font-weight: bold !important; |
|||
background-color: #FA3E3E; |
|||
color:white !important; |
|||
} |
@ -0,0 +1,20 @@ |
|||
/** @odoo-module */ |
|||
|
|||
import { patch } from "@web/core/utils/patch"; |
|||
import { PosStore } from "@point_of_sale/app/store/pos_store"; |
|||
|
|||
patch(PosStore.prototype, { |
|||
/** |
|||
* Processes loaded data for the Point of Sale store. |
|||
* |
|||
* @param {Object} loadedData - The data loaded for the Point of Sale. |
|||
* @returns {Promise} A promise that resolves when the data is processed. |
|||
*/ |
|||
async _processData(loadedData) { |
|||
await super._processData(...arguments); |
|||
this.pos_orders = loadedData['pos.order']; |
|||
this.pos_order_lines = loadedData['pos.order.line']; |
|||
}, |
|||
}); |
|||
|
|||
|
@ -0,0 +1,136 @@ |
|||
/** @odoo-module */ |
|||
|
|||
import { registry } from "@web/core/registry"; |
|||
const { Component, useState } = owl; |
|||
import { useService } from "@web/core/utils/hooks"; |
|||
|
|||
|
|||
class kitchen_screen_dashboard extends Component { |
|||
|
|||
setup() { |
|||
this.busService = this.env.services.bus_service; |
|||
this.busService.addChannel("pos_order_created"); |
|||
this.busService.addEventListener('notification', this.onPosOrderCreation.bind(this)); |
|||
|
|||
this.action = useService("action"); |
|||
this.rpc = this.env.services.rpc; |
|||
this.action = useService("action"); |
|||
this.orm = useService("orm"); |
|||
var self=this |
|||
this.state = useState({ |
|||
order_details: [], |
|||
shop_id:[], |
|||
stages: 'draft', |
|||
draft_count:[], |
|||
waiting_count:[], |
|||
ready_count:[], |
|||
lines:[] |
|||
}); |
|||
var session_shop_id; |
|||
//if refreshing the page then the last passed context (shop id)
|
|||
//save to the session storage
|
|||
if (this.props.action.context.default_shop_id) { |
|||
sessionStorage.setItem('shop_id', this.props.action.context.default_shop_id); |
|||
this.shop_id = this.props.action.context.default_shop_id; |
|||
session_shop_id = sessionStorage.getItem('shop_id'); |
|||
} else { |
|||
session_shop_id = sessionStorage.getItem('shop_id'); |
|||
this.shop_id = parseInt(session_shop_id, 10);; |
|||
} |
|||
self.orm.call("pos.order", "get_details", ["", self.shop_id,""]).then(function(result) { |
|||
self.state.order_details = result['orders'] |
|||
self.state.lines = result['order_lines'] |
|||
self.state.shop_id=self.shop_id |
|||
self.state.draft_count=self.state.order_details.filter((order) => order.order_status=='draft' && order.config_id[0]==self.state.shop_id).length |
|||
self.state.waiting_count=self.state.order_details.filter((order) => order.order_status=='waiting' && order.config_id[0]==self.state.shop_id).length |
|||
self.state.ready_count=self.state.order_details.filter((order) => order.order_status=='ready' && order.config_id[0]==self.state.shop_id).length |
|||
}); |
|||
} |
|||
|
|||
//Calling the onPosOrderCreation when an order is created or edited on the backend and return the notification
|
|||
onPosOrderCreation(message){ |
|||
let payload = message.detail[0].payload |
|||
var self=this |
|||
if(payload.message == "pos_order_created" && payload.res_model == "pos.order"){ |
|||
self.orm.call("pos.order", "get_details", ["", self.shop_id,""]).then(function(result) { |
|||
self.state.order_details = result['orders'] |
|||
self.state.lines = result['order_lines'] |
|||
self.state.shop_id=self.shop_id |
|||
self.state.draft_count=self.state.order_details.filter((order) => order.order_status=='draft' && order.config_id[0]==self.state.shop_id).length |
|||
self.state.waiting_count=self.state.order_details.filter((order) => order.order_status=='waiting' && order.config_id[0]==self.state.shop_id).length |
|||
self.state.ready_count=self.state.order_details.filter((order) => order.order_status=='ready' && order.config_id[0]==self.state.shop_id).length |
|||
}); |
|||
} |
|||
} |
|||
|
|||
// cancel the order from the kitchen
|
|||
cancel_order(e) { |
|||
var input_id = $("#" + e.target.id).val(); |
|||
this.orm.call("pos.order", "order_progress_cancel", [Number(input_id)]) |
|||
var current_order = this.state.order_details.filter((order) => order.id==input_id) |
|||
if(current_order){ |
|||
current_order[0].order_status = 'cancel' |
|||
} |
|||
} |
|||
// accept the order from the kitchen
|
|||
accept_order(e) { |
|||
var input_id = $("#" + e.target.id).val(); |
|||
ScrollReveal().reveal("#" + e.target.id, { |
|||
delay: 1000, |
|||
duration: 2000, |
|||
opacity: 0, |
|||
distance: "50%", |
|||
origin: "top", |
|||
reset: true, |
|||
interval: 600, |
|||
}); |
|||
var self=this |
|||
this.orm.call("pos.order", "order_progress_draft", [Number(input_id)]) |
|||
var current_order = this.state.order_details.filter((order) => order.id==input_id) |
|||
if(current_order){ |
|||
current_order[0].order_status = 'waiting' |
|||
} |
|||
} |
|||
// set the stage is ready to see the completed stage orders
|
|||
ready_stage(e) { |
|||
var self = this; |
|||
self.state.stages = 'ready'; |
|||
} |
|||
//set the stage is waiting to see the ready stage orders
|
|||
waiting_stage(e) { |
|||
var self = this; |
|||
self.state.stages = 'waiting'; |
|||
} |
|||
//set the stage is draft to see the cooking stage orders
|
|||
draft_stage(e) { |
|||
var self = this; |
|||
self.state.stages = 'draft'; |
|||
} |
|||
// change the status of the order from the kitchen
|
|||
done_order(e) { |
|||
var self = this; |
|||
var input_id = $("#" + e.target.id).val(); |
|||
this.orm.call("pos.order", "order_progress_change", [Number(input_id)]) |
|||
var current_order = this.state.order_details.filter((order) => order.id==input_id) |
|||
if(current_order){ |
|||
current_order[0].order_status = 'ready' |
|||
} |
|||
} |
|||
// change the status of the product from the kitchen
|
|||
accept_order_line(e) { |
|||
var input_id = $("#" + e.target.id).val(); |
|||
this.orm.call("pos.order.line", "order_progress_change", [Number(input_id)]) |
|||
var current_order_line=this.state.lines.filter((order_line) => order_line.id==input_id) |
|||
if (current_order_line){ |
|||
if (current_order_line[0].order_status == 'ready'){ |
|||
current_order_line[0].order_status = 'waiting' |
|||
} |
|||
else{ |
|||
current_order_line[0].order_status = 'ready' |
|||
} |
|||
} |
|||
} |
|||
|
|||
} |
|||
kitchen_screen_dashboard.template = 'KitchenCustomDashBoard'; |
|||
registry.category("actions").add("kitchen_custom_dashboard_tags", kitchen_screen_dashboard); |
@ -0,0 +1,142 @@ |
|||
/** @odoo-module */ |
|||
import { patch } from "@web/core/utils/patch"; |
|||
import { ActionpadWidget } from "@point_of_sale/app/screens/product_screen/action_pad/action_pad"; |
|||
import { useService } from "@web/core/utils/hooks"; |
|||
import { ErrorPopup } from "@point_of_sale/app/errors/popups/error_popup"; |
|||
import { _t } from "@web/core/l10n/translation"; |
|||
|
|||
|
|||
/** |
|||
* @props partner |
|||
*/ |
|||
|
|||
patch(ActionpadWidget.prototype, { |
|||
setup() { |
|||
super.setup(); |
|||
this.orm = useService("orm"); |
|||
this.popup = useService("popup"); |
|||
|
|||
}, |
|||
get swapButton() { |
|||
return this.props.actionType === "payment" && this.pos.config.module_pos_restaurant; |
|||
}, |
|||
get currentOrder() { |
|||
return this.pos.get_order(); |
|||
}, |
|||
get swapButtonClasses() { |
|||
return { |
|||
"highlight btn-primary": this.currentOrder?.hasChangesToPrint(), |
|||
altlight: |
|||
!this.currentOrder?.hasChangesToPrint() && this.currentOrder?.hasSkippedChanges(), |
|||
}; |
|||
}, |
|||
async submitOrder() { |
|||
var line = [] |
|||
var self = this; |
|||
|
|||
|
|||
if (!this.clicked) { |
|||
this.clicked = true; |
|||
try { |
|||
var order_name=this.pos.selectedOrder.uid |
|||
await this.orm.call("pos.order", "check_order_status", ["", order_name]).then(function(result){ |
|||
if (result==false){ |
|||
self.kitchen_order_status=false |
|||
self.popup.add(ErrorPopup, { |
|||
title: _t("Order is Completed"), |
|||
body: _t("There Order is Completed please create a new Order"), |
|||
}); |
|||
} |
|||
else{ |
|||
self.kitchen_order_status=true |
|||
} |
|||
}); |
|||
if ( self.kitchen_order_status){ |
|||
await this.pos.sendOrderInPreparationUpdateLastChange(this.currentOrder); |
|||
for (const orders of this.pos.get_order().orderlines) { |
|||
line.push([0, 0, { |
|||
'qty': orders.quantity, |
|||
'price_unit': orders.price, |
|||
'price_subtotal': orders.quantity * orders.price, |
|||
'price_subtotal_incl': orders.quantity * orders.price, |
|||
'discount': orders.discount, |
|||
'product_id': orders.product.id, |
|||
'tax_ids': [ |
|||
[6, false, []] |
|||
], |
|||
'id': 29, |
|||
'pack_lot_ids': [], |
|||
'full_product_name': orders.product.display_name, |
|||
'price_extra': orders.price_extra, |
|||
'name': 'newsx/0031', |
|||
'is_cooking': true, |
|||
'note':orders.note |
|||
}]) |
|||
} |
|||
var orders = [{ |
|||
'pos_reference': this.pos.get_order().uid, |
|||
'session_id':1, |
|||
'amount_total': 0, |
|||
'amount_paid': 0, |
|||
'amount_return': '0', |
|||
'amount_tax': 2.18, |
|||
'lines': line, |
|||
'is_cooking': true, |
|||
'order_status': 'draft', |
|||
'company_id': this.pos.company.id, |
|||
'session_id':this.currentOrder.pos_session_id, |
|||
'hour':self.currentOrder.date_order.c.hour, |
|||
'minutes':self.currentOrder.date_order.c.minute, |
|||
'table_id':this.pos.get_order().pos.table.id, |
|||
'floor':this.pos.get_order().pos.currentFloor.name, |
|||
'config_id':this.pos.get_order().pos.config.id |
|||
}] |
|||
await self.orm.call("pos.order", "get_details", ["", self.pos.config.id, orders]) |
|||
} |
|||
} finally { |
|||
this.clicked = false; |
|||
} |
|||
} |
|||
}, |
|||
hasQuantity(order) { |
|||
if (!order) { |
|||
return false; |
|||
} else { |
|||
return ( |
|||
order.orderlines.reduce((totalQty, line) => totalQty + line.get_quantity(), 0) > 0 |
|||
); |
|||
} |
|||
}, |
|||
get highlightPay() { |
|||
return ( |
|||
super.highlightPay && |
|||
!this.currentOrder.hasChangesToPrint() && |
|||
this.hasQuantity(this.currentOrder) |
|||
); |
|||
}, |
|||
get categoryCount() { |
|||
const orderChange = this.currentOrder.getOrderChanges().orderlines; |
|||
const categories = Object.values(orderChange).reduce((acc, curr) => { |
|||
const categoryId = this.pos.db.product_by_id[curr.product_id].pos_categ_ids[0]; |
|||
const category = this.pos.db.category_by_id[categoryId]; |
|||
if (category) { |
|||
if (!acc[category.id]) { |
|||
acc[category.id] = { count: curr.quantity, name: category.name }; |
|||
} else { |
|||
acc[category.id].count += curr.quantity; |
|||
} |
|||
} |
|||
return acc; |
|||
}, {}); |
|||
return Object.values(categories); |
|||
}, |
|||
get displayCategoryCount() { |
|||
return this.categoryCount.slice(0, 3); |
|||
}, |
|||
get isCategoryCountOverflow() { |
|||
if (this.categoryCount.length > 3) { |
|||
return true; |
|||
} |
|||
return false; |
|||
}, |
|||
}); |
@ -0,0 +1,78 @@ |
|||
/** @odoo-module **/ |
|||
|
|||
import { Order } from "@point_of_sale/app/store/models"; |
|||
import { patch } from "@web/core/utils/patch"; |
|||
import { ErrorPopup } from "@point_of_sale/app/errors/popups/error_popup"; |
|||
import { _t } from "@web/core/l10n/translation"; |
|||
const { Component, useState } = owl; |
|||
import { useService } from "@web/core/utils/hooks"; |
|||
import { jsonrpc } from "@web/core/network/rpc_service"; |
|||
|
|||
/** |
|||
* Patching the Order class to add custom functionality. |
|||
*/ |
|||
patch(Order.prototype, { |
|||
setup(_defaultObj, options) { |
|||
super.setup(...arguments); |
|||
this.orm = options.pos.orm; |
|||
this.popup = options.pos.popup; |
|||
this.kitchen = true; |
|||
}, |
|||
/** |
|||
* Override of the pay method to handle payment logic. |
|||
*/ |
|||
async pay() { |
|||
var order_name = this.pos.selectedOrder.uid; |
|||
var self = this; |
|||
await this.orm.call("pos.order", "check_order", ["", order_name]).then(function (result) { |
|||
if (result.category) { |
|||
var title = "No category found for your current order in the kitchen.(" + result.category + ')'; |
|||
self.kitchen = false; |
|||
self.popup.add(ErrorPopup, { |
|||
title: _t(title), |
|||
body: _t("No food items found for the specified category for this kitchen. Kindly remove the selected food and update the order by clicking the 'Order' button. Following that, proceed with the payment."), |
|||
}); |
|||
} else if (result == true) { |
|||
self.kitchen = false; |
|||
self.popup.add(ErrorPopup, { |
|||
title: _t("Food is not ready"), |
|||
body: _t("Please Complete all the food first."), |
|||
}); |
|||
} else { |
|||
self.kitchen = true; |
|||
} |
|||
}); |
|||
|
|||
if (!this.orderlines.length) { |
|||
return; |
|||
} |
|||
|
|||
if ( |
|||
this.orderlines.some( |
|||
(line) => line.get_product().tracking !== "none" && !line.has_valid_product_lot() |
|||
) && |
|||
(this.pos.picking_type.use_create_lots || this.pos.picking_type.use_existing_lots) |
|||
) { |
|||
const { confirmed } = await this.env.services.popup.add(ConfirmPopup, { |
|||
title: _t("Some Serial/Lot Numbers are missing"), |
|||
body: _t( |
|||
"You are trying to sell products with serial/lot numbers, but some of them are not set.\nWould you like to proceed anyway?" |
|||
), |
|||
confirmText: _t("Yes"), |
|||
cancelText: _t("No"), |
|||
}); |
|||
|
|||
if (confirmed) { |
|||
if (this.kitchen) { |
|||
this.pos.mobile_pane = "right"; |
|||
this.env.services.pos.showScreen("PaymentScreen"); |
|||
} |
|||
} |
|||
} else { |
|||
if (this.kitchen) { |
|||
this.pos.mobile_pane = "right"; |
|||
this.env.services.pos.showScreen("PaymentScreen"); |
|||
} |
|||
} |
|||
} |
|||
}); |
@ -0,0 +1,96 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!--Kitchen screen dashboard for cook --> |
|||
<record id="kitchen_custom_dashboard_action" model="ir.actions.client"> |
|||
<field name="name">Dashboard</field> |
|||
<field name="tag">kitchen_custom_dashboard_tags</field> |
|||
<field name="target">fullscreen</field> |
|||
</record> |
|||
<!--Kitchen screen action--> |
|||
<record id="kitchen_screen_action" model="ir.actions.act_window"> |
|||
<field name="name">Kitchen screen Main Action</field> |
|||
<field name="type">ir.actions.act_window</field> |
|||
<field name="res_model">kitchen.screen</field> |
|||
<field name="view_mode">tree,form</field> |
|||
</record> |
|||
<!-- Kitchen screen Form & Tree view --> |
|||
<record id="kitchen_screen_view_form" model="ir.ui.view"> |
|||
<field name="name">kitchen.screen.view.form</field> |
|||
<field name="model">kitchen.screen</field> |
|||
<field name="arch" type="xml"> |
|||
<form class="kitchen_form_view"> |
|||
<sheet> |
|||
<div class="row mt16 o_settings_container" |
|||
name="auto_approval"> |
|||
<div class="col-12 col-lg-6 o_setting_box" |
|||
id="pos_config_id"> |
|||
<div class="o_setting_left_pane"> |
|||
</div> |
|||
<div class="o_setting_right_pane"> |
|||
<label for="pos_config_id"/> |
|||
<div class="text-muted"> |
|||
<div> |
|||
<field name="pos_config_id"/> |
|||
</div> |
|||
This will be the Allowed POS for this pos |
|||
Kitchen |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-12 col-lg-6 o_setting_box" |
|||
id="pos_categ_ids"> |
|||
<div class="o_setting_left_pane"> |
|||
</div> |
|||
<div class="o_setting_right_pane"> |
|||
<label for="pos_categ_ids"/> |
|||
<div class="text-muted"> |
|||
<div> |
|||
<field name="pos_categ_ids" |
|||
widget="many2many_tags"/> |
|||
</div> |
|||
This will be the Allowed POS category for |
|||
this pos Kitchen |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-12 col-lg-6 o_setting_box" |
|||
id="kitchen_screen"> |
|||
<div class="o_setting_left_pane"> |
|||
</div> |
|||
<div class="o_setting_right_pane"> |
|||
<div class="text-muted"> |
|||
<div> |
|||
<field name="shop_number" invisible="1"/> |
|||
<button name="%(kitchen_custom_dashboard_action)d" |
|||
type="action" |
|||
context="{'default_shop_id': shop_number}" |
|||
string="Kitchen Screen" |
|||
target="new" |
|||
class="btn-primary kitchen_screen1" |
|||
help="Got To the Kitchen Screen"/> |
|||
<br/> |
|||
<br/> |
|||
</div> |
|||
Click Here to See the kitchen Orders |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
<record id="kitchen_screen_view_tree" model="ir.ui.view"> |
|||
<field name="name">kitchen.screen.view.tree</field> |
|||
<field name="model">kitchen.screen</field> |
|||
<field name="arch" type="xml"> |
|||
<tree> |
|||
<field name="sequence"/> |
|||
<field name="pos_config_id"/> |
|||
<field name="pos_categ_ids"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,14 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!--Kitchen screen menu item --> |
|||
<menuitem id="pos_kitchen_screen_menu_root" |
|||
name="Pos kitchen screen" |
|||
parent="point_of_sale.menu_point_root" |
|||
sequence="10"/> |
|||
|
|||
<menuitem id="pos_kitchen_screen_menu_action" |
|||
name="Pos kitchen screen" |
|||
parent="pos_kitchen_screen_menu_root" |
|||
action="kitchen_screen_action" |
|||
sequence="10"/> |
|||
</odoo> |
@ -0,0 +1,15 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<odoo> |
|||
<!-- Pos order Form view inheriting and xpath a field --> |
|||
<record id="pos_order_view_form" model="ir.ui.view"> |
|||
<field name="name">pos.order.view.form.inherit.pos.kitchen.screen.odoo</field> |
|||
<field name="model">pos.order</field> |
|||
<field name="inherit_id" ref="point_of_sale.view_pos_pos_form"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//field[@name='partner_id']" position="after"> |
|||
<field name="is_cooking" invisible="1"/> |
|||
<field name="order_status" invisible="1"/> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</odoo> |