[ADD] point_of_sale: rescue sessions for orders on closed sessions

When an order is linked to a closed session, create a new rescue session for
these orphan orders. Orders should not be added to closed session as accounting
entries are already generated.

Add boolean field rescue (readonly and hidden to make sure user can not create
rescue sessions).
Ignore the unicity constraints for the rescue sessions.
This commit is contained in:
Martin Trigaux
2015-05-06 09:18:12 +02:00
parent 9f541d29bf
commit bed409322d
2 changed files with 27 additions and 4 deletions
+26 -4
View File
@@ -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()
@@ -826,6 +826,7 @@
<field name="user_id" context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'point_of_sale.group_pos_manager', 'base.group_sale_manager']}"/>
<field name="currency_id" invisible="1"/>
<field name="config_id"/>
<field name="rescue" attrs="{'invisible': [('rescue', '=', False)]}" />
</group>
<group>
<field name="start_at" attrs="{'invisible' : [('state', '=', 'opening_control')]}"/>