Browse Source

Dec 17: [ADD] Initial Commit 'automatic_project_task_timer'

pull/309/head
Cybrosys Technologies 4 months ago
parent
commit
7568c2f4a1
  1. 51
      automatic_project_task_timer/README.rst
  2. 22
      automatic_project_task_timer/__init__.py
  3. 53
      automatic_project_task_timer/__manifest__.py
  4. 5
      automatic_project_task_timer/doc/RELEASE_NOTES.md
  5. 25
      automatic_project_task_timer/models/__init__.py
  6. 37
      automatic_project_task_timer/models/account_analytic_line.py
  7. 147
      automatic_project_task_timer/models/project_task.py
  8. 33
      automatic_project_task_timer/models/res_config_settings.py
  9. 72
      automatic_project_task_timer/models/timer_configuration.py
  10. 3
      automatic_project_task_timer/security/ir.model.access.csv
  11. BIN
      automatic_project_task_timer/static/description/assets/icons/check.png
  12. BIN
      automatic_project_task_timer/static/description/assets/icons/chevron.png
  13. BIN
      automatic_project_task_timer/static/description/assets/icons/cogs.png
  14. BIN
      automatic_project_task_timer/static/description/assets/icons/consultation.png
  15. BIN
      automatic_project_task_timer/static/description/assets/icons/ecom-black.png
  16. BIN
      automatic_project_task_timer/static/description/assets/icons/education-black.png
  17. BIN
      automatic_project_task_timer/static/description/assets/icons/hotel-black.png
  18. BIN
      automatic_project_task_timer/static/description/assets/icons/license.png
  19. BIN
      automatic_project_task_timer/static/description/assets/icons/lifebuoy.png
  20. BIN
      automatic_project_task_timer/static/description/assets/icons/manufacturing-black.png
  21. BIN
      automatic_project_task_timer/static/description/assets/icons/pos-black.png
  22. BIN
      automatic_project_task_timer/static/description/assets/icons/puzzle.png
  23. BIN
      automatic_project_task_timer/static/description/assets/icons/restaurant-black.png
  24. BIN
      automatic_project_task_timer/static/description/assets/icons/service-black.png
  25. BIN
      automatic_project_task_timer/static/description/assets/icons/trading-black.png
  26. BIN
      automatic_project_task_timer/static/description/assets/icons/training.png
  27. BIN
      automatic_project_task_timer/static/description/assets/icons/update.png
  28. BIN
      automatic_project_task_timer/static/description/assets/icons/user.png
  29. BIN
      automatic_project_task_timer/static/description/assets/icons/wrench.png
  30. BIN
      automatic_project_task_timer/static/description/assets/misc/Cybrosys R.png
  31. BIN
      automatic_project_task_timer/static/description/assets/misc/categories.png
  32. BIN
      automatic_project_task_timer/static/description/assets/misc/check-box.png
  33. BIN
      automatic_project_task_timer/static/description/assets/misc/compass.png
  34. BIN
      automatic_project_task_timer/static/description/assets/misc/corporate.png
  35. BIN
      automatic_project_task_timer/static/description/assets/misc/customer-support.png
  36. BIN
      automatic_project_task_timer/static/description/assets/misc/cybrosys-logo.png
  37. BIN
      automatic_project_task_timer/static/description/assets/misc/features.png
  38. BIN
      automatic_project_task_timer/static/description/assets/misc/logo.png
  39. 3
      automatic_project_task_timer/static/description/assets/misc/phone.svg
  40. BIN
      automatic_project_task_timer/static/description/assets/misc/pictures.png
  41. BIN
      automatic_project_task_timer/static/description/assets/misc/pie-chart.png
  42. BIN
      automatic_project_task_timer/static/description/assets/misc/right-arrow.png
  43. BIN
      automatic_project_task_timer/static/description/assets/misc/star.png
  44. 9
      automatic_project_task_timer/static/description/assets/misc/support (1) 1.svg
  45. 6
      automatic_project_task_timer/static/description/assets/misc/support-email.svg
  46. BIN
      automatic_project_task_timer/static/description/assets/misc/support.png
  47. 9
      automatic_project_task_timer/static/description/assets/misc/whatsapp 1.svg
  48. BIN
      automatic_project_task_timer/static/description/assets/misc/whatsapp.png
  49. BIN
      automatic_project_task_timer/static/description/assets/modules/1.jpg
  50. BIN
      automatic_project_task_timer/static/description/assets/modules/2.gif
  51. BIN
      automatic_project_task_timer/static/description/assets/modules/3.jpg
  52. BIN
      automatic_project_task_timer/static/description/assets/modules/4.jpg
  53. BIN
      automatic_project_task_timer/static/description/assets/modules/5.png
  54. BIN
      automatic_project_task_timer/static/description/assets/modules/6.jpg
  55. BIN
      automatic_project_task_timer/static/description/assets/screenshots/1.png
  56. BIN
      automatic_project_task_timer/static/description/assets/screenshots/2.png
  57. BIN
      automatic_project_task_timer/static/description/assets/screenshots/3.png
  58. BIN
      automatic_project_task_timer/static/description/assets/screenshots/4.png
  59. BIN
      automatic_project_task_timer/static/description/assets/screenshots/5.png
  60. BIN
      automatic_project_task_timer/static/description/assets/screenshots/6.png
  61. BIN
      automatic_project_task_timer/static/description/assets/screenshots/7.png
  62. BIN
      automatic_project_task_timer/static/description/assets/screenshots/8.png
  63. BIN
      automatic_project_task_timer/static/description/assets/screenshots/9.png
  64. BIN
      automatic_project_task_timer/static/description/assets/screenshots/hero.gif
  65. BIN
      automatic_project_task_timer/static/description/banner.jpg
  66. BIN
      automatic_project_task_timer/static/description/icon.png
  67. 864
      automatic_project_task_timer/static/description/index.html
  68. 15
      automatic_project_task_timer/static/src/js/form_open.js
  69. 89
      automatic_project_task_timer/static/src/js/task_timer.js
  70. 8
      automatic_project_task_timer/static/src/xml/task_timer_templates.xml
  71. 33
      automatic_project_task_timer/views/project_task_views.xml
  72. 21
      automatic_project_task_timer/views/res_config_settings_views.xml
  73. 26
      automatic_project_task_timer/views/timer_configuration_views.xml

