From 645df676310d039859fde2def6772c52d119391e Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Thu, 16 Feb 2017 14:13:41 +0100 Subject: [PATCH] [FIX] point_of_sale: implement todo The link between the pos.order.line sequence and the config was lost after creation. Using the default with next_by_code is incorrect as every pos.config has a sequence with the same code. --- addons/point_of_sale/models/pos_config.py | 10 ++++++---- addons/point_of_sale/models/pos_order.py | 15 ++++++++++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/addons/point_of_sale/models/pos_config.py b/addons/point_of_sale/models/pos_config.py index 8dbcb4f1793..c97bdd4fb4d 100644 --- a/addons/point_of_sale/models/pos_config.py +++ b/addons/point_of_sale/models/pos_config.py @@ -104,6 +104,9 @@ class PosConfig(models.Model): sequence_id = fields.Many2one('ir.sequence', string='Order IDs Sequence', readonly=True, help="This sequence is automatically created by Odoo but you can change it " "to customize the reference numbers of your orders.", copy=False) + sequence_line_id = fields.Many2one('ir.sequence', string='Order Line IDs Sequence', readonly=True, + help="This sequence is automatically created by Odoo but you can change it " + "to customize the reference numbers of your orders lines.", copy=False) session_ids = fields.One2many('pos.session', 'config_id', string='Sessions') current_session_id = fields.Many2one('pos.session', compute='_compute_current_session', string="Current Session") current_session_state = fields.Char(compute='_compute_current_session') @@ -218,16 +221,15 @@ class PosConfig(models.Model): # force sequence_id field to new pos.order sequence values['sequence_id'] = IrSequence.create(val).id - # TODO master: add field sequence_line_id on model - # this make sure we always have one available per company val.update(name=_('POS order line %s') % values['name'], code='pos.order.line') - IrSequence.create(val) + values['sequence_line_id'] = IrSequence.create(val).id return super(PosConfig, self).create(values) @api.multi def unlink(self): - for pos_config in self.filtered(lambda pos_config: pos_config.sequence_id): + for pos_config in self.filtered(lambda pos_config: pos_config.sequence_id or pos_config.sequence_line_id): pos_config.sequence_id.unlink() + pos_config.sequence_line_id.unlink() return super(PosConfig, self).unlink() # Methods to open the POS diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index ec96a147252..b514fbb88e0 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -31,7 +31,7 @@ class PosOrder(models.Model): @api.model def _order_fields(self, ui_order): - process_line = partial(self.env['pos.order.line']._order_line_fields) + process_line = partial(self.env['pos.order.line']._order_line_fields, session_id=ui_order['pos_session_id']) return { 'name': ui_order['name'], 'user_id': ui_order['user_id'] or False, @@ -749,14 +749,23 @@ class PosOrderLine(models.Model): _description = "Lines of Point of Sale" _rec_name = "product_id" - def _order_line_fields(self, line): + def _order_line_fields(self, line, session_id=None): + if line and 'name' not in line[2]: + if session_id: + # set name based on the sequence specified on the config + session = self.env['pos.session'].browse(session_id) + line[2]['name'] = session.config_id.sequence_line_id._next() + else: + # fallback on any pos.order.line sequence + line[2]['name'] = self.env['ir.sequence'].next_by_code('pos.order.line') + if line and 'tax_ids' not in line[2]: product = self.env['product.product'].browse(line[2]['product_id']) line[2]['tax_ids'] = [(6, 0, [x.id for x in product.taxes_id])] return line company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.user.company_id) - name = fields.Char(string='Line No', required=True, copy=False, default=lambda self: self.env['ir.sequence'].next_by_code('pos.order.line')) + name = fields.Char(string='Line No', required=True, copy=False) notice = fields.Char(string='Discount Notice') product_id = fields.Many2one('product.product', string='Product', domain=[('sale_ok', '=', True)], required=True, change_default=True) price_unit = fields.Float(string='Unit Price', digits=0)