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
#
##############################################################################
from osv import fields , osv
2008-12-08 17:08:40 +00:00
from tools . translate import _
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
2010-06-10 12:44:52 +00:00
def get_product_accounts ( self , cr , uid , product_id , context = None ) :
2010-05-27 05:45:34 +00:00
""" To get the stock input account, stock output account and stock journal related to product.
2010-07-06 11:56:32 +00:00
@param product_id : product id
2010-05-27 05:45:34 +00:00
@return : dictionary which contains information regarding stock input account , stock output account and stock journal
2010-06-10 12:44:52 +00:00
"""
2010-07-06 11:56:32 +00:00
if context is None :
context = { }
product_obj = self . pool . get ( ' product.product ' ) . browse ( cr , uid , product_id , context = context )
stock_input_acc = product_obj . property_stock_account_input and product_obj . property_stock_account_input . id or False
2010-05-27 05:45:34 +00:00
if not stock_input_acc :
stock_input_acc = product_obj . categ_id . property_stock_account_input_categ and product_obj . categ_id . property_stock_account_input_categ . id or False
2010-07-06 11:56:32 +00:00
2010-05-27 05:45:34 +00:00
stock_output_acc = product_obj . property_stock_account_output and product_obj . property_stock_account_output . id or False
if not stock_output_acc :
stock_output_acc = product_obj . categ_id . property_stock_account_output_categ and product_obj . categ_id . property_stock_account_output_categ . id or False
2010-03-25 12:08:31 +00:00
2010-05-27 05:45:34 +00:00
journal_id = product_obj . categ_id . property_stock_journal and product_obj . categ_id . property_stock_journal . id or False
2010-06-10 12:44:52 +00:00
account_variation = product_obj . categ_id . property_stock_variation and product_obj . categ_id . property_stock_variation . id or False
2010-07-06 11:56:32 +00:00
2010-06-10 12:44:52 +00:00
return {
2010-07-06 11:56:32 +00:00
' stock_account_input ' : stock_input_acc ,
' stock_account_output ' : stock_output_acc ,
' stock_journal ' : journal_id ,
2010-06-10 12:44:52 +00:00
' property_stock_variation ' : account_variation
2010-07-06 11:56:32 +00:00
}
2010-05-27 07:10:12 +00:00
2010-03-25 12:08:31 +00:00
def do_change_standard_price ( self , cr , uid , ids , datas , context = { } ) :
2010-05-26 12:59:30 +00:00
""" Changes the Standard Price of Product and creates an account move accordingly.
@param datas : dict . contain default datas like new_price , stock_output_account , stock_input_account , stock_journal
2010-07-06 11:56:32 +00:00
@param context : A standard dictionary
@return :
"""
2010-03-25 12:08:31 +00:00
location_obj = self . pool . get ( ' stock.location ' )
move_obj = self . pool . get ( ' account.move ' )
2010-07-06 11:56:32 +00:00
move_line_obj = self . pool . get ( ' account.move.line ' )
2010-03-26 09:25:02 +00:00
2010-03-25 12:08:31 +00:00
new_price = datas . get ( ' new_price ' , 0.0 )
stock_output_acc = datas . get ( ' stock_output_account ' , False )
stock_input_acc = datas . get ( ' stock_input_account ' , False )
journal_id = datas . get ( ' stock_journal ' , False )
2010-05-27 07:10:12 +00:00
property_obj = self . pool . get ( ' ir.property ' )
2010-05-27 08:31:40 +00:00
product_obj = self . browse ( cr , uid , ids ) [ 0 ]
account_variation = product_obj . categ_id . property_stock_variation
2010-07-01 13:40:10 +00:00
account_variation_id = account_variation and account_variation . id or False
if not account_variation_id : raise osv . except_osv ( _ ( ' Error! ' ) , _ ( ' Variation Account is not specified for Product Category: %s ' % ( product_obj . categ_id . name ) ) )
2010-07-06 11:56:32 +00:00
move_ids = [ ]
2010-06-12 23:01:10 +00:00
loc_ids = location_obj . search ( cr , uid , [ ( ' usage ' , ' = ' , ' internal ' ) ] )
2010-03-25 12:08:31 +00:00
for rec_id in ids :
for location in location_obj . browse ( cr , uid , loc_ids ) :
c = context . copy ( )
c . update ( {
' location ' : location . id ,
' compute_child ' : False
2010-07-06 11:56:32 +00:00
} )
2010-03-25 12:08:31 +00:00
product = self . browse ( cr , uid , rec_id , context = c )
qty = product . qty_available
2010-07-06 11:56:32 +00:00
diff = product . standard_price - new_price
2010-07-01 13:40:10 +00:00
if not diff : raise osv . except_osv ( _ ( ' Error! ' ) , _ ( " Could not find any difference between standard price and new price! " ) )
2010-03-25 12:08:31 +00:00
if qty :
2010-07-06 11:56:32 +00:00
company_id = location . company_id and location . company_id . id or False
2010-07-01 13:40:10 +00:00
if not company_id : raise osv . except_osv ( _ ( ' Error! ' ) , _ ( ' Company is not specified in Location ' ) )
2010-03-26 09:25:02 +00:00
#
# Accounting Entries
#
if not journal_id :
journal_id = product . categ_id . property_stock_journal and product . categ_id . property_stock_journal . id or False
if not journal_id :
raise osv . except_osv ( _ ( ' Error! ' ) ,
_ ( ' There is no journal defined ' \
' on the product category: " %s " (id: %d ) ' ) % \
( product . categ_id . name ,
product . categ_id . id , ) )
2010-03-25 12:08:31 +00:00
move_id = move_obj . create ( cr , uid , {
2010-07-06 11:56:32 +00:00
' journal_id ' : journal_id ,
2010-03-25 12:08:31 +00:00
' company_id ' : company_id
2010-07-06 11:56:32 +00:00
} )
2010-03-25 12:08:31 +00:00
move_ids . append ( move_id )
2010-03-26 09:25:02 +00:00
if diff > 0 :
if not stock_input_acc :
stock_input_acc = product . product_tmpl_id . \
property_stock_account_input . id
if not stock_input_acc :
stock_input_acc = product . categ_id . \
property_stock_account_input_categ . id
if not stock_input_acc :
raise osv . except_osv ( _ ( ' Error! ' ) ,
_ ( ' There is no stock input account defined ' \
' for this product: " %s " (id: %d ) ' ) % \
( product . name ,
product . id , ) )
2010-07-06 11:56:32 +00:00
amount_diff = qty * diff
2010-03-25 12:08:31 +00:00
move_line_obj . create ( cr , uid , {
' name ' : product . name ,
' account_id ' : stock_input_acc ,
' debit ' : amount_diff ,
' move_id ' : move_id ,
} )
move_line_obj . create ( cr , uid , {
2010-07-01 13:40:10 +00:00
' name ' : product . categ_id . name ,
' account_id ' : account_variation_id ,
2010-03-25 12:08:31 +00:00
' credit ' : amount_diff ,
' move_id ' : move_id
} )
2010-07-06 11:56:32 +00:00
elif diff < 0 :
2010-03-26 09:25:02 +00:00
if not stock_output_acc :
stock_output_acc = product . product_tmpl_id . \
property_stock_account_output . id
if not stock_output_acc :
stock_output_acc = product . categ_id . \
property_stock_account_output_categ . id
if not stock_output_acc :
raise osv . except_osv ( _ ( ' Error! ' ) ,
_ ( ' There is no stock output account defined ' \
' for this product: " %s " (id: %d ) ' ) % \
( product . name ,
product . id , ) )
2010-03-25 12:08:31 +00:00
amount_diff = qty * - diff
move_line_obj . create ( cr , uid , {
2010-08-13 12:20:05 +00:00
' name ' : product . name ,
' account_id ' : stock_output_acc ,
' credit ' : amount_diff ,
' move_id ' : move_id
2010-03-25 12:08:31 +00:00
} )
move_line_obj . create ( cr , uid , {
2010-08-13 12:20:05 +00:00
' name ' : product . categ_id . name ,
' account_id ' : account_variation_id ,
' debit ' : amount_diff ,
' move_id ' : move_id
2010-07-06 11:56:32 +00:00
} )
2010-03-25 12:08:31 +00:00
self . write ( cr , uid , rec_id , { ' standard_price ' : new_price } )
2010-03-26 09:25:02 +00:00
return move_ids
2010-03-25 12:08:31 +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
2010-05-26 12:59:30 +00:00
def get_product_available ( self , cr , uid , ids , context = None ) :
""" Finds whether product is available or not in particular warehouse.
@return : Dictionary of values
"""
2010-05-25 12:03:36 +00:00
if context is None :
2008-10-31 14:09:59 +00:00
context = { }
2010-05-25 12:03:36 +00:00
states = context . get ( ' states ' , [ ] )
what = context . get ( ' what ' , ( ) )
2008-09-23 13:24:11 +00:00
if not ids :
ids = self . search ( cr , uid , [ ] )
res = { } . fromkeys ( ids , 0.0 )
if not ids :
2008-09-23 14:24:03 +00:00
return res
2008-09-23 13:24:11 +00:00
if context . get ( ' shop ' , False ) :
2008-12-10 14:29:55 +00:00
cr . execute ( ' select warehouse_id from sale_shop where id= %s ' , ( int ( context [ ' shop ' ] ) , ) )
2008-09-23 13:24:11 +00:00
res2 = cr . fetchone ( )
if res2 :
context [ ' warehouse ' ] = res2 [ 0 ]
if context . get ( ' warehouse ' , False ) :
2008-12-10 14:29:55 +00:00
cr . execute ( ' select lot_stock_id from stock_warehouse where id= %s ' , ( int ( context [ ' warehouse ' ] ) , ) )
2008-09-23 13:24:11 +00:00
res2 = cr . fetchone ( )
if res2 :
context [ ' location ' ] = res2 [ 0 ]
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 ' ' ) ) :
location_ids = self . pool . get ( ' stock.location ' ) . search ( cr , uid , [ ( ' name ' , ' ilike ' , context [ ' location ' ] ) ] , context = context )
2008-09-25 09:30:39 +00:00
else :
location_ids = context [ ' location ' ]
2008-09-23 13:24:11 +00:00
else :
2009-06-24 06:11:42 +00:00
location_ids = [ ]
wids = self . pool . get ( ' stock.warehouse ' ) . search ( cr , uid , [ ] , context = context )
for w in self . pool . get ( ' stock.warehouse ' ) . browse ( cr , uid , wids , context = context ) :
location_ids . append ( w . lot_stock_id . id )
2008-09-23 13:24:11 +00:00
# build the list of ids of children of the location given by id
2009-01-28 14:29:42 +00:00
if context . get ( ' compute_child ' , True ) :
child_location_ids = self . pool . get ( ' stock.location ' ) . search ( cr , uid , [ ( ' location_id ' , ' child_of ' , location_ids ) ] )
2010-05-25 12:03:36 +00:00
location_ids = child_location_ids or location_ids
2009-01-28 14:29:42 +00:00
else :
2010-05-25 12:03:36 +00:00
location_ids = location_ids
2008-09-23 13:24:11 +00:00
2008-12-18 19:39:18 +00:00
uoms_o = { }
2008-09-23 13:24:11 +00:00
product2uom = { }
for product in self . browse ( cr , uid , ids , context = context ) :
product2uom [ product . id ] = product . uom_id . id
2008-12-18 19:39:18 +00:00
uoms_o [ product . uom_id . id ] = product . uom_id
2008-09-23 13:24:11 +00:00
results = [ ]
results2 = [ ]
2008-09-23 14:24:03 +00:00
2008-09-23 13:24:11 +00:00
from_date = context . get ( ' from_date ' , False )
2008-09-23 14:24:03 +00:00
to_date = context . get ( ' to_date ' , False )
2008-09-23 13:24:11 +00:00
date_str = False
if from_date and to_date :
2008-10-31 14:09:59 +00:00
date_str = " date_planned>= ' %s ' and date_planned<= ' %s ' " % ( from_date , to_date )
2008-09-23 13:24:11 +00:00
elif from_date :
2008-10-31 14:09:59 +00:00
date_str = " date_planned>= ' %s ' " % ( from_date )
2008-09-23 13:24:11 +00:00
elif to_date :
2008-10-31 14:09:59 +00:00
date_str = " date_planned<= ' %s ' " % ( to_date )
2008-09-23 14:24:03 +00:00
2008-09-23 13:24:11 +00:00
if ' in ' in what :
2008-09-23 14:24:03 +00:00
# all moves from a location out of the set to a location in the set
2008-09-23 13:24:11 +00:00
cr . execute (
' select sum(product_qty), product_id, product_uom ' \
' from stock_move ' \
2010-06-16 11:51:39 +00:00
' where location_id NOT IN %s ' \
' and location_dest_id IN %s ' \
' and product_id IN %s ' \
' and state IN %s ' + ( date_str and ' and ' + date_str + ' ' or ' ' ) + ' ' \
' group by product_id,product_uom ' , ( tuple ( location_ids ) , tuple ( location_ids ) , tuple ( ids ) , tuple ( states ) , )
2008-09-23 13:24:11 +00:00
)
results = cr . fetchall ( )
if ' out ' in what :
2008-09-23 14:24:03 +00:00
# all moves from a location in the set to a location out of the set
2008-09-23 13:24:11 +00:00
cr . execute (
' select sum(product_qty), product_id, product_uom ' \
' from stock_move ' \
2010-06-16 11:51:39 +00:00
' where location_id IN %s ' \
' and location_dest_id NOT IN %s ' \
' and product_id IN %s ' \
2009-11-24 09:06:10 +00:00
' and state in %s ' + ( date_str and ' and ' + date_str + ' ' or ' ' ) + ' ' \
2010-06-16 11:51:39 +00:00
' group by product_id,product_uom ' , ( tuple ( location_ids ) , tuple ( location_ids ) , tuple ( ids ) , tuple ( states ) , )
2008-09-23 13:24:11 +00:00
)
results2 = cr . fetchall ( )
uom_obj = self . pool . get ( ' product.uom ' )
2008-12-18 19:39:18 +00:00
uoms = map ( lambda x : x [ 2 ] , results ) + map ( lambda x : x [ 2 ] , results2 )
if context . get ( ' uom ' , False ) :
uoms + = [ context [ ' uom ' ] ]
uoms = filter ( lambda x : x not in uoms_o . keys ( ) , uoms )
if uoms :
uoms = uom_obj . browse ( cr , uid , list ( set ( uoms ) ) , context = context )
for o in uoms :
uoms_o [ o . id ] = o
2008-09-23 13:24:11 +00:00
for amount , prod_id , prod_uom in results :
2008-12-18 19:39:18 +00:00
amount = uom_obj . _compute_qty_obj ( cr , uid , uoms_o [ prod_uom ] , amount ,
uoms_o [ context . get ( ' uom ' , False ) or product2uom [ prod_id ] ] )
2008-09-23 13:24:11 +00:00
res [ prod_id ] + = amount
for amount , prod_id , prod_uom in results2 :
2008-12-18 19:39:18 +00:00
amount = uom_obj . _compute_qty_obj ( cr , uid , uoms_o [ prod_uom ] , amount ,
uoms_o [ context . get ( ' uom ' , False ) or product2uom [ prod_id ] ] )
2008-09-23 14:24:03 +00:00
res [ prod_id ] - = amount
return res
2008-09-23 13:24:11 +00:00
2010-07-06 11:56:32 +00:00
def _product_available ( self , cr , uid , ids , field_names = None , arg = False , context = None ) :
2010-05-26 12:59:30 +00:00
""" Finds the incoming and outgoing quantity of product.
@return : Dictionary of values
"""
2008-10-21 16:28:19 +00:00
if not field_names :
2010-05-26 12:59:30 +00:00
field_names = [ ]
2010-07-06 11:56:32 +00:00
if context is None :
context = { }
2008-10-21 16:28:19 +00:00
res = { }
for id in ids :
res [ id ] = { } . fromkeys ( field_names , 0.0 )
for f in field_names :
c = context . copy ( )
2010-05-26 12:59:30 +00:00
if f == ' qty_available ' :
c . update ( { ' states ' : ( ' done ' , ) , ' what ' : ( ' in ' , ' out ' ) } )
if f == ' virtual_available ' :
c . update ( { ' states ' : ( ' confirmed ' , ' waiting ' , ' assigned ' , ' done ' ) , ' what ' : ( ' in ' , ' out ' ) } )
if f == ' incoming_qty ' :
c . update ( { ' states ' : ( ' confirmed ' , ' waiting ' , ' assigned ' ) , ' what ' : ( ' in ' , ) } )
if f == ' outgoing_qty ' :
c . update ( { ' states ' : ( ' confirmed ' , ' waiting ' , ' assigned ' ) , ' what ' : ( ' out ' , ) } )
stock = self . get_product_available ( cr , uid , ids , context = c )
2008-09-07 23:24:39 +00:00
for id in ids :
2008-10-21 16:28:19 +00:00
res [ id ] [ f ] = stock . get ( id , 0.0 )
return res
2008-09-23 14:24:03 +00:00
2008-09-07 23:24:39 +00:00
_columns = {
2009-12-22 06:45:51 +00:00
' qty_available ' : fields . function ( _product_available , method = True , type = ' float ' , string = ' Real Stock ' , help = " Current quantities of products in selected locations or all internal if none have been selected. " , multi = ' qty_available ' ) ,
2009-12-21 09:50:54 +00:00
' virtual_available ' : fields . function ( _product_available , method = True , type = ' float ' , string = ' Virtual Stock ' , help = " Future stock for this product according to the selected locations or all internal if none have been selected. Computed as: Real Stock - Outgoing + Incoming. " , multi = ' qty_available ' ) ,
2008-10-21 16:28:19 +00:00
' incoming_qty ' : fields . function ( _product_available , method = True , type = ' float ' , string = ' Incoming ' , help = " Quantities of products that are planned to arrive in selected locations or all internal if none have been selected. " , multi = ' qty_available ' ) ,
' outgoing_qty ' : fields . function ( _product_available , method = True , type = ' float ' , string = ' Outgoing ' , help = " Quantities of products that are planned to leave in selected locations or all internal if none have been selected. " , multi = ' qty_available ' ) ,
2009-12-22 06:45:51 +00:00
' track_production ' : fields . boolean ( ' Track Production Lots ' , help = " Forces to use a Production Lot during production order " ) ,
2009-12-21 09:50:54 +00:00
' track_incoming ' : fields . boolean ( ' Track Incoming Lots ' , help = " Forces to use a tracking lot during receptions " ) ,
' track_outgoing ' : fields . boolean ( ' Track Outgoing Lots ' , help = " Forces to use a tracking lot during deliveries " ) ,
2010-06-12 23:01:10 +00:00
' location_id ' : fields . dummy ( string = ' Location ' , relation = ' stock.location ' , type = ' many2one ' ) ,
2010-06-10 12:44:52 +00:00
' valuation ' : fields . selection ( [ ( ' manual_periodic ' , ' Periodic (manual) ' ) ,
( ' real_time ' , ' Real Time (automatized) ' ) , ] , ' Stock Valuation ' , help = " Decide if the system must automatically creates account moves based on stock moves " , required = True ) ,
}
_defaults = {
' valuation ' : lambda * a : ' manual_periodic ' ,
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
2010-07-06 11:56:32 +00:00
product_product ( )
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 = {
' property_stock_procurement ' : fields . property (
' stock.location ' ,
type = ' many2one ' ,
relation = ' stock.location ' ,
2010-04-09 07:14:08 +00:00
string = " Procurement Location " ,
2008-07-22 15:11:28 +00:00
method = True ,
view_load = True ,
2009-10-22 13:40:16 +00:00
domain = [ ( ' usage ' , ' like ' , ' procurement ' ) ] ,
2009-12-23 13:12:47 +00:00
help = " For the current product, 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 (
' stock.location ' ,
type = ' many2one ' ,
relation = ' stock.location ' ,
string = " Production Location " ,
method = True ,
view_load = True ,
2009-10-22 13:40:16 +00:00
domain = [ ( ' usage ' , ' like ' , ' production ' ) ] ,
2009-12-23 13:12:47 +00:00
help = " For the current product, this stock location will be used, instead of the default one, as the source location for stock moves generated by production orders " ) ,
2008-07-22 15:11:28 +00:00
' property_stock_inventory ' : fields . property (
' stock.location ' ,
type = ' many2one ' ,
relation = ' stock.location ' ,
string = " Inventory Location " ,
method = True ,
view_load = True ,
2009-10-22 13:40:16 +00:00
domain = [ ( ' usage ' , ' like ' , ' inventory ' ) ] ,
2009-12-23 13:12:47 +00:00
help = " For the current product, this stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory " ) ,
2008-07-22 15:11:28 +00:00
' property_stock_account_input ' : fields . property ( ' account.account ' ,
type = ' many2one ' , relation = ' account.account ' ,
string = ' Stock Input Account ' , method = True , view_load = True ,
help = ' This account will be used, instead of the default one, to value input stock ' ) ,
' property_stock_account_output ' : fields . property ( ' account.account ' ,
type = ' many2one ' , relation = ' account.account ' ,
string = ' Stock Output Account ' , method = True , view_load = True ,
help = ' This account will be used, instead of the default one, to value output stock ' ) ,
}
2010-07-06 11:56:32 +00:00
2008-09-23 13:24:11 +00:00
product_template ( )
2006-12-07 13:41:40 +00:00
2007-04-25 14:08:50 +00:00
class product_category ( osv . osv ) :
2010-07-06 11:56:32 +00:00
2008-07-22 15:11:28 +00:00
_inherit = ' product.category '
_columns = {
' property_stock_journal ' : fields . property ( ' account.journal ' ,
relation = ' account.journal ' , type = ' many2one ' ,
string = ' Stock journal ' , method = True , view_load = True ,
help = " This journal will be used for the accounting move generated by stock move " ) ,
' property_stock_account_input_categ ' : fields . property ( ' account.account ' ,
type = ' many2one ' , relation = ' account.account ' ,
string = ' Stock Input Account ' , method = True , view_load = True ,
help = ' This account will be used to value the input stock ' ) ,
' property_stock_account_output_categ ' : fields . property ( ' account.account ' ,
type = ' many2one ' , relation = ' account.account ' ,
string = ' Stock Output Account ' , method = True , view_load = True ,
help = ' This account will be used to value the output stock ' ) ,
2010-07-06 11:56:32 +00:00
' property_stock_variation ' : fields . property ( ' account.account ' ,
2010-06-10 12:44:52 +00:00
type = ' many2one ' ,
relation = ' account.account ' ,
2010-07-01 13:40:10 +00:00
string = " Stock Variation Account " ,
2010-07-06 11:56:32 +00:00
method = True , view_load = True ,
2010-06-10 12:44:52 +00:00
help = " This account will be used in product when valuation type is real-time valuation " , ) ,
2008-07-22 15:11:28 +00:00
}
2008-07-23 14:41:47 +00:00
2010-07-06 11:56:32 +00:00
product_category ( )
2008-07-23 14:41:47 +00:00
2010-07-06 11:56:32 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: