diff --git a/advanced_project_management_system/README.rst b/advanced_project_management_system/README.rst
new file mode 100755
index 000000000..6570bf577
--- /dev/null
+++ b/advanced_project_management_system/README.rst
@@ -0,0 +1,49 @@
+ .. image:: https://img.shields.io/badge/license-LGPL--3-green.svg
+ :target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html
+ :alt: License: LGPL-3
+
+Advanced project management system
+==================================
+All additional features of project module are in single module
+
+Configuration
+=============
+- No additional configuration required
+
+License
+-------
+General Public License, Version 3 (LGPL v3).
+(https://www.gnu.org/licenses/lgpl-3.0-standalone.html)
+
+Company
+-------
+* `Cybrosys Techno Solutions `__
+
+Credits
+-------
+* Developer: (V16) Sreeshanth V S, Jumana Jabin MP,
+ (V17) Kailas Krishna
+ 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 `__
+
+Further information
+===================
+HTML Description: ``__
diff --git a/advanced_project_management_system/__init__.py b/advanced_project_management_system/__init__.py
new file mode 100755
index 000000000..b7e1aa45e
--- /dev/null
+++ b/advanced_project_management_system/__init__.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from . import models
+from . import report
+from . import wizard
diff --git a/advanced_project_management_system/__manifest__.py b/advanced_project_management_system/__manifest__.py
new file mode 100755
index 000000000..fa531ce6d
--- /dev/null
+++ b/advanced_project_management_system/__manifest__.py
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+{
+ 'name': "Advanced Project Management System",
+ "version": "17.0.1.0.0",
+ "category": "Project",
+ "summary": "Advanced Project Management System can handle projects,"
+ "tasks, due dates, checklists",
+ "description": """Advanced Project Management System designed to streamline
+ every aspect of your projects. From handling projects and tasks to managing
+ due dates and checklists, this all-in-one solution simplifies project and
+ task management for you.""",
+ 'author': 'Cybrosys Techno Solutions',
+ 'company': 'Cybrosys Techno Solutions',
+ 'maintainer': 'Cybrosys Techno Solutions',
+ 'website': "https://www.cybrosys.com",
+ 'depends': ['project', 'hr_timesheet'],
+ 'data': [
+ 'security/advanced_project_management_system_security.xml',
+ 'security/ir.model.access.csv',
+ 'data/ir_cron_data.xml',
+ 'data/mail_template_data.xml',
+ 'data/ir_actions_server_data.xml',
+ 'data/ir_sequence_data.xml',
+ 'views/project_milestone_views.xml',
+ 'views/res_config_settings_views.xml',
+ 'views/project_checklist_views.xml',
+ 'views/project_task_checklist_views.xml',
+ 'views/project_task_views.xml',
+ 'views/project_task_checklist_template_views.xml',
+ 'views/project_checklist_template_views.xml',
+ 'views/project_category_views.xml',
+ 'views/project_project_views.xml',
+ 'views/ir_attachment_views.xml',
+ 'views/project_issue_views.xml',
+ 'report/project_project_template.xml',
+ 'report/project_task_template.xml',
+ 'report/ir_action_report.xml',
+ 'report/project_task_burnup_chart_report_views.xml',
+ 'report/project_task_velocity_chart_report_views.xml',
+ 'wizard/project_task_checklist_import_views.xml',
+ 'wizard/project_stage_update_views.xml',
+ 'wizard/project_task_mass_update_views.xml',
+ 'wizard/project_shortcut_views.xml'
+ ],
+ 'assets': {
+ 'web.assets_backend': {
+ 'advanced_project_management_system/static/src/scss/style.scss',
+ 'advanced_project_management_system/static/src/js/burnup_chart_search_model.js',
+ 'advanced_project_management_system/static/src/js/burnup_chart_model.js',
+ 'advanced_project_management_system/static/src/js/burnup_chart_view.js',
+ 'advanced_project_management_system/static/src/xml/burnup_chart_view.xml',
+ 'advanced_project_management_system/static/src/xml/chatter_templates.xml',
+ 'advanced_project_management_system/static/src/js/composer_patch.js',
+ 'advanced_project_management_system/static/src/js/velocity_chart_model.js',
+ 'advanced_project_management_system/static/src/js/velocity_chart_search_model.js',
+ 'advanced_project_management_system/static/src/js/velocity_chart_view.js',
+ 'advanced_project_management_system/static/src/xml/velocity_chart_view.xml',
+ },
+ },
+ 'images': ['static/description/banner.jpg'],
+ 'license': 'LGPL-3',
+ 'installable': True,
+ 'auto_install': False,
+ 'application': False,
+}
diff --git a/advanced_project_management_system/data/ir_actions_server_data.xml b/advanced_project_management_system/data/ir_actions_server_data.xml
new file mode 100755
index 000000000..bc878d1a0
--- /dev/null
+++ b/advanced_project_management_system/data/ir_actions_server_data.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ Mass Stage Update
+
+
+ code
+
+ action = record.project_multi_stage_update()
+
+
+
+
+ Mass Update
+
+
+ code
+
+ action = record.task_mass_update()
+
+
+
+
diff --git a/advanced_project_management_system/data/ir_cron_data.xml b/advanced_project_management_system/data/ir_cron_data.xml
new file mode 100755
index 000000000..65045b8fd
--- /dev/null
+++ b/advanced_project_management_system/data/ir_cron_data.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ Document Expire
+
+ code
+ model.document_expire_notification()
+ 1
+ days
+ -1
+
+
+
+ Task overdue notification
+
+ code
+ model.task_overdue_notification()
+ 1
+ days
+ -1
+
+
+
diff --git a/advanced_project_management_system/data/ir_sequence_data.xml b/advanced_project_management_system/data/ir_sequence_data.xml
new file mode 100755
index 000000000..3dec19c1f
--- /dev/null
+++ b/advanced_project_management_system/data/ir_sequence_data.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Sequence
+ project.issue
+ PI
+ 3
+
+
+
diff --git a/advanced_project_management_system/data/mail_template_data.xml b/advanced_project_management_system/data/mail_template_data.xml
new file mode 100755
index 000000000..097fc01d2
--- /dev/null
+++ b/advanced_project_management_system/data/mail_template_data.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+ Document Expire Notification
+
+
+ {{object.company_id.email}}
+ {{object.partner_id.email}}
+ Document Expiry Notification for
+ {{object.name}}
+
+
+
+ Dear Mr/Ms,
+
+ Your document
+
+
+
+ is expiring on
+
+
+
+
+ Thank you
+
+
+
+
+
diff --git a/advanced_project_management_system/doc/RELEASE_NOTES.md b/advanced_project_management_system/doc/RELEASE_NOTES.md
new file mode 100755
index 000000000..c873aa5fb
--- /dev/null
+++ b/advanced_project_management_system/doc/RELEASE_NOTES.md
@@ -0,0 +1,6 @@
+## Module
+
+#### 30.03.2024
+#### Version 17.0.1.0.0
+#### ADD
+- Initial commit for Advanced project management system
diff --git a/advanced_project_management_system/models/__init__.py b/advanced_project_management_system/models/__init__.py
new file mode 100755
index 000000000..822cadea3
--- /dev/null
+++ b/advanced_project_management_system/models/__init__.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from . import ir_attachment
+from . import project_project
+from . import project_category
+from . import project_checklist
+from . import project_checklist_info
+from . import project_checklist_template
+from . import project_issue
+from . import project_task
+from . import project_task_checklist
+from . import project_task_checklist_info
+from . import project_task_checklist_template
+from . import project_task_type
+from . import res_config_settings
diff --git a/advanced_project_management_system/models/ir_attachment.py b/advanced_project_management_system/models/ir_attachment.py
new file mode 100755
index 000000000..9d07710ea
--- /dev/null
+++ b/advanced_project_management_system/models/ir_attachment.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import api, fields, models
+
+
+class IrAttachment(models.Model):
+ """ Added document expiry information"""
+ _inherit = 'ir.attachment'
+
+ expiry_date = fields.Date(string='Expiry Date',
+ help="for setting expiry date for the document")
+ expiry_notification = fields.Boolean(string='Expiry Date Notification',
+ help="For sending expiry notification")
+ partner_id = fields.Many2one('res.partner', string="partner",
+ help="For adding the partner ")
+ document_email_to = fields.Char(
+ default=lambda self: self.env['ir.config_parameter'].sudo().get_param(
+ 'res.config.settings.email'), string="Email to",
+ help="For getting owner email")
+ document_mai_customer = fields.Boolean(
+ default=lambda self: self.env['ir.config_parameter'].sudo().get_param(
+ 'res.config.settings.notify_customer'), string="Email to customer",
+ help="Notify email to customer ")
+
+ def document_expire_notification(self):
+ """ Automatically sent email when the
+ document expiration date is over"""
+ if self.env['ir.config_parameter'].sudo().get_param(
+ 'res.config.settings.notify_customer'):
+ attachments = self.search([('expiry_date', '!=', None)])
+ for attachment in attachments:
+ if attachment.expiry_date < fields.Date.today():
+ mail_template = attachment.env.ref(
+ 'advanced_project_management_system.document_expire_notification_to_customer')
+ mail_template.send_mail(attachment.id, force_send=True)
+ attachments = self.search([('expiry_date', '!=', None)])
+ for attachment in attachments:
+ if attachment.expiry_notification:
+ if attachment.expiry_date < fields.Date.today():
+ mail_template = attachment.env.ref(
+ 'advanced_project_management_system.document_expire_notification_mail_template')
+ mail_template.send_mail(attachment.id, force_send=True)
+
+ @api.onchange('res_id')
+ def _onchange_res_id(self):
+ """ Compute customer name and add to attachment from projects"""
+ attachments = self.search([('res_model', '=', 'project.project')])
+ for attachment in attachments:
+ projects = self.env['project.project'].search(
+ [('id', '=', attachment.res_id)])
+ if projects.partner_id:
+ attachment.partner_id = projects.partner_id.id
diff --git a/advanced_project_management_system/models/project_category.py b/advanced_project_management_system/models/project_category.py
new file mode 100755
index 000000000..bb27729cc
--- /dev/null
+++ b/advanced_project_management_system/models/project_category.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectCategory(models.Model):
+ """ Setting up the project category"""
+ _name = "project.category"
+ _description = "Project categories"
+
+ name = fields.Char(string='Project Category', tracking=True,
+ help="Name of the category")
+ is_active = fields.Boolean(string='Active',
+ help="Check is it active or not ")
diff --git a/advanced_project_management_system/models/project_checklist.py b/advanced_project_management_system/models/project_checklist.py
new file mode 100755
index 000000000..400c33ed7
--- /dev/null
+++ b/advanced_project_management_system/models/project_checklist.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectChecklist(models.Model):
+ """ Project checklist information"""
+ _name = "project.checklist"
+ _description = "Project checklist"
+
+ name = fields.Char(string='Name', required=True,
+ name="name of the checklist")
+ description = fields.Char(string='Description', required=True,
+ help="Description about the checklist ")
+ company_id = fields.Many2one('res.company', string='Company',
+ required=True, help="Company information",
+ default=lambda self: self.env.company.id)
diff --git a/advanced_project_management_system/models/project_checklist_info.py b/advanced_project_management_system/models/project_checklist_info.py
new file mode 100755
index 000000000..484c4bb1b
--- /dev/null
+++ b/advanced_project_management_system/models/project_checklist_info.py
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectChecklistInfo(models.Model):
+ """ Project checklist details"""
+ _name = "project.checklist.info"
+ _description = "Project checklist information"
+
+ checklist_id = fields.Many2one('project.checklist',
+ string='Name',
+ help="Project checklist details")
+ description = fields.Char(string='Description',
+ related='checklist_id.description',
+ help="description about the checklist")
+ project_id = fields.Many2one('project.project', string="Project",
+ help="details of the project")
+ date = fields.Date(string='Date', default=fields.Date.today(),
+ help="get the date ")
+ state = fields.Selection(
+ selection=[('new', 'New'), ('progres', 'In Progress'),
+ ('done', 'Done'), ('cancel', 'Cancel')], default='new',
+ readonly=False, string="Status",
+ help="Get information about the state")
+
+ def action_set_checklist_complete(self):
+ """ Mark the checklist progress and completion"""
+ if self.state in ['new', 'progres']:
+ self.state = 'done'
+ self.project_id.checklist_progress += 100 / float(
+ len(self.search([('project_id', '=', self.project_id.id)])))
+
+ def action_set_checklist_close(self):
+ """ Checklist cancel details"""
+ self.state = 'cancel'
diff --git a/advanced_project_management_system/models/project_checklist_template.py b/advanced_project_management_system/models/project_checklist_template.py
new file mode 100755
index 000000000..041436ce5
--- /dev/null
+++ b/advanced_project_management_system/models/project_checklist_template.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectChecklistTemplate(models.Model):
+ """ Project checklist template"""
+ _name = "project.checklist.template"
+ _description = "Project checklist template"
+
+ name = fields.Char(string='Name', help="name of the template")
+ checklist_ids = fields.Many2many('project.checklist',
+ string='Checklist',
+ help="checklist information")
diff --git a/advanced_project_management_system/models/project_issue.py b/advanced_project_management_system/models/project_issue.py
new file mode 100755
index 000000000..effca06c7
--- /dev/null
+++ b/advanced_project_management_system/models/project_issue.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import api, fields, models
+
+
+class ProjectIssue(models.Model):
+ """ For managing project issues"""
+ _name = "project.issue"
+ _description = 'Project and task issue'
+
+ user_id = fields.Many2one("res.users", string="Assigned to",
+ help="The person who is responsible to solve "
+ "the issue")
+ summary = fields.Text(string='Issue summary', help="Adding project issue")
+ email = fields.Char(string="Email", help="Email address")
+ project_id = fields.Many2one('project.project', string="project",
+ help="To know issue noticed in which project")
+ task_id = fields.Many2one('project.task', string="Task",
+ help="To know issue noticed in which task",
+ domain=[('project_id', '=', project_id)])
+ priority = fields.Selection([('0', 'Low'), ('1', 'High')], default='0',
+ string="Priority")
+ tag_ids = fields.Many2many('project.tags', string='Tags',
+ help='Set the tags')
+ partner_id = fields.Many2one('res.partner', string="Contact",
+ help="Know about the contact details")
+ name = fields.Char(string='Number', default='new',
+ help='To track the issue reference')
+ description = fields.Text(string='Description',
+ help="To add the issue in detail")
+ extra_info = fields.Text(string="Extra Info",
+ help="To add some extra information")
+ state = fields.Selection([('new', 'New'), ('progress', 'In Progress'),
+ ('done', 'Done'), ('cancel', 'Cancel')],
+ default='new', string='State',
+ help='Project issue pipeline stages')
+ create_date = fields.Datetime(string="Create Date",
+ help='For tracking the record creation date',
+ default=fields.Datetime.now())
+
+ @api.model
+ def create(self, vals):
+ """ Added reference number"""
+ if vals.get('name', 'New'):
+ vals['name'] = self.env['ir.sequence'].next_by_code(
+ 'project.issue')
+ res = super(ProjectIssue, self).create(vals)
+ return res
diff --git a/advanced_project_management_system/models/project_project.py b/advanced_project_management_system/models/project_project.py
new file mode 100755
index 000000000..e8128f7b9
--- /dev/null
+++ b/advanced_project_management_system/models/project_project.py
@@ -0,0 +1,219 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+import json
+from odoo import api, fields, models, _
+
+
+class ProjectProject(models.Model):
+ """ Added project documents,checklist,stage updates"""
+ _inherit = 'project.project'
+
+ project_category_id = fields.Many2one('project.category',
+ string='Project Category',
+ help="For adding project category ")
+ document_count = fields.Integer(string='Documents',
+ compute='_compute_document_count',
+ help="For getting the document count")
+ project_stage_id = fields.Many2one('project.project.stage',
+ tracking=True, string='Stage',
+ help="Project stages")
+ project_checklist_info_ids = fields.One2many('project.checklist.info',
+ 'project_id',
+ help="Project checklist details",
+ string='Checklist')
+ checklist_progress = fields.Float(string="Progress",
+ help="For checklist progress bar ")
+ checklist_template_ids = fields.Many2many('project.checklist.template',
+ string='checklist template',
+ help="For getting checklist "
+ "template")
+ issue_count = fields.Integer(string="Project issue",
+ help="For getting project issue ",
+ compute="_compute_issue_count")
+ shortcut_ids = fields.One2many('project.shortcut', 'project_id',
+ string='Shortcuts')
+ url_shortcut = fields.Char(string="URL Shortcut",
+ compute="_compute_url_shortcut",
+ help="Enter the URL shortcut.")
+ is_active = fields.Boolean(string="Is Active", store=True,
+ help="Check this box if the URL is active.")
+ url_link = fields.Char(string="URL Link", help="Enter the URL link.")
+ url_name = fields.Char(string="URL Name",
+ help="Enter the name associated with the URL.")
+
+ def open_project_creation_wizard(self):
+ """ Open the project creation wizard """
+ return {
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'project.project',
+ 'view_mode': 'form',
+ 'view_id': self.env.ref(
+ 'advanced_project_management_system.project.project.view.form.'
+ 'simplified').id,
+ 'target': 'current',
+ }
+
+ @api.depends('url_link', 'url_name')
+ def _compute_url_shortcut(self):
+ """ Compute the URL shortcut and its activation status """
+ for project in self:
+ if project.url_link:
+ project.is_active = True
+ project.url_shortcut = project.url_link
+ else:
+ project.url_shortcut = "Add Link"
+ project.is_active = False
+
+ def open_url_shortcut(self):
+ """ Open the URL shortcut """
+ for project in self:
+ if project.url_shortcut:
+ return {
+ 'name': self.url_name,
+ 'type': 'ir.actions.act_url',
+ 'url': project.url_shortcut,
+ 'target': 'self',
+ }
+
+ def button_document(self):
+ """ Return document kanban for the project"""
+ return {
+ 'name': 'Documents',
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'ir.attachment',
+ 'view_mode': 'kanban,form',
+ 'res_id': self._origin.id,
+ 'domain': [
+ ('res_id', '=', self._origin.id),
+ ('res_model', '=', 'project.project')
+ ],
+ }
+
+ def _compute_document_count(self):
+ """ Compute document count and return """
+ for rec in self:
+ attachment_ids = self.env['ir.attachment'].search(
+ [('res_model', '=', 'project.project'),
+ ('res_id', '=', rec.id)])
+ rec.document_count = len(attachment_ids)
+
+ def project_multi_stage_update(self):
+ """ Return wizard to update the project stage"""
+ return {
+ 'type': 'ir.actions.act_window',
+ 'name': 'Mass Update',
+ 'view_mode': 'form',
+ 'target': 'new',
+ 'res_model': 'project.stage.update',
+ }
+
+ @api.onchange('checklist_template_ids')
+ def _onchange_checklist_template_ids(self):
+ """ Updating checklist"""
+ check_list_id = self.env['project.checklist.template'].browse(
+ self.checklist_template_ids.ids)
+ if check_list_id:
+ for checklist_id in check_list_id.checklist_ids.ids:
+ self.update({
+ 'project_checklist_info_ids':
+ [(0, 0, {
+ 'checklist_id': checklist_id
+ })]
+ })
+
+ def _compute_issue_count(self):
+ """ For getting project issue count"""
+ for rec in self:
+ issue_id = self.env['project.issue'].search(
+ [('project_id', '=', rec.id)])
+ rec.issue_count = len(issue_id)
+
+ def button_issue(self):
+ """Return project issues"""
+ return {
+ 'type': 'ir.actions.act_window',
+ 'name': 'Project Issues',
+ 'view_mode': 'tree,form',
+ 'res_model': 'project.issue',
+ 'domain': [('project_id', '=', self.id)]
+ }
+
+ def _get_stat_buttons(self):
+ """ Get statistical buttons for the project """
+ self.ensure_one()
+ buttons = super(ProjectProject, self)._get_stat_buttons()
+ if self.user_has_groups('project.group_project_user'):
+ buttons.append({
+ 'icon': 'area-chart',
+ 'text': _('Burnup Chart'),
+ 'action_type': 'action',
+ 'action': 'advanced_project_management_system.action_project_task_burnup_chart_report',
+ 'additional_context': json.dumps({
+ 'active_id': self.id,
+ }),
+ 'show': True,
+ 'sequence': 60,
+ })
+ if self.user_has_groups('project.group_project_user'):
+ buttons.append({
+ 'icon': 'line-chart',
+ 'text': _('Velocity Chart'),
+ 'action_type': 'action',
+ 'action': 'advanced_project_management_system.action_project_velocity_chart_report',
+ 'additional_context': json.dumps({
+ 'active_id': self.id,
+ }),
+ 'show': True,
+ 'sequence': 60,
+ })
+ return buttons
+
+ def action_project_task_burnup_chart_report(self):
+ """ Open the Burnup Chart report for the project """
+ action = self.env['ir.actions.act_window']._for_xml_id(
+ 'advanced_project_management_system'
+ '.action_project_task_burnup_chart_report')
+ action['display_name'] = _("%(name)s's Burnup Chart", name=self.name)
+ return action
+
+ def action_project_velocity_chart_report(self):
+ """ Open the Velocity Chart report for the project """
+ action = self.env['ir.actions.act_window']._for_xml_id(
+ 'advanced_project_management_system'
+ '.action_project_velocity_chart_report')
+ action['display_name'] = _("%(name)s's Velocity Chart",
+ name=self.name)
+ return action
+
+ def action_open_shortcut(self):
+ """ Open the shortcut creation form """
+ view_id = self.env.ref(
+ 'advanced_project_management_system.project_shortcut_view_form').id
+ return {
+ 'name': 'Add Custom Project Shortcut',
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'project.shortcut',
+ 'views': [(view_id, 'form')],
+ 'type': 'ir.actions.act_window',
+ 'target': 'new',
+ }
diff --git a/advanced_project_management_system/models/project_task.py b/advanced_project_management_system/models/project_task.py
new file mode 100755
index 000000000..b7a90bcf1
--- /dev/null
+++ b/advanced_project_management_system/models/project_task.py
@@ -0,0 +1,126 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import api, fields, models
+
+
+class ProjectTask(models.Model):
+ """ Added checklist and document details"""
+ _inherit = 'project.task'
+
+ document_count = fields.Integer(string='Documents',
+ compute='_compute_document_count',
+ help="For getting document count")
+ checklist_template_ids = fields.Many2many(
+ 'project.task.checklist.template',
+ string='Checklist', help="For adding project checklist template")
+ checklist_info_ids = fields.One2many('project.task.checklist.info',
+ 'task_id', string="checklist info",
+ help="for getting project checklist "
+ "details")
+ checklist_progress = fields.Float(string='Checklist Completed',
+ colors="red,orange,yellow,green",
+ help="For tracking checklist progress",
+ max_value=1, min_value=0)
+ task_type = fields.Selection([
+ ('task', 'Task'),
+ ('subtask', 'Subtask'),
+ ('bug', 'Bug'),
+ ], string='Task Type', default="task")
+
+ def task_overdue_notification(self):
+ """ Scheduled action for email notification to
+ employee about task due """
+ if self.env['ir.config_parameter'].sudo().get_param(
+ 'res.config.settings.is_overdue_notification'):
+ task_ids = self.search([])
+ for task in task_ids:
+ if task.stage_id.name not in (
+ 'Done',
+ 'Canceled') and task.date_deadline and task.date_deadline < fields.Date.today():
+ mail_template = task.env.ref(
+ 'advanced_project_management_system.task_due_email_notification')
+ mail_template.send_mail(task.id, force_send=True)
+
+ def _get_user_emails(self):
+ """ Return email ids of the employee"""
+ emails = []
+ task_ids = self.search([('date_deadline', '<', fields.Date.today())])
+ for task in task_ids:
+ if task.stage_id.name not in ('Done', 'Canceled'):
+ for user in task.user_ids:
+ emails.append(user.login)
+ return emails
+
+ def _compute_document_count(self):
+ """ Compute document count and return """
+ for rec in self:
+ attachment_ids = self.env['ir.attachment'].search(
+ [('res_model', '=', 'project.task'), ('res_id', '=', rec.id)])
+ rec.document_count = len(attachment_ids)
+
+ def button_task_document(self):
+ """ Return document kanban for the task"""
+ return {
+ 'name': 'Documents',
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'ir.attachment',
+ 'view_mode': 'kanban,form',
+ 'res_id': self._origin.id,
+ 'domain': [
+ ('res_id', '=', self._origin.id),
+ ('res_model', '=', 'project.task')],
+ }
+
+ def task_mass_update(self):
+ """ Return wizard for updating task details"""
+ return {
+ 'name': 'Documents',
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'project.task.mass.update',
+ 'target': 'new',
+ 'view_mode': 'form',
+ }
+
+ @api.onchange('stage_id')
+ def _onchange_stage_id(self):
+ """ While changing task stage task will automatically assign to
+ users from task stage"""
+ if self.stage_id.user_ids:
+ self.user_ids = self.stage_id.user_ids
+
+ @api.onchange('checklist_template_ids')
+ def _onchange_checklist_template_ids(self):
+ """When the `checklist_template_ids` field is modified, this method is
+ triggered to update the `checklist_info_ids` field.
+ It browses the selected checklist templates and for each checklist item in these templates,
+ it creates a new checklist info record linked to the current task.
+ """
+ check_list_id = self.env['project.task.checklist.template'].browse(
+ self.checklist_template_ids.ids)
+ if check_list_id:
+ for checklist_id in check_list_id.checklist_ids.ids:
+ self.update({
+ 'checklist_info_ids':
+ [(0, 0, {
+ 'checklist_id': checklist_id
+ })]
+ })
diff --git a/advanced_project_management_system/models/project_task_checklist.py b/advanced_project_management_system/models/project_task_checklist.py
new file mode 100755
index 000000000..f688d8528
--- /dev/null
+++ b/advanced_project_management_system/models/project_task_checklist.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectChecklist(models.Model):
+ """Task checklist details"""
+ _name = "project.task.checklist"
+ _description = "Task Custom Checklist"
+
+ name = fields.Char(string='Name', required=True,
+ help="name of the checklist")
+ description = fields.Char(string='Description', required=True,
+ help="Description of the checklist")
+ company_id = fields.Many2one('res.company', string='Company',
+ required=True,
+ default=lambda self: self.env.company.id,
+ help="For getting company details")
diff --git a/advanced_project_management_system/models/project_task_checklist_info.py b/advanced_project_management_system/models/project_task_checklist_info.py
new file mode 100755
index 000000000..f801bb325
--- /dev/null
+++ b/advanced_project_management_system/models/project_task_checklist_info.py
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models, _
+from odoo.exceptions import ValidationError
+
+
+class ProjectTaskChecklistInfo(models.Model):
+ """ Task checklist details"""
+ _name = "project.task.checklist.info"
+ _description = "Task checklist information"
+
+ checklist_id = fields.Many2one('project.task.checklist',
+ string='Name', help="checklist")
+ description = fields.Char(string='Description',
+ related='checklist_id.description',
+ help="Description of the checklist info ")
+ task_id = fields.Many2one('project.task', string="Task",
+ help="Task details")
+ checklist_progress = fields.Integer(string="progress",
+ help="For tracking the checklist "
+ "progress and completion")
+ date = fields.Date(string='Date', default=fields.Date.today(),
+ help="Get the date information")
+ state = fields.Selection(
+ selection=[('new', 'New'), ('progres', 'In Progress'),
+ ('done', 'Done'), ('cancel', 'Cancel')], default='new',
+ string="Status", help="get the status of the checklist ")
+
+ def action_set_checklist_complete(self):
+ """ Managing the checklist progress and completion"""
+ if self.state in ['new', 'progres']:
+ checklist_template_id = self.env[
+ 'project.task.checklist.template'].search(
+ [('id', 'in', self.task_id.checklist_template_ids.ids)])
+ if len(checklist_template_id.checklist_ids.ids) > 0:
+ self.task_id.checklist_progress += 100 / float(
+ len(checklist_template_id.checklist_ids.ids))
+ self.state = 'done'
+ else:
+ raise ValidationError(_("Please add checklist"))
+
+ def action_set_checklist_close(self):
+ """ Checklist cancel info """
+ self.state = 'cancel'
diff --git a/advanced_project_management_system/models/project_task_checklist_template.py b/advanced_project_management_system/models/project_task_checklist_template.py
new file mode 100755
index 000000000..fa8cf5760
--- /dev/null
+++ b/advanced_project_management_system/models/project_task_checklist_template.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectTaskChecklistTemplate(models.Model):
+ """Task checklist template"""
+ _name = "project.task.checklist.template"
+ _description = "Task checklist template"
+
+ name = fields.Char(string='Name', help="name of the template")
+ checklist_ids = fields.Many2many('project.task.checklist',
+ string='Checklist',
+ help="To get the checklist details")
diff --git a/advanced_project_management_system/models/project_task_type.py b/advanced_project_management_system/models/project_task_type.py
new file mode 100644
index 000000000..9628523d9
--- /dev/null
+++ b/advanced_project_management_system/models/project_task_type.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectTaskType(models.Model):
+ """ Added user information"""
+ _inherit = 'project.task.type'
+
+ user_ids = fields.Many2many('res.users', string='Assign Multiple Users',
+ help="We can assign multiple users ")
diff --git a/advanced_project_management_system/models/res_config_settings.py b/advanced_project_management_system/models/res_config_settings.py
new file mode 100755
index 000000000..3d02629da
--- /dev/null
+++ b/advanced_project_management_system/models/res_config_settings.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import api, fields, models
+
+
+class ResConfigSettings(models.TransientModel):
+ """ Added document expiry notification expiry mail details """
+ _inherit = "res.config.settings"
+
+ is_project_category = fields.Boolean(
+ string='Enable Project Category',
+ help="Enabling project category",
+ config_parameter='advanced_project_management_system.is_project_category')
+ document_expiry_notification = fields.Boolean(
+ string='Document Expiry Notification',
+ help="For sending document expiry notification",
+ config_parameter='advanced_project_management_system.document_expiry_notification')
+ notify_customer = fields.Boolean(
+ string='Notify Customer',
+ help="For notifying the customer",
+ config_parameter='advanced_project_management_system.notify_customer')
+ on_expiry_notification = fields.Boolean(
+ string='On Expiry Date Notification', help="Sent expiry notification",
+ config_parameter='advanced_project_management_system.on_expiry_notification')
+ email = fields.Char(
+ string='Notify Email to', help="Get email id",
+ config_parameter='advanced_project_management_system.email')
+ notify_days = fields.Integer(
+ string='Notify After Expiry Date',
+ help="Notification sent before these days",
+ config_parameter='advanced_project_management_system.notify_days')
+ is_overdue_notification = fields.Boolean(
+ string='Overdue Notification?',
+ help="For sending overdue notification",
+ config_parameter='advanced_project_management_system.is_overdue_notification')
+ notification_before = fields.Integer(
+ string='Notification Days',
+ help="Sent notification before these days",
+ config_parameter='advanced_project_management_system.notification_before')
+
+ @api.onchange('is_project_category')
+ def _onchange_is_project_category(self):
+ """Handles the addition or removal of the current user from the
+ `group_project_category` based on the state of `is_project_category`."""
+ groups = self.env.ref(
+ 'advanced_project_management_system.group_project_category')
+ if self.is_project_category:
+ groups.write({'users': [(4, self.env.user.id)]})
+ else:
+ groups.write({'users': [(3, self.env.user.id)]})
diff --git a/advanced_project_management_system/report/__init__.py b/advanced_project_management_system/report/__init__.py
new file mode 100644
index 000000000..4bfd5f41a
--- /dev/null
+++ b/advanced_project_management_system/report/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from . import project_task_burnup_chart_report
+from . import project_task_velocity_chart_report
diff --git a/advanced_project_management_system/report/ir_action_report.xml b/advanced_project_management_system/report/ir_action_report.xml
new file mode 100755
index 000000000..b82f3285d
--- /dev/null
+++ b/advanced_project_management_system/report/ir_action_report.xml
@@ -0,0 +1,25 @@
+
+
+
+
+ Print Project
+ project.project
+ qweb-pdf
+ advanced_project_management_system.project_details_report
+ project_report
+ 'Project Details'
+
+ report
+
+
+
+ Print Task
+ project.task
+ qweb-pdf
+ advanced_project_management_system.task_details_report
+ task_report
+ 'Task Details'
+
+ report
+
+
diff --git a/advanced_project_management_system/report/project_project_template.xml b/advanced_project_management_system/report/project_project_template.xml
new file mode 100755
index 000000000..01bb6d864
--- /dev/null
+++ b/advanced_project_management_system/report/project_project_template.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ /
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Manager:
+
+
+ Customer:
+
+
+
+
+
+
Task Name
+
Allocated Hours
+
Spend Hours
+
Remaining Hours
+
Assigned To
+
Assign Date
+
Deadline
+
Stage
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/advanced_project_management_system/report/project_task_burnup_chart_report.py b/advanced_project_management_system/report/project_task_burnup_chart_report.py
new file mode 100644
index 000000000..4dd677fb4
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_burnup_chart_report.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from collections import defaultdict
+from odoo import fields, models, _
+
+
+class ProjectTaskBurnupChartReport(models.AbstractModel):
+ """This model defines the Burnup Chart report for project tasks. """
+ _name = 'project.task.burnup.chart.report'
+ _description = 'Burnup Chart'
+ _auto = True
+
+ project_id = fields.Many2one('project.project', readonly=True)
+ date = fields.Datetime(string='Date', readonly=True,
+ help='The date of data entry')
+ completed_count = fields.Integer(string='Completed Tasks', readonly=True,
+ help='The number of completed tasks')
+ total_count = fields.Integer(string='Total Tasks', readonly=True,
+ help='The total number of tasks')
+
+ def _read_group(self, domain, groupby=(), aggregates=(), having=(),
+ offset=0, limit=None, order=None):
+ data = []
+ project_id = self._context.get('active_id')
+
+ if groupby:
+ tasks = self.env['project.task'].search([
+ ('project_id', '=', project_id),
+ ('stage_id.name', '=', 'Done')
+ ])
+
+ task_counts = defaultdict(lambda: defaultdict(int))
+ task_names = defaultdict(list)
+
+ for task in tasks:
+ completion_date = task.date_deadline or task.create_date.date()
+
+ if isinstance(completion_date, fields.date):
+ completion_date = fields.datetime.combine(completion_date,
+ fields.datetime.min.time())
+ start_date = task.create_date.date()
+
+ if task.stage_id.name == 'Done':
+ month_year = completion_date
+ task_counts[month_year]['Total'] += 1
+
+ if start_date != completion_date:
+ task_counts[month_year]['Start'] += 1
+ task_names[month_year].append(task.name)
+
+ for month_year, counts in task_counts.items():
+ data.append((month_year, task_names[month_year], counts['Total']))
+ return data
diff --git a/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml b/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml
new file mode 100644
index 000000000..860051f29
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ project.task.burnup.chart.report.view.search
+ project.task.burnup.chart.report
+
+
+
+
+
+
+
+
+ project.task.burnup.chart.report.view.graph
+ project.task.burnup.chart.report
+
+
+
+
+
+
+
+
+
+ burnup Chart
+ project.task.burnup.chart.report
+ graph
+
+ {'search_default_project_id': active_id, 'search_default_date': 1, 'search_default_stage': 1, 'search_default_filter_date': 1}
+ [('project_id', '!=', False)]
+
+
+ No data yet!
+
+
Analyze how quickly your team is completing your project's tasks and check if everything is progressing according to plan.
+
+
+
\ No newline at end of file
diff --git a/advanced_project_management_system/report/project_task_template.xml b/advanced_project_management_system/report/project_task_template.xml
new file mode 100755
index 000000000..20597f901
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_template.xml
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
diff --git a/advanced_project_management_system/report/project_task_velocity_chart_report.py b/advanced_project_management_system/report/project_task_velocity_chart_report.py
new file mode 100644
index 000000000..65b4bea05
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_velocity_chart_report.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from collections import defaultdict
+from odoo import api, fields, models, _
+
+
+class ProjectVelocityChartReport(models.AbstractModel):
+ """
+ Abstract model for the Velocity Chart report.
+ This model is used to calculate and display the Velocity Chart report
+ for a specific project and task.
+ """
+ _name = 'project.velocity.chart.report'
+ _description = 'Velocity Chart'
+
+ date = fields.Date(string='Sprint Start Date', readonly=True,
+ help="The start date of the sprint.")
+ completed_story_points = fields.Float(string='Completed Story Points',
+ readonly=True,
+ help="The total story points"
+ " completed in the sprint.")
+
+ @api.model
+ def _read_group(self, domain, groupby=(), aggregates=(), having=(),
+ offset=0, limit=None, order=None):
+ """Compute grouped data for the Velocity Chart report."""
+ data = []
+ project_id = self._context.get('active_id')
+ if groupby:
+ tasks = self.env['project.task'].search([
+ ('project_id', '=', project_id),
+ ('stage_id.name', '=', 'Done')
+ ])
+ completed_within_deadline_count = defaultdict(
+ lambda: defaultdict(int))
+ completed_names = defaultdict(list)
+ for task in tasks:
+ sprint_start_date = task.create_date.date()
+ completion_date = task.date_deadline or task.create_date.date()
+ if isinstance(completion_date, fields.date):
+ completion_date = fields.datetime.combine(completion_date,
+ fields.datetime.min.time())
+
+ if task.stage_id.name == 'Done':
+ month_year = completion_date
+ completed_within_deadline_count[month_year]['Total'] += 1
+ if sprint_start_date != completion_date:
+ completed_within_deadline_count[month_year][
+ 'Start'] += 1
+ completed_names[month_year].append(task.name)
+ for month_year, counts in completed_within_deadline_count.items():
+ data.append((month_year, completed_names[month_year], counts['Total']))
+ return data
diff --git a/advanced_project_management_system/report/project_task_velocity_chart_report_views.xml b/advanced_project_management_system/report/project_task_velocity_chart_report_views.xml
new file mode 100644
index 000000000..ccb4dfd94
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_velocity_chart_report_views.xml
@@ -0,0 +1,50 @@
+
+
+
+
+ project.velocity.chart.report.view.search
+ project.velocity.chart.report
+
+
+
+
+
+
+
+
+ project.velocity.chart.report.view.graph
+ project.velocity.chart.report
+
+
+
+
+
+
+
+
+
+ Velocity Chart
+ project.velocity.chart.report
+ graph
+
+ {'search_default_project_id': active_id,
+ 'search_default_date': 1}
+
+ [('project_id', '!=', False)]
+
+
+ No data yet!
+
+
Analyze your project's velocity over time with the Velocity
+ Chart.
+
+
+
+
diff --git a/advanced_project_management_system/security/advanced_project_management_system_security.xml b/advanced_project_management_system/security/advanced_project_management_system_security.xml
new file mode 100755
index 000000000..f6ca87f62
--- /dev/null
+++ b/advanced_project_management_system/security/advanced_project_management_system_security.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Access Project Document
+
+
+
+ Access Project Category Menu
+
+
+
diff --git a/advanced_project_management_system/security/ir.model.access.csv b/advanced_project_management_system/security/ir.model.access.csv
new file mode 100755
index 000000000..31b313088
--- /dev/null
+++ b/advanced_project_management_system/security/ir.model.access.csv
@@ -0,0 +1,15 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_project_task_checklist,access.project.task.checklist,model_project_task_checklist,base.group_user,1,1,1,1
+access_project_task_checklist_import,access.project.task.checklist.import,model_project_task_checklist_import,base.group_user,1,1,1,1
+access_project_task_checklist_info,access.project.task.checklist.info,model_project_task_checklist_info,base.group_user,1,1,1,1
+access_project_category,access.project.category,model_project_category,base.group_user,1,1,1,1
+access_project_stage_update,access.project.stage.update,model_project_stage_update,base.group_user,1,1,1,1
+access_project_task_mass_update,access.project.task.mass.update,model_project_task_mass_update,base.group_user,1,1,1,1
+access_project_task_checklist_template,access.project.task.checklist.template,model_project_task_checklist_template,base.group_user,1,1,1,1
+access_project_checklist,access.project.checklist,model_project_checklist,base.group_user,1,1,1,1
+access_project_checklist_template,access.project.checklist.template,model_project_checklist_template,base.group_user,1,1,1,1
+access_project_checklist_info,access.project.checklist.info,model_project_checklist_info,base.group_user,1,1,1,1
+access_project_issue,access.project.issue,model_project_issue,base.group_user,1,1,1,1
+access_project_task_burnup_chart_report,access.burnup.chart.report,model_project_task_burnup_chart_report,base.group_user,1,1,1,1
+advanced_project_management_system.access_project_shortcut,access.project.shortcut,advanced_project_management_system.model_project_shortcut,base.group_user,1,1,1,1
+access_project_velocity_chart_report,access.velocity.chart.report,model_project_velocity_chart_report,base.group_user,1,1,1,1
diff --git a/advanced_project_management_system/static/csv/task_checklist.csv b/advanced_project_management_system/static/csv/task_checklist.csv
new file mode 100755
index 000000000..ec832f66c
--- /dev/null
+++ b/advanced_project_management_system/static/csv/task_checklist.csv
@@ -0,0 +1,5 @@
+Name,Description
+checklist A,checklist A
+checklist B,checklist B
+checklist C,checklist C
+checklist D,checklist D
\ No newline at end of file
diff --git a/advanced_project_management_system/static/description/assets/icons/capture (1).png b/advanced_project_management_system/static/description/assets/icons/capture (1).png
new file mode 100644
index 000000000..8824deafc
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/capture (1).png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/check.png b/advanced_project_management_system/static/description/assets/icons/check.png
new file mode 100644
index 000000000..c8e85f51d
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/check.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/chevron.png b/advanced_project_management_system/static/description/assets/icons/chevron.png
new file mode 100644
index 000000000..2089293d6
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/chevron.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/cogs.png b/advanced_project_management_system/static/description/assets/icons/cogs.png
new file mode 100644
index 000000000..95d0bad62
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/cogs.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/consultation.png b/advanced_project_management_system/static/description/assets/icons/consultation.png
new file mode 100644
index 000000000..8319d4baa
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/consultation.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/ecom-black.png b/advanced_project_management_system/static/description/assets/icons/ecom-black.png
new file mode 100644
index 000000000..a9385ff13
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/ecom-black.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/education-black.png b/advanced_project_management_system/static/description/assets/icons/education-black.png
new file mode 100644
index 000000000..3eb09b27b
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/education-black.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/hotel-black.png b/advanced_project_management_system/static/description/assets/icons/hotel-black.png
new file mode 100644
index 000000000..130f613be
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/hotel-black.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/img.png b/advanced_project_management_system/static/description/assets/icons/img.png
new file mode 100644
index 000000000..70197f477
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/img.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/license.png b/advanced_project_management_system/static/description/assets/icons/license.png
new file mode 100644
index 000000000..a5869797e
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/license.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/lifebuoy.png b/advanced_project_management_system/static/description/assets/icons/lifebuoy.png
new file mode 100644
index 000000000..658d56ccc
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/lifebuoy.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/manufacturing-black.png b/advanced_project_management_system/static/description/assets/icons/manufacturing-black.png
new file mode 100644
index 000000000..697eb0e9f
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/manufacturing-black.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/photo-capture.png b/advanced_project_management_system/static/description/assets/icons/photo-capture.png
new file mode 100644
index 000000000..06c111758
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/photo-capture.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/pos-black.png b/advanced_project_management_system/static/description/assets/icons/pos-black.png
new file mode 100644
index 000000000..97c0f90c1
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/pos-black.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/puzzle.png b/advanced_project_management_system/static/description/assets/icons/puzzle.png
new file mode 100644
index 000000000..65cf854e7
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/puzzle.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/restaurant-black.png b/advanced_project_management_system/static/description/assets/icons/restaurant-black.png
new file mode 100644
index 000000000..4a35eb939
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/restaurant-black.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/service-black.png b/advanced_project_management_system/static/description/assets/icons/service-black.png
new file mode 100644
index 000000000..301ab51cb
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/service-black.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/trading-black.png b/advanced_project_management_system/static/description/assets/icons/trading-black.png
new file mode 100644
index 000000000..9398ba2f1
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/trading-black.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/training.png b/advanced_project_management_system/static/description/assets/icons/training.png
new file mode 100644
index 000000000..884ca024d
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/training.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/update.png b/advanced_project_management_system/static/description/assets/icons/update.png
new file mode 100644
index 000000000..ecbc5a01a
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/update.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/user.png b/advanced_project_management_system/static/description/assets/icons/user.png
new file mode 100644
index 000000000..6ffb23d9f
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/user.png differ
diff --git a/advanced_project_management_system/static/description/assets/icons/wrench.png b/advanced_project_management_system/static/description/assets/icons/wrench.png
new file mode 100644
index 000000000..6c04dea0f
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/wrench.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/Cybrosys R.png b/advanced_project_management_system/static/description/assets/misc/Cybrosys R.png
new file mode 100644
index 000000000..da4058087
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/Cybrosys R.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/email.svg b/advanced_project_management_system/static/description/assets/misc/email.svg
new file mode 100644
index 000000000..15291cdc3
--- /dev/null
+++ b/advanced_project_management_system/static/description/assets/misc/email.svg
@@ -0,0 +1,33 @@
+
diff --git a/advanced_project_management_system/static/description/assets/misc/phone.svg b/advanced_project_management_system/static/description/assets/misc/phone.svg
new file mode 100644
index 000000000..b7bd7f251
--- /dev/null
+++ b/advanced_project_management_system/static/description/assets/misc/phone.svg
@@ -0,0 +1,3 @@
+
diff --git a/advanced_project_management_system/static/description/assets/misc/star (1) 2.svg b/advanced_project_management_system/static/description/assets/misc/star (1) 2.svg
new file mode 100644
index 000000000..5ae9f507a
--- /dev/null
+++ b/advanced_project_management_system/static/description/assets/misc/star (1) 2.svg
@@ -0,0 +1,9 @@
+
diff --git a/advanced_project_management_system/static/description/assets/misc/support (1) 1.svg b/advanced_project_management_system/static/description/assets/misc/support (1) 1.svg
new file mode 100644
index 000000000..7d37a8f30
--- /dev/null
+++ b/advanced_project_management_system/static/description/assets/misc/support (1) 1.svg
@@ -0,0 +1,9 @@
+
diff --git a/advanced_project_management_system/static/description/assets/misc/support-email.svg b/advanced_project_management_system/static/description/assets/misc/support-email.svg
new file mode 100644
index 000000000..eb70370d6
--- /dev/null
+++ b/advanced_project_management_system/static/description/assets/misc/support-email.svg
@@ -0,0 +1,6 @@
+
diff --git a/advanced_project_management_system/static/description/assets/misc/tick-mark.svg b/advanced_project_management_system/static/description/assets/misc/tick-mark.svg
new file mode 100644
index 000000000..2dbb40187
--- /dev/null
+++ b/advanced_project_management_system/static/description/assets/misc/tick-mark.svg
@@ -0,0 +1,17 @@
+
diff --git a/advanced_project_management_system/static/description/assets/misc/whatsapp 1.svg b/advanced_project_management_system/static/description/assets/misc/whatsapp 1.svg
new file mode 100644
index 000000000..0bfaf8fc6
--- /dev/null
+++ b/advanced_project_management_system/static/description/assets/misc/whatsapp 1.svg
@@ -0,0 +1,9 @@
+
diff --git a/advanced_project_management_system/static/description/assets/misc/whatsapp.svg b/advanced_project_management_system/static/description/assets/misc/whatsapp.svg
new file mode 100644
index 000000000..b618aea1d
--- /dev/null
+++ b/advanced_project_management_system/static/description/assets/misc/whatsapp.svg
@@ -0,0 +1,33 @@
+
diff --git a/advanced_project_management_system/static/description/assets/modules/1.png b/advanced_project_management_system/static/description/assets/modules/1.png
new file mode 100644
index 000000000..164eb62c7
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/1.png differ
diff --git a/advanced_project_management_system/static/description/assets/modules/2.jpg b/advanced_project_management_system/static/description/assets/modules/2.jpg
new file mode 100644
index 000000000..d3c201230
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/2.jpg differ
diff --git a/advanced_project_management_system/static/description/assets/modules/3.png b/advanced_project_management_system/static/description/assets/modules/3.png
new file mode 100644
index 000000000..f2b7d217a
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/3.png differ
diff --git a/advanced_project_management_system/static/description/assets/modules/4.jpg b/advanced_project_management_system/static/description/assets/modules/4.jpg
new file mode 100644
index 000000000..37e17adae
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/4.jpg differ
diff --git a/advanced_project_management_system/static/description/assets/modules/5.png b/advanced_project_management_system/static/description/assets/modules/5.png
new file mode 100644
index 000000000..ec2c10a19
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/5.png differ
diff --git a/advanced_project_management_system/static/description/assets/modules/6.jpg b/advanced_project_management_system/static/description/assets/modules/6.jpg
new file mode 100644
index 000000000..878810bd4
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/6.jpg differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/1.png b/advanced_project_management_system/static/description/assets/screenshots/1.png
new file mode 100644
index 000000000..2740312a0
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/1.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/10.png b/advanced_project_management_system/static/description/assets/screenshots/10.png
new file mode 100644
index 000000000..a56762804
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/10.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/11.png b/advanced_project_management_system/static/description/assets/screenshots/11.png
new file mode 100644
index 000000000..b360ac55f
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/11.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/12.png b/advanced_project_management_system/static/description/assets/screenshots/12.png
new file mode 100644
index 000000000..ce53ae648
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/12.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/13.png b/advanced_project_management_system/static/description/assets/screenshots/13.png
new file mode 100644
index 000000000..246820c8c
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/13.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/14.png b/advanced_project_management_system/static/description/assets/screenshots/14.png
new file mode 100644
index 000000000..aba46e073
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/14.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/15.png b/advanced_project_management_system/static/description/assets/screenshots/15.png
new file mode 100644
index 000000000..f08c28701
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/15.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/16.png b/advanced_project_management_system/static/description/assets/screenshots/16.png
new file mode 100644
index 000000000..1a33b98aa
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/16.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/17.png b/advanced_project_management_system/static/description/assets/screenshots/17.png
new file mode 100644
index 000000000..98d2d2daa
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/17.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/18.png b/advanced_project_management_system/static/description/assets/screenshots/18.png
new file mode 100644
index 000000000..526ed08c0
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/18.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/19.png b/advanced_project_management_system/static/description/assets/screenshots/19.png
new file mode 100644
index 000000000..799300c38
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/19.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/2.png b/advanced_project_management_system/static/description/assets/screenshots/2.png
new file mode 100644
index 000000000..9652182a9
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/2.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/20.png b/advanced_project_management_system/static/description/assets/screenshots/20.png
new file mode 100644
index 000000000..56c1980cb
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/20.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/21.png b/advanced_project_management_system/static/description/assets/screenshots/21.png
new file mode 100644
index 000000000..555cb4df4
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/21.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/22.png b/advanced_project_management_system/static/description/assets/screenshots/22.png
new file mode 100644
index 000000000..3ab9de2cb
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/22.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/23.png b/advanced_project_management_system/static/description/assets/screenshots/23.png
new file mode 100644
index 000000000..bd3166700
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/23.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/24.png b/advanced_project_management_system/static/description/assets/screenshots/24.png
new file mode 100644
index 000000000..b63903881
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/24.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/25.png b/advanced_project_management_system/static/description/assets/screenshots/25.png
new file mode 100644
index 000000000..7734e4ddd
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/25.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/26.png b/advanced_project_management_system/static/description/assets/screenshots/26.png
new file mode 100644
index 000000000..19f643356
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/26.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/27.png b/advanced_project_management_system/static/description/assets/screenshots/27.png
new file mode 100644
index 000000000..f05956f6e
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/27.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/28.png b/advanced_project_management_system/static/description/assets/screenshots/28.png
new file mode 100644
index 000000000..99749eee6
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/28.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/29.png b/advanced_project_management_system/static/description/assets/screenshots/29.png
new file mode 100644
index 000000000..9fad332e4
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/29.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/3.png b/advanced_project_management_system/static/description/assets/screenshots/3.png
new file mode 100644
index 000000000..6ee8e92a5
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/3.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/30.png b/advanced_project_management_system/static/description/assets/screenshots/30.png
new file mode 100644
index 000000000..79e2fee12
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/30.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/31.png b/advanced_project_management_system/static/description/assets/screenshots/31.png
new file mode 100644
index 000000000..d9b142453
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/31.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/32.png b/advanced_project_management_system/static/description/assets/screenshots/32.png
new file mode 100644
index 000000000..86a10bf10
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/32.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/33.png b/advanced_project_management_system/static/description/assets/screenshots/33.png
new file mode 100644
index 000000000..838c4af18
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/33.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/4.png b/advanced_project_management_system/static/description/assets/screenshots/4.png
new file mode 100644
index 000000000..2c86cfc5e
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/4.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/5.png b/advanced_project_management_system/static/description/assets/screenshots/5.png
new file mode 100644
index 000000000..60f167651
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/5.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/6.png b/advanced_project_management_system/static/description/assets/screenshots/6.png
new file mode 100644
index 000000000..4ef30eac8
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/6.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/7.png b/advanced_project_management_system/static/description/assets/screenshots/7.png
new file mode 100644
index 000000000..f0409895c
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/7.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/8.png b/advanced_project_management_system/static/description/assets/screenshots/8.png
new file mode 100644
index 000000000..a7fe2e8b4
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/8.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/9.png b/advanced_project_management_system/static/description/assets/screenshots/9.png
new file mode 100644
index 000000000..df333071e
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/9.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/hero.gif b/advanced_project_management_system/static/description/assets/screenshots/hero.gif
new file mode 100644
index 000000000..d0b5536d0
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/hero.gif differ
diff --git a/advanced_project_management_system/static/description/banner.jpg b/advanced_project_management_system/static/description/banner.jpg
new file mode 100644
index 000000000..133604830
Binary files /dev/null and b/advanced_project_management_system/static/description/banner.jpg differ
diff --git a/advanced_project_management_system/static/description/icon.png b/advanced_project_management_system/static/description/icon.png
new file mode 100644
index 000000000..a3dda6d3a
Binary files /dev/null and b/advanced_project_management_system/static/description/icon.png differ
diff --git a/advanced_project_management_system/static/description/index.html b/advanced_project_management_system/static/description/index.html
new file mode 100755
index 000000000..c3c7ac678
--- /dev/null
+++ b/advanced_project_management_system/static/description/index.html
@@ -0,0 +1,1166 @@
+
+
+
+
+
+
+ Odoo App 3 Index
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Community
+
+
+ Enterprise
+
+
+
+
+
+
+
Advanced Project Management System
+
+ All and Additional Features of Project Module are in Single Module.
+
+ Go to Project -> Configuration -> You can see a Project Milestone menu.
+
+
+
+
+
+
+
+
+
+
+
+ Project milestone tree view with group by Project
+
+
+
+
+
+
+
+
+
+
+ Project Milestone form View
+
+ Click any of the record from the milestone.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Milestone Task Details
+
+ In the Project milestone form view we can see smart button having task count.
+
+
+
+
+
+
+
+
+
+
+
+ Project Stages
+
+ Select any Project form view in the status bar we can see the Project Stage.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Category Menu
+
+ Go to Project -> Configuration -> we can see Project Category menu click on that, or we can create Project category.
+
+
+
+
+
+
+
+
+
+
+
+ Project Category
+
+ Open a Project under settings tab we can add Project category.
+
+
+
+
+
+
+
+
+
+
+
+ Task Checklist Import
+
+ Go to Project -> Configuration -> we can see Task Custom Checklist Import menu.
+
+
+
+
+
+
+
+
+
+
+
+ Task Checklist Import Wizard
+
+ Click on the task custom checklist import menu we can see the wizard
+ is open We have the option to import excel and csv files, and we can
+ download sample file for importing.
+
+
+
+
+
+
+
+
+
+
+
+ Task Checklist Template
+
+ Go to Project -> Configuration -> we can see Task Checklist Template menu click on that.
+
+
+
+
+
+
+
+
+
+
+
+ Task Checklist Template Form View
+
+ Click any record or click create button we can create template and add checklists.
+
+
+
+
+
+
+
+
+
+
+
+ Add Checklist Template on the Task
+
+ Go to any task and under checklist tab we can add checklist template and checklist will automatically add there.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Custom Checklist Menu
+
+ Go to ->Project ->Configuration -> we can see Project Custom Checklist menu and click on that.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Checklist Template
+
+ Go to ->Project -> Configuration -> we can see Project
+ Checklist Template menu, and we can create one template
+ by adding checklists to it.
+
+
+
+
+
+
+
+
+
+
+
+ Add Checklist Template on the Project
+
+ Go to any Project and under Checklist tab we can add
+ checklist template and checklist will automatically add there.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Project Document Management
+
+ Go to any Project we can see smart button for documents
+ and click on the smart button we can see all the documents
+ related to the current Project.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Project Issue
+
+ Go to -> Project ->Configuration ->Project Issue
+ menu click on that we can create new issue.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Project Issue in Form View
+
+ Open a Project we can see smart button named Project
+ issue and by clicking we can see the Project Issues.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Project ShortCuts
+
+ We can add a shortcut option, add a link of frequently used
+ resources to our project, and also we can add a GitHub
+ repository to show information about commits, pull,
+ push requests in our project.
+
+
+
+
+
+
+
+
+
+
+
+ BurnUp Chart and Velocity Chart
+
+
+
+
+
+
+
+
+
+
+ BurnUp Chart of Project
+
+
+
+
+
+
+
+
+
+
Velocity Chart of Project
+
+
+
+
+
+
+
+
+
+
Task Type
+
+ we can choose task type for each Project.
+
+
+
+
+
+
+
+
+
+
+
Comments of a Project
+
+ we can add comments for each Project from chatter.
+
+
+
+
+
+
+
+
+
+ Use Checklist Template and Checklist Import to Checklist for Various Project and Tasks.
+
+
+ Manage Documents Related to Project and Task.
+
+
+ Option to Import Checklist.
+
+
+
+ Available in Odoo 16.0 Community & Enterprise.
+
+
+ We can Categories the Project in to Different Categories.
+
+
+ Option to Track and Manage Project Issues.
+
+
+ Can Add Comments to Project.
+
+
+ We can Update Multiple Task Details Simultaneously.
+
+
+ We can Update Multiple Project Stages Simultaneously.
+
+
+
+
+
+
+
+
Version
+ 17.0.1.0.0|Released on:29th March 2024
+
+
+ Initial Commit for Advanced Project Management System.
+
+
+
+
+
+
diff --git a/advanced_project_management_system/wizard/__init__.py b/advanced_project_management_system/wizard/__init__.py
new file mode 100755
index 000000000..764d4bd77
--- /dev/null
+++ b/advanced_project_management_system/wizard/__init__.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from . import project_task_checklist_import
+from . import project_stage_update
+from . import project_task_mass_update
+from . import project_shortcut
diff --git a/advanced_project_management_system/wizard/project_shortcut.py b/advanced_project_management_system/wizard/project_shortcut.py
new file mode 100644
index 000000000..184291e6b
--- /dev/null
+++ b/advanced_project_management_system/wizard/project_shortcut.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+import urllib.parse
+from odoo import api, fields, models
+from odoo.exceptions import UserError
+
+
+class ProjectShortcut(models.TransientModel):
+ """Custom Project Shortcut Wizard"""
+ _name = 'project.shortcut'
+ _description = 'Custom Project Shortcut Wizard'
+
+ name = fields.Char(string='Name', required=True, help='Name of the'
+ ' shortcut')
+ link = fields.Char(string='Link', required=True, help='URL link of the '
+ 'shortcut')
+ project_id = fields.Many2one('project.project', string='Project',
+ help='Associated Project')
+ is_shortcuts = fields.Boolean(string="Has Shortcuts", readonly=True,
+ help='Check if there are shortcuts')
+
+ @api.model
+ def default_get(self, fields):
+ """Get default values for the wizard."""
+ defaults = super(ProjectShortcut, self).default_get(fields)
+ active_project_id = self.env.context.get('active_id')
+ if active_project_id:
+ defaults['project_id'] = active_project_id
+ return defaults
+
+ @staticmethod
+ def is_valid_url(url):
+ """Check if the URL is valid."""
+ try:
+ result = urllib.parse.urlparse(url)
+ return all([result.scheme, result.netloc])
+ except ValueError:
+ return False
+
+ def action_project_shortcut(self):
+ """Create or update project shortcuts."""
+ project = self.project_id
+ if project:
+ if not self.is_valid_url(self.link):
+ raise UserError("Invalid URL. Please enter a valid URL.")
+ project.write({'url_link': self.link,
+ 'url_name': self.name,
+ 'is_active': True})
diff --git a/advanced_project_management_system/wizard/project_shortcut_views.xml b/advanced_project_management_system/wizard/project_shortcut_views.xml
new file mode 100644
index 000000000..be62e29dd
--- /dev/null
+++ b/advanced_project_management_system/wizard/project_shortcut_views.xml
@@ -0,0 +1,30 @@
+
+
+
+
+ project.shortcut.view.form
+ project.shortcut
+
+
+
+
+
+
+ Add Custom Project Shortcut
+ project.shortcut
+ form
+ new
+
+
diff --git a/advanced_project_management_system/wizard/project_stage_update.py b/advanced_project_management_system/wizard/project_stage_update.py
new file mode 100755
index 000000000..048a1fe8d
--- /dev/null
+++ b/advanced_project_management_system/wizard/project_stage_update.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectStageUpdate(models.TransientModel):
+ """ Wizard for updating project stage """
+ _name = "project.stage.update"
+ _description = 'Project stage mass update'
+
+ is_update_stage = fields.Boolean(string='Update Stage',
+ help="For updating the stage")
+ stage_id = fields.Many2one('project.project.stage', string='Stages',
+ help="getting stages", required=True)
+
+ def mass_update_project_stage(self):
+ """ Update project stage pf multiple stage at a time"""
+ for project in self.env['project.project'].browse(
+ self._context['active_ids']):
+ project.update({
+ 'project_stage_id': self.stage_id.id
+ })
diff --git a/advanced_project_management_system/wizard/project_stage_update_views.xml b/advanced_project_management_system/wizard/project_stage_update_views.xml
new file mode 100755
index 000000000..d66c64894
--- /dev/null
+++ b/advanced_project_management_system/wizard/project_stage_update_views.xml
@@ -0,0 +1,36 @@
+
+
+
+
+ project.stage.update.view.form
+ project.stage.update
+
+
+
+
+
+
+ Update Project Stage
+ project.stage.update
+ form
+ new
+
+
+ Update Project Stage
+
+
+
+
diff --git a/advanced_project_management_system/wizard/project_task_checklist_import.py b/advanced_project_management_system/wizard/project_task_checklist_import.py
new file mode 100755
index 000000000..9f63d9963
--- /dev/null
+++ b/advanced_project_management_system/wizard/project_task_checklist_import.py
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+import base64
+import csv
+import io
+import xlrd
+from odoo import fields, models, _
+from odoo.exceptions import UserError
+
+
+class ProjectTaskChecklistImport(models.TransientModel):
+ """Task custom checklist import wizard."""
+ _name = "project.task.checklist.import"
+ _description = "Task custom checklist import"
+
+ file = fields.Binary(string='Upload Your File Here',
+ help="FOr updating the file", required=True)
+ file_type = fields.Selection([('excel', 'Excel'), ('csv', 'CSV')],
+ required=True, string="File type",
+ help="For determine the file type")
+ company_id = fields.Many2one('res.company', string="company",
+ help="For getting company details",
+ default=lambda self: self.env.company.id)
+ download_sample_file = fields.Boolean(
+ string="Download Sample File",
+ help="For downloading sample excel or csv file ")
+
+ def import_custom_checklist(self):
+ """ function to import task custom checklist using excel and csv"""
+ if self.file_type == 'excel':
+ book = xlrd.open_workbook(
+ file_contents=base64.decodebytes(self.file))
+ row_value = []
+ for sheet in book.sheets():
+ for row in range(1, sheet.nrows):
+ row_value.append(sheet.row_values(row))
+ for row in row_value:
+ self.env['project.task.checklist'].create({
+ 'name': row[0],
+ 'description': row[1],
+ 'company_id': self.company_id.id
+ })
+ elif self.file_type == 'csv':
+ row_value = []
+ csv_data = base64.b64decode(self.file)
+ data_file = io.StringIO(csv_data.decode("utf-8"))
+ data_file.seek(0)
+ file_reader = []
+ csv_reader = csv.reader(data_file, delimiter=',')
+ file_reader.extend(csv_reader)
+ for row in range(1, len(file_reader)):
+ row_value.append(file_reader[row])
+ for row in row_value:
+ self.env['project.task.checklist'].create({
+ 'name': row[0],
+ 'description': row[1],
+ 'company_id': self.company_id.id
+ })
+ else:
+ raise UserError(_("Please check the file you have uploaded"))
diff --git a/advanced_project_management_system/wizard/project_task_checklist_import_views.xml b/advanced_project_management_system/wizard/project_task_checklist_import_views.xml
new file mode 100755
index 000000000..d736d5193
--- /dev/null
+++ b/advanced_project_management_system/wizard/project_task_checklist_import_views.xml
@@ -0,0 +1,61 @@
+
+
+
+
+ project.task.checklist.import.view.form
+ project.task.checklist.import
+
+
+
+
+
+
+ Task Custom Checklist Import
+ project.task.checklist.import
+ form
+ new
+
+
+ Task Custom Checklist Import
+
+
+
+
+
+
diff --git a/advanced_project_management_system/wizard/project_task_mass_update.py b/advanced_project_management_system/wizard/project_task_mass_update.py
new file mode 100755
index 000000000..6be22d61e
--- /dev/null
+++ b/advanced_project_management_system/wizard/project_task_mass_update.py
@@ -0,0 +1,83 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectTaskMassUpdate(models.TransientModel):
+ """ Wizard for mass task details updates"""
+ _name = "project.task.mass.update"
+ _description = "Task mass update"
+
+ is_update_assign_to = fields.Boolean(string="Update Assign To",
+ help="For updating task assignees")
+ is_update_deadline = fields.Boolean(string='Update Deadline',
+ help="For updating task deadline")
+ is_update_project = fields.Boolean(string='Update Project',
+ help="for updating project details")
+ is_update_stage = fields.Boolean(string='Update Stage',
+ help="for updating task stage")
+ is_update_tags = fields.Boolean(string='Update Tags',
+ help="for updating task tags")
+ user_ids = fields.Many2many('res.users', string='Assign To',
+ help="FOr updating users")
+ deadline = fields.Date(string='Deadline',
+ help="For updating task deadline")
+ project_id = fields.Many2one('project.project', string='Project',
+ help="For updating projects in a task")
+ stage_id = fields.Many2one('project.task.type', string='stage',
+ help="For updating task stage",
+ domain=[('fold', '=', True)])
+ tag_ids = fields.Many2many('project.tags', string='Tags',
+ help="FOr updating task tags")
+
+ def update_task_details(self):
+ """ Function to update task information coming from the wizard """
+ if self.user_ids:
+ for task in self.env['project.task'].browse(
+ self._context['active_ids']):
+ task.update({
+ 'user_ids': self.user_ids.ids,
+ })
+ if self.deadline:
+ for task in self.env['project.task'].browse(
+ self._context['active_ids']):
+ task.update({
+ 'date_deadline': self.deadline,
+ })
+ if self.project_id:
+ for task in self.env['project.task'].browse(
+ self._context['active_ids']):
+ task.update({
+ 'project_id': self.project_id.id,
+ })
+ if self.stage_id:
+ for task in self.env['project.task'].browse(
+ self._context['active_ids']):
+ task.update({
+ 'stage_id': self.stage_id.id,
+ })
+ if self.tag_ids:
+ for task in self.env['project.task'].browse(
+ self._context['active_ids']):
+ task.update({
+ 'tag_ids': self.tag_ids.ids,
+ })
diff --git a/advanced_project_management_system/wizard/project_task_mass_update_views.xml b/advanced_project_management_system/wizard/project_task_mass_update_views.xml
new file mode 100755
index 000000000..f6472eddc
--- /dev/null
+++ b/advanced_project_management_system/wizard/project_task_mass_update_views.xml
@@ -0,0 +1,59 @@
+
+
+
+
+ project.task.mass.update.view.form
+ project.task.mass.update
+
+
+
+
+
+
+ Task mass update
+ project.task.mass.update
+ form
+ new
+
+