[IMP]: Improve code for all child locations
[odoo/odoo.git] / addons / stock / wizard / stock_fill_inventory.py
index 6d70736..b4c0a2a 100644 (file)
 #
 ##############################################################################
 
-import wizard
-import netsvc
-import pooler
-
-import time
 from osv import fields, osv
 from tools.translate import _
-from service import web_services
-from tools.misc import UpdateableStr, UpdateableDict
 
 class stock_fill_inventory(osv.osv_memory):
     _name = "stock.fill.inventory"
-    _description = "Fill Inventory"
+    _description = "Import Inventory"
     _columns = {
-            'location_id': fields.many2one('stock.location', 'Location', required=True), 
-            'recursive': fields.boolean("Include all childs for the location"), 
-            }
+        'location_id': fields.many2one('stock.location', 'Location', required=True),
+        'recursive': fields.boolean("Include children",help="If checked, products contained in child locations of selected location will be included as well."),
+        'set_stock_zero': fields.boolean("Set to zero",help="If checked, all product quantities will be set to zero to help ensure a real physical inventory is done"),
+    }
+    def view_init(self, cr, uid, fields_list, context=None):
+        """
+         Creates view dynamically and adding fields at runtime.
+         @param self: The object pointer.
+         @param cr: A database cursor
+         @param uid: ID of the user currently logged in
+         @param context: A standard dictionary
+         @return: New arch of view with new columns.
+        """
+        if context==None:
+            context={}
+        res = super(stock_fill_inventory, self).view_init(cr, uid, fields_list, context=context)
+        if context.get('active_id', False):
+            stock = self.pool.get('stock.inventory').browse(cr, uid, context.get('active_id', False))
+            if stock.state=='done':
+                raise osv.except_osv(_('Error!'), _('Stock Inventory is done'))
+        True
 
-    def _fill_inventory(self, cr, uid, ids, context):
+    def fill_inventory(self, cr, uid, ids, context=None):
+        """ To Import stock inventory according to products available in the selected locations.
+        @param self: The object pointer.
+        @param cr: A database cursor
+        @param uid: ID of the user currently logged in
+        @param ids: the ID or list of IDs if we want more than one
+        @param context: A standard dictionary
+        @return:
+        """
+        if context is None:
+            context = {}
         inventory_line_obj = self.pool.get('stock.inventory.line')
         location_obj = self.pool.get('stock.location')
-        for fill_inventory in self.browse(cr, uid, ids):
-            res={}
-            res_location = {}
-            if fill_inventory.recursive :
-                location_ids = location_obj.search(cr, uid, [('location_id', 
-                                 'child_of', fill_inventory.location_id.id)])
-                for location in location_ids :
-                    res=location_obj._product_get(cr, uid, location)
-                    res_location[location]=res
-            else:
-                context.update({'compute_child':False})
-                res=location_obj._product_get(cr, uid, fill_inventory.location_id.id, context=context)
-                res_location[fill_inventory.location_id.id]=res
+        product_obj = self.pool.get('product.product')
+        stock_location_obj = self.pool.get('stock.location')
+        move_obj = self.pool.get('stock.move')
+        if ids and len(ids):
+            ids = ids[0]
+        else:
+             return {'type': 'ir.actions.act_window_close'}
+        fill_inventory = self.browse(cr, uid, ids, context=context)
+        res = {}
+        res_location = {}
+        if fill_inventory.recursive :
+            location_ids = location_obj.search(cr, uid, [('location_id',
+                             'child_of', fill_inventory.location_id.id)], order="id")
+        else:
+            location_ids = [fill_inventory.location_id.id]
+
+        res = {}
+        flag = False
+        for location in location_ids:
+            datas = {}
+            res[location] = {}
+            move_ids = move_obj.search(cr, uid, [('location_dest_id','=',location),('state','=','done')], context=context)
+
+            for move in move_obj.browse(cr, uid, move_ids, context=context):
+                lot_id = move.prodlot_id.id
+                prod_id = move.product_id.id
+                qty = move.product_qty
+                location_dest_id = move.location_dest_id.id
+                if datas.get((prod_id, lot_id)):
+                    qty = datas[(prod_id, lot_id)]['product_qty'] + qty
+                datas[(prod_id, lot_id)] = {'product_id': prod_id, 'location_id': location_dest_id, 'product_qty': qty, 'product_uom': move.product_id.uom_id.id, 'prod_lot_id': lot_id}
+            if datas:
+                flag = True
+                res[location] = datas
+
+        if not flag:
+            raise osv.except_osv(_('Message !'), _('No product in this location.'))
 
-                product_ids=[]
-                for location in res_location.keys():
-                    res=res_location[location]
-                    for product_id in res.keys():
-                        prod = self.pool.get('product.product').browse(cr, uid, [product_id])[0]
-                        uom = prod.uom_id.id
-                        context.update({'uom': uom})
-                        amount=self.pool.get('stock.location')._product_get(cr, uid, 
-                                 location, [product_id], context=context)[product_id]
+        for i in res.values():
+            if i.values():
+                for mydata in i.values():
+                    mydata.update({'inventory_id': context['active_ids'][0]})
+                    domain = []
+                    if fill_inventory.set_stock_zero:
+                        mydata.update({'product_qty': 0})
+                    for k, v in mydata.items():
+                        domain.append((k, '=', v))
+                    line_ids = inventory_line_obj.search(cr, uid, domain)
 
-                        if(amount):
-                            line_ids=inventory_line_obj.search(cr, uid, 
-                                [('inventory_id', '=', context['active_ids']), 
-                                 ('location_id', '=', location), 
-                                 ('product_id', '=', product_id), 
-                                 ('product_uom', '=', uom), 
-                                ('product_qty', '=', amount)])
-                            if not len(line_ids):
-                                inventory_line={'inventory_id': context['active_ids'][0], 
-                                                    'location_id': location, 
-                                                    'product_id': product_id, 
-                                                    'product_uom': uom, 
-                                                    'product_qty': amount}
-                                inventory_line_obj.create(cr, uid, inventory_line)
-                            product_ids.append(product_id)
+                    if not len(line_ids):
+                        inventory_line_obj.create(cr, uid, mydata)
 
-                if(len(product_ids)==0):
-                    raise osv.except_osv(_('Message !'), _('No product in this location.'))
-                return {}
+        return {'type': 'ir.actions.act_window_close'}
 
 stock_fill_inventory()