You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
4.9 KiB
112 lines
4.9 KiB
# -*- coding: utf-8 -*-
|
|
#############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
|
|
#
|
|
# You can modify it under the terms of the GNU AFFERO
|
|
# GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
# (AGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
#############################################################################
|
|
from typing import Optional
|
|
from odoo import Command, fields, models, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class PosConfig(models.Model):
|
|
"""Inherit pos configuration and add new fields."""
|
|
_inherit = 'pos.config'
|
|
|
|
web_menu_view_mode = fields.Boolean(
|
|
string="POS web Menu",
|
|
help="Allow customers to view the menu on their phones.")
|
|
web_qr_code = fields.Binary(
|
|
string='QRcode',
|
|
help='Qr code of POS App that allows customers to view the menu on '
|
|
'their smartphone.')
|
|
|
|
def _get_web_menu_route(self, table_id: Optional[int] = None) -> str:
|
|
"""Return url for pos web menu with pos config_id and table_id."""
|
|
self.ensure_one()
|
|
base_route = f"/menu/{self.id}"
|
|
table_route = ""
|
|
table = self.env["restaurant.table"].search(
|
|
[("active", "=", True), ("id", "=", table_id)], limit=1)
|
|
if table:
|
|
table_route = f"&table_identifier={table.identifier}"
|
|
return f"{base_route}?{table_route}"
|
|
|
|
def preview_pos_web_menu_url(self):
|
|
"""Return Url action for the pos web menu on clicking the menu item on
|
|
dashboard."""
|
|
self.ensure_one()
|
|
# Raise user error if session not opened yet
|
|
if not self.current_session_id:
|
|
raise UserError(
|
|
_('The restaurant is closed. You cannot browse the menu'))
|
|
return {"type": "ir.actions.act_url",
|
|
"url": self._get_web_menu_route(),
|
|
"target": "new"}
|
|
|
|
def _generate_unique_id(self, pos_session_id: int, table_id: int,
|
|
item_number: int) -> str:
|
|
"""A unique pos reference will be generated."""
|
|
first_part = f"{int(pos_session_id):05d}"
|
|
second_part = f"{int(table_id):03d}"
|
|
third_part = f"{int(item_number):04d}"
|
|
return f"Web-Order {first_part}-{second_part}-{third_part}"
|
|
|
|
def create_order_from_web(self, cart_item, table, customer):
|
|
"""Pos order created
|
|
:param dict cart_item: items added to pos web cart;
|
|
:param int table: id of selected table from pos cart;
|
|
:param int customer: id of selected customer;
|
|
"""
|
|
session_id = self.current_session_id
|
|
pos_order = self.env['pos.order'].sudo().search(
|
|
[('user_id', '=', self.env.user.id), ('state', '=', 'draft'),
|
|
('table_id', '=', int(table))], limit=1)
|
|
total = sum(item['lst_price'] for item in cart_item)
|
|
unique_id = self._generate_unique_id(session_id.id, table,
|
|
len(cart_item))
|
|
# if there is no existing order in draft stage of pos order new
|
|
# order will be created. Otherwise, product will be added to existing order.
|
|
if not pos_order:
|
|
order_item = {
|
|
'session_id': session_id.id,
|
|
'pos_reference': unique_id,
|
|
'table_id': int(table),
|
|
'partner_id': int(customer),
|
|
'amount_total': total,
|
|
'amount_tax': 0.0,
|
|
'amount_paid': 0.0,
|
|
'amount_return': 0.0}
|
|
pos_order = self.env['pos.order'].create(order_item)
|
|
for item in cart_item:
|
|
if pos_order.partner_id.id != int(customer):
|
|
return "False"
|
|
line_product = pos_order.lines.filtered(
|
|
lambda p: p.full_product_name == item['display_name'])
|
|
if not line_product:
|
|
total += item['lst_price']
|
|
pos_lines = {'full_product_name': item['display_name'],
|
|
'product_id': int(item['id']),
|
|
'customer_note': item['cust_note'],
|
|
'price_unit': item['lst_price'],
|
|
'price_subtotal': item['lst_price'],
|
|
'price_subtotal_incl': item['lst_price'],
|
|
'total_cost': 50}
|
|
pos_order.write({'lines': [Command.create(pos_lines), ]})
|
|
quantity = line_product.qty
|
|
line_product.write({'qty': quantity + 1})
|
|
|