diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index bd6bc17a78e..a303ca0e508 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -299,7 +299,8 @@ class pos_session(osv.osv): 'state' : fields.selection(POS_SESSION_STATE, 'Status', required=True, readonly=True, select=1, copy=False), - + 'rescue': fields.boolean('Rescue session', readonly=True, + help="Auto-generated session for orphan orders, ignored in constraints"), 'sequence_number': fields.integer('Order Sequence Number', help='A sequence number that is incremented with each order'), 'login_number': fields.integer('Login Sequence Number', help='A sequence number that is incremented each time a user resumes the pos session'), @@ -370,7 +371,8 @@ class pos_session(osv.osv): # open if there is no session in 'opening_control', 'opened', 'closing_control' for one user domain = [ ('state', 'not in', ('closed','closing_control')), - ('user_id', '=', session.user_id.id) + ('user_id', '=', session.user_id.id), + ('rescue', '=', False) ] count = self.search_count(cr, uid, domain, context=context) if count>1: @@ -381,7 +383,8 @@ class pos_session(osv.osv): for session in self.browse(cr, uid, ids, context=None): domain = [ ('state', '!=', 'closed'), - ('config_id', '=', session.config_id.id) + ('config_id', '=', session.config_id.id), + ('rescue', '=', False) ] count = self.search_count(cr, uid, domain, context=context) if count>1: @@ -586,13 +589,32 @@ class pos_order(osv.osv): 'journal': ui_paymentline['journal_id'], } + def _get_rescue_session(self, cr, uid, order, context=None): + """ Find or generate a rescue session """ + pos_session = self.pool['pos.session'] + date = order.get('creation_date', time.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)) + closed_session = pos_session.browse(cr, uid, order['pos_session_id'], context=context) + rescue_session_ids = pos_session.search(cr, uid, [ + ('rescue', '=', True), ('config_id', '=', closed_session.config_id.id), + ('start_at', '<=', date), ('state', '=', 'opened') + ], limit=1, context=context) + if not rescue_session_ids: + return pos_session.copy(cr, uid, order['pos_session_id'], default={ + 'rescue': True, + }, context=context) + return rescue_session_ids[0] + def _process_order(self, cr, uid, order, context=None): + session = self.pool['pos.session'].browse(cr, uid, order['pos_session_id'], context=context) + if session.state == 'closed': + rescue_session_id = self._get_rescue_session(cr, uid, order, context=context) + order['pos_session_id'] = rescue_session_id + session = self.pool['pos.session'].browse(cr, uid, rescue_session_id, context=context) order_id = self.create(cr, uid, self._order_fields(cr, uid, order, context=context),context) for payments in order['statement_ids']: self.add_payment(cr, uid, order_id, self._payment_fields(cr, uid, payments[2], context=context), context=context) - session = self.pool.get('pos.session').browse(cr, uid, order['pos_session_id'], context=context) if session.sequence_number <= order['sequence_number']: session.write({'sequence_number': order['sequence_number'] + 1}) session.refresh() diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index 3ddec3d485b..98f33118065 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -826,6 +826,7 @@ +