diff --git a/addons/sale_timesheet/models/project.py b/addons/sale_timesheet/models/project.py index 6f81e8a7658..7627880430a 100644 --- a/addons/sale_timesheet/models/project.py +++ b/addons/sale_timesheet/models/project.py @@ -90,29 +90,13 @@ class ProjectTask(models.Model): for task in self: if task.sale_line_id: if not task.sale_line_id.is_service or task.sale_line_id.is_expense: - raise ValidationError(_('You cannot link the order item %s - %s to this task because it is a re-invoiced expense.' % (task.sale_line_id.order_id.id, task.sale_line_id.product_id.name))) - - @api.model - def create(self, values): - # sub task has the same so line than their parent - parent_id = values['parent_id'] if 'parent_id' in values else self.env.context.get('default_parent_id') - if parent_id: - values['sale_line_id'] = self.env['project.task'].browse(parent_id).sudo().sale_line_id.id - return super(ProjectTask, self).create(values) + raise ValidationError(_('You cannot link the order item %s - %s to this task because it is a re-invoiced expense.' % (task.sale_line_id.order_id.id, task.sale_line_id.product_id.name))) @api.multi def write(self, values): - # sub task has the same so line than their parent - if 'parent_id' in values: - values['sale_line_id'] = self.env['project.task'].browse(values['parent_id']).sudo().sale_line_id.id - result = super(ProjectTask, self).write(values) # reassign SO line on related timesheet lines if 'sale_line_id' in values: - # subtasks should have the same SO line than their mother - self.sudo().mapped('child_ids').write({ - 'so_line': values['sale_line_id'] - }) self.sudo().mapped('timesheet_ids').write({ 'so_line': values['sale_line_id'] }) @@ -124,12 +108,6 @@ class ProjectTask(models.Model): raise ValidationError(_('You cannot delete a task related to a sales order. You can only archive it.')) return super(ProjectTask, self).unlink() - @api.multi - def _subtask_implied_fields(self): - fields_list = super(ProjectTask, self)._subtask_implied_fields() - fields_list += ['sale_line_id'] - return fields_list - @api.multi def action_view_so(self): self.ensure_one() diff --git a/addons/sale_timesheet/tests/test_sale_service.py b/addons/sale_timesheet/tests/test_sale_service.py index e0b9c44669e..f4a1a0dc263 100644 --- a/addons/sale_timesheet/tests/test_sale_service.py +++ b/addons/sale_timesheet/tests/test_sale_service.py @@ -344,7 +344,16 @@ class TestSaleService(TestCommonSaleTimesheetNoChart): 'price_unit': self.product_delivery_timesheet3.list_price, 'order_id': self.sale_order.id, }) + so_line_deliver_new_task_project_2 = self.env['sale.order.line'].create({ + 'name': self.product_delivery_timesheet3.name + "(2)", + 'product_id': self.product_delivery_timesheet3.id, + 'product_uom_qty': 10, + 'product_uom': self.product_delivery_timesheet3.uom_id.id, + 'price_unit': self.product_delivery_timesheet3.list_price, + 'order_id': self.sale_order.id, + }) so_line_deliver_new_task_project.product_id_change() + so_line_deliver_new_task_project_2.product_id_change() self.sale_order.action_confirm() project = so_line_deliver_new_task_project.project_id @@ -358,14 +367,13 @@ class TestSaleService(TestCommonSaleTimesheetNoChart): 'parent_id': task.id, 'project_id': project.id, 'name': '%s: substask1' % (task.name,), - 'sale_line_id': False # forcing, but should have not effect }) task2 = self.env['project.task'].create({ 'project_id': project.id, 'name': '%s: substask1' % (task.name,) }) - self.assertEqual(subtask.sale_line_id, task.sale_line_id, "A child task should have the same SO line than its mother") + self.assertEqual(subtask.sale_line_id, task.sale_line_id, "By, default, a child task should have the same SO line than its mother") self.assertEqual(task2.sale_line_id, project.sale_line_id, "A new task in a billable project should have the same SO line than its project") self.assertEqual(task2.partner_id, so_line_deliver_new_task_project.order_partner_id, "A new task in a billable project should have the same SO line than its project") @@ -373,6 +381,18 @@ class TestSaleService(TestCommonSaleTimesheetNoChart): subtask.write({'project_id': self.project_global.id}) self.assertEqual(subtask.sale_line_id, task.sale_line_id, "A child task should always have the same SO line than its mother, even when changing project") + self.assertEqual(subtask.sale_line_id, so_line_deliver_new_task_project) + + # changing the SO line of the mother task + task.write({'sale_line_id': so_line_deliver_new_task_project_2.id}) + + self.assertEqual(subtask.sale_line_id, so_line_deliver_new_task_project, "A child task is not impacted by the change of SO line of its mother") + self.assertEqual(task.sale_line_id, so_line_deliver_new_task_project_2, "A mother task can have its SO line set manually") + + # changing the SO line of a subtask + subtask.write({'sale_line_id': so_line_deliver_new_task_project_2.id}) + + self.assertEqual(subtask.sale_line_id, so_line_deliver_new_task_project_2, "A child can have its SO line set manually") def test_change_ordered_qty(self): """ Changing the ordered quantity of a SO line that have created a task should update the planned hours of this task """ diff --git a/addons/sale_timesheet/views/project_task_views.xml b/addons/sale_timesheet/views/project_task_views.xml index 1ebdc46cbfa..cb631dbd608 100644 --- a/addons/sale_timesheet/views/project_task_views.xml +++ b/addons/sale_timesheet/views/project_task_views.xml @@ -41,7 +41,7 @@ string="Sales Order"/> - +