51
automatic_project_task_timer/README.rst

@ -0,0 +1,51 @@
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
Automatic Project Task Timer
============================
App for running the timer automatically for the task comes in In Progress stage.
Configuration
=============
* For configuring the timer, Go to Users --> Set the user group as Administrator
for Projects then,
Projects --> Configuration --> Timer Configuration menu to configure the
project and stage.
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
License
-------
GNU AFFERO GENERAL PUBLIC LICENSE v3.0 (AGPL-3)
(https://www.gnu.org/licenses/agpl-3.0-standalone.html)
Credits
-------
* Developers: (V17) Mohammed Irfan T, Contact: odoo@cybrosys.com
* Developers: (V16) Prathyunnan R, Contact: odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

22
automatic_project_task_timer/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohammed Irfan T(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from . import models

53
automatic_project_task_timer/__manifest__.py

@ -0,0 +1,53 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohammed Irfan T(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
{
'name': 'Automatic Project Task Timer',
'version': '17.0.1.0.0',
'category': 'Project',
'summary': 'Automatic Running Timer for Project Tasks',
'description': "This module helps you to track time sheet in project "
"using a real timer, it's starts when task is in "
"configured stage and stops when its moves to any other "
"stage and the timesheet will be recorded.",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'depends': ['hr_timesheet'],
'data': [
'security/ir.model.access.csv',
'views/project_task_views.xml',
'views/res_config_settings_views.xml',
'views/timer_configuration_views.xml'
],
'assets': {
'web.assets_backend': [
'automatic_project_task_timer/static/src/js/task_timer.js',
'automatic_project_task_timer/static/src/js/form_open.js',
'automatic_project_task_timer/static/src/xml/task_timer_templates.xml',
]},
'images': ['static/description/banner.jpg'],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

5
automatic_project_task_timer/doc/RELEASE_NOTES.md

@ -0,0 +1,5 @@
## Module <automatic_project_task_timer>
#### 08.07.2024
#### Version 17.0.1.0.0
#### ADD
- Initial commit for Automatic Project Task Timer

25
automatic_project_task_timer/models/__init__.py

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohammed Irfan T(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from . import account_analytic_line
from . import project_task
from . import res_config_settings
from . import timer_configuration

37
automatic_project_task_timer/models/account_analytic_line.py

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohammed Irfan T(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class AccountAnalyticLine(models.Model):
"""inherited the 'account.analytic.line' for showing the time records."""
_inherit = 'account.analytic.line'
date_start = fields.Datetime(string='Start Date', help='Shows the '
'starting time of '
'the timer')
date_end = fields.Datetime(string='End Date', help='Shows '
'the ending'
' time of '
'the timer')
timer_duration = fields.Float(string='Time Duration(Minutes)',
help='Shows the real time ')

147
automatic_project_task_timer/models/project_task.py

@ -0,0 +1,147 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohammed Irfan T(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from datetime import datetime
from odoo import api, fields, models
class Task(models.Model):
"""inherited the 'project.task' for running the timer """
_inherit = 'project.task'
task_timer = fields.Boolean(string='Timer', default=False,
help='Activated when task configured stage')
is_user_working = fields.Boolean(string='Is Current User Working',
compute='_compute_is_user_working',
help="Technical field indicating whether "
"the current user is working. ")
duration = fields.Float(string='Real Duration', store=True, copy=False,
readonly=False, help='Shows the duration')
is_status_stage = fields.Boolean(string='Stage Status',
help='To set the status of task at the '
'initial time.')
check_stage = fields.Integer(string='Stage',
compute='_compute_check_stage',
help='To check the stage whether it is '
'configured or not')
def _compute_check_stage(self):
"""To check the stage whether it is configured or not, for that
assigning the configured stage id to this field."""
for rec in self:
rec.check_stage = self.env['timer.configuration'].search(
[('project_id.id', '=', rec.project_id.id)]).stage_id.id
@api.constrains('stage_id')
def _task_timer(self):
"""Checks the status of timer setting and
toggle the task timer boolean to active """
self.write({
'is_status_stage': False
})
timer_setting = self.env['ir.config_parameter'].sudo().get_param(
'automatic_project_task_timer.timer_setting')
if timer_setting:
for rec in self.env['timer.configuration'].search([]):
if self.project_id == rec.project_id:
if self.stage_id.id == rec.stage_id.id:
self.write({'task_timer': True})
else:
self.write({'task_timer': False})
def _compute_is_user_working(self):
""" Checks whether the current user is working """
for order in self:
if order.timesheet_ids.filtered(
lambda x: (x.user_id.id == self.env.user.id) and (
not x.date_end)):
order.is_user_working = True
else:
order.is_user_working = False
@api.model
@api.constrains('task_timer')
def toggle_start(self):
"""The time sheet record will be created
by checking all the conditions """
time_line_obj = self.env['account.analytic.line']
for rec in self:
if rec.task_timer is True:
rec.write({'is_user_working': True})
for time_sheet in rec:
time_line_obj.create({
'name': '%s : %s' % (self.env.user.name,
time_sheet.name),
'task_id': time_sheet.id,
'user_id': self.env.user.id,
'project_id': time_sheet.project_id.id,
'date_start': datetime.now(),
})
else:
rec.write({'is_user_working': False})
for time_line in time_line_obj.search(
[('task_id', 'in', self.ids),
('date_end', '=', False)]):
time_line.write({'date_end': fields.Datetime.now()})
if time_line.date_start:
if time_line.date_end:
diff = fields.Datetime.from_string(
time_line.date_end) \
- fields.Datetime.from_string(
time_line.date_start).replace(
second=0, microsecond=0)
time_line.timer_duration = \
round(diff.total_seconds() / 60.0, 2)
time_line.unit_amount = \
round(diff.total_seconds() / (60.0 * 60.0), 2)
else:
time_line.unit_amount = 0.0
time_line.timer_duration = 0.0
else:
time_line.write({'date_start': fields.Datetime.now()})
if time_line.date_end:
diff = fields.Datetime.from_string(
time_line.date_end) \
- fields.Datetime.from_string(
time_line.date_start).replace(
second=0, microsecond=0)
time_line.timer_duration = \
round(diff.total_seconds() / 60.0, 2)
time_line.unit_amount = \
round(diff.total_seconds() / (60.0 * 60.0), 2)
else:
time_line.unit_amount = 0.0
time_line.timer_duration = 0.0
def get_working_duration(self):
"""Get the additional duration for 'open times'
i.e. productivity lines with no date_end."""
self.ensure_one()
duration = 0
for time in \
self.timesheet_ids.filtered(lambda time: not time.date_end):
if type(time.date_start) != datetime:
time.date_start = datetime.now()
duration = 0
else:
duration += \
(datetime.now() - time.date_start).total_seconds() / 60
return duration

33
automatic_project_task_timer/models/res_config_settings.py

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohammed Irfan T(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
"""inherited the 'res.config.settings'
for activating timer in project module."""
_inherit = 'res.config.settings'
timer_setting = fields.Boolean(
string='Task Timer',
config_parameter='automatic_project_task_timer.timer_setting',
help='Enable to activate the timer')

72
automatic_project_task_timer/models/timer_configuration.py

@ -0,0 +1,72 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Mohammed Irfan T(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models
class TimerConfiguration(models.Model):
"""Timer configuration model for configure the automatic timer
stage to activate the timer, Each project have different stages,
based on the configured stage for each project the timer will be runs."""
_name = 'timer.configuration'
_description = 'Timer Configuration'
project_id = fields.Many2one('project.project', string='Project',
help='Configure the project to activate the '
'timer')
stage_ids = fields.Many2many('project.task.type',
string='Stages',
help='To set the domain for stages')
stage_id = fields.Many2one('project.task.type', string='Stage',
help='Set the stage to activate the timer',
domain="[('id', 'in', stage_ids)]",
required=True)
@api.onchange('project_id')
def _onchange_project_id(self):
"""To set the domain for stage_id field to select the stages
from the stages of the selected project"""
data = []
for rec in self.env['project.task.type'].search([]):
if self.project_id.id in rec.project_ids.ids:
data.append(rec.id)
self.stage_ids = data
@api.model
def create(self, vals):
"""To set the status stage for all the tasks in the corresponding
project, so that the warning message will pop-ups when the form
opens. For that supering the ORM Create method to get the corresponding
project. """
projects = self.env['project.project'].sudo().browse(vals.get(
'project_id'))
tasks = self.env['project.task'].search([('project_id', '=' ,projects.id)])
for records in tasks:
if records.stage_id.id == vals.get('stage_id'):
records.write({
'is_status_stage': True
})
else:
records.write({
'is_status_stage': False
})
res = super(TimerConfiguration, self).create(vals)
return res

3
automatic_project_task_timer/security/ir.model.access.csv

@ -0,0 +1,3 @@
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_timer_configuration_manager,access.timer.configuration.manager,model_timer_configuration,project.group_project_manager,1,1,1,1
access_timer_configuration_user,access.timer.configuration.user,model_timer_configuration,project.group_project_user,0,0,1,0
1 id name model_id/id group_id/id perm_read perm_write perm_create perm_unlink
2 access_timer_configuration_manager access.timer.configuration.manager model_timer_configuration project.group_project_manager 1 1 1 1
3 access_timer_configuration_user access.timer.configuration.user model_timer_configuration project.group_project_user 0 0 1 0

BIN
automatic_project_task_timer/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
automatic_project_task_timer/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
automatic_project_task_timer/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
automatic_project_task_timer/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
automatic_project_task_timer/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
automatic_project_task_timer/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
automatic_project_task_timer/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
automatic_project_task_timer/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
automatic_project_task_timer/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
automatic_project_task_timer/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
automatic_project_task_timer/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
automatic_project_task_timer/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
automatic_project_task_timer/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
automatic_project_task_timer/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
automatic_project_task_timer/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
automatic_project_task_timer/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
automatic_project_task_timer/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
automatic_project_task_timer/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
automatic_project_task_timer/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
automatic_project_task_timer/static/description/assets/misc/Cybrosys R.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
automatic_project_task_timer/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
automatic_project_task_timer/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
automatic_project_task_timer/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
automatic_project_task_timer/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
automatic_project_task_timer/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
automatic_project_task_timer/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
automatic_project_task_timer/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
automatic_project_task_timer/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

3
automatic_project_task_timer/static/description/assets/misc/phone.svg

@ -0,0 +1,3 @@
<svg width="36" height="44" viewBox="0 0 36 44" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M7.25 19.3903C10.13 26.0689 14.76 31.5322 20.43 34.9305L24.83 29.7268C25.38 29.0778 26.17 28.889 26.86 29.1486C29.1 30.0218 31.51 30.4938 34 30.4938C35.11 30.4938 36 31.544 36 32.8537V41.1135C36 42.4233 35.11 43.4734 34 43.4734C15.22 43.4734 0 25.5143 0 3.35456C0 2.0448 0.9 0.994629 2 0.994629H9C10.11 0.994629 11 2.0448 11 3.35456C11 6.29268 11.4 9.1364 12.14 11.7795C12.36 12.5937 12.2 13.5259 11.65 14.1749L7.25 19.3903Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 565 B

BIN
automatic_project_task_timer/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
automatic_project_task_timer/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
automatic_project_task_timer/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
automatic_project_task_timer/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

9
automatic_project_task_timer/static/description/assets/misc/support (1) 1.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 43 KiB

6
automatic_project_task_timer/static/description/assets/misc/support-email.svg

@ -0,0 +1,6 @@
<svg width="49" height="37" viewBox="0 0 49 37" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group">
<path id="Vector" d="M2.23798 3.59132C3.53363 4.39742 21.5313 15.9748 22.2027 16.3917C22.8741 16.8087 23.5573 17.0032 24.6173 17.0032C25.6774 17.0032 26.3606 16.8087 27.0319 16.3917C27.7033 15.9748 45.701 4.39742 46.9967 3.59132C47.4796 3.29945 48.2923 2.77131 48.469 2.17368C48.7753 1.11741 48.4455 0.714355 47.138 0.714355H24.6173H2.09664C0.789214 0.714355 0.459412 1.13131 0.765656 2.17368C0.942335 2.78521 1.75506 3.29945 2.23798 3.59132Z" fill="white"/>
<path id="Vector_2" d="M48.0214 4.21664C47.0555 4.80037 38.3865 12.0831 32.6503 16.4611L42.3323 29.3171C42.5679 29.5951 42.6739 29.9286 42.5443 30.0954C42.403 30.2483 42.0967 30.1649 41.8494 29.9008L30.2357 18.3374C28.4807 19.6716 27.2439 20.5889 27.0319 20.7279C26.1249 21.2699 25.4889 21.3394 24.6173 21.3394C23.7457 21.3394 23.1096 21.2699 22.2027 20.7279C21.9789 20.5889 20.7539 19.6716 18.9989 18.3374L7.38519 29.9008C7.14961 30.1788 6.83159 30.2622 6.69025 30.0954C6.54891 29.9425 6.65491 29.5951 6.89048 29.3171L16.5607 16.4611C10.8245 12.0831 2.06126 4.80037 1.09541 4.21664C0.0588929 3.59121 0 4.32783 0 4.89766C0 5.46749 0 33.3893 0 33.3893C0 34.6819 1.61367 36.2941 2.76797 36.2941H24.6173H46.4666C47.6209 36.2941 48.999 34.668 48.999 33.3893C48.999 33.3893 48.999 5.4536 48.999 4.89766C48.999 4.31393 49.0697 3.59121 48.0214 4.21664Z" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
automatic_project_task_timer/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

9
automatic_project_task_timer/static/description/assets/misc/whatsapp 1.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 38 KiB

BIN
automatic_project_task_timer/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
automatic_project_task_timer/static/description/assets/modules/1.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
automatic_project_task_timer/static/description/assets/modules/2.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 KiB

BIN
automatic_project_task_timer/static/description/assets/modules/3.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

BIN
automatic_project_task_timer/static/description/assets/modules/4.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
automatic_project_task_timer/static/description/assets/modules/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
automatic_project_task_timer/static/description/assets/modules/6.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
automatic_project_task_timer/static/description/assets/screenshots/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

BIN
automatic_project_task_timer/static/description/assets/screenshots/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
automatic_project_task_timer/static/description/assets/screenshots/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
automatic_project_task_timer/static/description/assets/screenshots/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
automatic_project_task_timer/static/description/assets/screenshots/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
automatic_project_task_timer/static/description/assets/screenshots/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

BIN
automatic_project_task_timer/static/description/assets/screenshots/7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

BIN
automatic_project_task_timer/static/description/assets/screenshots/8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

BIN
automatic_project_task_timer/static/description/assets/screenshots/9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
automatic_project_task_timer/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

BIN
automatic_project_task_timer/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
automatic_project_task_timer/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

864
automatic_project_task_timer/static/description/index.html

@ -0,0 +1,864 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Odoo App 3 Index</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
crossorigin="anonymous">
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
</head>
<body>
<section>
<div class="container"
style="font-family: 'Inter', sans-serif !important;background-color: #fff !important;">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between flex-wrap align-items-sm-center"
style="border-bottom:1px solid rgba(0, 0, 0, 0.22)">
<div class="my-3">
<img src="assets/misc/Cybrosys R.png"
style="width:auto !important; height:40px !important">
</div>
<div class="my-3 d-flex align-items-center">
<div class="text-center"
style="background-color:#017E84 !important;font-size: 0.8rem !important; color:#fff !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;">
Community
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 text-center d-flex align-items-center flex-column"
style="margin: 80px 0px !important;">
<h1 style="font-size: 2.8rem;font-weight: 700; color:
#1A202C;">
Automatic Project Task Timer</h1>
<p class="my-3 mb-4"
style="max-width: 80%; font-weight: 400 !important; line-height: 32px; color: #718096;">
Automatic Running Timer for Project Tasks at the Configured
Stages.
</p>
<div style="width: 80%; margin-top: 3rem;">
<img src="assets/screenshots/hero.gif"
class="img-responsive" width="100%" height="auto">
</div>
</div>
</div>
<div class="container mt-5 mb-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#714b67 !important">
Key Highlights
</p>
</div>
<div class="row py-4">
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Feature Control:
</p>
<p class="m-0" style="color:#718096">Control the
availability of features from the configuration
settings.</p>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Timer Activation: </p>
<p class="m-0" style="color:#718096">Streamline
The timer will be run if it is activated in the
configuration settings.</p>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Auto-Start Timer: </p>
<p class="m-0" style="color:#718096"> Automatically
starts to count from the beginning whether the
task is moved to In progress stage by changing
the stage by clicking or dragging.</p>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Time Recording:
</p>
<p class="m-0" style="color:#718096">Starting time
and ending time will be recorded in the
timesheet.
</p>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Odoo 17.0 Community :
</p>
<p class="m-0" style="color:#718096">Available in
Odoo 17.0
Community.</p>
</div>
</div>
</div>
</div>
</div>
<div class="container rounded">
<ul class="nav nav-tabs d-flex"
style="width: fit-content;margin: 0 auto;gap: 1rem;">
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a class="active show" data-toggle="tab" href="#tab1"
style="color: #fff;font-weight: 500; background-color: #714B67; text-decoration: none;">
<i class="fa-regular fa-image pr-2"
style="color: #fff;"></i>
Screenshots</a></li>
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a data-toggle="tab" href="#tab2"
style="color: #fff;font-weight: 500; text-decoration: none;"><i
class="fa-solid fa-star pr-2"
style="color: #fff;"></i>Features</a></li>
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a data-toggle="tab" href="#tab3"
style="color: #fff;font-weight: 500; text-decoration: none; background-color: #714B67;"><i
class="fa-solid fa-book-open pr-2"
style="color: #fff;"></i>Released Notes</a></li>
</ul>
<div class="tab-content"
style="background-color: rgba(121, 113, 119, 0.04);">
<div id="tab1" class="tab-pane fade in active show">
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/1.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Set the User Group for Project as Administrator to see the
Configuration menu.
</h4>
<p>
Go to Settings -> Users & Companies -> Users -> Project :
Administrator
</p>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/2.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Configure your custom stage of each project to make the
automatic timer on that particular stage only from the Timer
Configuration menu.
</h4>
<p>
Go to Project -> Configuration -> Timer Configuration
</p>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/3.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Timer Configuration
</h4>
<p>
Set up your Projects and related Stages.
</p>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/4.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Activate the feature from configuration setting.</h4>
<p>
Go to Projects -> Configuration
->
Settings.
Activate the Task Timer boolean to activate the run timer.
</p>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/5.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Create a new task.
</h4>
<p>Add a task under the timer configured stage.</p>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/6.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
The timer is assigned to zero when a task is in other stage.
</h4>
<p>
A real duration field will be seen on the timesheet page. In
the other stages the timer won't be run, and also timesheet not
be recorded.
</p>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/7.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
The timer starts to run when a task comes in Configured stage.
</h4>
<p>
The timer starts running and timesheet also created with the
starting time.
</p>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/8.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
The timer will stop when a task comes to the other stage.
</h4>
<p>
The timer stops running when the task moves to any other stage
and the timesheet will update with the ending time also we can
see the time when the timer stops.
</p>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/9.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
The timer will also be activated when a task is dragged to the
Configured stage.
</h4>
</div>
</div>
</div>
</div>
<div id="tab2" class="tab-pane fade">
<div class="col-mg-12" style="padding: 1rem 4rem;">
<ul style="list-style: none; padding: 1rem 0;font-weight: 500;">
<li class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<span style="margin-right: 12px;"><img
src="assets/misc/star (1) 2.svg"
alt=""
width="16px">Real-time tracking starts when the task is in the configured stage.</span>
</li>
<li class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<span style="margin-right: 12px;"><img
src="assets/misc/star (1) 2.svg"
alt=""
width="16px">The timer stops and the timesheet is recorded when the task moves to another stage.</span>
</li>
</ul>
</div>
</div>
<div id="tab3" class="tab-pane fade">
<div class="col-mg-12 active" style="padding: 1rem 4rem;">
<div class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="d-flex mb-3"
style="font-size: 0.8rem; font-weight: 500;"><span>Version
17.0.1.0.0</span><span
class="px-2">|</span><span
style="color: #714B67;font-weight: 600;">Released on:08th Jan 2024</span>
</div>
<p class="m-0"
style=" color:#718096!important; font-size:1rem !important;line-height: 28px;">
Initial Commit for Automatic Project Task Timer
</p>
</div>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Related Products</p>
</div>
</div>
<div id="myCarousel" class="carousel slide py-3" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<div class="row p-4">
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/base_accounting_kit/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/1.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Odoo 17 Full Accounting Kit</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/auto_database_backup/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/2.gif"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Automatic Database Backup To Local
Server, Remote Server,Google Drive,
Dropbox, Onedrive, Nextcloud and
Amazon S3</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/direct_print_odoo/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/3.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Direct Print</p>
</div>
</a>
</div>
</div>
</div>
</div>
<div class="carousel-item">
<div class="row p-4">
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/mail_push_notification/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/4.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Push Notification From ChatBox</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/login_user_detail/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px;">
<img src="assets/modules/5.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
User Log Details</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/hr_payroll_account_community/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px;">
<img src="assets/modules/6.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Odoo17 Payroll Accounting</p>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
<a class="carousel-control-prev" href="#myCarousel"
data-slide="prev" style="width: 35px; color: #000;">
<span class="carousel-control-prev-icon">
<i class="fa fa-chevron-left"
style="font-size: 24px;"></i>
</span>
</a>
<a class="carousel-control-next" href="#myCarousel"
data-slide="next" style="width: 35px; color: #000;">
<span class="carousel-control-next-icon">
<i class="fa fa-chevron-right"
style="font-size: 24px;"></i>
</span>
</a>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Our Services</p>
</div>
</div>
<div class="container my-5">
<div class="row py-3">
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#13EA36 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/cogs.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Customization</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#DBC711; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/wrench.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Implementation</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#FF6B6B ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/lifebuoy.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Support</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#FFA801 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/user.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Hire
Odoo Developer</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#54A0FF; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/puzzle.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Integration</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#6D7680 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/update.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Migration</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#786FA6 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/consultation.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Consultancy</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#F8A5C2 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/training.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Implementation</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#E6BE26; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/license.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Licensing Consultancy</p>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Our Industries</p>
</div>
</div>
<div class="container">
<div class="row my-5 py-4">
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100 "
style="border-right: 1px solid rgb(209, 209, 209); border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; box-shadow: 6px 0 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/trading-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Trading</p>
<p>Easily procure and sell your products</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgb(209, 209, 209); padding: 30px;">
<img src="assets/icons/pos-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">POS</p>
<p>Easy configuration and convivial experience</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding: 30px; box-shadow: 0 5px 10px rgba(228, 227, 227, 0.373)">
<img src="assets/icons/education-black.png"
width="42px" height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Education</p>
<p>A platform for educational management</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; ">
<img src="assets/icons/manufacturing-black.png"
width="42px" height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Manufacturing</p>
<p>Plan, track and schedule your operations</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;">
<img src="assets/icons/ecom-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">E-commerce
& Website</p>
<p>Mobile friendly, awe-inspiring product pages</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;box-shadow: 0 -5px 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/service-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Service
Management</p>
<p>Keep track of services and invoice</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px; ">
<img src="assets/icons/restaurant-black.png"
width="42px" height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Restaurant</p>
<p>Run your bar or restaurant methodically</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style=" padding: 30px;box-shadow: -5px 0 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/hotel-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Hotel
Management</p>
<p>An all-inclusive hotel management application</p>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Support</p>
</div>
</div>
<div class="container my-5">
<div class="row" style="background-color: #FFFAFE;">
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center"
style="border-right: 1px solid #D9D9D9;">
<div style="padding: 30px;">
<div class="d-flex align-items-center">
<img src="assets/misc/support (1) 1.svg" alt=""
width="60px" style="margin-right: 12px;">
<div style="padding: 0px 8px;">
<span
style="color: #714B67;font-size: 24px;font-weight: 600;padding-bottom: 1rem;">Need
Help?</span>
<p class="m-0" style="color:#718096;">Got
questions or need help? Get in touch.</p>
<div style="font-weight: 400;"><span><img
src="assets/misc/support-email.svg"
alt=""
width="18px"
style="filter: invert(1);margin-right: 0.8rem;"></span>odoo@cybrosys.com
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center">
<div style="padding: 30px;">
<div class="d-flex align-items-center">
<img src="assets/misc/whatsapp 1.svg" alt=""
width="60px" style="margin-right: 12px;">
<div>
<span style="color: #714B67;font-size: 24px;font-weight: 600;">WhatsApp</span>
<p class="m-0" style="color:#718096;">Say hi to
us on WhatsApp!</p>
<div style="font-weight: 400; font-size: 16px;"><span><img
src="assets/misc/phone.svg"
alt="" width="14px"
style="filter: invert(1); margin-right: 0.8rem;"></span>+91
99456767686
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html>

15
automatic_project_task_timer/static/src/js/form_open.js

@ -0,0 +1,15 @@
/** @odoo-module **/
import { patch } from "@web/core/utils/patch";
import { FormRenderer } from '@web/views/form/form_renderer';
import { useService } from "@web/core/utils/hooks";
patch(FormRenderer.prototype, {
// Patched the form render to show the notification for already existing task.
setup(){
super.setup();
if(this.props.record.data.is_status_stage)
{
this.notification = useService("notification");
this.notification.add("Timer will not works properly for already existing task, To make that, Change the stage once again after activating task timer from configuration.", {title: "Warning", type: "danger"});
}
},
});

89
automatic_project_task_timer/static/src/js/task_timer.js

@ -0,0 +1,89 @@
/** @odoo-module **/
import { registry } from "@web/core/registry";
import { useService } from "@web/core/utils/hooks";
import { parseFloatTime } from "@web/views/fields/parsers";
import { useInputField } from "@web/views/fields/input_field_hook";
const { Component, useState, onWillUpdateProps, onWillStart, onWillDestroy } = owl;
// Function for converting the time and return the value in each seconds.
function formatMinutes(value) {
if (value === false) {
return "";
}
const isNegative = value < 0;
if (isNegative) {
value = Math.abs(value);
}
let min = Math.floor(value);
let sec = Math.floor((value % 1) * 60);
sec = `${sec}`.padStart(2, "0");
min = `${min}`.padStart(2, "0");
return `${isNegative ? "-" : ""}${min}:${sec}`;
}
export class TaskTimer extends Component {
//Extend component to add TaskTimer
setup() {
this.orm = useService('orm');
this.state = useState({
// Duration is expected to be given in minutes
duration:this.props?.value ? this.props.value : this.props.record.data.duration,
});
useInputField({
getValue: () => this.durationFormatted,
refName: "numpadDecimal",
parse: (v) => parseFloatTime(v),
});
this.ongoing =
this.props.ongoing !== undefined
? this.props.ongoing
: this.props.record.data.is_user_working;
onWillStart(async () => {
//Check the status while form rendering.
if(this.props.ongoing === undefined && !this.props.record.model.useSampleModel && this.props.record.data.stage_id[0] == this.props.record.data.check_stage) {
const additionalDuration = await this.orm.call('project.task', 'get_working_duration', [this.props.record.resId]);
this.state.duration += additionalDuration;
}
if (this.ongoing) {
this._runTimer();
}
});
onWillUpdateProps((nextProps) => {
const newOngoing = "ongoing" in nextProps? nextProps.ongoing: "record" in nextProps && nextProps.record.data.is_user_working;
const rerun = !this.ongoing && newOngoing;
this.ongoing = newOngoing;
if (rerun) {
this.state.duration = nextProps.record.data.duration;
this._runTimer();
}
else{
this.state.duration = nextProps.record.data.duration
}
});
onWillDestroy(() => clearTimeout(this.timer));
}
//Getting the formatted time duration
get durationFormatted() {
return formatMinutes(this.state.duration);
}
//Function for setting the interval and call in each 1000ms
_runTimer() {
this.timer = setTimeout(() => {
if (this.ongoing) {
this.state.duration += 1 / 60;
this._runTimer();
}
}, 1000);
}
}
TaskTimer.template = "TaskTimerTemplate";
export const taskTimer = {
component: TaskTimer,
supportedTypes : ["float"],
};
//Adding the widget to the field registry
registry.category("fields").add("task_timer", taskTimer);
registry.category("formatters").add("task_timer", formatMinutes);

8
automatic_project_task_timer/static/src/xml/task_timer_templates.xml

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Template for getting the timer widget.-->
<templates id="template" xml:space="preserve">
<t t-name="TaskTimerTemplate" owl="1">
<span t-if="props.readonly" t-esc="durationFormatted"/>
<input t-else="" t-att-id="props.id" t-ref="numpadDecimal" t-att-placeholder="props.placeholder" inputmode="numeric" class="o_input" />
</t>
</templates>

33
automatic_project_task_timer/views/project_task_views.xml

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Adding the relative fields in 'project.task' module-->
<record id="project_task_view_form" model="ir.ui.view">
<field name="name">project.task.view.form.inherit.automatic.project.task.timer</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_form2"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='tag_ids']" position="after">
<label for="task_timer"/>
<div class="o_row" style="display: inline-block;">
<field name="task_timer" widget="boolean_toggle"
invisible="true"/>
</div>
<field name="is_status_stage" invisible="true"/>
<field name="check_stage" invisible="true"/>
</xpath>
<xpath expr="//field[@name='timesheet_ids']/tree/field[@name='unit_amount']"
position="before">
<field name="date_start" required="1"/>
<field name="date_end" required="1"/>
<field name="timer_duration" column_invisible="1"/>
</xpath>
<xpath expr="//field[@name='partner_id']" position="after">
<field name="is_user_working" invisible="1"/>
<field name="duration" id="duration" widget="task_timer"
style="color: red;"
readonly = "is_user_working"
sum="real duration"/>
</xpath>
</field>
</record>
</odoo>

21
automatic_project_task_timer/views/res_config_settings_views.xml

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Adding task timer in configuration-->
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">
res.config.settings.view.form.inherit.automatic.project.task.timer
</field>
<field name="model">res.config.settings</field>
<field name="inherit_id"
ref="project.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//block[@id='tasks_management']/setting[@id='project_milestone']"
position="after">
<setting id="timer_setting"
help="Timer will automatically activate for tasks in progress stage">
<field name="timer_setting"/>
</setting>
</xpath>
</field>
</record>
</odoo>

26
automatic_project_task_timer/views/timer_configuration_views.xml

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Tree view record of the timer configuration model-->
<record id="timer_configuration_view_tree" model="ir.ui.view">
<field name="name">timer.configuration.view.tree</field>
<field name="model">timer.configuration</field>
<field name="arch" type="xml">
<tree string="Configuration" editable="bottom">
<field name="project_id"/>
<field name="stage_id"/>
<field name="stage_ids" column_invisible="1"/>
</tree>
</field>
</record>
<!-- Record action for timer configuration model-->
<record id="timer_configuration_action" model="ir.actions.act_window">
<field name="name">Timer Configuration</field>
<field name="res_model">timer.configuration</field>
<field name="view_mode">tree</field>
</record>
<!-- Menu action for timer configuration model-->
<menuitem id="timer_configuration_menu_root" name="Timer Configuration"
action="timer_configuration_action"
parent="project.menu_project_config">
</menuitem>
</odoo>
Loading…
Cancel
Save