[IMP] Return of products average, cost method company dependent, quantity fields company dependent

bzr revid: jco@openerp.com-20130419101701-mc61w0q5hvwq596w
This commit is contained in:
Josse Colpaert 2013-04-19 12:17:01 +02:00
parent e17325325f
commit 2509bb8708
3 changed files with 43 additions and 4 deletions

View File

@ -303,12 +303,12 @@ class product_template(osv.osv):
'standard_price': fields.property('', type = 'float', view_load=True,
help="Cost price of the product used for standard stock valuation in accounting and used as a base price on purchase orders.",
groups="base.group_user", string="Cost"),
#fields.float('Cost', digits_compute=dp.get_precision('Product Price'), help="Cost price of the product used for standard stock valuation in accounting and used as a base price on purchase orders.", groups="base.group_user"),
'volume': fields.float('Volume', help="The volume in m3."),
'weight': fields.float('Gross Weight', digits_compute=dp.get_precision('Stock Weight'), help="The gross weight in Kg."),
'weight_net': fields.float('Net Weight', digits_compute=dp.get_precision('Stock Weight'), help="The net weight in Kg."),
'cost_method': fields.selection([('standard','Standard Price'), ('average','Average Price')], 'Costing Method', required=True,
help="Standard Price: The cost price is manually updated at the end of a specific period (usually every year). \nAverage Price: The cost price is recomputed at each incoming shipment."),
'cost_method': fields.property('', type='selection', view_load=True, selection = [('standard','Standard Price'), ('average','Average Price')],
help="Standard Price: The cost price is manually updated at the end of a specific period (usually every year). \nAverage Price: The cost price is recomputed at each incoming shipment.",
string="Costing Method"),
'warranty': fields.float('Warranty'),
'sale_ok': fields.boolean('Can be Sold', help="Specify if the product can be selected in a sales order line."),
'state': fields.selection([('',''),

View File

@ -202,7 +202,6 @@ class product_product(osv.osv):
"""
if context is None:
context = {}
location_obj = self.pool.get('stock.location')
warehouse_obj = self.pool.get('stock.warehouse')
shop_obj = self.pool.get('sale.shop')
@ -277,12 +276,18 @@ class product_product(osv.osv):
if date_values:
where.append(tuple(date_values))
#It depends on the company of the user
user = self.pool.get("res.users").browse(cr, uid, uid, context=context)
where.append(user.company_id.id)
prodlot_id = context.get('prodlot_id', False)
prodlot_clause = ''
if prodlot_id:
prodlot_clause = ' and prodlot_id = %s '
where += [prodlot_id]
# TODO: perhaps merge in one query.
if 'in' in what:
# all moves from a location out of the set to a location in the set
@ -293,6 +298,7 @@ class product_product(osv.osv):
'and location_dest_id IN %s '\
'and product_id IN %s '\
'and state IN %s ' + (date_str and 'and '+date_str+' ' or '') +' '\
'and company_id = %s '\
+ prodlot_clause +
'group by product_id,product_uom',tuple(where))
results = cr.fetchall()
@ -305,6 +311,7 @@ class product_product(osv.osv):
'and location_dest_id NOT IN %s '\
'and product_id IN %s '\
'and state in %s ' + (date_str and 'and '+date_str+' ' or '') + ' '\
'and company_id = %s '\
+ prodlot_clause +
'group by product_id,product_uom',tuple(where))
results2 = cr.fetchall()

View File

@ -1277,6 +1277,38 @@ class stock_picking(osv.osv):
{'price_unit': product_price,
'price_currency_id': product_currency})
#Average price computation when returning products
if (pick.type == 'out') and (move.product_id.cost_method == 'average'):
orig_move_id = move_obj.search(cr, uid, [('move_history_ids2', 'in', [move.id])], context=context)
if len(orig_move_id) == 1:
#Is it ok to repeat code here?
move_orig = move_obj.browse(cr, uid, orig_move_id[0], context=context)
product = product_obj.browse(cr, uid, move.product_id.id)
move_currency_id = move.company_id.currency_id.id
context['currency_id'] = move_currency_id
qty = uom_obj._compute_qty(cr, uid, product_uom, product_qty, product.uom_id.id)
if product.id in product_avail:
product_avail[product.id] += qty
else:
product_avail[product.id] = product.qty_available
if qty > 0:
new_price = currency_obj.compute(cr, uid, product_currency,
move_currency_id, move_orig.price_unit)
new_price = uom_obj._compute_price(cr, uid, product_uom, new_price,
product.uom_id.id)
# Get the standard price
amount_unit = product.price_get('standard_price', context=context)[product.id]
new_std_price = ((amount_unit * product_avail[product.id])\
- (new_price * qty))/(product_avail[product.id] - qty)
# Write the field according to price type field
product_obj.write(cr, uid, [product.id], {'standard_price': new_std_price})
# Record the values that were chosen in the wizard, so they can be
# used for inventory valuation if real-time valuation is enabled.
move_obj.write(cr, uid, [move.id],
{'price_unit': move_orig.price_unit,
'price_currency_id': product_currency})
for move in too_few:
product_qty = move_product_qty[move.id]