[MERGE] Forward-port of latest 7.0 bugfixes, up to rev. 10016 revid:dle@openerp.com...
[odoo/odoo.git] / addons / sale_stock / sale_stock.py
index 11f3e02..bdd5ac9 100644 (file)
@@ -23,19 +23,10 @@ from datetime import datetime, timedelta
 from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT, DATETIME_FORMATS_MAP, float_compare
 from dateutil.relativedelta import relativedelta
 from openerp.osv import fields, osv
-from openerp import netsvc
 from openerp.tools.translate import _
 import pytz
 from openerp import SUPERUSER_ID
 
-class sale_shop(osv.osv):
-    _inherit = "sale.shop"
-    _columns = {
-        'warehouse_id': fields.many2one('stock.warehouse', 'Warehouse'),
-    }
-
-sale_shop()
-
 class sale_order(osv.osv):
     _inherit = "sale.order"
     
@@ -72,9 +63,16 @@ class sale_order(osv.osv):
                 vals.update({'invoice_quantity': 'order'})
             if vals['order_policy'] == 'picking':
                 vals.update({'invoice_quantity': 'procurement'})
-        order =  super(sale_order, self).create(cr, uid, vals, context=context)
+        order = super(sale_order, self).create(cr, uid, vals, context=context)
         return order
 
+    def _get_default_warehouse(self, cr, uid, context=None):
+        company_id = self.pool.get('res.users')._get_company(cr, uid, context=context)
+        warehouse_ids = self.pool.get('stock.warehouse').search(cr, uid, [('company_id', '=', company_id)], context=context)
+        if not warehouse_ids:
+            return False
+        return warehouse_ids[0]
+
     # This is False
     def _picked_rate(self, cr, uid, ids, name, arg, context=None):
         if not ids:
@@ -142,11 +140,13 @@ class sale_order(osv.osv):
         'picking_ids': fields.one2many('stock.picking.out', 'sale_id', 'Related Picking', readonly=True, help="This is a list of delivery orders that has been generated for this sales order."),
         'shipped': fields.boolean('Delivered', readonly=True, help="It indicates that the sales order has been delivered. This field is updated only after the scheduler(s) have been launched."),
         'picked_rate': fields.function(_picked_rate, string='Picked', type='float'),
+        'warehouse_id': fields.many2one('stock.warehouse', 'Warehouse', required=True),
         'invoice_quantity': fields.selection([('order', 'Ordered Quantities'), ('procurement', 'Shipped Quantities')], 'Invoice on', 
                                              help="The sales order will automatically create the invoice proposition (draft invoice).\
                                               You have to choose  if you want your invoice based on ordered ", required=True, readonly=True, states={'draft': [('readonly', False)]}),
     }
     _defaults = {
+             'warehouse_id': _get_default_warehouse,
              'picking_policy': 'direct',
              'order_policy': 'manual',
              'invoice_quantity': 'order',
@@ -164,6 +164,14 @@ class sale_order(osv.osv):
 
         return osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
 
+    def onchange_warehouse_id(self, cr, uid, ids, warehouse_id, context=None):
+        val = {}
+        if warehouse_id:
+            warehouse = self.pool.get('stock.warehouse').browse(cr, uid, warehouse_id, context=context)
+            if warehouse.company_id:
+                val['company_id'] = warehouse.company_id.id
+        return {'value': val}
+
     def action_view_delivery(self, cr, uid, ids, context=None):
         '''
         This function returns an action that display existing delivery orders of given sales order ids. It can either be a in a list or in a form view, if there is only one delivery order to show.
@@ -196,11 +204,11 @@ class sale_order(osv.osv):
         return res
 
     def action_cancel(self, cr, uid, ids, context=None):
-        wf_service = netsvc.LocalService("workflow")
         if context is None:
             context = {}
         sale_order_line_obj = self.pool.get('sale.order.line')
         proc_obj = self.pool.get('procurement.order')
+        stock_obj = self.pool.get('stock.picking')
         for sale in self.browse(cr, uid, ids, context=context):
             for pick in sale.picking_ids:
                 if pick.state not in ('draft', 'cancel'):
@@ -211,11 +219,9 @@ class sale_order(osv.osv):
                     for mov in pick.move_lines:
                         proc_ids = proc_obj.search(cr, uid, [('move_id', '=', mov.id)])
                         if proc_ids:
-                            for proc in proc_ids:
-                                wf_service.trg_validate(uid, 'procurement.order', proc, 'button_check', cr)
+                            proc_obj.signal_button_check(cr, uid, proc_ids)            
             for r in self.read(cr, uid, ids, ['picking_ids']):
-                for pick in r['picking_ids']:
-                    wf_service.trg_validate(uid, 'stock.picking', pick, 'button_cancel', cr)
+                stock_obj.signal_button_cancel(cr, uid, r['picking_ids'])
         return super(sale_order, self).action_cancel(cr, uid, ids, context=context)
 
     def action_wait(self, cr, uid, ids, context=None):
@@ -301,7 +307,7 @@ class sale_order(osv.osv):
                     or line.product_uom_qty,
             'product_uos': (line.product_uos and line.product_uos.id)\
                     or line.product_uom.id,
-            'location_id': order.shop_id.warehouse_id.lot_stock_id.id,
+            'location_id': order.warehouse_id.lot_stock_id.id,
             'procure_method': line.type,
             'move_id': move_id,
             'company_id': order.company_id.id,
@@ -309,8 +315,8 @@ class sale_order(osv.osv):
         }
 
     def _prepare_order_line_move(self, cr, uid, order, line, picking_id, date_planned, context=None):
-        location_id = order.shop_id.warehouse_id.lot_stock_id.id
-        output_id = order.shop_id.warehouse_id.lot_output_id.id
+        location_id = order.warehouse_id.lot_stock_id.id
+        output_id = order.warehouse_id.lot_output_id.id
         return {
             'name': line.name,
             'picking_id': picking_id,
@@ -430,11 +436,9 @@ class sale_order(osv.osv):
                 line.write({'procurement_id': proc_id})
                 self.ship_recreate(cr, uid, order, line, move_id, proc_id)
 
-        wf_service = netsvc.LocalService("workflow")
         if picking_id:
-            wf_service.trg_validate(uid, 'stock.picking', picking_id, 'button_confirm', cr)
-        for proc_id in proc_ids:
-            wf_service.trg_validate(uid, 'procurement.order', proc_id, 'button_confirm', cr)
+            picking_obj.signal_button_confirm(cr, uid, [picking_id])
+        procurement_obj.signal_button_confirm(cr, uid, proc_ids)
 
         val = {}
         if order.state == 'shipping_except':