diff --git a/project_task_sequence_number/__manifest__.py b/project_task_sequence_number/__manifest__.py
index ed8938dd0..7faf66893 100644
--- a/project_task_sequence_number/__manifest__.py
+++ b/project_task_sequence_number/__manifest__.py
@@ -21,7 +21,7 @@
###############################################################################
{
'name': 'Project & Project Task Sequence Number',
- 'version': '17.0.1.0.0',
+ 'version': '17.0.1.0.1',
'category': 'Project',
'summary': 'Add dynamic sequence number for project and task.',
'description': 'This helps to give unique sequence number to project and '
@@ -35,7 +35,7 @@
'data': [
'data/ir_sequence_data.xml',
'views/project_project_views.xml',
- 'views/project_task_views.xml'
+ 'views/project_task_views.xml',
],
'images': ['static/description/banner.jpg'],
'license': 'AGPL-3',
diff --git a/project_task_sequence_number/doc/RELEASE_NOTES.md b/project_task_sequence_number/doc/RELEASE_NOTES.md
index 056e22925..f928eb939 100644
--- a/project_task_sequence_number/doc/RELEASE_NOTES.md
+++ b/project_task_sequence_number/doc/RELEASE_NOTES.md
@@ -3,3 +3,8 @@
#### Version 17.0.1.0.0
#### ADD
- Initial commit for Project & Project Task Sequence Number
+
+#### 18.06.2025
+#### Version 17.0.1.0.1
+#### BUG FIX
+- Added a sequence for sub-tasks also.
\ No newline at end of file
diff --git a/project_task_sequence_number/models/project_task.py b/project_task_sequence_number/models/project_task.py
index d14d5011b..006adcfec 100644
--- a/project_task_sequence_number/models/project_task.py
+++ b/project_task_sequence_number/models/project_task.py
@@ -19,62 +19,67 @@
# If not, see .
#
###############################################################################
-from odoo import api, fields, models
+from odoo import api, fields, models
+#
+#
class ProjectTask(models.Model):
- """In ProjectTask class, which will add a new field for task sequence.
- When we create the record, the sequence will be based on the
- task_sequence."""
_inherit = 'project.task'
- task_sequence = fields.Char(string='Task Sequence', readonly=True,
- copy=False, default='New',
- help='Unique sequence number of the task.')
+ task_sequence = fields.Char(string='Task Sequence', readonly=True, copy=False, default='New',
+ help='Hierarchical sequence number of the task.')
@api.model_create_multi
- def create(self, vals):
- """Overwrite the function create to calculate the sequence value based
- on the given prefix"""
- for records in vals:
- if not records['project_id']:
- if records.get('task_sequence', 'New') == 'New':
- records['task_sequence'] = self.env['ir.sequence']. \
- next_by_code(
- 'project.task') or 'New'
- else:
- project = self.env['project.project'].browse(
- records['project_id'])
- if project.task_sequence_id.prefix:
- records['task_sequence'] = '%s/%s/%s' % \
- (project.project_sequence,
- project.task_sequence_id.prefix,
- self.env['ir.sequence'].
- next_by_code('project.task') or
- 'New')
- else:
- records['task_sequence'] = '%s/%s' % \
- (project.project_sequence,
- self.env['ir.sequence'].
- next_by_code(
- 'project.task') or
- 'New')
- return super(ProjectTask, self).create(records)
+ def create(self, vals_list):
+ tasks = super(ProjectTask, self).create(vals_list)
+ for task in tasks:
+ task.with_context(bypass_sequence=True)._compute_custom_sequence()
+ return tasks
def write(self, vals):
- """Overwrite the function to update the sequence """
- if vals.get('project_id'):
- project = self.env['project.project'].browse(vals.get(
- 'project_id'))
- if project.task_sequence_id.prefix:
- vals['task_sequence'] = '%s/%s/%s' % \
- (project.project_sequence,
- project.task_sequence_id.prefix,
- self.env['ir.sequence'].next_by_code(
- 'project.task') or 'New')
+ result = super(ProjectTask, self).write(vals)
+ if not self.env.context.get('bypass_sequence'):
+ for task in self:
+ task.with_context(bypass_sequence=True)._compute_custom_sequence()
+ return result
+
+ def _compute_custom_sequence(self):
+ for task in self:
+ task_seq = self.env['ir.sequence'].next_by_code('project.task') or 'New'
+
+ if not task.project_id or not task.project_id.project_sequence:
+ continue # Skip if missing project data
+
+ if task.parent_id:
+ parent_seq = task.parent_id.task_sequence or task.parent_id.name
+ subtask_number = task._get_sibling_count(task.parent_id)
+
+ # Use sub-task name if provided
+ # subtask_name = (task.name or '').split(',')[0].strip()
+ # if subtask_name:
+ # sequence = f"{parent_seq}/{subtask_name}"
+ # else:
+ sequence = f"{parent_seq}/Sub Task {subtask_number}"
else:
- vals['task_sequence'] = '%s/%s' % \
- (project.project_sequence,
- self.env['ir.sequence'].
- next_by_code('project.task') or 'New')
- return super(ProjectTask, self).write(vals)
+ task_number = task._get_task_count(task.project_id)
+ formatted_task_number = str(task_number).zfill(4)
+
+ sequence = self.env['ir.sequence'].search([('code', '=', 'project.task')], limit=1)
+ task_prefix = sequence.prefix if sequence else ''
+ sequence = f"{task.project_id.project_sequence}-{task_prefix}{formatted_task_number}"
+
+ # Avoid recursion
+ task.sudo().write({'task_sequence': sequence})
+
+ def _get_task_count(self, project):
+ return self.search_count([
+ ('project_id', '=', project.id),
+ ('parent_id', '=', False)
+ ])
+
+ def _get_sibling_count(self, parent_task):
+ return self.search_count([
+ ('parent_id', '=', parent_task.id),
+ ('id', '!=', self.id)
+ ]) + 1
diff --git a/project_task_sequence_number/static/description/assets/screenshots/img.png b/project_task_sequence_number/static/description/assets/screenshots/img.png
new file mode 100644
index 000000000..435634360
Binary files /dev/null and b/project_task_sequence_number/static/description/assets/screenshots/img.png differ
diff --git a/project_task_sequence_number/static/description/assets/screenshots/task7.png b/project_task_sequence_number/static/description/assets/screenshots/task7.png
new file mode 100644
index 000000000..df8c4a9bf
Binary files /dev/null and b/project_task_sequence_number/static/description/assets/screenshots/task7.png differ
diff --git a/project_task_sequence_number/static/description/index.html b/project_task_sequence_number/static/description/index.html
index 5a6241176..441911efa 100644
--- a/project_task_sequence_number/static/description/index.html
+++ b/project_task_sequence_number/static/description/index.html
@@ -212,7 +212,8 @@
We can specify 'Prefix' of the task.
-
+
+
+
+
+

+
+
+
+ When a sub-task is created, the sequence should be
+
+
+