[IMP] sale_timesheet: convert timesheet_product_id in related for task

Before this commit, this field is stored and contains by default the
value of the same field in project.project. Moreover, we cannot choose
another timesheet_product_id in task views. It means that field is most
of the time the timesheet_product_id of linked project.

This commit converts this stored field into related field to the same
field in project.project and remove an inherit view which adds only this
field without displaying in the view.

task-2424382
This commit is contained in:
Xavier BOL (xbo)
2021-01-15 15:59:59 +01:00
parent 1475138e68
commit 8d8e054a22
3 changed files with 3 additions and 46 deletions
+1 -33
View File
@@ -186,16 +186,6 @@ class Project(models.Model):
class ProjectTask(models.Model):
_inherit = "project.task"
@api.model
def default_get(self, fields):
result = super(ProjectTask, self).default_get(fields)
if not result.get('timesheet_product_id', False) and 'project_id' in result:
project = self.env['project.project'].browse(result['project_id'])
if project.pricing_type != 'employee_rate':
result['timesheet_product_id'] = project.timesheet_product_id.id
return result
# override sale_order_id and make it computed stored field instead of regular field.
sale_order_id = fields.Many2one(compute='_compute_sale_order_id', store=True, readonly=False,
domain="['|', '|', ('partner_id', '=', partner_id), ('partner_id', 'child_of', commercial_partner_id), ('partner_id', 'parent_of', partner_id)]")
@@ -204,14 +194,7 @@ class ProjectTask(models.Model):
is_project_map_empty = fields.Boolean("Is Project map empty", compute='_compute_is_project_map_empty')
has_multi_sol = fields.Boolean(compute='_compute_has_multi_sol', compute_sudo=True)
allow_billable = fields.Boolean(related="project_id.allow_billable")
timesheet_product_id = fields.Many2one(
'product.product', string='Service',
domain="""[
('type', '=', 'service'),
('invoice_policy', '=', 'delivery'),
('service_type', '=', 'timesheet'),
'|', ('company_id', '=', False), ('company_id', '=', company_id)]""",
help='Select a Service product with which you would like to bill your time spent on this task.')
timesheet_product_id = fields.Many2one(related="project_id.timesheet_product_id")
remaining_hours_so = fields.Float('Remaining Hours on SO', compute='_compute_remaining_hours_so')
remaining_hours_available = fields.Boolean(related="sale_line_id.remaining_hours_available")
@@ -298,21 +281,6 @@ class ProjectTask(models.Model):
domain.append(('order_id', '=?', self.project_sale_order_id.id))
return self.env['sale.order.line'].search(domain, limit=1)
def action_make_billable(self):
return {
"name": _("Create Sales Order"),
"type": 'ir.actions.act_window',
"res_model": 'project.task.create.sale.order',
"views": [[False, "form"]],
"target": 'new',
"context": {
'active_id': self.id,
'active_model': 'project.task',
'form_view_initial_mode': 'edit',
'default_product_id': self.timesheet_product_id.id or self.project_id.timesheet_product_id.id,
},
}
def _get_timesheet(self):
# return not invoiced timesheet and timesheet without so_line or so_line linked to task
timesheet_ids = super(ProjectTask, self)._get_timesheet()
@@ -119,7 +119,8 @@ class TestProjectBilling(TestCommonSaleTimesheet):
Task = self.env['project.task']
# set a customer on the project
self.project_non_billable.write({
'partner_id': self.partner_2.id
'partner_id': self.partner_2.id,
'timesheet_product_id': self.product_delivery_timesheet3,
})
# create a task and 2 timesheets
task = Task.with_context(default_project_id=self.project_non_billable.id).create({
@@ -147,7 +148,6 @@ class TestProjectBilling(TestCommonSaleTimesheet):
'allow_billable': True,
'pricing_type': 'fixed_rate',
})
task.timesheet_product_id = self.product_delivery_timesheet3
# create wizard
wizard = self.env['project.create.sale.order'].with_context(active_id=self.project_non_billable.id, active_model='project.project').create({})
@@ -202,17 +202,6 @@
</field>
</record>
<record id="quick_create_task_form_sale_timesheet" model="ir.ui.view">
<field name="name">project.task.form.inherit.timesheet</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.quick_create_task_form"/>
<field name="arch" type="xml">
<field name="project_id" position="after">
<field name="timesheet_product_id" invisible="1"/>
</field>
</field>
</record>
<record id="project_timesheet_action_client_timesheet_plan" model="ir.actions.act_window">
<field name="name">Overview</field>
<field name="res_model">project.project</field>