diff --git a/addons/hr_timesheet/models/project.py b/addons/hr_timesheet/models/project.py
index d33d9c45722..329c242e0d3 100644
--- a/addons/hr_timesheet/models/project.py
+++ b/addons/hr_timesheet/models/project.py
@@ -98,6 +98,38 @@ class Task(models.Model):
timesheet_timer_first_start = fields.Datetime("Timesheet Timer First Use", readonly=True)
timesheet_timer_last_stop = fields.Datetime("Timesheet Timer Last Use", readonly=True)
display_timesheet_timer = fields.Boolean("Display Timesheet Time", compute='_compute_display_timesheet_timer')
+ display_timer_start_primary = fields.Boolean(compute='_compute_display_timer_buttons')
+ display_timer_start_secondary = fields.Boolean(compute='_compute_display_timer_buttons')
+ display_timer_stop = fields.Boolean(compute='_compute_display_timer_buttons')
+ display_timer_pause = fields.Boolean(compute='_compute_display_timer_buttons')
+ display_timer_resume = fields.Boolean(compute='_compute_display_timer_buttons')
+
+ @api.depends('display_timesheet_timer', 'timer_start', 'timer_pause', 'total_hours_spent')
+ def _compute_display_timer_buttons(self):
+ for task in self:
+ start_p, start_s, stop, pause, resume = True, True, True, True, True
+ if not task.display_timesheet_timer:
+ start_p, start_s, stop, pause, resume = False, False, False, False, False
+ else:
+ if task.timer_start:
+ start_p, start_s = False, False
+ if task.timer_pause:
+ pause = False
+ else:
+ resume = False
+ else:
+ stop, pause, resume = False, False, False
+ if not task.total_hours_spent:
+ start_s = False
+ else:
+ start_p = False
+ task.write({
+ 'display_timer_start_primary': start_p,
+ 'display_timer_start_secondary': start_s,
+ 'display_timer_stop': stop,
+ 'display_timer_pause': pause,
+ 'display_timer_resume': resume,
+ })
@api.depends('timesheet_ids.unit_amount')
def _compute_effective_hours(self):
diff --git a/addons/hr_timesheet/views/project_views.xml b/addons/hr_timesheet/views/project_views.xml
index 3df4ad3b4b0..a50c6dfb58b 100644
--- a/addons/hr_timesheet/views/project_views.xml
+++ b/addons/hr_timesheet/views/project_views.xml
@@ -261,16 +261,21 @@
+
+
+
+
+
+ attrs="{'invisible': [('display_timer_start_primary', '=', False)]}" groups="hr_timesheet.group_hr_timesheet_user"/>
+ attrs="{'invisible': [('display_timer_start_secondary', '=', False)]}" groups="hr_timesheet.group_hr_timesheet_user"/>
+ attrs="{'invisible': [('display_timer_stop', '=', False)]}" groups="hr_timesheet.group_hr_timesheet_user"/>
+ attrs="{'invisible': [('display_timer_pause', '=', False)]}" groups="hr_timesheet.group_hr_timesheet_user"/>
+ attrs="{'invisible': [('display_timer_resume', '=', False)]}" groups="hr_timesheet.group_hr_timesheet_user"/>
ml-2
diff --git a/addons/sale_timesheet/models/project.py b/addons/sale_timesheet/models/project.py
index 31a06694f12..90e69b533e7 100644
--- a/addons/sale_timesheet/models/project.py
+++ b/addons/sale_timesheet/models/project.py
@@ -21,6 +21,15 @@ class Project(models.Model):
help="Employee/Sale Order Item Mapping:\n Defines to which sales order item an employee's timesheet entry will be linked."
"By extension, it defines the rate at which an employee's time on the project is billed.")
allow_billable = fields.Boolean("Bill from Tasks")
+ display_create_order = fields.Boolean(compute='_compute_display_create_order')
+
+ @api.depends('billable_type', 'allow_billable', 'sale_order_id', 'partner_id')
+ def _compute_display_create_order(self):
+ for project in self:
+ show = True
+ if not project.partner_id or project.billable_type != 'no' or project.allow_billable or project.sale_order_id:
+ show = False
+ project.display_create_order = show
@api.depends('sale_order_id', 'sale_line_id', 'sale_line_employee_ids')
def _compute_billable_type(self):
@@ -125,6 +134,19 @@ class ProjectTask(models.Model):
], string="Billable Type", compute='_compute_billable_type', compute_sudo=True, store=True)
is_project_map_empty = fields.Boolean("Is Project map empty", compute='_compute_is_project_map_empty')
allow_billable = fields.Boolean(related="project_id.allow_billable")
+ display_create_order = fields.Boolean(compute='_compute_display_create_order')
+
+ @api.depends(
+ 'allow_billable', 'allow_timesheets', 'sale_order_id', 'display_timesheet_timer',
+ 'timer_start')
+ def _compute_display_create_order(self):
+ for task in self:
+ show = True
+ if not task.allow_billable or not task.allow_timesheets or \
+ task.billable_type == 'employee_rate' or not task.partner_id or \
+ task.sale_order_id or (task.display_timesheet_timer and task.timer_start):
+ show = False
+ task.display_create_order = show
@api.onchange('sale_line_id')
def _onchange_sale_line_id(self):
diff --git a/addons/sale_timesheet/views/project_task_views.xml b/addons/sale_timesheet/views/project_task_views.xml
index 125d8d50d3e..055ddb56dc2 100644
--- a/addons/sale_timesheet/views/project_task_views.xml
+++ b/addons/sale_timesheet/views/project_task_views.xml
@@ -7,11 +7,12 @@
-
+
+
@@ -74,7 +75,8 @@
-
+
+