[FIX] point_of_sale: incorrect sequences for orders
authorMartin Trigaux <mat@openerp.com>
Tue, 26 Aug 2014 12:31:42 +0000 (14:31 +0200)
committerMartin Trigaux <mat@openerp.com>
Tue, 26 Aug 2014 14:33:58 +0000 (16:33 +0200)
A new ir.sequence is generated at pos.config creation for the orders. However it was not used as the type was not set. The fallback was done on the general sequence.
In addition to the sequences being shared, it was not possible to create a pos.order in multicompany (no sequence found for user company, name was null).
Same issue for the pos.order.line.
This patch generates correctly pos.order and pos.order.line sequences at pos.config creation.

Instead of using the pos.config sequence to generate session number (not what this field was intended to), use the existing sequence for pos.session.
Remove company_id value on default pos.session sequence to make sure it's shared between companies and correctly set the prefix.

addons/point_of_sale/__openerp__.py
addons/point_of_sale/point_of_sale.py
addons/point_of_sale/point_of_sale_sequence.xml

index 4e378d0..9a7c48d 100644 (file)
@@ -63,9 +63,9 @@ Main Features
         'views/templates.xml',
         'point_of_sale_report.xml',
         'point_of_sale_view.xml',
+        'point_of_sale_sequence.xml',
         'point_of_sale_data.xml',
         'report/pos_order_report_view.xml',
-        'point_of_sale_sequence.xml',
         'point_of_sale_workflow.xml',
         'account_statement_view.xml',
         'account_statement_report.xml',
index 9d731e6..1e07497 100644 (file)
@@ -186,14 +186,26 @@ class pos_config(osv.osv):
         return self.write(cr, uid, ids, {'state' : 'deprecated'}, context=context)
 
     def create(self, cr, uid, values, context=None):
-        proxy = self.pool.get('ir.sequence')
-        sequence_values = dict(
-            name='PoS %s' % values['name'],
-            padding=5,
-            prefix="%s/"  % values['name'],
-        )
-        sequence_id = proxy.create(cr, uid, sequence_values, context=context)
-        values['sequence_id'] = sequence_id
+        ir_sequence = self.pool.get('ir.sequence')
+        # force sequence_id field to new pos.order sequence
+        values['sequence_id'] = ir_sequence.create(cr, uid, {
+            'name': 'POS Order %s' % values['name'],
+            'padding': 4,
+            'prefix': "%s/"  % values['name'],
+            'code': "pos.order",
+            'company_id': values.get('company_id', False),
+        }, context=context)
+
+        # TODO master: add field sequence_line_id on model
+        # this make sure we always have one available per company
+        ir_sequence.create(cr, uid, {
+            'name': 'POS order line %s' % values['name'],
+            'padding': 4,
+            'prefix': "%s/"  % values['name'],
+            'code': "pos.order.line",
+            'company_id': values.get('company_id', False),
+        }, context=context)
+
         return super(pos_config, self).create(cr, uid, values, context=context)
 
     def unlink(self, cr, uid, ids, context=None):
@@ -399,7 +411,7 @@ class pos_session(osv.osv):
             bank_statement_ids.append(statement_id)
 
         values.update({
-            'name' : pos_config.sequence_id._next(),
+            'name': self.pool['ir.sequence'].get(cr, uid, 'pos.session'),
             'statement_ids' : [(6, 0, bank_statement_ids)],
             'config_id': config_id
         })
@@ -464,7 +476,6 @@ class pos_session(osv.osv):
 
     def wkf_action_close(self, cr, uid, ids, context=None):
         # Close CashBox
-        bsl = self.pool.get('account.bank.statement.line')
         for record in self.browse(cr, uid, ids, context=context):
             for st in record.statement_ids:
                 if abs(st.difference) > st.journal_id.amount_authorized_diff:
@@ -722,7 +733,13 @@ class pos_order(osv.osv):
     }
 
     def create(self, cr, uid, values, context=None):
-        values['name'] = self.pool.get('ir.sequence').get(cr, uid, 'pos.order')
+        if values.get('session_id'):
+            # set name based on the sequence specified on the config
+            session = self.pool['pos.session'].browse(cr, uid, values['session_id'], context=context)
+            values['name'] = session.config_id.sequence_id._next()
+        else:
+            # fallback on any pos.order sequence
+            values['name'] = self.pool.get('ir.sequence').get_id(cr, uid, 'pos.order', 'code', context=context)
         return super(pos_order, self).create(cr, uid, values, context=context)
 
     def test_paid(self, cr, uid, ids, context=None):
index 4bcab24..6ac1d00 100644 (file)
         <field name="name">POS Order</field>
         <field name="code">pos.order</field>
     </record>
-    <record model="ir.sequence" id="seq_pos_order">
-        <field name="name">POS Order</field>
-        <field name="code">pos.order</field>
-        <field name="prefix">POS</field>
-        <field name="padding">4</field>
-    </record>
 
     <record model="ir.sequence.type" id="seq_type_pos_order_line">
         <field name="name">POS order line</field>
         <field name="code">pos.order.line</field>
     </record>
-    <record model="ir.sequence" id="seq_pos_order_line">
-        <field name="name">POS order line</field>
-        <field name="code">pos.order.line</field>
-        <field name="prefix">POSL</field>
-        <field name="padding">4</field>
-    </record>
 
     <record model="ir.sequence.type" id="seq_type_pos_session">
         <field name="name">POS Session</field>
@@ -36,8 +24,9 @@
     <record model="ir.sequence" id="seq_pos_session">
         <field name="name">POS Session</field>
         <field name="code">pos.session</field>
-        <field name="prefix">POS/%(day)s/(month)s/%(year)s/</field>
-        <field name="padding">4</field>
+        <field name="prefix">POS/%(year)s/%(month)s/%(day)s/</field>
+        <field name="padding">2</field>
+        <field name="company_id" eval="False" />
     </record>
 
 </data>