diff --git a/pos_kitchen_screen_odoo/__manifest__.py b/pos_kitchen_screen_odoo/__manifest__.py index 8e9d10af2..952c7e071 100644 --- a/pos_kitchen_screen_odoo/__manifest__.py +++ b/pos_kitchen_screen_odoo/__manifest__.py @@ -21,7 +21,7 @@ ############################################################################ { 'name': 'POS Kitchen Screen', - 'version': '18.0.1.1.3', + 'version': '18.0.1.1.4', 'category': 'Point Of Sale', 'summary': 'POS Kitchen Screen facilitates sending certain orders ' 'automatically to the kitchen.The POS Kitchen Screen allows for ' diff --git a/pos_kitchen_screen_odoo/doc/RELEASE_NOTES.md b/pos_kitchen_screen_odoo/doc/RELEASE_NOTES.md index 14745ca1b..d14ec1eed 100644 --- a/pos_kitchen_screen_odoo/doc/RELEASE_NOTES.md +++ b/pos_kitchen_screen_odoo/doc/RELEASE_NOTES.md @@ -29,3 +29,8 @@ - Fixed issue where latest orders disappearing from kitchen screen when plan button is clicked from POS. - Fixed issue where orders in kitchen screen required manual refresh. - Fixed issue when adding items to the order and quantity defaults to one. + +#### 07.08.2025 +#### Version 18.0.1.1.4 +#### BUG FIX +-Fixed the issue where a completed kitchen order reverted to 'Cooking' status after the payment was processed. \ No newline at end of file diff --git a/pos_kitchen_screen_odoo/models/pos_orders.py b/pos_kitchen_screen_odoo/models/pos_orders.py index 9f433c2bf..742897656 100644 --- a/pos_kitchen_screen_odoo/models/pos_orders.py +++ b/pos_kitchen_screen_odoo/models/pos_orders.py @@ -25,6 +25,7 @@ import pytz class PosOrder(models.Model): + """Inheriting the pos order model """ _inherit = "pos.order" order_status = fields.Selection(string="Order Status", @@ -40,11 +41,10 @@ class PosOrder(models.Model): 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') + minutes = fields.Char(string='Order time') floor = fields.Char(string='Floor time') avg_prepare_time = fields.Float(string="Avg Prepare Time", store=True) - @api.model_create_multi def create(self, vals_list): """Override create function for the validation of the order""" @@ -52,30 +52,35 @@ class PosOrder(models.Model): for vals in vals_list: product_ids = [item[2]['product_id'] for item in vals.get('lines')] if product_ids: - prepare_times = self.env['product.product'].search([('id', 'in', product_ids)]).mapped( + prepare_times = self.env['product.product'].search( + [('id', 'in', product_ids)]).mapped( 'prepair_time_minutes') vals['avg_prepare_time'] = max(prepare_times) - existing_order = self.search([("pos_reference", "=", vals.get("pos_reference"))], limit=1) + existing_order = self.search( + [("pos_reference", "=", vals.get("pos_reference"))], limit=1) if existing_order: continue if not vals.get("order_status"): vals["order_status"] = 'draft' - if vals.get('order_id') and not vals.get('name'): - 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() - elif not vals.get('name'): - vals['name'] = self.env['ir.sequence'].next_by_code('pos.order') - - - + # Ensure name is always set + if not vals.get('name'): + if vals.get('order_id'): + config = self.env['pos.order'].browse( + vals['order_id']).session_id.config_id + vals[ + 'name'] = config.sequence_line_id._next() if config.sequence_line_id else \ + self.env['ir.sequence'].next_by_code('pos.order') or '/' + else: + vals['name'] = self.env['ir.sequence'].next_by_code( + 'pos.order') or '/' processed_vals_to_create.append(vals) - res = super().create(processed_vals_to_create) if processed_vals_to_create else self.browse() + res = super().create( + processed_vals_to_create) if processed_vals_to_create else self.browse() orders_to_notify = [] for order in res: @@ -86,13 +91,14 @@ class PosOrder(models.Model): has_kitchen_items = False for order_line in order.lines: if order_line.product_id.pos_categ_ids and any( - cat.id in kitchen_screen.pos_categ_ids.ids for cat in order_line.product_id.pos_categ_ids): + cat.id in kitchen_screen.pos_categ_ids.ids for cat + in order_line.product_id.pos_categ_ids): order_line.is_cooking = True has_kitchen_items = True if has_kitchen_items: order.is_cooking = True - order.order_ref = order.name + order.order_ref = order.name # Set order_ref here if order.order_status != 'draft': order.order_status = 'draft' orders_to_notify.append(order) @@ -103,7 +109,9 @@ class PosOrder(models.Model): 'res_model': self._name, 'message': 'pos_order_created', 'order_id': order.id, - 'config_id': order.config_id.id + 'config_id': order.config_id.id, + 'order_ref': order.order_ref + # Include order_ref in notification } channel = f'pos_order_created_{order.config_id.id}' self.env["bus.bus"]._sendone(channel, "notification", message) @@ -113,40 +121,59 @@ class PosOrder(models.Model): def write(self, vals): """Override write function for adding order status in vals""" original_statuses = {order.id: order.order_status for order in self} - res = super(PosOrder, self).write(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") == "paid" and order.name == "/": + vals["name"] = self._compute_order_name() + kitchen_screen = self.env["kitchen.screen"].search( [("pos_config_id", "=", order.config_id.id)], limit=1 ) - if kitchen_screen: has_kitchen_items = False for line_data in order.lines: if line_data.product_id.pos_categ_ids and any( - cat.id in kitchen_screen.pos_categ_ids.ids for cat in line_data.product_id.pos_categ_ids): + cat.id in kitchen_screen.pos_categ_ids.ids + for cat in line_data.product_id.pos_categ_ids + ): has_kitchen_items = True break + # Update vals instead of direct assignment to avoid recursive write if has_kitchen_items and not order.is_cooking: - order.is_cooking = True - if order.order_status not in ['waiting', 'ready', 'cancel']: - order.order_status = 'draft' + vals.update({ + 'is_cooking': True, + 'order_status': vals.get('order_status', + 'draft') if not order.order_status else order.order_status + }) elif not has_kitchen_items and order.is_cooking: - order.is_cooking = False + vals.update({'is_cooking': False}) - if order.is_cooking and order.id in original_statuses: - if original_statuses[order.id] != order.order_status: + # Send notification only if order_status changed + if has_kitchen_items and order.id in original_statuses and 'order_status' in vals: + if original_statuses[order.id] != vals.get('order_status'): message = { 'res_model': self._name, 'message': 'pos_order_updated', 'order_id': order.id, 'config_id': order.config_id.id, - 'new_status': order.order_status + 'new_status': vals.get('order_status') } channel = f'pos_order_created_{order.config_id.id}' - self.env["bus.bus"]._sendone(channel, "notification", message) - return res + self.env["bus.bus"]._sendone(channel, "notification", + message) + + return super(PosOrder, self).write(vals) @api.model def get_details(self, shop_id, *args, **kwargs): @@ -160,7 +187,7 @@ class PosOrder(models.Model): pos_orders = self.env["pos.order"].search([ ("is_cooking", "=", True), ("config_id", "=", shop_id), - ("state", "!=", "cancel"), + ("state", "not in", ["cancel", "paid"]), ("order_status", "!=", "cancel"), "|", "|", ("order_status", "=", "draft"), @@ -168,6 +195,10 @@ class PosOrder(models.Model): ("order_status", "=", "ready") ], order="date_order") + # Additional filtering to exclude paid orders with 'ready' status + pos_orders = pos_orders.filtered(lambda order: not ( + order.state == "paid" and order.order_status == "ready")) + pos_lines = pos_orders.lines.filtered( lambda line: line.is_cooking and any( categ.id in kitchen_screen.pos_categ_ids.ids @@ -207,22 +238,28 @@ class PosOrder(models.Model): def action_pos_order_paid(self): """Inherited method called when a POS order transitions to 'paid' state.""" res = super().action_pos_order_paid() + kitchen_screen = self.env["kitchen.screen"].search( [("pos_config_id", "=", self.config_id.id)], limit=1 ) if kitchen_screen: + vals = {} has_kitchen_items = False for order_line in self.lines: if order_line.product_id.pos_categ_ids and any( - cat.id in kitchen_screen.pos_categ_ids.ids for cat in order_line.product_id.pos_categ_ids): - order_line.is_cooking = True + cat.id in kitchen_screen.pos_categ_ids.ids for cat in + order_line.product_id.pos_categ_ids): + order_line.write({'is_cooking': True}) has_kitchen_items = True if has_kitchen_items: - self.is_cooking = True - self.order_ref = self.name - if not self.order_status or self.order_status == 'draft': - self.order_status = 'draft' + vals.update({ + 'is_cooking': True, + 'order_ref': self.name, + # Only set order_status to 'draft' if it’s not already set + 'order_status': self.order_status or 'draft' + }) + self.write(vals) message = { 'res_model': self._name, @@ -330,7 +367,8 @@ class PosOrder(models.Model): """Create new kitchen order or update existing one with new items.""" for order_data in orders_data: pos_reference = order_data.get('pos_reference') - existing_order = self.search([('pos_reference', '=', pos_reference)], limit=1) + existing_order = self.search( + [('pos_reference', '=', pos_reference)], limit=1) kitchen_screen = self.env["kitchen.screen"].search([ ("pos_config_id", "=", order_data.get('config_id')) ], limit=1) @@ -342,6 +380,7 @@ class PosOrder(models.Model): if existing_order.order_status in ['ready', 'cancel']: continue + current_status = existing_order.order_status or 'draft' existing_line_products = {line.product_id.id: line for line in existing_order.lines} for line_data in order_data.get('lines', []): line_vals = line_data[2] @@ -370,7 +409,7 @@ class PosOrder(models.Model): 'discount': line_vals.get('discount', 0), 'full_product_name': line_vals.get('full_product_name'), 'is_cooking': True, - 'order_status': 'draft', + 'order_status': current_status, 'note': line_vals.get('note', ''), }) @@ -399,7 +438,7 @@ class PosOrder(models.Model): 'discount': line_vals.get('discount', 0), 'full_product_name': line_vals.get('full_product_name'), 'is_cooking': True, - 'order_status': 'draft', + 'order_status': order_data.get('order_status', 'draft'), 'note': line_vals.get('note', ''), }]) @@ -413,7 +452,7 @@ class PosOrder(models.Model): 'amount_tax': order_data.get('amount_tax'), 'lines': kitchen_lines, 'is_cooking': True, - 'order_status': 'draft', + 'order_status': order_data.get('order_status', 'draft'), 'company_id': order_data.get('company_id'), 'table_id': order_data.get('table_id'), 'config_id': order_data.get('config_id'), @@ -440,11 +479,7 @@ class PosOrder(models.Model): if not pos_order: return True - - if pos_order.order_status in ['draft', 'waiting']: - return True - else: - return False + return pos_order.order_status in ['draft', 'waiting'] class PosOrderLine(models.Model):