[FIX] mrp_production_real_cost: Update costs when operation time lines change

Up to now, you have to rely only on play/pause/stop controls, and the time passed
between them for having real costs reflected, but there are manufacturing processes
that reflects their times not directly, but afterwards introducing the summaries.
This commit allows to reflect the changes on costs when you edit up times.
This commit is contained in:
Pedro M. Baeza
2016-02-13 14:33:14 +01:00
parent 7bcc6ea919
commit a533da1b11
3 changed files with 51 additions and 29 deletions

View File

@@ -6,7 +6,7 @@
{
"name": "Real costs in manufacturing orders",
"version": "8.0.1.0.0",
"version": "8.0.1.0.1",
"depends": [
"project_timesheet",
"mrp_project",

View File

@@ -21,24 +21,32 @@ class MrpProductionWorkcenterLine(models.Model):
task_obj = self.env['project.task']
if self.workcenter_id.costs_hour > 0.0:
hour_uom = self.env.ref('product.product_uom_hour', False)
operation_line = self.operation_time_lines[-1]
production = self.production_id
workcenter = self.workcenter_id
product = workcenter.product_id
journal_id = workcenter.costs_journal_id or self.env.ref(
journal = workcenter.costs_journal_id or self.env.ref(
'mrp.analytic_journal_machines', False)
# Delete previous uptime analytic entries
analytic_line_obj.search(
[('mrp_production_id', '=', production.id),
('workorder', '=', self.id),
('journal_id', '=', journal.id),
('name', '=like', '%%%s' % _('HOUR'))]
).unlink()
# Recreate a new entry with the total uptime
name = "-".join([production.name or '',
workcenter.code or '',
self.routing_wc_line.routing_id.code or '',
product.default_code or '',
_('HOUR')])
uptime = sum(self.mapped('operation_time_lines.uptime'))
general_acc = workcenter.costs_general_account_id or False
price = -(workcenter.costs_hour * operation_line.uptime)
price = -workcenter.costs_hour * uptime
if price:
analytic_vals = production._prepare_real_cost_analytic_line(
journal_id, name, production, product,
journal, name, production, product,
general_account=general_acc, workorder=self,
qty=operation_line.uptime, amount=price)
qty=uptime, amount=price)
task = task_obj.search(
[('mrp_production_id', '=', production.id),
('workorder', '=', False)])
@@ -93,22 +101,24 @@ class MrpProductionWorkcenterLine(models.Model):
@api.multi
def action_start_working(self):
result = super(MrpProductionWorkcenterLine,
self).action_start_working()
result = super(
MrpProductionWorkcenterLine, self).action_start_working()
self._create_pre_post_cost_lines(cost_type='pre')
return result
@api.multi
def action_pause(self):
result = super(MrpProductionWorkcenterLine, self).action_pause()
self._create_analytic_line()
return result
def action_done(self):
self._create_pre_post_cost_lines(cost_type='post')
return super(MrpProductionWorkcenterLine, self).action_done()
class OperationTimeLine(models.Model):
_inherit = 'operation.time.line'
@api.multi
def action_done(self):
not_paused_records = self.filtered(lambda x: x.state != 'pause')
not_paused_records._write_end_date_operation_line()
self._create_analytic_line()
self._create_pre_post_cost_lines(cost_type='post')
result = super(MrpProductionWorkcenterLine, self).action_done()
return result
def write(self, vals):
"""Recreate costs when updating manually the uptime."""
res = super(OperationTimeLine, self).write(vals)
if 'start_date' in vals or 'end_date' in vals:
self.operation_time._create_analytic_line()
return res

View File

@@ -6,7 +6,6 @@
from openerp.tests import common
from openerp import fields
from datetime import timedelta
import time
class TestMrpProductionRealCost(common.TransactionCase):
@@ -26,18 +25,31 @@ class TestMrpProductionRealCost(common.TransactionCase):
line.pre_cost = 10
line.post_cost = 20
line.signal_workflow('button_start_working')
line.operation_time_lines[-1].start_date = self.start_date
self.assertEqual(
len(self.production.analytic_line_ids.filtered('amount')), 1)
time.sleep(1)
line.operation_time_lines[-1].start_date = (
self.start_date - timedelta(hours=1))
analytic_line = self.production.analytic_line_ids.filtered('amount')
# This should have the pre-operation cost
self.assertEqual(len(analytic_line), 1)
line.signal_workflow('button_pause')
self.assertEqual(
len(self.production.analytic_line_ids.filtered('amount')), 2)
analytic_lines = self.production.analytic_line_ids.filtered('amount')
# This should have the pre-operation cost and uptime line
self.assertEqual(len(analytic_lines), 2)
prev_amount = analytic_lines[-1].amount
line.signal_workflow('button_resume')
time.sleep(1)
line.operation_time_lines[-1].start_date = (
self.start_date - timedelta(hours=2))
line.signal_workflow('button_done')
self.assertEqual(
len(self.production.analytic_line_ids.filtered('amount')), 3)
analytic_lines = self.production.analytic_line_ids.filtered('amount')
# This should have the pre- cost, uptime line and post- cost
self.assertEqual(len(analytic_lines), 3)
self.assertNotEqual(analytic_lines[-1].amount, prev_amount)
prev_amount = analytic_lines[-1].amount
# Change manually an uptime to see if costs change
line.operation_time_lines[-1].end_date = (
self.start_date + (timedelta(hours=3)))
analytic_lines = self.production.analytic_line_ids.filtered('amount')
self.assertNotEqual(analytic_lines[-1].amount, prev_amount)
# Change analytic entries to see if production real_cost field changes
self.production.analytic_line_ids[:1].amount = -10
self.assertTrue(self.production.real_cost)