2006-12-07 13:41:40 +00:00
# -*- encoding: utf-8 -*-
##############################################################################
#
2008-11-03 19:18:56 +00:00
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# $Id$
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
# it under the terms of the GNU 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
# GNU General Public License for more details.
2006-12-07 13:41:40 +00:00
#
2008-11-03 19:18:56 +00:00
# You should have received a copy of the GNU General Public License
# 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 _
2007-10-19 12:15:38 +00:00
2008-09-07 23:24:39 +00:00
class product_product ( osv . osv ) :
_inherit = " product.product "
2008-09-24 08:46:41 +00:00
def view_header_get ( self , cr , user , view_id , view_type , 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
if ( context . get ( ' location ' , False ) ) :
2008-09-24 08:46:41 +00:00
return _ ( ' Products: ' ) + self . pool . get ( ' stock.location ' ) . browse ( cr , user , context [ ' location ' ] , context ) . name
2008-09-23 14:24:03 +00:00
return res
2008-09-25 09:30:39 +00:00
def get_product_available ( self , cr , uid , ids , context = None ) :
if not context :
2008-10-31 14:09:59 +00:00
context = { }
2008-09-23 13:24:11 +00:00
states = context . get ( ' states ' , [ ] )
what = context . get ( ' what ' , ( ) )
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 ' ] ]
else :
location_ids = context [ ' location ' ]
2008-09-23 13:24:11 +00:00
else :
cr . execute ( " select lot_stock_id from stock_warehouse " )
2008-10-31 14:09:59 +00:00
location_ids = [ id for ( id , ) in cr . fetchall ( ) ]
2008-09-23 13:24:11 +00:00
# build the list of ids of children of the location given by id
2008-10-10 14:56:59 +00:00
child_location_ids = self . pool . get ( ' stock.location ' ) . search ( cr , uid , [ ( ' location_id ' , ' child_of ' , location_ids ) ] )
location_ids = len ( child_location_ids ) and child_location_ids or location_ids
2008-09-23 13:24:11 +00:00
2008-09-23 14:24:03 +00:00
states_str = ' , ' . join ( map ( lambda s : " ' %s ' " % s , states ) )
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
prod_ids_str = ' , ' . join ( map ( str , ids ) )
location_ids_str = ' , ' . join ( map ( str , location_ids ) )
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 ' \
' where location_id not in ( ' + location_ids_str + ' ) ' \
' and location_dest_id in ( ' + location_ids_str + ' ) ' \
' and product_id in ( ' + prod_ids_str + ' ) ' \
' and state in ( ' + states_str + ' ) ' + ( date_str and ' and ' + date_str + ' ' or ' ' ) + ' ' \
' group by product_id,product_uom '
)
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 ' \
' where location_id in ( ' + location_ids_str + ' ) ' \
' and location_dest_id not in ( ' + location_ids_str + ' ) ' \
' and product_id in ( ' + prod_ids_str + ' ) ' \
' and state in ( ' + states_str + ' ) ' + ( date_str and ' and ' + date_str + ' ' or ' ' ) + ' ' \
' group by product_id,product_uom '
)
results2 = cr . fetchall ( )
uom_obj = self . pool . get ( ' product.uom ' )
for amount , prod_id , prod_uom in results :
amount = uom_obj . _compute_qty ( cr , uid , prod_uom , amount ,
context . get ( ' uom ' , False ) or product2uom [ prod_id ] )
res [ prod_id ] + = amount
for amount , prod_id , prod_uom in results2 :
amount = uom_obj . _compute_qty ( cr , uid , prod_uom , amount ,
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
2008-10-21 16:28:19 +00:00
def _product_available ( self , cr , uid , ids , field_names = None , arg = False , context = { } ) :
if not field_names :
field_names = [ ]
res = { }
for id in ids :
res [ id ] = { } . fromkeys ( field_names , 0.0 )
for f in field_names :
c = context . copy ( )
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 = {
2008-10-21 16:28:19 +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 ' ) ,
' virtual_available ' : fields . function ( _product_available , method = True , type = ' float ' , string = ' Virtual Stock ' , help = " Futur stock for this product according to the selected location or all internal if none have been selected. Computed as: Real Stock - Outgoing + Incoming. " , multi = ' qty_available ' ) ,
' 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 ' ) ,
2008-09-20 19:06:25 +00:00
' track_production ' : fields . boolean ( ' Track Production Lots ' , help = " Force to use a Production Lot during production order " ) ,
' track_incoming ' : fields . boolean ( ' Track Incomming Lots ' , help = " Force to use a Production Lot during receptions " ) ,
' track_outgoing ' : fields . boolean ( ' Track Outging Lots ' , help = " Force to use a Production Lot during deliveries " ) ,
2008-09-07 23:24:39 +00:00
}
2008-09-24 08:46:41 +00:00
def fields_view_get ( self , cr , uid , view_id = None , view_type = ' form ' , context = None , toolbar = False ) :
2008-09-23 13:24:11 +00:00
res = super ( product_product , self ) . fields_view_get ( cr , uid , view_id , view_type , context , toolbar )
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 ' ) :
2008-12-08 17:08:40 +00:00
res [ ' fields ' ] [ ' virtual_available ' ] [ ' string ' ] = _ ( ' Futur 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 ' ) :
2008-12-08 17:08:40 +00:00
res [ ' fields ' ] [ ' virtual_available ' ] [ ' string ' ] = _ ( ' Futur 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 ' ) :
2008-12-08 17:08:40 +00:00
res [ ' fields ' ] [ ' virtual_available ' ] [ ' string ' ] = _ ( ' Futur 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 ' ) :
2008-12-08 17:08:40 +00:00
res [ ' fields ' ] [ ' virtual_available ' ] [ ' string ' ] = _ ( ' Futur P&L ' )
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 ' ) :
2008-12-08 17:08:40 +00:00
res [ ' fields ' ] [ ' virtual_available ' ] [ ' string ' ] = _ ( ' Futur 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 ' ) :
2008-12-08 17:08:40 +00:00
res [ ' fields ' ] [ ' virtual_available ' ] [ ' string ' ] = _ ( ' Futur 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 14:24:03 +00:00
2008-09-23 13:24:11 +00:00
return res
2008-09-07 23:24:39 +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 ' ,
string = " Procurement Location " ,
method = True ,
view_load = True ,
help = " For the current product (template), this stock location will be used, instead of the default one, as the source location for stock moves generated by procurements " ) ,
' property_stock_production ' : fields . property (
' stock.location ' ,
type = ' many2one ' ,
relation = ' stock.location ' ,
string = " Production Location " ,
method = True ,
view_load = True ,
help = " For the current product (template), this stock location will be used, instead of the default one, as the source location for stock moves generated by production orders " ) ,
' property_stock_inventory ' : fields . property (
' stock.location ' ,
type = ' many2one ' ,
relation = ' stock.location ' ,
string = " Inventory Location " ,
method = True ,
view_load = True ,
help = " For the current product (template), this stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory " ) ,
' 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 ' ) ,
}
2007-10-19 12:15:38 +00:00
2008-09-23 13:24:11 +00:00
product_template ( )
2006-12-07 13:41:40 +00:00
2007-10-19 12:15:38 +00:00
2007-04-25 14:08:50 +00:00
class product_category ( osv . osv ) :
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 ' ) ,
}
2007-10-19 12:15:38 +00:00
2007-04-25 14:08:50 +00:00
product_category ( )
2008-07-23 14:41:47 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: