From c0a897d528ce5882b46ed197eacb2bbddf45c4c8 Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Fri, 27 Apr 2018 22:00:10 +0000 Subject: [PATCH] [IMP] point_of_sale: get login_number in the same transaction as update it Otherwise, if two POS stations are using the same user with the same pos.config, i.e. create two session AND if you have bad luck, then those sessions will get same login_number, which leads to losing half of orders, because POS stations will generate same pos_reference and only first order from the POSes is saved, while another order is lost without let know to cashier. closes odoo/odoo#24486 Signed-off-by: Martin Trigaux (mat) --- addons/point_of_sale/controllers/main.py | 4 ++-- addons/point_of_sale/models/pos_session.py | 4 +++- addons/point_of_sale/static/src/js/models.js | 3 ++- addons/point_of_sale/views/pos_templates.xml | 1 + 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/addons/point_of_sale/controllers/main.py b/addons/point_of_sale/controllers/main.py index d2119bef036..bdcd7555118 100644 --- a/addons/point_of_sale/controllers/main.py +++ b/addons/point_of_sale/controllers/main.py @@ -34,12 +34,12 @@ class PosController(http.Controller): pos_session = request.env['pos.session'].sudo().search(domain, limit=1) if not pos_session: return werkzeug.utils.redirect('/web#action=point_of_sale.action_client_pos_menu') - pos_session.login() # The POS only work in one company, so we enforce the one of the session in the context session_info = request.env['ir.http'].session_info() session_info['user_context']['allowed_company_ids'] = pos_session.company_id.ids context = { - 'session_info': session_info + 'session_info': session_info, + 'login_number': pos_session.login(), } return request.render('point_of_sale.index', qcontext=context) diff --git a/addons/point_of_sale/models/pos_session.py b/addons/point_of_sale/models/pos_session.py index 36c779eac79..448f6423101 100644 --- a/addons/point_of_sale/models/pos_session.py +++ b/addons/point_of_sale/models/pos_session.py @@ -220,9 +220,11 @@ class PosSession(models.Model): def login(self): self.ensure_one() + login_number = self.login_number + 1 self.write({ - 'login_number': self.login_number + 1, + 'login_number': login_number, }) + return login_number def action_pos_session_open(self): # second browse because we need to refetch the data from the DB for cash_register_id diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index 993db43141a..bb34b3dca30 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -242,7 +242,7 @@ exports.PosModel = Backbone.Model.extend({ }, },{ model: 'pos.session', - fields: ['id', 'name', 'user_id', 'config_id', 'start_at', 'stop_at', 'sequence_number', 'login_number', 'payment_method_ids'], + fields: ['id', 'name', 'user_id', 'config_id', 'start_at', 'stop_at', 'sequence_number', 'payment_method_ids'], domain: function(self){ var domain = [ ['state','=','opened'], @@ -253,6 +253,7 @@ exports.PosModel = Backbone.Model.extend({ }, loaded: function(self, pos_sessions, tmp){ self.pos_session = pos_sessions[0]; + self.pos_session.login_number = odoo.login_number; self.config_id = self.config_id || self.pos_session && self.pos_session.config_id[0]; tmp.payment_method_ids = pos_sessions[0].payment_method_ids; }, diff --git a/addons/point_of_sale/views/pos_templates.xml b/addons/point_of_sale/views/pos_templates.xml index 5ff4b1f1a04..ea9bb99f835 100644 --- a/addons/point_of_sale/views/pos_templates.xml +++ b/addons/point_of_sale/views/pos_templates.xml @@ -31,6 +31,7 @@ var odoo = ;