summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosse Colpaert <jco@odoo.com>2014-09-17 18:00:52 +0200
committerJosse Colpaert <jco@odoo.com>2014-09-17 18:00:52 +0200
commit8aca4094af3796668c1bdcde8ead3fcab3c3e8da (patch)
treee82a5d1fb9d9e105eef82764bc1c21394ec97b76
parent57ad514bb2a024d25d336c61d0a60c9f4000adb1 (diff)
parent4d3ae9ea548ab4571f73933e0072d6a1cb45875d (diff)
Merge pull request #2460 from odoo-dev/8.0-wmslandedextraout-jco
8.0 wmslandedextraout jco
-rw-r--r--addons/stock_landed_costs/stock_landed_costs.py63
-rw-r--r--addons/stock_landed_costs/stock_landed_costs_view.xml2
2 files changed, 56 insertions, 9 deletions
diff --git a/addons/stock_landed_costs/stock_landed_costs.py b/addons/stock_landed_costs/stock_landed_costs.py
index 1952194387c..8933cec1164 100644
--- a/addons/stock_landed_costs/stock_landed_costs.py
+++ b/addons/stock_landed_costs/stock_landed_costs.py
@@ -98,21 +98,25 @@ class stock_landed_cost(osv.osv):
'date': fields.date.context_today,
}
- def _create_accounting_entries(self, cr, uid, line, move_id, context=None):
+ def _create_accounting_entries(self, cr, uid, line, move_id, qty_out, context=None):
product_obj = self.pool.get('product.template')
cost_product = line.cost_line_id and line.cost_line_id.product_id
if not cost_product:
return False
accounts = product_obj.get_product_accounts(cr, uid, line.product_id.product_tmpl_id.id, context=context)
debit_account_id = accounts['property_stock_valuation_account_id']
- credit_account_id = cost_product.property_account_expense and cost_product.property_account_expense.id or cost_product.categ_id.property_account_expense_categ.id
+ already_out_account_id = accounts['stock_account_output']
+ credit_account_id = line.cost_line_id.account_id.id or cost_product.property_account_expense.id or cost_product.categ_id.property_account_expense_categ.id
+
if not credit_account_id:
raise osv.except_osv(_('Error!'), _('Please configure Stock Expense Account for product: %s.') % (cost_product.name))
- return self._create_account_move_line(cr, uid, line, move_id, credit_account_id, debit_account_id, context=context)
- def _create_account_move_line(self, cr, uid, line, move_id, credit_account_id, debit_account_id, context=None):
+ return self._create_account_move_line(cr, uid, line, move_id, credit_account_id, debit_account_id, qty_out, already_out_account_id, context=context)
+
+ def _create_account_move_line(self, cr, uid, line, move_id, credit_account_id, debit_account_id, qty_out, already_out_account_id, context=None):
"""
Generate the account.move.line values to track the landed cost.
+ Afterwards, for the goods that are already out of stock, we should create the out moves
"""
aml_obj = self.pool.get('account.move.line')
aml_obj.create(cr, uid, {
@@ -131,6 +135,25 @@ class stock_landed_cost(osv.osv):
'credit': line.additional_landed_cost,
'account_id': credit_account_id
}, context=context)
+
+ #Create account move lines for quants already out of stock
+ if qty_out > 0:
+ aml_obj.create(cr, uid, {
+ 'name': line.name + ": " + str(qty_out) + _(' already out'),
+ 'move_id': move_id,
+ 'product_id': line.product_id.id,
+ 'quantity': qty_out,
+ 'credit': line.additional_landed_cost * qty_out / line.quantity,
+ 'account_id': debit_account_id
+ }, context=context)
+ aml_obj.create(cr, uid, {
+ 'name': line.name + ": " + str(qty_out) + _(' already out'),
+ 'move_id': move_id,
+ 'product_id': line.product_id.id,
+ 'quantity': qty_out,
+ 'debit': line.additional_landed_cost * qty_out / line.quantity,
+ 'account_id': already_out_account_id
+ }, context=context)
return True
def _create_account_move(self, cr, uid, cost, context=None):
@@ -142,11 +165,31 @@ class stock_landed_cost(osv.osv):
}
return self.pool.get('account.move').create(cr, uid, vals, context=context)
+ def _check_sum(self, cr, uid, landed_cost, context=None):
+ """
+ Will check if each cost line its valuation lines sum to the correct amount
+ and if the overall total amount is correct also
+ """
+ costcor = {}
+ tot = 0
+ for valuation_line in landed_cost.valuation_adjustment_lines:
+ if costcor.get(valuation_line.cost_line_id):
+ costcor[valuation_line.cost_line_id] += valuation_line.additional_landed_cost
+ else:
+ costcor[valuation_line.cost_line_id] = valuation_line.additional_landed_cost
+ tot += valuation_line.additional_landed_cost
+ res = (tot == landed_cost.amount_total)
+ for costl in costcor.keys():
+ if costcor[costl] != costl.price_unit:
+ res = False
+ return res
+
def button_validate(self, cr, uid, ids, context=None):
quant_obj = self.pool.get('stock.quant')
+
for cost in self.browse(cr, uid, ids, context=context):
- if not cost.valuation_adjustment_lines:
- raise osv.except_osv(_('Error!'), _('You cannot validate a landed cost which has no valuation line.'))
+ if not cost.valuation_adjustment_lines or not self._check_sum(cr, uid, cost, context=context):
+ raise osv.except_osv(_('Error!'), _('You cannot validate a landed cost which has no valid valuation lines.'))
move_id = self._create_account_move(cr, uid, cost, context=context)
quant_dict = {}
for line in cost.valuation_adjustment_lines:
@@ -162,7 +205,11 @@ class stock_landed_cost(osv.osv):
quant_dict[quant.id] += diff
for key, value in quant_dict.items():
quant_obj.write(cr, uid, quant.id, {'cost': value}, context=context)
- self._create_accounting_entries(cr, uid, line, move_id, context=context)
+ qty_out = 0
+ for quant in line.move_id.quant_ids:
+ if quant.location_id.usage != 'internal':
+ qty_out += quant.qty
+ self._create_accounting_entries(cr, uid, line, move_id, qty_out, context=context)
self.write(cr, uid, cost.id, {'state': 'done', 'account_move_id': move_id}, context=context)
return True
@@ -246,7 +293,7 @@ class stock_landed_cost_lines(osv.osv):
'name': fields.char('Description'),
'cost_id': fields.many2one('stock.landed.cost', 'Landed Cost', required=True, ondelete='cascade'),
'product_id': fields.many2one('product.product', 'Product', required=True),
- 'price_unit': fields.float('Unit Price', required=True, digits_compute=dp.get_precision('Product Price')),
+ 'price_unit': fields.float('Cost', required=True, digits_compute=dp.get_precision('Product Price')),
'split_method': fields.selection(product.SPLIT_METHOD, string='Split Method', required=True),
'account_id': fields.many2one('account.account', 'Account', domain=[('type', '<>', 'view'), ('type', '<>', 'closed')]),
}
diff --git a/addons/stock_landed_costs/stock_landed_costs_view.xml b/addons/stock_landed_costs/stock_landed_costs_view.xml
index a527efa99af..74de718a4f3 100644
--- a/addons/stock_landed_costs/stock_landed_costs_view.xml
+++ b/addons/stock_landed_costs/stock_landed_costs_view.xml
@@ -85,7 +85,7 @@
</group>
</group>
</form>
- <tree string="Valuation Adjustments" editable="bottom">
+ <tree string="Valuation Adjustments" editable="bottom" create="0">
<field name="cost_line_id" readonly="1"/>
<field name="product_id" readonly="1"/>
<field name="weight" readonly="1"/>