[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) <mat@odoo.com>
This commit is contained in:
Ivan Yelizariev
2019-09-12 11:36:39 +00:00
committed by Martin Trigaux
parent bf8d288d04
commit c0a897d528
4 changed files with 8 additions and 4 deletions
+2 -2
View File
@@ -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)
+3 -1
View File
@@ -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
+2 -1
View File
@@ -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;
},
@@ -31,6 +31,7 @@
var odoo = <t t-raw="json.dumps({
'csrf_token': request.csrf_token(None),
'session_info': session_info,
'login_number': login_number,
'debug': debug,
})"/>;
</script>