+ 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..30587ebea
--- /dev/null
+++ b/advanced_project_management_system/doc/RELEASE_NOTES.md
@@ -0,0 +1,6 @@
+## Module
+
+#### 14.03.2024
+#### Version 16.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..a4140851d
--- /dev/null
+++ b/advanced_project_management_system/models/project_checklist_info.py
@@ -0,0 +1,58 @@
+# -*- 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'
+ checklist_template_id = self.env[
+ 'project.checklist.template'].search(
+ [('id', 'in', self.project_id.checklist_template_ids.ids)])
+ self.project_id.checklist_progress += 100 / float(
+ len(checklist_template_id.checklist_ids.ids))
+
+ 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..8b3e120b5
--- /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.Integer(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..acd0b2905
--- /dev/null
+++ b/advanced_project_management_system/models/project_task.py
@@ -0,0 +1,122 @@
+# -*- 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
+from datetime import datetime
+
+
+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):
+ 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..f2cdae3c8
--- /dev/null
+++ b/advanced_project_management_system/models/res_config_settings.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 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):
+ 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..9d9667e29
--- /dev/null
+++ b/advanced_project_management_system/report/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-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..23b3f3153
--- /dev/null
+++ b/advanced_project_management_system/report/ir_action_report.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ 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..76dcaef0b
--- /dev/null
+++ b/advanced_project_management_system/report/project_project_template.xml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ /
+
+
+
+
+
+
+
+
+
+
+
+ ,
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Manager :
+
+
+ Customer :
+
+
+
+
+
Task Name
+
Planned 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..f98ab37f4
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_burnup_chart_report.py
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-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 ProjectTaskBurnupChartReport(models.AbstractModel):
+ """This model defines the Burnup Chart report for project tasks. """
+ _name = 'project.task.burnup.chart.report'
+ _description = 'Burnup Chart'
+
+ 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')
+ @api.model
+ def _read_group_raw(self, domain, fields, groupby, offset=0,
+ limit=None, orderby=False, lazy=True):
+ """Generate raw data for the Burnup 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')
+ ])
+ task_counts = defaultdict(lambda: defaultdict(int))
+ task_names = defaultdict(list)
+ for task in tasks:
+ completion_date = task.date_deadline or task.create_date.date()
+ start_date = task.create_date.date()
+ if task.stage_id.name == 'Done':
+ month_year = completion_date.strftime('%B %Y')
+ 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({
+ 'date:month': [0, month_year],
+ 'stage_id': True,
+ 'completed_count': "\n".join(task_names[month_year]),
+ '__count': counts['Total'],
+ 'date_start': counts['Start'],
+ '__domain': domain
+ })
+ 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..825cb764f
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml
@@ -0,0 +1,48 @@
+
+
+
+
+ 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}
+
+ [('display_project_id', '!=', False)]
+
+
+ No data yet!
+
+
Analyze the growth of your project's scope and track progress
+ over time with the Burnup Chart.
+
+
+
+
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..15ef03e8f
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_velocity_chart_report.py
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-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_raw(self, domain, fields, groupby, offset=0, limit=None,
+ orderby=False, lazy=True):
+ """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 task.stage_id.name == 'Done':
+ month_year = completion_date.strftime('%B %Y')
+ 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({
+ 'date:month': [0, month_year],
+ 'stage_id': True,
+ 'completed_count': "\n".join(
+ completed_names[month_year]),
+ '__count': counts['Total'],
+ 'date_start': counts['Start'],
+ '__domain': domain
+ })
+ 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/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/security/ir_attachment_security.xml b/advanced_project_management_system/security/ir_attachment_security.xml
new file mode 100755
index 000000000..b40672630
--- /dev/null
+++ b/advanced_project_management_system/security/ir_attachment_security.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Access Project Document
+
+
+
+ access project category menu
+
+
+
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/check.png b/advanced_project_management_system/static/description/assets/icons/check.png
new file mode 100755
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 100755
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 100755
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 100755
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 100755
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 100755
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 100755
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/license.png b/advanced_project_management_system/static/description/assets/icons/license.png
new file mode 100755
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 100755
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 100755
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/pos-black.png b/advanced_project_management_system/static/description/assets/icons/pos-black.png
new file mode 100755
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 100755
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 100755
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 100755
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 100755
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 100755
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 100755
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 100755
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 100755
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/categories.png b/advanced_project_management_system/static/description/assets/misc/categories.png
new file mode 100755
index 000000000..bedf1e0b1
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/categories.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/check-box.png b/advanced_project_management_system/static/description/assets/misc/check-box.png
new file mode 100755
index 000000000..42caf24b9
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/check-box.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/compass.png b/advanced_project_management_system/static/description/assets/misc/compass.png
new file mode 100755
index 000000000..d5fed8faa
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/compass.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/corporate.png b/advanced_project_management_system/static/description/assets/misc/corporate.png
new file mode 100755
index 000000000..2eb13edbf
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/corporate.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/customer-support.png b/advanced_project_management_system/static/description/assets/misc/customer-support.png
new file mode 100755
index 000000000..79efc72ed
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/customer-support.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/cybrosys-logo.png b/advanced_project_management_system/static/description/assets/misc/cybrosys-logo.png
new file mode 100755
index 000000000..cc3cc0ccf
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/cybrosys-logo.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/features.png b/advanced_project_management_system/static/description/assets/misc/features.png
new file mode 100755
index 000000000..b41769f77
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/features.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/logo.png b/advanced_project_management_system/static/description/assets/misc/logo.png
new file mode 100755
index 000000000..478462d3e
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/logo.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/pictures.png b/advanced_project_management_system/static/description/assets/misc/pictures.png
new file mode 100755
index 000000000..56d255fe9
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/pictures.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/pie-chart.png b/advanced_project_management_system/static/description/assets/misc/pie-chart.png
new file mode 100755
index 000000000..426e05244
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/pie-chart.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/right-arrow.png b/advanced_project_management_system/static/description/assets/misc/right-arrow.png
new file mode 100755
index 000000000..730984a06
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/right-arrow.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/star.png b/advanced_project_management_system/static/description/assets/misc/star.png
new file mode 100755
index 000000000..2eb9ab29f
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/star.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/support.png b/advanced_project_management_system/static/description/assets/misc/support.png
new file mode 100755
index 000000000..4f18b8b82
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/support.png differ
diff --git a/advanced_project_management_system/static/description/assets/misc/whatsapp.png b/advanced_project_management_system/static/description/assets/misc/whatsapp.png
new file mode 100755
index 000000000..d513a5356
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/whatsapp.png differ
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..6c8c8adc3
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.png b/advanced_project_management_system/static/description/assets/modules/2.png
new file mode 100644
index 000000000..57eebc5b2
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/2.png 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..c2c620ba2
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..9e2de064a
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..81bb12d06
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.png b/advanced_project_management_system/static/description/assets/modules/6.png
new file mode 100644
index 000000000..8047cf484
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/6.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..fb0b4649a
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/assets/screenshots/project_management_01.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_01.png
new file mode 100755
index 000000000..67b1294b4
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_01.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_02.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_02.png
new file mode 100755
index 000000000..6818fb8e4
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_02.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_03.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_03.png
new file mode 100755
index 000000000..d792abf47
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_03.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_04.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_04.png
new file mode 100755
index 000000000..e19eef5dd
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_04.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_05.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_05.png
new file mode 100755
index 000000000..0d02894f5
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_05.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_06.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_06.png
new file mode 100755
index 000000000..268170b53
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_06.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_07.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_07.png
new file mode 100755
index 000000000..a670ffcfc
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_07.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_08.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_08.png
new file mode 100644
index 000000000..2b9876bf2
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_08.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_09.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_09.png
new file mode 100755
index 000000000..64e04ecac
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_09.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_10.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_10.png
new file mode 100755
index 000000000..36742c196
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_10.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_11.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_11.png
new file mode 100755
index 000000000..519889ccd
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_11.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_12.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_12.png
new file mode 100755
index 000000000..71e0c7cad
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_12.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_13.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_13.png
new file mode 100755
index 000000000..703484952
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_13.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_14.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_14.png
new file mode 100755
index 000000000..c3c8b3ff3
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_14.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_15.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_15.png
new file mode 100755
index 000000000..233dc26b9
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_15.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_16.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_16.png
new file mode 100755
index 000000000..9972a5b96
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_16.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_17.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_17.png
new file mode 100755
index 000000000..f5ae50848
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_17.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_18.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_18.png
new file mode 100755
index 000000000..480900850
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_18.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_19.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_19.png
new file mode 100755
index 000000000..bf96a2bd4
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_19.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_20.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_20.png
new file mode 100755
index 000000000..3d9219b98
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_20.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_21.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_21.png
new file mode 100755
index 000000000..53c6f88b9
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_21.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_22.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_22.png
new file mode 100755
index 000000000..2457d51f1
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_22.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_23.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_23.png
new file mode 100755
index 000000000..5cf677dc5
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_23.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_24.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_24.png
new file mode 100755
index 000000000..0186ecdc3
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_24.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_25.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_25.png
new file mode 100755
index 000000000..6fc187d2c
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_25.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_26.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_26.png
new file mode 100755
index 000000000..601eb21ff
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_26.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_27.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_27.png
new file mode 100755
index 000000000..ec2b571d5
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_27.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_28.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_28.png
new file mode 100755
index 000000000..58804f65d
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_28.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_29.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_29.png
new file mode 100755
index 000000000..6551d5132
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_29.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_30.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_30.png
new file mode 100644
index 000000000..8b422b541
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_30.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_31.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_31.png
new file mode 100644
index 000000000..649043290
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_31.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_32.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_32.png
new file mode 100644
index 000000000..d514b0fde
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_32.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_33.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_33.png
new file mode 100644
index 000000000..5135f4355
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_33.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_34.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_34.png
new file mode 100644
index 000000000..532eb11b1
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_34.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_35.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_35.png
new file mode 100644
index 000000000..c0f61dd1c
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_35.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_36.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_36.png
new file mode 100644
index 000000000..601029953
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_36.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_37.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_37.png
new file mode 100644
index 000000000..bf8380fe7
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_37.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_38.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_38.png
new file mode 100644
index 000000000..5320f7cc4
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_38.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_39.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_39.png
new file mode 100644
index 000000000..4c416ad8e
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_39.png differ
diff --git a/advanced_project_management_system/static/description/assets/screenshots/project_management_40.png b/advanced_project_management_system/static/description/assets/screenshots/project_management_40.png
new file mode 100644
index 000000000..f6c2acd17
Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/project_management_40.png differ
diff --git a/advanced_project_management_system/static/description/banner.jpg b/advanced_project_management_system/static/description/banner.jpg
new file mode 100755
index 000000000..2c961eeca
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 100755
index 000000000..140ed701b
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..994b34dca
--- /dev/null
+++ b/advanced_project_management_system/static/description/index.html
@@ -0,0 +1,923 @@
+
+
+
+
+
+
+ Community
+
+
+ Enterprise
+
+
+
+
+
+
+
+
+
+ Advanced Project Management System
+
+
+ All and Additional Features of Project Module are in Single
+ Module
+ This module helps you to get more features on Project management system
+ ,We have added features related to checklist,documents,stage,milestone,
+ category,timer, and timesheet related to Project and task and etc
+
+
+
+
+
+
+
+
+
+
+ Features
+
+
+
+
+
+
+ Option to Manage Project and Task Checklist
+
+
+
+ Use Checklist Template and Checklist Import
+ to Checklist for Various Project and Tasks
+
+
+
+ Manage Milestone for Project and Task
+
+
+
+ Manage Documents Related to Project and Task
+
+
+
+ Option to Import Checklist
+
+
+
+ BurnUp Chart of a Project
+
+
+
+ Velocity Chart Report of a Project
+
+
+
+
+
+ Available in Odoo 16.0
+ Community & Enterprise.
+
+
+
+ We can Categories the Project in to Different Categories
+
+
+
+ Option to Track and Manage Project Issues
+
+
+
+ Using Project Stage and Stage Template we can Manage Project Staging
+
+
+
+ We can Update Multiple Task Details Simultaneously
+
+
+
+ We can Update Multiple Project Stages Simultaneously
+
+
+
+ We can Add a Shortcut Option, Where We can Add a GitHub Repository to Show About Commits , Pull , Push Requests in our Project or Add a Link of Frequently Used Resources.
+
+
+
+ Can Add Comments to Project
+
+
+
+
+
+
+
+
+
+
+
+ Screenshots
+
+
+
+
+
+
+ Project Milestone Menu
+
+
+ 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
+
+
+
+ Also, we can see the time of all activities of a Project
+
+
+
+
+
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..bba690123
--- /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..968f2bd9d
--- /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..a5d885bf7
--- /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
+
+