2009-10-14 11:15:34 +00:00
# -*- coding: utf-8 -*-
2006-12-07 13:41:40 +00:00
##############################################################################
#
2009-09-24 10:46:21 +00:00
# OpenERP, Open Source Management Solution
2010-01-12 09:18:39 +00:00
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
2006-12-07 13:41:40 +00:00
#
2008-11-03 19:18:56 +00:00
# This program is free software: you can redistribute it and/or modify
2009-10-14 11:15:34 +00:00
# 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.
2006-12-07 13:41:40 +00:00
#
2008-11-03 19:18:56 +00:00
# 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
2009-10-14 11:15:34 +00:00
# GNU Affero General Public License for more details.
2006-12-07 13:41:40 +00:00
#
2009-10-14 11:15:34 +00:00
# You should have received a copy of the GNU Affero General Public License
2008-11-03 19:18:56 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2006-12-07 13:41:40 +00:00
#
##############################################################################
2012-12-06 14:56:32 +00:00
from openerp . osv import fields , osv
from openerp . tools . translate import _
2012-12-17 15:23:03 +00:00
import openerp . addons . decimal_precision as dp
2008-12-08 17:08:40 +00:00
2008-09-07 23:24:39 +00:00
class product_product ( osv . osv ) :
2010-06-12 23:01:10 +00:00
_inherit = " product.product "
2010-03-25 12:08:31 +00:00
2013-10-04 14:56:59 +00:00
### FROM MOD STOCK LOCATION
_columns = {
' route_ids ' : fields . many2many ( ' stock.location.route ' , ' stock_route_product ' , ' product_id ' , ' route_id ' , ' Routes ' , domain = " [( ' product_selectable ' , ' = ' , True)] " ) , #Adds domain
}
2012-05-22 07:02:28 +00:00
def _stock_move_count ( self , cr , uid , ids , field_name , arg , context = None ) :
2012-05-04 14:55:51 +00:00
res = dict ( [ ( id , { ' reception_count ' : 0 , ' delivery_count ' : 0 } ) for id in ids ] )
2012-05-22 07:02:28 +00:00
move_pool = self . pool . get ( ' stock.move ' )
2012-05-22 14:37:59 +00:00
moves = move_pool . read_group ( cr , uid , [
( ' product_id ' , ' in ' , ids ) ,
2013-07-24 15:32:35 +00:00
( ' location_id.usage ' , ' != ' , ' internal ' ) ,
( ' location_dest_id.usage ' , ' = ' , ' internal ' ) ,
2012-09-03 17:54:10 +00:00
( ' state ' , ' in ' , ( ' confirmed ' , ' assigned ' , ' pending ' ) )
2012-05-22 14:37:59 +00:00
] , [ ' product_id ' ] , [ ' product_id ' ] )
for move in moves :
product_id = move [ ' product_id ' ] [ 0 ]
2012-05-22 14:54:33 +00:00
res [ product_id ] [ ' reception_count ' ] = move [ ' product_id_count ' ]
2012-05-22 14:37:59 +00:00
moves = move_pool . read_group ( cr , uid , [
( ' product_id ' , ' in ' , ids ) ,
2013-07-24 15:32:35 +00:00
( ' location_id.usage ' , ' = ' , ' internal ' ) ,
( ' location_dest_id.usage ' , ' != ' , ' internal ' ) ,
2012-09-03 17:54:10 +00:00
( ' state ' , ' in ' , ( ' confirmed ' , ' assigned ' , ' pending ' ) )
2012-05-22 14:37:59 +00:00
] , [ ' product_id ' ] , [ ' product_id ' ] )
for move in moves :
product_id = move [ ' product_id ' ] [ 0 ]
2012-06-11 10:50:38 +00:00
res [ product_id ] [ ' delivery_count ' ] = move [ ' product_id_count ' ]
2012-05-04 14:55:51 +00:00
return res
2012-04-26 10:31:33 +00:00
2010-07-06 11:56:32 +00:00
def view_header_get ( self , cr , user , view_id , view_type , context = None ) :
if context is None :
context = { }
2008-09-23 14:24:03 +00:00
res = super ( product_product , self ) . view_header_get ( cr , user , view_id , view_type , context )
if res : return res
2010-07-07 09:05:22 +00:00
if ( context . get ( ' active_id ' , False ) ) and ( context . get ( ' active_model ' ) == ' stock.location ' ) :
return _ ( ' Products: ' ) + self . pool . get ( ' stock.location ' ) . browse ( cr , user , context [ ' active_id ' ] , context ) . name
2008-09-23 14:24:03 +00:00
return res
2013-09-04 17:04:13 +00:00
#
# TODO: Needs to be rechecked
#
2013-06-30 14:10:14 +00:00
def _get_domain_locations ( self , cr , uid , ids , context = None ) :
2013-05-14 13:23:22 +00:00
'''
Parses the context and returns a list of location_ids based on it .
It will return all stock locations when no parameters are given
Possible parameters are shop , warehouse , location , force_company , compute_child
'''
2013-06-29 22:17:03 +00:00
context = context or { }
2011-06-02 06:55:59 +00:00
location_obj = self . pool . get ( ' stock.location ' )
warehouse_obj = self . pool . get ( ' stock.warehouse ' )
2008-09-23 13:24:11 +00:00
2013-06-29 22:17:03 +00:00
location_ids = [ ]
2008-09-23 13:24:11 +00:00
if context . get ( ' location ' , False ) :
2008-09-25 09:30:39 +00:00
if type ( context [ ' location ' ] ) == type ( 1 ) :
location_ids = [ context [ ' location ' ] ]
2010-06-12 23:01:10 +00:00
elif type ( context [ ' location ' ] ) in ( type ( ' ' ) , type ( u ' ' ) ) :
2013-06-29 22:17:03 +00:00
domain = [ ( ' name ' , ' ilike ' , context [ ' location ' ] ) ]
2013-05-07 14:04:43 +00:00
if context . get ( ' force_company ' , False ) :
2013-06-29 22:17:03 +00:00
domain + = [ ( ' company_id ' , ' = ' , context [ ' force_company ' ] ) ]
location_ids = location_obj . search ( cr , uid , domain , context = context )
2008-09-25 09:30:39 +00:00
else :
location_ids = context [ ' location ' ]
2008-09-23 13:24:11 +00:00
else :
2013-06-29 22:17:03 +00:00
if context . get ( ' warehouse ' , False ) :
wh = warehouse_obj . browse ( cr , uid , [ context [ ' warehouse ' ] ] , context = context )
else :
wids = warehouse_obj . search ( cr , uid , [ ] , context = context )
wh = warehouse_obj . browse ( cr , uid , wids , context = context )
2011-06-02 06:55:59 +00:00
for w in warehouse_obj . browse ( cr , uid , wids , context = context ) :
2013-06-30 14:10:14 +00:00
location_ids . append ( w . lot_stock_id . id )
2008-09-23 13:24:11 +00:00
2013-06-30 14:10:14 +00:00
operator = context . get ( ' compute_child ' , True ) and ' child_of ' or ' in '
domain = context . get ( ' force_company ' , False ) and [ ' & ' , ( ' company_id ' , ' = ' , context [ ' force_company ' ] ) ] or [ ]
2013-06-30 20:13:23 +00:00
domain + = [ ( ' product_id ' , ' in ' , ids ) ]
2013-06-30 14:10:14 +00:00
return (
domain + [ ( ' location_id ' , operator , location_ids ) ] ,
2013-06-30 20:13:23 +00:00
domain + [ ' & ' , ( ' location_dest_id ' , operator , location_ids ) , ' ! ' , ( ' location_id ' , operator , location_ids ) ] ,
domain + [ ' & ' , ( ' location_id ' , operator , location_ids ) , ' ! ' , ( ' location_dest_id ' , operator , location_ids ) ]
2013-06-30 14:10:14 +00:00
)
2013-04-22 13:57:19 +00:00
2013-06-30 14:10:14 +00:00
def _get_domain_dates ( self , cr , uid , ids , context ) :
2013-04-22 13:57:19 +00:00
from_date = context . get ( ' from_date ' , False )
to_date = context . get ( ' to_date ' , False )
2013-06-30 14:10:14 +00:00
domain = [ ]
if from_date :
domain . append ( ( ' date ' , ' >= ' , from_date ) )
if to_date :
domain . append ( ( ' date ' , ' <= ' , to_date ) )
return domain
2008-09-23 14:24:03 +00:00
2013-06-30 14:10:14 +00:00
def _product_available ( self , cr , uid , ids , field_names = None , arg = False , context = None ) :
context = context or { }
field_names = field_names or [ ]
2008-09-23 14:24:03 +00:00
2013-07-18 11:59:34 +00:00
domain_products = [ ( ' product_id ' , ' in ' , ids ) ]
2013-06-30 20:13:23 +00:00
domain_quant , domain_move_in , domain_move_out = self . _get_domain_locations ( cr , uid , ids , context = context )
2013-07-18 11:59:34 +00:00
domain_move_in + = self . _get_domain_dates ( cr , uid , ids , context = context ) + [ ( ' state ' , ' not in ' , ( ' done ' , ' cancel ' ) ) ] + domain_products
domain_move_out + = self . _get_domain_dates ( cr , uid , ids , context = context ) + [ ( ' state ' , ' not in ' , ( ' done ' , ' cancel ' ) ) ] + domain_products
domain_quant + = domain_products
2013-09-12 07:38:37 +00:00
if context . get ( ' lot_id ' ) or context . get ( ' owner_id ' ) or context . get ( ' package_id ' ) :
if context . get ( ' lot_id ' ) :
domain_quant . append ( ( ' lot_id ' , ' = ' , context [ ' lot_id ' ] ) )
if context . get ( ' owner_id ' ) :
domain_quant . append ( ( ' owner_id ' , ' = ' , context [ ' owner_id ' ] ) )
if context . get ( ' package_id ' ) :
domain_quant . append ( ( ' package_id ' , ' = ' , context [ ' package_id ' ] ) )
2013-06-30 14:10:14 +00:00
moves_in = [ ]
moves_out = [ ]
else :
2013-07-18 11:59:34 +00:00
# if field_names in ['incoming_qty', 'outgoing_qty', 'virtual_available']:
2013-06-30 14:10:14 +00:00
moves_in = self . pool . get ( ' stock.move ' ) . read_group ( cr , uid , domain_move_in , [ ' product_id ' , ' product_qty ' ] , [ ' product_id ' ] , context = context )
moves_out = self . pool . get ( ' stock.move ' ) . read_group ( cr , uid , domain_move_out , [ ' product_id ' , ' product_qty ' ] , [ ' product_id ' ] , context = context )
2013-04-19 10:17:01 +00:00
2013-06-30 14:10:14 +00:00
quants = self . pool . get ( ' stock.quant ' ) . read_group ( cr , uid , domain_quant , [ ' product_id ' , ' qty ' ] , [ ' product_id ' ] , context = context )
2010-11-11 12:41:24 +00:00
2013-06-30 20:13:23 +00:00
quants = dict ( map ( lambda x : ( x [ ' product_id ' ] [ 0 ] , x [ ' qty ' ] ) , quants ) )
2013-07-18 11:59:34 +00:00
2013-06-30 20:13:23 +00:00
moves_in = dict ( map ( lambda x : ( x [ ' product_id ' ] [ 0 ] , x [ ' product_qty ' ] ) , moves_in ) )
moves_out = dict ( map ( lambda x : ( x [ ' product_id ' ] [ 0 ] , x [ ' product_qty ' ] ) , moves_out ) )
2008-09-23 13:24:11 +00:00
2008-10-21 16:28:19 +00:00
res = { }
for id in ids :
2013-06-30 14:10:14 +00:00
res [ id ] = {
' qty_available ' : quants . get ( id , 0.0 ) ,
' incoming_qty ' : moves_in . get ( id , 0.0 ) ,
' outgoing_qty ' : moves_out . get ( id , 0.0 ) ,
' virtual_available ' : quants . get ( id , 0.0 ) + moves_in . get ( id , 0.0 ) - moves_out . get ( id , 0.0 ) ,
}
2008-10-21 16:28:19 +00:00
return res
2008-09-23 14:24:03 +00:00
2008-09-07 23:24:39 +00:00
_columns = {
2012-05-22 07:02:28 +00:00
' reception_count ' : fields . function ( _stock_move_count , string = " Reception " , type = ' integer ' , multi = ' pickings ' ) ,
' delivery_count ' : fields . function ( _stock_move_count , string = " Delivery " , type = ' integer ' , multi = ' pickings ' ) ,
2011-10-28 15:02:09 +00:00
' qty_available ' : fields . function ( _product_available , multi = ' qty_available ' ,
2012-04-25 12:09:08 +00:00
type = ' float ' , digits_compute = dp . get_precision ( ' Product Unit of Measure ' ) ,
2011-10-28 15:02:09 +00:00
string = ' Quantity On Hand ' ,
help = " Current quantity of products. \n "
" In a context with a single Stock Location, this includes "
" goods stored at this Location, or any of its children. \n "
" In a context with a single Warehouse, this includes "
" goods stored in the Stock Location of this Warehouse, or any "
" of its children. \n "
" stored in the Stock Location of the Warehouse of this Shop, "
" or any of its children. \n "
" Otherwise, this includes goods stored in any Stock Location "
2012-10-23 13:02:42 +00:00
" with ' internal ' type. " ) ,
2011-10-28 15:02:09 +00:00
' virtual_available ' : fields . function ( _product_available , multi = ' qty_available ' ,
2012-04-25 12:09:08 +00:00
type = ' float ' , digits_compute = dp . get_precision ( ' Product Unit of Measure ' ) ,
2012-10-29 12:54:26 +00:00
string = ' Forecasted Quantity ' ,
2011-12-22 16:54:22 +00:00
help = " Forecast quantity (computed as Quantity On Hand "
2011-10-28 15:02:09 +00:00
" - Outgoing + Incoming) \n "
" In a context with a single Stock Location, this includes "
2012-10-23 13:02:42 +00:00
" goods stored in this location, or any of its children. \n "
2011-10-28 15:02:09 +00:00
" In a context with a single Warehouse, this includes "
" goods stored in the Stock Location of this Warehouse, or any "
" of its children. \n "
" stored in the Stock Location of the Warehouse of this Shop, "
" or any of its children. \n "
" Otherwise, this includes goods stored in any Stock Location "
2012-10-23 13:02:42 +00:00
" with ' internal ' type. " ) ,
2011-10-28 15:02:09 +00:00
' incoming_qty ' : fields . function ( _product_available , multi = ' qty_available ' ,
2012-04-25 12:09:08 +00:00
type = ' float ' , digits_compute = dp . get_precision ( ' Product Unit of Measure ' ) ,
2011-10-28 15:02:09 +00:00
string = ' Incoming ' ,
help = " Quantity of products that are planned to arrive. \n "
" In a context with a single Stock Location, this includes "
" goods arriving to this Location, or any of its children. \n "
" In a context with a single Warehouse, this includes "
" goods arriving to the Stock Location of this Warehouse, or "
" any of its children. \n "
" In a context with a single Shop, this includes goods "
" arriving to the Stock Location of the Warehouse of this "
" Shop, or any of its children. \n "
" Otherwise, this includes goods arriving to any Stock "
2012-10-23 13:02:42 +00:00
" Location with ' internal ' type. " ) ,
2011-10-28 15:02:09 +00:00
' outgoing_qty ' : fields . function ( _product_available , multi = ' qty_available ' ,
2012-04-25 12:09:08 +00:00
type = ' float ' , digits_compute = dp . get_precision ( ' Product Unit of Measure ' ) ,
2011-10-28 15:02:09 +00:00
string = ' Outgoing ' ,
help = " Quantity of products that are planned to leave. \n "
" In a context with a single Stock Location, this includes "
2012-10-23 13:02:42 +00:00
" goods leaving this Location, or any of its children. \n "
2011-10-28 15:02:09 +00:00
" In a context with a single Warehouse, this includes "
2012-10-23 13:02:42 +00:00
" goods leaving the Stock Location of this Warehouse, or "
2011-10-28 15:02:09 +00:00
" any of its children. \n "
" In a context with a single Shop, this includes goods "
2012-10-23 13:02:42 +00:00
" leaving the Stock Location of the Warehouse of this "
2011-10-28 15:02:09 +00:00
" Shop, or any of its children. \n "
2012-10-23 13:02:42 +00:00
" Otherwise, this includes goods leaving any Stock "
" Location with ' internal ' type. " ) ,
2012-04-24 13:08:05 +00:00
' track_production ' : fields . boolean ( ' Track Manufacturing Lots ' , help = " Forces to specify a Serial Number for all moves containing this product and generated by a Manufacturing Order " ) ,
' track_incoming ' : fields . boolean ( ' Track Incoming Lots ' , help = " Forces to specify a Serial Number for all moves containing this product and coming from a Supplier Location " ) ,
' track_outgoing ' : fields . boolean ( ' Track Outgoing Lots ' , help = " Forces to specify a Serial Number for all moves containing this product and going to a Customer Location " ) ,
2011-07-08 08:52:03 +00:00
' location_id ' : fields . dummy ( string = ' Location ' , relation = ' stock.location ' , type = ' many2one ' ) ,
' warehouse_id ' : fields . dummy ( string = ' Warehouse ' , relation = ' stock.warehouse ' , type = ' many2one ' ) ,
2013-09-02 14:37:43 +00:00
' orderpoint_ids ' : fields . one2many ( ' stock.warehouse.orderpoint ' , ' product_id ' , ' Minimum Stock Rules ' ) ,
2013-09-13 09:42:16 +00:00
' route_ids ' : fields . many2many ( ' stock.location.route ' , ' stock_route_product ' , ' product_id ' , ' route_id ' , ' Routes ' ,
2013-09-09 11:55:15 +00:00
help = " Depending on the modules installed, this will allow you to define the route of the product: whether it will be bought, manufactured, MTO/MTS,... " ) ,
2008-09-07 23:24:39 +00:00
}
2010-06-10 12:44:52 +00:00
2009-09-24 10:46:21 +00:00
def fields_view_get ( self , cr , uid , view_id = None , view_type = ' form ' , context = None , toolbar = False , submenu = False ) :
res = super ( product_product , self ) . fields_view_get ( cr , uid , view_id , view_type , context , toolbar = toolbar , submenu = submenu )
2010-07-06 11:56:32 +00:00
if context is None :
2009-12-29 13:05:00 +00:00
context = { }
2008-09-23 13:24:11 +00:00
if ( ' location ' in context ) and context [ ' location ' ] :
location_info = self . pool . get ( ' stock.location ' ) . browse ( cr , uid , context [ ' location ' ] )
fields = res . get ( ' fields ' , { } )
if fields :
2008-09-23 14:24:03 +00:00
if location_info . usage == ' supplier ' :
if fields . get ( ' virtual_available ' ) :
2009-11-13 05:41:16 +00:00
res [ ' fields ' ] [ ' virtual_available ' ] [ ' string ' ] = _ ( ' Future Receptions ' )
2008-09-23 13:24:11 +00:00
if fields . get ( ' qty_available ' ) :
2008-12-08 17:08:40 +00:00
res [ ' fields ' ] [ ' qty_available ' ] [ ' string ' ] = _ ( ' Received Qty ' )
2008-09-23 14:24:03 +00:00
2008-09-23 13:24:11 +00:00
if location_info . usage == ' internal ' :
if fields . get ( ' virtual_available ' ) :
2009-11-13 05:41:16 +00:00
res [ ' fields ' ] [ ' virtual_available ' ] [ ' string ' ] = _ ( ' Future Stock ' )
2008-09-23 14:24:03 +00:00
2008-09-23 13:24:11 +00:00
if location_info . usage == ' customer ' :
if fields . get ( ' virtual_available ' ) :
2009-11-13 05:41:16 +00:00
res [ ' fields ' ] [ ' virtual_available ' ] [ ' string ' ] = _ ( ' Future Deliveries ' )
2008-09-23 13:24:11 +00:00
if fields . get ( ' qty_available ' ) :
2008-12-08 17:08:40 +00:00
res [ ' fields ' ] [ ' qty_available ' ] [ ' string ' ] = _ ( ' Delivered Qty ' )
2008-09-23 14:24:03 +00:00
2008-09-23 13:24:11 +00:00
if location_info . usage == ' inventory ' :
if fields . get ( ' virtual_available ' ) :
2009-11-13 05:41:16 +00:00
res [ ' fields ' ] [ ' virtual_available ' ] [ ' string ' ] = _ ( ' Future P&L ' )
2010-07-06 11:56:32 +00:00
if fields . get ( ' qty_available ' ) :
2010-06-18 07:12:06 +00:00
res [ ' fields ' ] [ ' qty_available ' ] [ ' string ' ] = _ ( ' P&L Qty ' )
2008-09-23 14:24:03 +00:00
2008-09-23 13:24:11 +00:00
if location_info . usage == ' procurement ' :
if fields . get ( ' virtual_available ' ) :
2009-11-13 05:41:16 +00:00
res [ ' fields ' ] [ ' virtual_available ' ] [ ' string ' ] = _ ( ' Future Qty ' )
2008-09-23 13:24:11 +00:00
if fields . get ( ' qty_available ' ) :
2008-12-08 17:08:40 +00:00
res [ ' fields ' ] [ ' qty_available ' ] [ ' string ' ] = _ ( ' Unplanned Qty ' )
2008-09-23 14:24:03 +00:00
2008-09-23 13:24:11 +00:00
if location_info . usage == ' production ' :
if fields . get ( ' virtual_available ' ) :
2009-11-13 05:41:16 +00:00
res [ ' fields ' ] [ ' virtual_available ' ] [ ' string ' ] = _ ( ' Future Productions ' )
2008-09-23 13:24:11 +00:00
if fields . get ( ' qty_available ' ) :
2008-12-08 17:08:40 +00:00
res [ ' fields ' ] [ ' qty_available ' ] [ ' string ' ] = _ ( ' Produced Qty ' )
2008-09-23 13:24:11 +00:00
return res
2008-09-07 23:24:39 +00:00
2006-12-07 13:41:40 +00:00
2008-09-23 13:24:11 +00:00
class product_template ( osv . osv ) :
2008-07-22 15:11:28 +00:00
_name = ' product.template '
_inherit = ' product.template '
_columns = {
2013-09-02 14:37:43 +00:00
' type ' : fields . selection ( [ ( ' product ' , ' Stockable Product ' ) , ( ' consu ' , ' Consumable ' ) , ( ' service ' , ' Service ' ) ] , ' Product Type ' , required = True , help = " Consumable: Will not imply stock management for this product. \n Stockable product: Will imply stock management for this product. " ) ,
2008-07-22 15:11:28 +00:00
' property_stock_procurement ' : fields . property (
type = ' many2one ' ,
relation = ' stock.location ' ,
2010-04-09 07:14:08 +00:00
string = " Procurement Location " ,
2009-10-22 13:40:16 +00:00
domain = [ ( ' usage ' , ' like ' , ' procurement ' ) ] ,
2012-10-23 13:02:42 +00:00
help = " This stock location will be used, instead of the default one, as the source location for stock moves generated by procurements. " ) ,
2008-07-22 15:11:28 +00:00
' property_stock_production ' : fields . property (
type = ' many2one ' ,
relation = ' stock.location ' ,
string = " Production Location " ,
2009-10-22 13:40:16 +00:00
domain = [ ( ' usage ' , ' like ' , ' production ' ) ] ,
2012-10-23 13:02:42 +00:00
help = " This stock location will be used, instead of the default one, as the source location for stock moves generated by manufacturing orders. " ) ,
2008-07-22 15:11:28 +00:00
' property_stock_inventory ' : fields . property (
type = ' many2one ' ,
relation = ' stock.location ' ,
string = " Inventory Location " ,
2009-10-22 13:40:16 +00:00
domain = [ ( ' usage ' , ' like ' , ' inventory ' ) ] ,
2012-10-31 10:25:24 +00:00
help = " This stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory. " ) ,
2012-10-23 13:02:42 +00:00
' sale_delay ' : fields . float ( ' Customer Lead Time ' , help = " The average delay in days between the confirmation of the customer order and the delivery of the finished products. It ' s the time you promise to your customers. " ) ,
2012-10-03 06:48:40 +00:00
' loc_rack ' : fields . char ( ' Rack ' , size = 16 ) ,
' loc_row ' : fields . char ( ' Row ' , size = 16 ) ,
' loc_case ' : fields . char ( ' Case ' , size = 16 ) ,
2008-07-22 15:11:28 +00:00
}
2010-07-06 11:56:32 +00:00
2012-10-03 06:48:40 +00:00
_defaults = {
2012-10-03 11:42:08 +00:00
' sale_delay ' : 7 ,
2012-10-03 06:48:40 +00:00
}
2013-10-04 14:56:59 +00:00
### FROM MOD STOCK LOCATION [All under]
class product_removal_strategy ( osv . osv ) :
_name = ' product.removal '
_description = ' Removal Strategy '
_order = ' sequence '
_columns = {
' product_categ_id ' : fields . many2one ( ' product.category ' , ' Category ' , required = True ) ,
' sequence ' : fields . integer ( ' Sequence ' ) ,
' method ' : fields . selection ( [ ( ' fifo ' , ' FIFO ' ) , ( ' lifo ' , ' LIFO ' ) ] , " Method " , required = True ) ,
' location_id ' : fields . many2one ( ' stock.location ' , ' Locations ' , required = True ) ,
}
#
# class product_product(osv.osv):
# _inherit = 'product.product'
# _columns = {
# 'route_ids': fields.many2many('stock.location.route', 'stock_route_product', 'product_id', 'route_id', 'Routes', domain="[('product_selectable', '=', True)]"), #Adds domain
# }
class product_category ( osv . osv ) :
_inherit = ' product.category '
def calculate_total_routes ( self , cr , uid , ids , name , args , context = None ) :
res = { }
route_obj = self . pool . get ( " stock.location.route " )
for categ in self . browse ( cr , uid , ids , context = context ) :
categ2 = categ
routes = [ x . id for x in categ . route_ids ]
while categ2 . parent_id :
categ2 = categ2 . parent_id
routes + = [ x . id for x in categ2 . route_ids ]
res [ categ . id ] = routes
return res
_columns = {
' route_ids ' : fields . many2many ( ' stock.location.route ' , ' stock_location_route_categ ' , ' categ_id ' , ' route_id ' , ' Routes ' , domain = " [( ' product_categ_selectable ' , ' = ' , True)] " ) ,
' removal_strategy_ids ' : fields . one2many ( ' product.removal ' , ' product_categ_id ' , ' Removal Strategies ' ) ,
' putaway_strategy_ids ' : fields . one2many ( ' product.putaway ' , ' product_categ_id ' , ' Put Away Strategies ' ) ,
' total_route_ids ' : fields . function ( calculate_total_routes , relation = ' stock.location.route ' , type = ' many2many ' , string = ' Total routes ' , readonly = True ) ,
}
class product_putaway_strategy ( osv . osv ) :
_name = ' product.putaway '
_description = ' Put Away Strategy '
_columns = {
' product_categ_id ' : fields . many2one ( ' product.category ' , ' Product Category ' , required = True ) ,
' location_id ' : fields . many2one ( ' stock.location ' , ' Parent Location ' , help = " Parent Destination Location from which a child bin location needs to be chosen " , required = True ) , #domain=[('type', '=', 'parent')],
' method ' : fields . selection ( [ ( ' fixed ' , ' Fixed Location ' ) ] , " Method " , required = True ) ,
' location_spec_id ' : fields . many2one ( ' stock.location ' , ' Specific Location ' , help = " When the location is specific, it will be put over there " ) , #domain=[('type', '=', 'parent')],
}
2006-12-07 13:41:40 +00:00
2010-07-06 11:56:32 +00:00
2010-09-21 05:58:33 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: