2009-10-13 05:58:37 +00:00
# -*- coding: utf-8 -*-
2006-12-07 13:41:40 +00:00
##############################################################################
2009-11-24 12:09:06 +00:00
#
2009-10-14 11:15:34 +00:00
# OpenERP, Open Source Management Solution
2010-01-12 09:18:39 +00:00
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
2008-06-16 11:00:21 +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
2009-11-24 12:09:06 +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
import time
2006-12-07 13:41:40 +00:00
from _common import rounding
2012-12-06 14:56:32 +00:00
from openerp . osv import fields , osv
from openerp . tools . translate import _
import openerp . addons . decimal_precision as dp
2010-03-06 20:52:19 +00:00
2006-12-07 13:41:40 +00:00
class price_type ( osv . osv ) :
2008-07-22 15:11:28 +00:00
"""
The price type is used to points which field in the product form
is a price and in which currency is this price expressed .
When a field is a price , you can use it in pricelists to base
sale and purchase prices based on some fields of the product .
"""
2010-11-19 13:48:01 +00:00
def _price_field_get ( self , cr , uid , context = None ) :
2008-12-13 06:05:19 +00:00
mf = self . pool . get ( ' ir.model.fields ' )
ids = mf . search ( cr , uid , [ ( ' model ' , ' in ' , ( ( ' product.product ' ) , ( ' product.template ' ) ) ) , ( ' ttype ' , ' = ' , ' float ' ) ] , context = context )
2008-12-08 17:08:40 +00:00
res = [ ]
2008-12-13 06:05:19 +00:00
for field in mf . browse ( cr , uid , ids , context = context ) :
res . append ( ( field . name , field . field_description ) )
2008-12-08 17:08:40 +00:00
return res
2008-07-22 15:11:28 +00:00
def _get_currency ( self , cr , uid , ctx ) :
comp = self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid ) . company_id
if not comp :
comp_id = self . pool . get ( ' res.company ' ) . search ( cr , uid , [ ] ) [ 0 ]
comp = self . pool . get ( ' res.company ' ) . browse ( cr , uid , comp_id )
return comp . currency_id . id
2007-10-23 19:02:01 +00:00
2008-07-22 15:11:28 +00:00
_name = " product.price.type "
2010-05-19 18:32:32 +00:00
_description = " Price Type "
2008-07-22 15:11:28 +00:00
_columns = {
2008-09-22 06:06:56 +00:00
" name " : fields . char ( " Price Name " , size = 32 , required = True , translate = True , help = " Name of this kind of price. " ) ,
2008-07-22 15:11:28 +00:00
" active " : fields . boolean ( " Active " ) ,
2009-01-06 11:17:44 +00:00
" field " : fields . selection ( _price_field_get , " Product Field " , size = 32 , required = True , help = " Associated field in the product form. " ) ,
2008-09-22 06:06:56 +00:00
" currency_id " : fields . many2one ( ' res.currency ' , " Currency " , required = True , help = " The currency the field is expressed in. " ) ,
2008-07-22 15:11:28 +00:00
}
_defaults = {
" active " : lambda * args : True ,
" currency_id " : _get_currency
}
2010-08-13 12:20:05 +00:00
2006-12-07 13:41:40 +00:00
#----------------------------------------------------------
# Price lists
#----------------------------------------------------------
class product_pricelist_type ( osv . osv ) :
2008-07-22 15:11:28 +00:00
_name = " product.pricelist.type "
_description = " Pricelist Type "
_columns = {
2009-01-22 23:04:36 +00:00
' name ' : fields . char ( ' Name ' , size = 64 , required = True , translate = True ) ,
2008-09-22 05:56:30 +00:00
' key ' : fields . char ( ' Key ' , size = 64 , required = True , help = " Used in the code to select specific prices based on the context. Keep unchanged. " ) ,
2008-07-22 15:11:28 +00:00
}
2006-12-07 13:41:40 +00:00
class product_pricelist ( osv . osv ) :
2010-11-19 13:48:01 +00:00
def _pricelist_type_get ( self , cr , uid , context = None ) :
2009-10-01 11:32:20 +00:00
pricelist_type_obj = self . pool . get ( ' product.pricelist.type ' )
pricelist_type_ids = pricelist_type_obj . search ( cr , uid , [ ] , order = ' name ' )
pricelist_types = pricelist_type_obj . read ( cr , uid , pricelist_type_ids , [ ' key ' , ' name ' ] , context = context )
2009-11-24 12:09:06 +00:00
2009-10-01 11:32:20 +00:00
res = [ ]
2009-11-24 12:09:06 +00:00
2009-10-01 11:32:20 +00:00
for type in pricelist_types :
res . append ( ( type [ ' key ' ] , type [ ' name ' ] ) )
2009-11-24 12:09:06 +00:00
2009-10-01 11:32:20 +00:00
return res
2010-08-13 12:20:05 +00:00
2008-07-22 15:11:28 +00:00
_name = " product.pricelist "
_description = " Pricelist "
_columns = {
2008-09-22 05:56:30 +00:00
' name ' : fields . char ( ' Pricelist Name ' , size = 64 , required = True , translate = True ) ,
2012-10-23 13:02:42 +00:00
' active ' : fields . boolean ( ' Active ' , help = " If unchecked, it will allow you to hide the pricelist without removing it. " ) ,
2008-07-22 15:11:28 +00:00
' type ' : fields . selection ( _pricelist_type_get , ' Pricelist Type ' , required = True ) ,
' version_id ' : fields . one2many ( ' product.pricelist.version ' , ' pricelist_id ' , ' Pricelist Versions ' ) ,
' currency_id ' : fields . many2one ( ' res.currency ' , ' Currency ' , required = True ) ,
2009-12-02 11:20:06 +00:00
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' ) ,
2008-07-22 15:11:28 +00:00
}
2009-11-24 12:09:06 +00:00
2010-11-19 13:48:01 +00:00
def name_get ( self , cr , uid , ids , context = None ) :
2008-12-26 06:50:18 +00:00
result = [ ]
2009-03-09 13:35:04 +00:00
if not all ( ids ) :
return result
2010-11-19 13:48:01 +00:00
for pl in self . browse ( cr , uid , ids , context = context ) :
2008-12-29 16:33:26 +00:00
name = pl . name + ' ( ' + pl . currency_id . name + ' ) '
2008-12-26 06:50:18 +00:00
result . append ( ( pl . id , name ) )
2008-12-24 15:50:06 +00:00
return result
2009-11-24 12:09:06 +00:00
2008-12-24 15:50:06 +00:00
2008-07-22 15:11:28 +00:00
def _get_currency ( self , cr , uid , ctx ) :
2008-12-29 14:55:49 +00:00
comp = self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid ) . company_id
2008-07-22 15:11:28 +00:00
if not comp :
comp_id = self . pool . get ( ' res.company ' ) . search ( cr , uid , [ ] ) [ 0 ]
comp = self . pool . get ( ' res.company ' ) . browse ( cr , uid , comp_id )
return comp . currency_id . id
2007-10-23 19:02:01 +00:00
2008-07-22 15:11:28 +00:00
_defaults = {
' active ' : lambda * a : 1 ,
" currency_id " : _get_currency
}
2006-12-07 13:41:40 +00:00
2010-09-29 09:57:42 +00:00
#def price_get_multi(self, cr, uid, product_ids, context=None):
def price_get_multi ( self , cr , uid , pricelist_ids , products_by_qty_by_partner , context = None ) :
""" multi products ' price_get ' .
2010-10-28 11:36:41 +00:00
@param pricelist_ids :
@param products_by_qty :
@param partner :
2010-09-29 09:57:42 +00:00
@param context : {
' date ' : Date of the pricelist ( % Y - % m - % d ) , }
@return : a dict of dict with product_id as key and a dict ' price by pricelist ' as value
"""
def _create_parent_category_list ( id , lst ) :
if not id :
return [ ]
parent = product_category_tree . get ( id )
if parent :
lst . append ( parent )
return _create_parent_category_list ( parent , lst )
else :
return lst
# _create_parent_category_list
if context is None :
context = { }
date = time . strftime ( ' % Y- % m- %d ' )
if ' date ' in context :
date = context [ ' date ' ]
currency_obj = self . pool . get ( ' res.currency ' )
product_obj = self . pool . get ( ' product.product ' )
product_category_obj = self . pool . get ( ' product.category ' )
product_uom_obj = self . pool . get ( ' product.uom ' )
supplierinfo_obj = self . pool . get ( ' product.supplierinfo ' )
price_type_obj = self . pool . get ( ' product.price.type ' )
# product.pricelist.version:
2011-09-13 06:01:50 +00:00
if not pricelist_ids :
pricelist_ids = self . pool . get ( ' product.pricelist ' ) . search ( cr , uid , [ ] , context = context )
pricelist_version_ids = self . pool . get ( ' product.pricelist.version ' ) . search ( cr , uid , [
( ' pricelist_id ' , ' in ' , pricelist_ids ) ,
' | ' ,
( ' date_start ' , ' = ' , False ) ,
( ' date_start ' , ' <= ' , date ) ,
' | ' ,
( ' date_end ' , ' = ' , False ) ,
( ' date_end ' , ' >= ' , date ) ,
] )
if len ( pricelist_ids ) != len ( pricelist_version_ids ) :
2012-08-07 11:34:14 +00:00
raise osv . except_osv ( _ ( ' Warning! ' ) , _ ( " At least one pricelist has no active version ! \n Please create or activate one. " ) )
2010-09-29 09:57:42 +00:00
# product.product:
product_ids = [ i [ 0 ] for i in products_by_qty_by_partner ]
#products = dict([(item['id'], item) for item in product_obj.read(cr, uid, product_ids, ['categ_id', 'product_tmpl_id', 'uos_id', 'uom_id'])])
products = product_obj . browse ( cr , uid , product_ids , context = context )
products_dict = dict ( [ ( item . id , item ) for item in products ] )
# product.category:
product_category_ids = product_category_obj . search ( cr , uid , [ ] )
product_categories = product_category_obj . read ( cr , uid , product_category_ids , [ ' parent_id ' ] )
product_category_tree = dict ( [ ( item [ ' id ' ] , item [ ' parent_id ' ] [ 0 ] ) for item in product_categories if item [ ' parent_id ' ] ] )
results = { }
for product_id , qty , partner in products_by_qty_by_partner :
2011-09-13 06:01:50 +00:00
for pricelist_id in pricelist_ids :
2010-09-29 09:57:42 +00:00
price = False
tmpl_id = products_dict [ product_id ] . product_tmpl_id and products_dict [ product_id ] . product_tmpl_id . id or False
categ_id = products_dict [ product_id ] . categ_id and products_dict [ product_id ] . categ_id . id or False
categ_ids = _create_parent_category_list ( categ_id , [ categ_id ] )
if categ_ids :
categ_where = ' (categ_id IN ( ' + ' , ' . join ( map ( str , categ_ids ) ) + ' )) '
else :
categ_where = ' (categ_id IS NULL) '
2011-09-28 15:34:34 +00:00
if partner :
partner_where = ' base <> -2 OR %s IN (SELECT name FROM product_supplierinfo WHERE product_id = %s ) '
2012-05-14 07:09:10 +00:00
partner_args = ( partner , tmpl_id )
2011-09-28 15:34:34 +00:00
else :
partner_where = ' base <> -2 '
partner_args = ( )
2010-09-29 09:57:42 +00:00
cr . execute (
' SELECT i.*, pl.currency_id '
' FROM product_pricelist_item AS i, '
' product_pricelist_version AS v, product_pricelist AS pl '
' WHERE (product_tmpl_id IS NULL OR product_tmpl_id = %s ) '
' AND (product_id IS NULL OR product_id = %s ) '
' AND ( ' + categ_where + ' OR (categ_id IS NULL)) '
2011-09-28 15:34:34 +00:00
' AND ( ' + partner_where + ' ) '
2010-09-29 09:57:42 +00:00
' AND price_version_id = %s '
' AND (min_quantity IS NULL OR min_quantity <= %s ) '
' AND i.price_version_id = v.id AND v.pricelist_id = pl.id '
' ORDER BY sequence ' ,
2011-11-16 11:40:39 +00:00
( tmpl_id , product_id ) + partner_args + ( pricelist_version_ids [ 0 ] , qty ) )
2010-09-29 09:57:42 +00:00
res1 = cr . dictfetchall ( )
2010-12-21 12:56:38 +00:00
uom_price_already_computed = False
2010-09-29 09:57:42 +00:00
for res in res1 :
if res :
if res [ ' base ' ] == - 1 :
if not res [ ' base_pricelist_id ' ] :
price = 0.0
else :
price_tmp = self . price_get ( cr , uid ,
2010-10-04 08:18:03 +00:00
[ res [ ' base_pricelist_id ' ] ] , product_id ,
2010-11-22 13:04:04 +00:00
qty , context = context ) [ res [ ' base_pricelist_id ' ] ]
2010-09-29 09:57:42 +00:00
ptype_src = self . browse ( cr , uid , res [ ' base_pricelist_id ' ] ) . currency_id . id
2011-03-31 11:22:06 +00:00
uom_price_already_computed = True
2013-03-15 14:24:03 +00:00
price = currency_obj . compute ( cr , uid ,
ptype_src , res [ ' currency_id ' ] ,
price_tmp , round = False ,
context = context )
2010-09-29 09:57:42 +00:00
elif res [ ' base ' ] == - 2 :
# this section could be improved by moving the queries outside the loop:
where = [ ]
if partner :
where = [ ( ' name ' , ' = ' , partner ) ]
sinfo = supplierinfo_obj . search ( cr , uid ,
[ ( ' product_id ' , ' = ' , tmpl_id ) ] + where )
price = 0.0
if sinfo :
2010-12-21 12:56:38 +00:00
qty_in_product_uom = qty
2012-07-09 16:21:24 +00:00
product_default_uom = product_obj . read ( cr , uid , [ product_id ] , [ ' uom_id ' ] ) [ 0 ] [ ' uom_id ' ] [ 0 ]
2011-03-09 14:52:01 +00:00
supplier = supplierinfo_obj . browse ( cr , uid , sinfo , context = context ) [ 0 ]
seller_uom = supplier . product_uom and supplier . product_uom . id or False
2010-12-21 12:56:38 +00:00
if seller_uom and product_default_uom and product_default_uom != seller_uom :
uom_price_already_computed = True
qty_in_product_uom = product_uom_obj . _compute_qty ( cr , uid , product_default_uom , qty , to_uom_id = seller_uom )
2010-09-29 09:57:42 +00:00
cr . execute ( ' SELECT * ' \
' FROM pricelist_partnerinfo ' \
' WHERE suppinfo_id IN %s ' \
' AND min_quantity <= %s ' \
2010-12-21 12:56:38 +00:00
' ORDER BY min_quantity DESC LIMIT 1 ' , ( tuple ( sinfo ) , qty_in_product_uom , ) )
2010-09-29 09:57:42 +00:00
res2 = cr . dictfetchone ( )
if res2 :
price = res2 [ ' price ' ]
else :
price_type = price_type_obj . browse ( cr , uid , int ( res [ ' base ' ] ) )
2011-03-07 12:50:08 +00:00
uom_price_already_computed = True
2010-09-29 09:57:42 +00:00
price = currency_obj . compute ( cr , uid ,
price_type . currency_id . id , res [ ' currency_id ' ] ,
product_obj . price_get ( cr , uid , [ product_id ] ,
2011-05-02 18:46:43 +00:00
price_type . field , context = context ) [ product_id ] , round = False , context = context )
2010-09-29 09:57:42 +00:00
2011-04-08 14:01:30 +00:00
if price is not False :
2010-09-29 09:57:42 +00:00
price_limit = price
price = price * ( 1.0 + ( res [ ' price_discount ' ] or 0.0 ) )
2012-01-05 12:22:19 +00:00
price = rounding ( price , res [ ' price_round ' ] ) #TOFIX: rounding with tools.float_rouding
2010-09-29 09:57:42 +00:00
price + = ( res [ ' price_surcharge ' ] or 0.0 )
if res [ ' price_min_margin ' ] :
price = max ( price , price_limit + res [ ' price_min_margin ' ] )
if res [ ' price_max_margin ' ] :
price = min ( price , price_limit + res [ ' price_max_margin ' ] )
break
else :
# False means no valid line found ! But we may not raise an
# exception here because it breaks the search
price = False
if price :
2011-03-14 13:11:51 +00:00
results [ ' item_id ' ] = res [ ' id ' ]
2010-12-21 12:56:38 +00:00
if ' uom ' in context and not uom_price_already_computed :
2010-09-29 09:57:42 +00:00
product = products_dict [ product_id ]
uom = product . uos_id or product . uom_id
2011-09-13 12:21:52 +00:00
price = product_uom_obj . _compute_price ( cr , uid , uom . id , price , context [ ' uom ' ] )
2010-09-29 09:57:42 +00:00
if results . get ( product_id ) :
results [ product_id ] [ pricelist_id ] = price
else :
results [ product_id ] = { pricelist_id : price }
2010-09-27 14:21:50 +00:00
return results
2008-07-22 15:11:28 +00:00
def price_get ( self , cr , uid , ids , prod_id , qty , partner = None , context = None ) :
2010-09-29 09:57:42 +00:00
res_multi = self . price_get_multi ( cr , uid , pricelist_ids = ids , products_by_qty_by_partner = [ ( prod_id , qty , partner ) ] , context = context )
res = res_multi [ prod_id ]
2011-03-15 08:50:08 +00:00
res . update ( { ' item_id ' : { ids [ - 1 ] : res_multi . get ( ' item_id ' , ids [ - 1 ] ) } } )
2010-09-29 09:57:42 +00:00
return res
2006-12-07 13:41:40 +00:00
2007-10-10 05:44:59 +00:00
2006-12-07 13:41:40 +00:00
class product_pricelist_version ( osv . osv ) :
2008-07-22 15:11:28 +00:00
_name = " product.pricelist.version "
_description = " Pricelist Version "
_columns = {
' pricelist_id ' : fields . many2one ( ' product.pricelist ' , ' Price List ' ,
2010-02-04 07:12:40 +00:00
required = True , select = True , ondelete = ' cascade ' ) ,
2009-01-22 23:04:36 +00:00
' name ' : fields . char ( ' Name ' , size = 64 , required = True , translate = True ) ,
2009-03-15 17:52:31 +00:00
' active ' : fields . boolean ( ' Active ' ,
help = " When a version is duplicated it is set to non active, so that the " \
" dates do not overlaps with original version. You should change the dates " \
" and reactivate the pricelist " ) ,
2008-07-22 15:11:28 +00:00
' items_id ' : fields . one2many ( ' product.pricelist.item ' ,
' price_version_id ' , ' Price List Items ' , required = True ) ,
2012-10-23 13:02:42 +00:00
' date_start ' : fields . date ( ' Start Date ' , help = " First valid date for the version. " ) ,
' date_end ' : fields . date ( ' End Date ' , help = " Last valid date for the version. " ) ,
2009-12-23 14:11:38 +00:00
' company_id ' : fields . related ( ' pricelist_id ' , ' company_id ' , type = ' many2one ' ,
readonly = True , relation = ' res.company ' , string = ' Company ' , store = True )
2008-07-22 15:11:28 +00:00
}
_defaults = {
' active ' : lambda * a : 1 ,
}
2007-10-10 05:44:59 +00:00
2009-03-15 17:52:31 +00:00
# We desactivate duplicated pricelists, so that dates do not overlap
2010-11-23 11:31:52 +00:00
def copy ( self , cr , uid , id , default = None , context = None ) :
2009-03-15 17:52:31 +00:00
if not default : default = { }
default [ ' active ' ] = False
return super ( product_pricelist_version , self ) . copy ( cr , uid , id , default , context )
2010-11-19 13:48:01 +00:00
def _check_date ( self , cursor , user , ids , context = None ) :
for pricelist_version in self . browse ( cursor , user , ids , context = context ) :
2008-07-22 15:11:28 +00:00
if not pricelist_version . active :
continue
2009-03-15 17:52:31 +00:00
where = [ ]
if pricelist_version . date_start :
where . append ( " ((date_end>= ' %s ' ) or (date_end is null)) " % ( pricelist_version . date_start , ) )
if pricelist_version . date_end :
where . append ( " ((date_start<= ' %s ' ) or (date_start is null)) " % ( pricelist_version . date_end , ) )
2009-04-09 10:02:19 +00:00
2008-07-22 15:11:28 +00:00
cursor . execute ( ' SELECT id ' \
' FROM product_pricelist_version ' \
2009-03-15 17:52:31 +00:00
' WHERE ' + ' and ' . join ( where ) + ( where and ' and ' or ' ' ) +
' pricelist_id = %s ' \
2008-07-22 15:11:28 +00:00
' AND active ' \
2009-03-15 17:52:31 +00:00
' AND id <> %s ' , (
2008-07-22 15:11:28 +00:00
pricelist_version . pricelist_id . id ,
pricelist_version . id ) )
if cursor . fetchall ( ) :
return False
return True
2007-10-10 05:44:59 +00:00
2008-07-22 15:11:28 +00:00
_constraints = [
2009-04-09 10:02:19 +00:00
( _check_date , ' You cannot have 2 pricelist versions that overlap! ' ,
2008-07-22 15:11:28 +00:00
[ ' date_start ' , ' date_end ' ] )
]
2007-10-10 05:44:59 +00:00
2006-12-07 13:41:40 +00:00
class product_pricelist_item ( osv . osv ) :
2010-11-19 13:48:01 +00:00
def _price_field_get ( self , cr , uid , context = None ) :
2008-12-13 06:05:19 +00:00
pt = self . pool . get ( ' product.price.type ' )
ids = pt . search ( cr , uid , [ ] , context = context )
2008-12-08 17:08:40 +00:00
result = [ ]
2008-12-13 06:05:19 +00:00
for line in pt . browse ( cr , uid , ids , context = context ) :
result . append ( ( line . id , line . name ) )
2008-12-08 17:08:40 +00:00
result . append ( ( - 1 , _ ( ' Other Pricelist ' ) ) )
2013-03-21 14:34:59 +00:00
result . append ( ( - 2 , _ ( ' Supplier Prices on the product form ' ) ) )
2008-07-22 15:11:28 +00:00
return result
2006-12-07 13:41:40 +00:00
2008-07-22 15:11:28 +00:00
_name = " product.pricelist.item "
_description = " Pricelist item "
_order = " sequence, min_quantity desc "
_defaults = {
' base ' : lambda * a : - 1 ,
' min_quantity ' : lambda * a : 0 ,
' sequence ' : lambda * a : 5 ,
' price_discount ' : lambda * a : 0 ,
}
2009-11-24 12:09:06 +00:00
2010-11-19 13:48:01 +00:00
def _check_recursion ( self , cr , uid , ids , context = None ) :
for obj_list in self . browse ( cr , uid , ids , context = context ) :
2009-11-04 09:56:30 +00:00
if obj_list . base == - 1 :
main_pricelist = obj_list . price_version_id . pricelist_id . id
other_pricelist = obj_list . base_pricelist_id . id
if main_pricelist == other_pricelist :
2009-11-24 12:09:06 +00:00
return False
2009-11-04 09:56:30 +00:00
return True
2009-11-24 12:09:06 +00:00
2012-09-25 11:48:22 +00:00
def _check_margin ( self , cr , uid , ids , context = None ) :
for item in self . browse ( cr , uid , ids , context = context ) :
2012-09-26 08:22:50 +00:00
if item . price_max_margin and item . price_min_margin and ( item . price_min_margin > item . price_max_margin ) :
return False
2012-09-25 11:48:22 +00:00
return True
2008-07-22 15:11:28 +00:00
_columns = {
2008-09-22 05:56:30 +00:00
' name ' : fields . char ( ' Rule Name ' , size = 64 , help = " Explicit rule name for this pricelist line. " ) ,
2010-02-04 07:12:40 +00:00
' price_version_id ' : fields . many2one ( ' product.pricelist.version ' , ' Price List Version ' , required = True , select = True , ondelete = ' cascade ' ) ,
2012-10-23 13:02:42 +00:00
' product_tmpl_id ' : fields . many2one ( ' product.template ' , ' Product Template ' , ondelete = ' cascade ' , help = " Specify a template if this rule only applies to one product template. Keep empty otherwise. " ) ,
' product_id ' : fields . many2one ( ' product.product ' , ' Product ' , ondelete = ' cascade ' , help = " Specify a product if this rule only applies to one product. Keep empty otherwise. " ) ,
' categ_id ' : fields . many2one ( ' product.category ' , ' Product Category ' , ondelete = ' cascade ' , help = " Specify a product category if this rule only applies to products belonging to this category or its children categories. Keep empty otherwise. " ) ,
2006-12-07 13:41:40 +00:00
2012-10-23 13:02:42 +00:00
' min_quantity ' : fields . integer ( ' Min. Quantity ' , required = True , help = " Specify the minimum quantity that needs to be bought/sold for the rule to apply. " ) ,
2010-12-21 11:29:25 +00:00
' sequence ' : fields . integer ( ' Sequence ' , required = True , help = " Gives the order in which the pricelist items will be checked. The evaluation gives highest priority to lowest sequence and stops as soon as a matching item is found. " ) ,
2012-10-23 13:02:42 +00:00
' base ' : fields . selection ( _price_field_get , ' Based on ' , required = True , size = - 1 , help = " Base price for computation. " ) ,
2012-10-09 06:38:14 +00:00
' base_pricelist_id ' : fields . many2one ( ' product.pricelist ' , ' Other Pricelist ' ) ,
2006-12-07 13:41:40 +00:00
2008-07-22 15:11:28 +00:00
' price_surcharge ' : fields . float ( ' Price Surcharge ' ,
2012-09-25 10:18:50 +00:00
digits_compute = dp . get_precision ( ' Product Price ' ) , help = ' Specify the fixed amount to add or substract(if negative) to the amount calculated with the discount. ' ) ,
2008-07-22 15:11:28 +00:00
' price_discount ' : fields . float ( ' Price Discount ' , digits = ( 16 , 4 ) ) ,
' price_round ' : fields . float ( ' Price Rounding ' ,
2012-07-11 13:06:15 +00:00
digits_compute = dp . get_precision ( ' Product Price ' ) ,
2008-09-22 05:56:30 +00:00
help = " Sets the price so that it is a multiple of this value. \n " \
" Rounding is applied after the discount and before the surcharge. \n " \
2009-01-27 11:15:46 +00:00
" To have prices that end in 9.99, set rounding 10, surcharge -0.01 " \
2008-09-22 05:56:30 +00:00
) ,
2009-01-27 11:15:46 +00:00
' price_min_margin ' : fields . float ( ' Min. Price Margin ' ,
2012-09-19 11:05:40 +00:00
digits_compute = dp . get_precision ( ' Product Price ' ) , help = ' Specify the minimum amount of margin over the base price. ' ) ,
2009-01-27 11:15:46 +00:00
' price_max_margin ' : fields . float ( ' Max. Price Margin ' ,
2012-09-19 11:05:40 +00:00
digits_compute = dp . get_precision ( ' Product Price ' ) , help = ' Specify the maximum amount of margin over the base price. ' ) ,
2009-12-23 14:11:38 +00:00
' company_id ' : fields . related ( ' price_version_id ' , ' company_id ' , type = ' many2one ' ,
readonly = True , relation = ' res.company ' , string = ' Company ' , store = True )
2008-07-22 15:11:28 +00:00
}
2009-11-24 12:09:06 +00:00
2009-11-04 09:56:30 +00:00
_constraints = [
2012-09-26 08:22:50 +00:00
( _check_recursion , ' Error! You cannot assign the Main Pricelist as Other Pricelist in PriceList Item! ' , [ ' base_pricelist_id ' ] ) ,
( _check_margin , ' Error! The minimum margin should be lower than the maximum margin. ' , [ ' price_min_margin ' , ' price_max_margin ' ] )
2009-11-04 09:56:30 +00:00
]
2009-11-24 12:09:06 +00:00
2010-11-19 13:48:01 +00:00
def product_id_change ( self , cr , uid , ids , product_id , context = None ) :
2008-07-22 15:11:28 +00:00
if not product_id :
return { }
prod = self . pool . get ( ' product.product ' ) . read ( cr , uid , [ product_id ] , [ ' code ' , ' name ' ] )
if prod [ 0 ] [ ' code ' ] :
return { ' value ' : { ' name ' : prod [ 0 ] [ ' code ' ] } }
return { }
2006-12-07 13:41:40 +00:00
2008-07-23 14:41:47 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: