Files
enterprise-addons/pos_restaurant_preparation_display/models/pos_prep_order.py
T

130 lines
5.8 KiB
Python

from odoo import models, fields, api, _
class PosPrepOrder(models.Model):
_inherit = 'pos.prep.order'
pos_course_id = fields.Many2one('restaurant.order.course')
@api.model_create_multi
def create(self, vals_list):
course_id = self.env.context.get('po_course_id', None)
if course_id:
for vals in vals_list:
if not vals.get('pos_course_id', None):
vals['pos_course_id'] = course_id
return super().create(vals_list)
@api.model
def process_order(self, order_id, options={}):
order = self.env['pos.order'].browse(order_id)
if options.get('cancelled') or not order.course_ids or not order:
return super().process_order(order_id, options)
reload_display = False
category_ids = []
course_updated_notifications = []
fired_course_id = options.get('fired_course_id')
for course_id in order.course_ids:
course_lines_uuids = course_id.line_ids.mapped(lambda l: l.uuid)
course_already_fired = (course_id.fired and
self.env['pos.prep.order'].search([('pos_order_id', '=', order.id)], limit=1))
def order_line_filer(line_uuid):
return line_uuid in course_lines_uuids
changes = order.with_context(ppc_order_line_filter=order_line_filer, po_course_id=course_id.id)._process_preparation_changes(options)
if changes.get('change'):
category_ids += course_id.line_ids.product_id.pos_categ_ids.ids
reload_display = True
if changes.get('order_added') and course_already_fired:
course_updated_notifications.append({
'category_ids': changes.get('category_ids'),
'notification': _("Course %s Updated", str(course_id.index))
})
if reload_display or fired_course_id:
course = self.env['restaurant.order.course'].browse(fired_course_id)
category_ids += course.line_ids.product_id.pos_categ_ids.ids
preparation_display = self.env['pos.prep.display']._get_preparation_displays(order, category_ids)
for display in preparation_display:
display._send_load_orders_message(sound=True, orderId=order.id)
if fired_course_id and any(c.id == fired_course_id for c in order.course_ids):
course = self.env['restaurant.order.course'].browse(fired_course_id)
category_ids = course.line_ids.product_id.pos_categ_ids.ids
self._send_notification_to_preparation_displays(order, {
'category_ids': category_ids,
'notification': _("Course %s Fired", str(course.index))
})
for notification in course_updated_notifications:
self._send_notification_to_preparation_displays(order, notification)
return True
@api.model
def _send_notification_to_preparation_displays(self, order, data):
for p_dis in self.env['pos.prep.display']._get_preparation_displays(order, data['category_ids']):
p_dis._send_notification(data.get('sound'), data.get('notification'))
@api.depends('pos_order_id.floating_order_name', 'pos_order_id.table_id')
def _compute_order_name(self):
super()._compute_order_name()
for order in self:
if order.pos_order_id.session_id.config_id.module_pos_restaurant:
course_name = f" - {_('Course')[0]}{order.pos_course_id.index}" if order.pos_course_id else ''
if order.pos_order_id.table_id:
order.order_name = self._get_table_name(order.pos_order_id.table_id) + course_name
elif order.pos_order_id.floating_order_name:
order.order_name = order.pos_order_id.floating_order_name + course_name
else:
order.order_name = _("Direct Sale")
@api.model
def _get_table_name(self, table):
if not table:
return ""
name = f"T{table.table_number}"
if table.parent_id:
name += f" &{table.parent_id.table_number}"
return name
@api.model
def merge_orders(self, source_order_id, dest_order_id):
prep_source_orders = self.env['pos.prep.order'].search([('pos_order_id', '=', source_order_id)])
pos_dest_order = self.env['pos.order'].browse(dest_order_id)
if not prep_source_orders and not pos_dest_order:
return False
prep_source_orders.write({'pos_order_id': dest_order_id})
self.notify_pdis([dest_order_id])
return True
@api.model
def unmerge_orders(self, pos_orderline_uuids, new_pos_order_id):
prep_orders = self.env['pos.prep.order']
for former_pos_orderline_uuid, new_pos_orderline_uuid in pos_orderline_uuids.items():
prep_orderlines = self.env['pos.prep.line'].search([('pos_order_line_uuid', '=', former_pos_orderline_uuid)])
new_pos_orderline = self.env['pos.order.line'].search([('uuid', '=', new_pos_orderline_uuid)])
prep_orderlines.write({'pos_order_line_id': new_pos_orderline.id, 'pos_order_line_uuid': new_pos_orderline.uuid})
prep_orders |= prep_orderlines.mapped('prep_order_id')
prep_orders.write({'pos_order_id': new_pos_order_id})
self.notify_pdis([new_pos_order_id])
return True
@api.model
def notify_pdis(self, pos_order_ids):
for pos_order_id in pos_order_ids:
pos_order = self.env['pos.order'].browse(pos_order_id)
category_ids = set(pos_order.lines.mapped('product_id.pos_categ_ids.id'))
for p_dis in self.env['pos.prep.display']._get_preparation_displays(pos_order, category_ids):
p_dis._send_load_orders_message(True, False, pos_order_id)
return True