2010-03-10 09:42:47 +00:00
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import fields , osv
from tools . translate import _
class stock_fill_inventory ( osv . osv_memory ) :
_name = " stock.fill.inventory "
2010-09-08 13:43:53 +00:00
_description = " Import Inventory "
2010-03-10 09:42:47 +00:00
_columns = {
2010-08-13 12:20:05 +00:00
' location_id ' : fields . many2one ( ' stock.location ' , ' Location ' , required = True ) ,
2010-09-09 06:15:10 +00:00
' recursive ' : fields . boolean ( " Include children " , help = " If checked, products contained in child locations of selected location will be included as well. " ) ,
2010-09-09 12:05:14 +00:00
' 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 " ) ,
2010-05-26 12:59:30 +00:00
}
2010-09-13 11:46:02 +00:00
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 .
"""
2010-09-14 06:26:43 +00:00
if context == None :
context = { }
2010-09-13 11:46:02 +00:00
res = super ( stock_fill_inventory , self ) . view_init ( cr , uid , fields_list , context = context )
2010-09-14 06:26:43 +00:00
if context . get ( ' active_id ' , False ) :
stock = self . pool . get ( ' stock.inventory ' ) . browse ( cr , uid , context . get ( ' active_id ' , False ) )
if stock . state == ' done ' :
2010-10-27 13:35:24 +00:00
raise osv . except_osv ( _ ( ' Error! ' ) , _ ( ' Stock Inventory is done ' ) )
2010-09-13 11:46:02 +00:00
True
2010-03-10 09:42:47 +00:00
2010-09-14 06:26:43 +00:00
def fill_inventory ( self , cr , uid , ids , context = None ) :
2010-09-08 13:43:53 +00:00
""" To Import stock inventory according to products available in the selected locations.
2010-05-26 12:59:30 +00:00
@param self : The object pointer .
@param cr : A database cursor
@param uid : ID of the user currently logged in
2010-08-13 12:20:05 +00:00
@param ids : the ID or list of IDs if we want more than one
@param context : A standard dictionary
@return :
"""
2010-11-23 07:05:05 +00:00
if context is None :
context = { }
2010-03-10 09:42:47 +00:00
inventory_line_obj = self . pool . get ( ' stock.inventory.line ' )
location_obj = self . pool . get ( ' stock.location ' )
2010-03-11 07:47:54 +00:00
product_obj = self . pool . get ( ' product.product ' )
stock_location_obj = self . pool . get ( ' stock.location ' )
2010-09-09 14:05:55 +00:00
if ids and len ( ids ) :
ids = ids [ 0 ]
else :
2010-12-28 10:41:38 +00:00
return { ' type ' : ' ir.actions.act_window_close ' }
2010-11-22 10:37:53 +00:00
fill_inventory = self . browse ( cr , uid , ids , context = context )
2010-09-09 14:05:55 +00:00
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
2010-09-09 06:15:10 +00:00
2010-04-01 10:43:47 +00:00
product_ids = [ ]
for location in res_location . keys ( ) :
res = res_location [ location ]
for product_id in res . keys ( ) :
2010-11-23 11:31:52 +00:00
prod = product_obj . browse ( cr , uid , product_id , context = context )
2010-04-01 10:43:47 +00:00
uom = prod . uom_id . id
2010-09-08 11:36:22 +00:00
context . update ( uom = uom , compute_child = False )
2010-09-09 14:47:21 +00:00
amount = stock_location_obj . _product_get ( cr , uid ,
2010-04-01 10:43:47 +00:00
location , [ product_id ] , context = context ) [ product_id ]
if ( amount ) :
2010-09-09 14:47:21 +00:00
if fill_inventory . set_stock_zero :
amount = 0
2010-04-01 10:43:47 +00:00
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 ) :
2010-08-13 12:20:05 +00:00
inventory_line = {
' inventory_id ' : context [ ' active_ids ' ] [ 0 ] ,
' location_id ' : location ,
' product_id ' : product_id ,
' product_uom ' : uom ,
' product_qty ' : amount
}
2010-04-01 10:43:47 +00:00
inventory_line_obj . create ( cr , uid , inventory_line )
product_ids . append ( product_id )
2010-03-10 09:42:47 +00:00
2010-04-01 10:43:47 +00:00
if ( len ( product_ids ) == 0 ) :
raise osv . except_osv ( _ ( ' Message ! ' ) , _ ( ' No product in this location. ' ) )
2010-12-28 10:41:38 +00:00
return { ' type ' : ' ir.actions.act_window_close ' }
2010-03-10 09:42:47 +00:00
stock_fill_inventory ( )
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: