[ADD] stock_landed_costs : Added the mechanism to create valuation line per cost line.

bzr revid: mdi@tinyerp.com-20140411093957-ucna8z1837urzez2
This commit is contained in:
DJ Patel 2014-04-11 15:09:57 +05:30
parent 5e04721db4
commit 442a73af4e
2 changed files with 64 additions and 25 deletions

View File

@ -67,7 +67,7 @@ class stock_landed_cost(osv.osv):
for quant in move.quant_ids:
total_cost += quant.cost
total_qty += quant.qty
vals = dict(product_id = move.product_id.id, move_id = move.id, quantity = move.product_uom_qty, former_cost = total_cost * total_qty, weight = weight, volume = volume)
vals = dict(product_id = move.product_id.id, move_id = move.id, quantity = move.product_uom_qty, former_cost = total_cost * total_qty, weight = weight, volume = volume, flag = 'original')
lines.append(vals)
result['valuation_adjustment_lines'] = lines
return {'value': result}
@ -114,37 +114,70 @@ class stock_landed_cost(osv.osv):
for cost in self.browse(cr, uid, ids, context=None):
total_qty = 0.0
total_cost = 0.0
total_weight = 0.0
total_volume = 0.0
total_line = 0.0
for line in cost.valuation_adjustment_lines:
total_qty += line.quantity
total_cost += line.former_cost
total_line += 1
if line.flag == 'original':
total_qty += line.quantity
total_cost += line.former_cost
total_weight += line.weight
total_volume += line.volume
total_line += 1
unlink_ids = line_obj.search(cr, uid, [('cost_id', 'in', ids), ('flag', '=', 'duplicate')], context=context)
line_obj.unlink(cr, uid, unlink_ids, context=context)
for cost in self.browse(cr, uid, ids, context=None):
count = 0.0
for line in cost.cost_lines:
count += 1
for valuation in cost.valuation_adjustment_lines:
if count == 1:
line_obj.write(cr, uid, valuation.id, {'cost_line_id': line.id}, context=context)
continue
line_obj.copy(cr, uid, valuation.id, default={'cost_line_id': line.id, 'flag': 'duplicate'}, context=context)
for cost in self.browse(cr, uid, ids, context=None):
dict = {}
for line in cost.cost_lines:
for valuation in cost.valuation_adjustment_lines:
if line.split_method in ('by_quantity', 'by_weight', 'by_volume'):
per_unit = (line.price_unit / total_qty)
value = valuation.quantity * per_unit
if valuation.id not in dict:
dict.setdefault(valuation.id, value)
else:
dict[valuation.id] += value
elif line.split_method == 'equal':
per_unit = (line.price_unit / total_line)
if valuation.id not in dict:
dict.setdefault(valuation.id, per_unit)
else:
dict[valuation.id] += per_unit
elif line.split_method == 'by_current_cost_price':
per_unit = (line.price_unit / total_cost)
value = valuation.former_cost * per_unit
if valuation.id not in dict:
dict.setdefault(valuation.id, value)
else:
dict[valuation.id] += value
if valuation.cost_line_id and valuation.cost_line_id.id == line.id:
if line.split_method == 'by_quantity':
per_unit = (line.price_unit / total_qty)
value = valuation.quantity * per_unit
if valuation.id not in dict:
dict[valuation.id] = value
else:
dict[valuation.id] += value
elif line.split_method == 'by_weight':
per_unit = (line.price_unit / total_weight or 1.0)
value = valuation.quantity * per_unit
if valuation.id not in dict:
dict[valuation.id] = value
else:
dict[valuation.id] += value
elif line.split_method == 'by_volume':
per_unit = (line.price_unit / total_volume or 1.0)
value = valuation.quantity * per_unit
if valuation.id not in dict:
dict[valuation.id] = value
else:
dict[valuation.id] += value
elif line.split_method == 'equal':
per_unit = (line.price_unit / total_line)
if valuation.id not in dict:
dict[valuation.id] = per_unit
else:
dict[valuation.id] += per_unit
elif line.split_method == 'by_current_cost_price':
per_unit = (line.price_unit / total_cost)
value = valuation.former_cost * per_unit
if valuation.id not in dict:
dict[valuation.id] = value
else:
dict[valuation.id] += value
for key, value in dict.items():
line_obj.write(cr, uid, key, {'additional_landed_cost': value}, context=context)
@ -193,6 +226,7 @@ class stock_valuation_adjustment_lines(osv.osv):
_columns = {
'name': fields.char('Description', size=256),
'cost_id': fields.many2one('stock.landed.cost', 'Landed Cost', required=True, ondelete='cascade'),
'cost_line_id': fields.many2one('stock.landed.cost.lines', 'Cost Line'),
'move_id': fields.many2one('stock.move', 'Stock Move'),
'product_id': fields.many2one('product.product', 'Product', required=True),
'quantity': fields.float('Quantity', digits_compute= dp.get_precision('Product Unit of Measure'), required=True),
@ -202,10 +236,14 @@ class stock_valuation_adjustment_lines(osv.osv):
'former_cost_per_unit': fields.function(_amount_final, multi='cost', string='Former Cost(Per Unit)', type='float', digits_compute= dp.get_precision('Account'), store=True),
'additional_landed_cost': fields.float('Additional Landed Cost', digits_compute= dp.get_precision('Product Price')),
'final_cost': fields.function(_amount_final, multi='cost', string='Final Cost', type='float', digits_compute= dp.get_precision('Account'), store=True),
'flag': fields.selection([('original', 'Original'), ('duplicate', 'Duplicate')], 'Flag', readonly=True),
}
_defaults = {
'quantity': 1.0,
'weight': 1.0,
'volume': 1.0,
'flag': 'original',
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -79,6 +79,7 @@
<field name="quantity"/>
<field name="weight"/>
<field name="volume"/>
<field name="cost_line_id"/>
<field name="former_cost"/>
<field name="former_cost_per_unit"/>
<field name="additional_landed_cost"/>