[IMP] sale_timesheet: so line create project

As so line already generate task, and project
for the SO sometimes, making it always create the
project seems to be a good idea.
Grouping all the logic is better for maintenability
and readability.
This commit is contained in:
Jérome Maes
2017-09-13 08:41:30 +02:00
parent 5261cdceae
commit 9e00dacded
2 changed files with 31 additions and 20 deletions
-1
View File
@@ -20,4 +20,3 @@ class ProductTemplate(models.Model):
self.track_service = 'timesheet'
else:
self.track_service = 'manual'
+31 -19
View File
@@ -58,16 +58,9 @@ class SaleOrder(models.Model):
@api.multi
def action_confirm(self):
""" On SO confirmation, some lines should generate a task or a project. """
result = super(SaleOrder, self).action_confirm()
for order in self:
if not order.project_project_id:
for line in order.order_line:
if line.product_id.track_service == 'timesheet':
if not order.project_id:
order._create_analytic_account(prefix=line.product_id.default_code or None)
order.project_id.project_create({'name': order.project_id.name})
break
order.order_line.filtered(lambda line: line.is_service_task)._timesheet_find_task()
self.order_line._timesheet_service_generation()
return result
@api.multi
@@ -133,22 +126,25 @@ class SaleOrder(models.Model):
class SaleOrderLine(models.Model):
_inherit = "sale.order.line"
task_id = fields.Many2one('project.task', 'Task')
is_service_task = fields.Boolean("Will create a task", compute='_compute_is_service_task')
task_id = fields.Many2one('project.task', 'Task', help="Task generated by the sales order item")
is_service = fields.Boolean("Is service", compute='_compute_is_service', help="Sales Order item should generate a task and/or a project, depending on the product settings.")
@api.multi
def _compute_is_service_task(self):
def _compute_is_service(self):
for so_line in self:
so_line.is_service_task = so_line.product_id.type == 'service' and so_line.product_id.track_service == 'task'
so_line.is_service = so_line.product_id.type == 'service' and so_line.product_id.track_service in ['task', 'timesheet']
@api.model
def create(self, values):
line = super(SaleOrderLine, self).create(values)
if line.state == 'sale' and not line.order_id.project_id and line.product_id.track_service in ['timesheet', 'task']:
line.order_id._create_analytic_account()
line._timesheet_find_task()
if line.state == 'sale':
line._timesheet_service_generation()
return line
###########################################
### Analytic : auto recompute delivered quantity
###########################################
def _timesheet_compute_delivered_quantity_domain(self):
# TODO JEM: avoid increment delivered for all AAL or just timesheet ?
# see nim commit https://github.com/odoo/odoo/commit/21fbb9776a5fbd1838b189f1f7cf8c5d40663e14
@@ -161,6 +157,10 @@ class SaleOrderLine(models.Model):
timesheet_domain = self._timesheet_compute_delivered_quantity_domain()
return expression.OR([domain, timesheet_domain])
###########################################
## Service : Project and task generation
###########################################
def _convert_qty_company_hours(self):
company_time_uom_id = self.env.user.company_id.project_time_mode_id
if self.product_uom.id != company_time_uom_id.id and self.product_uom.category_id.id == company_time_uom_id.category_id.id:
@@ -170,18 +170,19 @@ class SaleOrderLine(models.Model):
return planned_hours
def _timesheet_find_project(self):
self.ensure_one()
Project = self.env['project.project']
project = self.product_id.with_context(force_company=self.company_id.id).project_id
if not project:
# find the project corresponding to the analytic account of the sales order
account = self.order_id.project_id
if not account:
self.order_id._create_analytic_account()
self.order_id._create_analytic_account(prefix=self.product_id.default_code or None)
account = self.order_id.project_id
project = Project.search([('analytic_account_id', '=', account.id)], limit=1)
if not project:
project_id = account.project_create({'name': account.name})
project = Project.browse(project_id)
project_id = account.sudo().project_create({'name': account.name})
project = Project.sudo().browse(project_id)
return project
def _timesheet_create_task_prepare_values(self):
@@ -243,3 +244,14 @@ class SaleOrderLine(models.Model):
task = so_line._timesheet_create_task()[so_line.id]
result[so_line.id] = task
return result
@api.multi
def _timesheet_service_generation(self):
""" For service lines, create the task or the project. If already exists, it simply links
the existing one to the line.
"""
for so_line in self.filtered(lambda sol: sol.is_service):
if so_line.product_id.track_service == 'task':
so_line._timesheet_find_task()
if so_line.product_id.track_service == 'timesheet':
so_line._timesheet_find_project()